chore: use RxJS for wait for Navigation (#11024)

This commit is contained in:
Nikolay Vitkov 2023-09-26 15:02:18 +02:00 committed by GitHub
parent c502ca89e4
commit aa16ab1cff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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);
} }