diff --git a/src/common/FrameManager.ts b/src/common/FrameManager.ts index 52b8cc77d2a92..c8277988affd4 100644 --- a/src/common/FrameManager.ts +++ b/src/common/FrameManager.ts @@ -108,6 +108,9 @@ export class FrameManager extends EventEmitter { ); } ); + session.on('Page.frameStartedLoading', (event) => { + this._onFrameStartedLoading(event.frameId); + }); session.on('Page.frameStoppedLoading', (event) => { this._onFrameStoppedLoading(event.frameId); }); @@ -287,6 +290,13 @@ export class FrameManager extends EventEmitter { this.emit(FrameManagerEmittedEvents.LifecycleEvent, frame); } + _onFrameStartedLoading(frameId: string): void { + const frame = this._frames.get(frameId); + if (!frame) return; + frame._onLoadingStarted(); + this.emit(FrameManagerEmittedEvents.LifecycleEvent, frame); + } + _onFrameStoppedLoading(frameId: string): void { const frame = this._frames.get(frameId); if (!frame) return; @@ -650,6 +660,10 @@ export class Frame { * @internal */ _name?: string; + /** + * @internal + */ + _hasStartedLoading = false; /** * @internal @@ -1416,6 +1430,13 @@ export class Frame { this._lifecycleEvents.add('load'); } + /** + * @internal + */ + _onLoadingStarted(): void { + this._hasStartedLoading = true; + } + /** * @internal */ diff --git a/src/common/LifecycleWatcher.ts b/src/common/LifecycleWatcher.ts index 0407a9cc9b9fb..276ddde42ed8b 100644 --- a/src/common/LifecycleWatcher.ts +++ b/src/common/LifecycleWatcher.ts @@ -255,7 +255,12 @@ export class LifecycleWatcher { if (!frame._lifecycleEvents.has(event)) return false; } for (const child of frame.childFrames()) { - if (!checkLifecycle(child, expectedLifecycle)) return false; + if ( + child._hasStartedLoading && + !checkLifecycle(child, expectedLifecycle) + ) { + return false; + } } return true; } diff --git a/test/assets/frames/lazy-frame.html b/test/assets/frames/lazy-frame.html new file mode 100644 index 0000000000000..d65dcd63bf32b --- /dev/null +++ b/test/assets/frames/lazy-frame.html @@ -0,0 +1,3 @@ +
+
+ \ No newline at end of file diff --git a/test/frame.spec.ts b/test/frame.spec.ts index 45d19279b2c0e..6403df763bb4d 100644 --- a/test/frame.spec.ts +++ b/test/frame.spec.ts @@ -278,6 +278,15 @@ describe('Frame specs', function () { server.PREFIX + '/frames/frame.html?param=value#fragment' ); }); + it('should support lazy frames', async () => { + const { page, server } = getTestState(); + + await page.setViewport({ width: 1158, height: 1227 }); + await page.goto(server.PREFIX + '/frames/lazy-frame.html'); + + expect(page.frames().length).toBe(2); + expect(page.frames()[1]._hasStartedLoading).toBeFalsy(); + }); }); describe('Frame.client', function () {