fix: do not use loaderId for Lifecycle events (#8353)

This commit is contained in:
Alex Rudenko 2022-05-17 15:27:21 +02:00 committed by GitHub
parent 74380303ac
commit 7107d2d300
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 18 deletions

View File

@ -194,7 +194,6 @@ export class FrameManager extends EventEmitter {
} = options; } = options;
const watcher = new LifecycleWatcher(this, frame, waitUntil, timeout); const watcher = new LifecycleWatcher(this, frame, waitUntil, timeout);
let ensureNewDocumentNavigation = false;
let error = await Promise.race([ let error = await Promise.race([
navigate(this._client, url, referer, frame._id), navigate(this._client, url, referer, frame._id),
watcher.timeoutOrTerminationPromise(), watcher.timeoutOrTerminationPromise(),
@ -202,9 +201,8 @@ export class FrameManager extends EventEmitter {
if (!error) { if (!error) {
error = await Promise.race([ error = await Promise.race([
watcher.timeoutOrTerminationPromise(), watcher.timeoutOrTerminationPromise(),
ensureNewDocumentNavigation watcher.newDocumentNavigationPromise(),
? watcher.newDocumentNavigationPromise() watcher.sameDocumentNavigationPromise(),
: watcher.sameDocumentNavigationPromise(),
]); ]);
} }
watcher.dispose(); watcher.dispose();
@ -223,7 +221,6 @@ export class FrameManager extends EventEmitter {
referrer, referrer,
frameId, frameId,
}); });
ensureNewDocumentNavigation = !!response.loaderId;
return response.errorText return response.errorText
? new Error(`${response.errorText} at ${url}`) ? new Error(`${response.errorText} at ${url}`)
: null; : null;

View File

@ -64,7 +64,6 @@ export class LifecycleWatcher {
_timeout: number; _timeout: number;
_navigationRequest?: HTTPRequest; _navigationRequest?: HTTPRequest;
_eventListeners: PuppeteerEventListener[]; _eventListeners: PuppeteerEventListener[];
_initialLoaderId: string;
_sameDocumentNavigationPromise: Promise<Error | null>; _sameDocumentNavigationPromise: Promise<Error | null>;
_sameDocumentNavigationCompleteCallback: (x?: Error) => void; _sameDocumentNavigationCompleteCallback: (x?: Error) => void;
@ -82,6 +81,7 @@ export class LifecycleWatcher {
_maximumTimer?: NodeJS.Timeout; _maximumTimer?: NodeJS.Timeout;
_hasSameDocumentNavigation?: boolean; _hasSameDocumentNavigation?: boolean;
_newDocumentNavigation?: boolean;
_swapped?: boolean; _swapped?: boolean;
constructor( constructor(
@ -100,7 +100,6 @@ export class LifecycleWatcher {
this._frameManager = frameManager; this._frameManager = frameManager;
this._frame = frame; this._frame = frame;
this._initialLoaderId = frame._loaderId;
this._timeout = timeout; this._timeout = timeout;
this._navigationRequest = null; this._navigationRequest = null;
this._eventListeners = [ this._eventListeners = [
@ -122,6 +121,11 @@ export class LifecycleWatcher {
FrameManagerEmittedEvents.FrameNavigatedWithinDocument, FrameManagerEmittedEvents.FrameNavigatedWithinDocument,
this._navigatedWithinDocument.bind(this) this._navigatedWithinDocument.bind(this)
), ),
helper.addEventListener(
this._frameManager,
FrameManagerEmittedEvents.FrameNavigated,
this._navigated.bind(this)
),
helper.addEventListener( helper.addEventListener(
this._frameManager, this._frameManager,
FrameManagerEmittedEvents.FrameSwapped, FrameManagerEmittedEvents.FrameSwapped,
@ -217,6 +221,12 @@ export class LifecycleWatcher {
this._checkLifecycleComplete(); this._checkLifecycleComplete();
} }
_navigated(frame: Frame): void {
if (frame !== this._frame) return;
this._newDocumentNavigation = true;
this._checkLifecycleComplete();
}
_frameSwapped(frame: Frame): void { _frameSwapped(frame: Frame): void {
if (frame !== this._frame) return; if (frame !== this._frame) return;
this._swapped = true; this._swapped = true;
@ -227,19 +237,9 @@ export class LifecycleWatcher {
// We expect navigation to commit. // We expect navigation to commit.
if (!checkLifecycle(this._frame, this._expectedLifecycle)) return; if (!checkLifecycle(this._frame, this._expectedLifecycle)) return;
this._lifecycleCallback(); this._lifecycleCallback();
if (
this._frame._loaderId === this._initialLoaderId &&
!this._hasSameDocumentNavigation
) {
if (this._swapped) {
this._swapped = false;
this._newDocumentNavigationCompleteCallback();
}
return;
}
if (this._hasSameDocumentNavigation) if (this._hasSameDocumentNavigation)
this._sameDocumentNavigationCompleteCallback(); this._sameDocumentNavigationCompleteCallback();
if (this._frame._loaderId !== this._initialLoaderId) if (this._swapped || this._newDocumentNavigation)
this._newDocumentNavigationCompleteCallback(); this._newDocumentNavigationCompleteCallback();
/** /**