diff --git a/src/webkit/Connection.ts b/src/webkit/Connection.ts index ef0eafc5bf..c20be530c8 100644 --- a/src/webkit/Connection.ts +++ b/src/webkit/Connection.ts @@ -88,8 +88,9 @@ export class Connection extends EventEmitter { this._scheduleQueueDispatch(); } - private _enqueueMessages(messages: string[]) { - this._incomingMessageQueue = this._incomingMessageQueue.concat(messages); + private _enqueueProvisionalMessages(messages: string[]) { + // Insert provisional messages at the point of "Target.didCommitProvisionalTarget" message. + this._incomingMessageQueue = messages.concat(this._incomingMessageQueue); this._scheduleQueueDispatch(); } @@ -169,7 +170,7 @@ export class Connection extends EventEmitter { if (!oldSession) throw new Error('Unknown old target: ' + oldTargetId); oldSession._swappedOut = true; - this._enqueueMessages(newSession._takeProvisionalMessagesAndCommit()); + this._enqueueProvisionalMessages(newSession._takeProvisionalMessagesAndCommit()); } } diff --git a/test/navigation.spec.js b/test/navigation.spec.js index d24e58ee17..7f03072b15 100644 --- a/test/navigation.spec.js +++ b/test/navigation.spec.js @@ -27,6 +27,56 @@ module.exports.addTests = function({testRunner, expect, playwright, FFOX, CHROME await page.goto(server.EMPTY_PAGE); expect(page.url()).toBe(server.EMPTY_PAGE); }); + it('should work cross-process', async({page, server}) => { + await page.goto(server.EMPTY_PAGE); + expect(page.url()).toBe(server.EMPTY_PAGE); + + const url = server.CROSS_PROCESS_PREFIX + '/empty.html'; + let requestFrame; + page.on('request', r => { + if (r.url() === url) + requestFrame = r.frame(); + }); + const response = await page.goto(url); + expect(page.url()).toBe(url); + expect(response.frame()).toBe(page.mainFrame()); + expect(requestFrame).toBe(page.mainFrame()); + expect(response.url()).toBe(url); + }); + it('should capture iframe navigation request', async({page, server}) => { + await page.goto(server.EMPTY_PAGE); + expect(page.url()).toBe(server.EMPTY_PAGE); + + const iframeUrl = server.PREFIX + '/frame.html'; + let requestFrame; + page.on('request', r => { + if (r.url() === iframeUrl) + requestFrame = r.frame(); + }); + const response = await page.goto(server.PREFIX + '/one-frame.html'); + expect(page.url()).toBe(server.PREFIX + '/one-frame.html'); + expect(response.frame()).toBe(page.mainFrame()); + expect(response.url()).toBe(server.PREFIX + '/one-frame.html'); + + expect(requestFrame).toBe(page.frames()[1]); + }); + it('should capture cross-process iframe navigation request', async({page, server}) => { + await page.goto(server.EMPTY_PAGE); + expect(page.url()).toBe(server.EMPTY_PAGE); + + const iframeUrl = server.CROSS_PROCESS_PREFIX + '/frame.html'; + let requestFrame; + page.on('request', r => { + if (r.url() === iframeUrl) + requestFrame = r.frame(); + }); + const response = await page.goto(server.CROSS_PROCESS_PREFIX + '/one-frame.html'); + expect(page.url()).toBe(server.CROSS_PROCESS_PREFIX + '/one-frame.html'); + expect(response.frame()).toBe(page.mainFrame()); + expect(response.url()).toBe(server.CROSS_PROCESS_PREFIX + '/one-frame.html'); + + expect(requestFrame).toBe(page.frames()[1]); + }); it('should work with anchor navigation', async({page, server}) => { await page.goto(server.EMPTY_PAGE); expect(page.url()).toBe(server.EMPTY_PAGE);