diff --git a/package.json b/package.json index bde9132976..e24ec65dbc 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "playwright": { "chromium_revision": "733125", "firefox_revision": "1018", - "webkit_revision": "1113" + "webkit_revision": "1119" }, "scripts": { "unit": "node test/test.js", diff --git a/src/webkit/wkPage.ts b/src/webkit/wkPage.ts index be190ff457..7b47396725 100644 --- a/src/webkit/wkPage.ts +++ b/src/webkit/wkPage.ts @@ -235,17 +235,27 @@ export class WKPage implements PageDelegate { } private _handleFrameTree(frameTree: Protocol.Page.FrameResourceTree) { - this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId || null); + const frame = this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId || null); this._onFrameNavigated(frameTree.frame, true); + + frame._utilityContext().then(async context => { + const readyState = await context.evaluate(() => document.readyState).catch(e => 'loading'); + if (frame.isDetached()) + return; + if (readyState === 'interactive' || readyState === 'complete') + this._page._frameManager.frameLifecycleEvent(frame._id, 'domcontentloaded'); + if (readyState === 'complete') + this._page._frameManager.frameLifecycleEvent(frame._id, 'load'); + }); + if (!frameTree.childFrames) return; - for (const child of frameTree.childFrames) this._handleFrameTree(child); } - _onFrameAttached(frameId: string, parentFrameId: string | null) { - this._page._frameManager.frameAttached(frameId, parentFrameId); + _onFrameAttached(frameId: string, parentFrameId: string | null): frames.Frame { + return this._page._frameManager.frameAttached(frameId, parentFrameId); } private _onFrameNavigated(framePayload: Protocol.Page.Frame, initial: boolean) { diff --git a/test/navigation.spec.js b/test/navigation.spec.js index a02d9ebf11..0213d2b17f 100644 --- a/test/navigation.spec.js +++ b/test/navigation.spec.js @@ -759,15 +759,21 @@ module.exports.describe = function({testRunner, expect, playwright, FFOX, CHROMI response.end('Not found'); await navigationPromise; }); - it.skip(WEBKIT || FFOX)('should work with pages that have loaded before being connected to', async({page, context, server}) => { + it.skip(FFOX)('should work with pages that have loaded before being connected to', async({page, context, server}) => { await page.goto(server.EMPTY_PAGE); await page.evaluate(async () => { const child = window.open(document.location.href); - while(child.document.readyState !== 'complete' || child.document.location.href === 'about:blank') - await new Promise(setTimeout); + while (child.document.readyState !== 'complete' || child.document.location.href === 'about:blank') + await new Promise(f => setTimeout(f, 100)); }); - const [, childPage] = await context.pages(); - await childPage.waitForLoadState(); + const pages = await context.pages(); + expect(pages.length).toBe(2); + expect(pages[0]).toBe(page); + expect(pages[0].url()).toBe(server.EMPTY_PAGE); + + expect(pages[1].url()).toBe(server.EMPTY_PAGE); + await pages[1].waitForLoadState(); + expect(pages[1].url()).toBe(server.EMPTY_PAGE); }); });