From 3c7181a545333112a2937694b507873374e75d48 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 12 Dec 2019 08:59:08 -0800 Subject: [PATCH] fix(webkit): fix ordering of provisional messages relative to the rest (#225) --- src/webkit/Connection.ts | 7 +++--- test/navigation.spec.js | 50 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) 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);