chore: use RxJS for wait for Navigation (#11024)
This commit is contained in:
parent
c502ca89e4
commit
aa16ab1cff
@ -16,6 +16,15 @@
|
|||||||
|
|
||||||
import * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js';
|
import * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js';
|
||||||
|
|
||||||
|
import {
|
||||||
|
type Observable,
|
||||||
|
firstValueFrom,
|
||||||
|
from,
|
||||||
|
fromEvent,
|
||||||
|
merge,
|
||||||
|
raceWith,
|
||||||
|
switchMap,
|
||||||
|
} from '../../third_party/rxjs/rxjs.js';
|
||||||
import {type CDPSession} from '../api/CDPSession.js';
|
import {type CDPSession} from '../api/CDPSession.js';
|
||||||
import {
|
import {
|
||||||
Frame,
|
Frame,
|
||||||
@ -30,9 +39,9 @@ import {type Awaitable} from '../common/types.js';
|
|||||||
import {
|
import {
|
||||||
UTILITY_WORLD_NAME,
|
UTILITY_WORLD_NAME,
|
||||||
setPageContent,
|
setPageContent,
|
||||||
waitForEvent,
|
|
||||||
waitWithTimeout,
|
waitWithTimeout,
|
||||||
} from '../common/util.js';
|
} from '../common/util.js';
|
||||||
|
import {timeout} from '../common/util.js';
|
||||||
import {Deferred} from '../util/Deferred.js';
|
import {Deferred} from '../util/Deferred.js';
|
||||||
import {disposeSymbol} from '../util/disposable.js';
|
import {disposeSymbol} from '../util/disposable.js';
|
||||||
|
|
||||||
@ -70,7 +79,7 @@ export class BidiFrame extends Frame {
|
|||||||
#page: BidiPage;
|
#page: BidiPage;
|
||||||
#context: BrowsingContext;
|
#context: BrowsingContext;
|
||||||
#timeoutSettings: TimeoutSettings;
|
#timeoutSettings: TimeoutSettings;
|
||||||
#abortDeferred = Deferred.create<Error>();
|
#abortDeferred = Deferred.create<never>();
|
||||||
#disposed = false;
|
#disposed = false;
|
||||||
sandboxes: SandboxChart;
|
sandboxes: SandboxChart;
|
||||||
override _id: string;
|
override _id: string;
|
||||||
@ -201,48 +210,32 @@ export class BidiFrame extends Frame {
|
|||||||
): Promise<BidiHTTPResponse | null> {
|
): Promise<BidiHTTPResponse | null> {
|
||||||
const {
|
const {
|
||||||
waitUntil = 'load',
|
waitUntil = 'load',
|
||||||
timeout = this.#timeoutSettings.navigationTimeout(),
|
timeout: ms = this.#timeoutSettings.navigationTimeout(),
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
const waitUntilEvent = lifeCycleToSubscribedEvent.get(
|
const waitUntilEvent = lifeCycleToSubscribedEvent.get(
|
||||||
getWaitUntilSingle(waitUntil)
|
getWaitUntilSingle(waitUntil)
|
||||||
) as string;
|
) as string;
|
||||||
|
|
||||||
const [info] = await Deferred.race([
|
const info = await firstValueFrom(
|
||||||
// TODO(lightning00blade): Should also keep tack of
|
merge(
|
||||||
// navigationAborted and navigationFailed
|
fromEvent(
|
||||||
Promise.all([
|
|
||||||
waitForEvent<Bidi.BrowsingContext.NavigationInfo>(
|
|
||||||
this.#context,
|
this.#context,
|
||||||
waitUntilEvent,
|
Bidi.ChromiumBidi.BrowsingContext.EventNames.NavigationStarted
|
||||||
() => {
|
).pipe(
|
||||||
return true;
|
switchMap(() => {
|
||||||
},
|
return fromEvent(
|
||||||
timeout,
|
this.#context,
|
||||||
this.#abortDeferred.valueOrThrow()
|
waitUntilEvent
|
||||||
|
) as Observable<Bidi.BrowsingContext.NavigationInfo>;
|
||||||
|
})
|
||||||
),
|
),
|
||||||
waitForEvent(
|
fromEvent(
|
||||||
this.#context,
|
this.#context,
|
||||||
Bidi.ChromiumBidi.BrowsingContext.EventNames.NavigationStarted,
|
Bidi.ChromiumBidi.BrowsingContext.EventNames.FragmentNavigated
|
||||||
() => {
|
) as Observable<Bidi.BrowsingContext.NavigationInfo>
|
||||||
return true;
|
).pipe(raceWith(timeout(ms), from(this.#abortDeferred.valueOrThrow())))
|
||||||
},
|
);
|
||||||
timeout,
|
|
||||||
this.#abortDeferred.valueOrThrow()
|
|
||||||
),
|
|
||||||
]),
|
|
||||||
waitForEvent<Bidi.BrowsingContext.NavigationInfo>(
|
|
||||||
this.#context,
|
|
||||||
Bidi.ChromiumBidi.BrowsingContext.EventNames.FragmentNavigated,
|
|
||||||
() => {
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
timeout,
|
|
||||||
this.#abortDeferred.valueOrThrow()
|
|
||||||
).then(info => {
|
|
||||||
return [info, undefined];
|
|
||||||
}),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return this.#page.getNavigationResponse(info.navigation);
|
return this.#page.getNavigationResponse(info.navigation);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user