fix(webkit): use cross-process loader ids (#486)
This commit is contained in:
parent
5b1aef4c20
commit
5fa39dde3f
|
|
@ -10,7 +10,7 @@
|
||||||
"playwright": {
|
"playwright": {
|
||||||
"chromium_revision": "724623",
|
"chromium_revision": "724623",
|
||||||
"firefox_revision": "1011",
|
"firefox_revision": "1011",
|
||||||
"webkit_revision": "1084"
|
"webkit_revision": "1087"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"unit": "node test/test.js",
|
"unit": "node test/test.js",
|
||||||
|
|
|
||||||
|
|
@ -188,6 +188,7 @@ export class FFPage implements PageDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
async navigateFrame(frame: frames.Frame, url: string, referer: string | undefined): Promise<frames.GotoResult> {
|
async navigateFrame(frame: frames.Frame, url: string, referer: string | undefined): Promise<frames.GotoResult> {
|
||||||
|
this._page._validateNavigationReferrer(referer);
|
||||||
const response = await this._session.send('Page.navigate', { url, referer, frameId: frame._id });
|
const response = await this._session.send('Page.navigate', { url, referer, frameId: frame._id });
|
||||||
return { newDocumentId: response.navigationId || undefined, isSameDocument: !response.navigationId };
|
return { newDocumentId: response.navigationId || undefined, isSameDocument: !response.navigationId };
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,11 @@ export class FrameManager {
|
||||||
this._page.emit(Events.Page.RequestFailed, request);
|
this._page.emit(Events.Page.RequestFailed, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
provisionalLoadFailed(documentId: string, error: string) {
|
||||||
|
for (const watcher of this._lifecycleWatchers)
|
||||||
|
watcher._onProvisionalLoadFailed(documentId, error);
|
||||||
|
}
|
||||||
|
|
||||||
private _removeFramesRecursively(frame: Frame) {
|
private _removeFramesRecursively(frame: Frame) {
|
||||||
for (const child of frame.childFrames())
|
for (const child of frame.childFrames())
|
||||||
this._removeFramesRecursively(child);
|
this._removeFramesRecursively(child);
|
||||||
|
|
@ -304,8 +309,11 @@ export class Frame {
|
||||||
|
|
||||||
async goto(url: string, options?: GotoOptions): Promise<network.Response | null> {
|
async goto(url: string, options?: GotoOptions): Promise<network.Response | null> {
|
||||||
let referer = (this._page._state.extraHTTPHeaders || {})['referer'];
|
let referer = (this._page._state.extraHTTPHeaders || {})['referer'];
|
||||||
if (options && options.referer !== undefined)
|
if (options && options.referer !== undefined) {
|
||||||
|
if (referer !== undefined && referer !== options.referer)
|
||||||
|
throw new Error('"referer" is already specified as extra HTTP header');
|
||||||
referer = options.referer;
|
referer = options.referer;
|
||||||
|
}
|
||||||
const watcher = new LifecycleWatcher(this, options, false /* supportUrlMatch */);
|
const watcher = new LifecycleWatcher(this, options, false /* supportUrlMatch */);
|
||||||
|
|
||||||
let navigateResult: GotoResult;
|
let navigateResult: GotoResult;
|
||||||
|
|
@ -973,6 +981,10 @@ class LifecycleWatcher {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onProvisionalLoadFailed(documentId: string, error: string) {
|
||||||
|
this._onAbortedNewDocumentNavigation(this._frame, documentId, error);
|
||||||
|
}
|
||||||
|
|
||||||
_onLifecycleEvent(frame: Frame) {
|
_onLifecycleEvent(frame: Frame) {
|
||||||
this._checkLifecycleComplete();
|
this._checkLifecycleComplete();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ export class WKBrowser extends platform.EventEmitter implements Browser {
|
||||||
this._eventListeners = [
|
this._eventListeners = [
|
||||||
helper.addEventListener(this._browserSession, 'Browser.pageProxyCreated', this._onPageProxyCreated.bind(this)),
|
helper.addEventListener(this._browserSession, 'Browser.pageProxyCreated', this._onPageProxyCreated.bind(this)),
|
||||||
helper.addEventListener(this._browserSession, 'Browser.pageProxyDestroyed', this._onPageProxyDestroyed.bind(this)),
|
helper.addEventListener(this._browserSession, 'Browser.pageProxyDestroyed', this._onPageProxyDestroyed.bind(this)),
|
||||||
|
helper.addEventListener(this._browserSession, 'Browser.provisionalLoadFailed', event => this._onProvisionalLoadFailed(event)),
|
||||||
helper.addEventListener(this._browserSession, kPageProxyMessageReceived, this._onPageProxyMessageReceived.bind(this)),
|
helper.addEventListener(this._browserSession, kPageProxyMessageReceived, this._onPageProxyMessageReceived.bind(this)),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -142,6 +143,11 @@ export class WKBrowser extends platform.EventEmitter implements Browser {
|
||||||
pageProxy.dispatchMessageToSession(event.message);
|
pageProxy.dispatchMessageToSession(event.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onProvisionalLoadFailed(event: Protocol.Browser.provisionalLoadFailedPayload) {
|
||||||
|
const pageProxy = this._pageProxies.get(event.pageProxyId)!;
|
||||||
|
pageProxy.handleProvisionalLoadFailed(event);
|
||||||
|
}
|
||||||
|
|
||||||
disconnect() {
|
disconnect() {
|
||||||
throw new Error('Unsupported operation');
|
throw new Error('Unsupported operation');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -223,8 +223,11 @@ export class WKPage implements PageDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
async navigateFrame(frame: frames.Frame, url: string, referrer: string | undefined): Promise<frames.GotoResult> {
|
async navigateFrame(frame: frames.Frame, url: string, referrer: string | undefined): Promise<frames.GotoResult> {
|
||||||
await this._session.send('Page.navigate', { url, frameId: frame._id, referrer });
|
if (this._pageProxySession.isDisposed())
|
||||||
return {}; // We cannot get loaderId of cross-process navigation in advance.
|
throw new Error('Target closed');
|
||||||
|
const pageProxyId = this._pageProxySession.sessionId;
|
||||||
|
const result = await this._pageProxySession.connection!.browserSession.send('Browser.navigate', { url, pageProxyId, frameId: frame._id, referrer });
|
||||||
|
return { newDocumentId: result.loaderId, isSameDocument: !result.loaderId };
|
||||||
}
|
}
|
||||||
|
|
||||||
needsLifecycleResetOnSetContent(): boolean {
|
needsLifecycleResetOnSetContent(): boolean {
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,12 @@ export class WKPageProxy {
|
||||||
this._pageProxySession.dispatchMessage(message);
|
this._pageProxySession.dispatchMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleProvisionalLoadFailed(event: Protocol.Browser.provisionalLoadFailedPayload) {
|
||||||
|
if (!this._wkPage)
|
||||||
|
return;
|
||||||
|
this._wkPage._page._frameManager.provisionalLoadFailed(event.loaderId, event.error);
|
||||||
|
}
|
||||||
|
|
||||||
async page(): Promise<Page> {
|
async page(): Promise<Page> {
|
||||||
if (!this._pagePromise)
|
if (!this._pagePromise)
|
||||||
this._pagePromise = this._initializeWKPage();
|
this._pagePromise = this._initializeWKPage();
|
||||||
|
|
|
||||||
|
|
@ -158,7 +158,7 @@ module.exports.describe = function({testRunner, expect, playwright, FFOX, CHROMI
|
||||||
await page.goto(httpsServer.PREFIX + '/redirect/1.html').catch(e => error = e);
|
await page.goto(httpsServer.PREFIX + '/redirect/1.html').catch(e => error = e);
|
||||||
expectSSLError(error.message);
|
expectSSLError(error.message);
|
||||||
});
|
});
|
||||||
it.skip(WEBKIT)('should not crash when navigating to bad SSL after a cross origin navigation', async({page, server, httpsServer}) => {
|
it('should not crash when navigating to bad SSL after a cross origin navigation', async({page, server, httpsServer}) => {
|
||||||
await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html');
|
await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html');
|
||||||
await page.goto(httpsServer.EMPTY_PAGE).catch(e => void 0);
|
await page.goto(httpsServer.EMPTY_PAGE).catch(e => void 0);
|
||||||
});
|
});
|
||||||
|
|
@ -322,19 +322,13 @@ module.exports.describe = function({testRunner, expect, playwright, FFOX, CHROMI
|
||||||
expect(request2.headers['referer']).toBe(server.PREFIX + '/grid.html');
|
expect(request2.headers['referer']).toBe(server.PREFIX + '/grid.html');
|
||||||
expect(page.url()).toBe(server.PREFIX + '/grid.html');
|
expect(page.url()).toBe(server.PREFIX + '/grid.html');
|
||||||
});
|
});
|
||||||
it.skip(FFOX)('should use referer option when setExtraHTTPHeaders provides referer', async({page, server}) => {
|
it('should reject referer option when setExtraHTTPHeaders provides referer', async({page, server}) => {
|
||||||
await page.setExtraHTTPHeaders({ 'referer': 'http://microsoft.com/' });
|
await page.setExtraHTTPHeaders({ 'referer': 'http://microsoft.com/' });
|
||||||
const [request1, request2] = await Promise.all([
|
let error;
|
||||||
server.waitForRequest('/grid.html'),
|
await page.goto(server.PREFIX + '/grid.html', {
|
||||||
server.waitForRequest('/digits/1.png'),
|
referer: 'http://google.com/',
|
||||||
page.goto(server.PREFIX + '/grid.html', {
|
}).catch(e => error = e);
|
||||||
referer: 'http://google.com/',
|
expect(error.message).toBe('"referer" is already specified as extra HTTP header');
|
||||||
}),
|
|
||||||
]);
|
|
||||||
expect(request1.headers['referer']).toBe('http://google.com/');
|
|
||||||
// Make sure subresources use referer specified by setExtraHTTPHeaders.
|
|
||||||
expect(request2.headers['referer']).toBe('http://microsoft.com/');
|
|
||||||
expect(page.url()).toBe(server.PREFIX + '/grid.html');
|
|
||||||
});
|
});
|
||||||
it('should override referrer-policy', async({page, server}) => {
|
it('should override referrer-policy', async({page, server}) => {
|
||||||
server.setRoute('/grid.html', (req, res) => {
|
server.setRoute('/grid.html', (req, res) => {
|
||||||
|
|
|
||||||
|
|
@ -781,6 +781,9 @@ module.exports.describe = function({testRunner, expect, headless, playwright, FF
|
||||||
describe('Page.setCacheEnabled', function() {
|
describe('Page.setCacheEnabled', function() {
|
||||||
it('should enable or disable the cache based on the state passed', async({page, server}) => {
|
it('should enable or disable the cache based on the state passed', async({page, server}) => {
|
||||||
await page.goto(server.PREFIX + '/cached/one-style.html');
|
await page.goto(server.PREFIX + '/cached/one-style.html');
|
||||||
|
// WebKit does r.setCachePolicy(ResourceRequestCachePolicy::ReloadIgnoringCacheData);
|
||||||
|
// when navigating to the same url, load empty.html to avoid that.
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
const [cachedRequest] = await Promise.all([
|
const [cachedRequest] = await Promise.all([
|
||||||
server.waitForRequest('/cached/one-style.html'),
|
server.waitForRequest('/cached/one-style.html'),
|
||||||
page.goto(server.PREFIX + '/cached/one-style.html'),
|
page.goto(server.PREFIX + '/cached/one-style.html'),
|
||||||
|
|
@ -789,6 +792,7 @@ module.exports.describe = function({testRunner, expect, headless, playwright, FF
|
||||||
expect(cachedRequest.headers['if-modified-since']).not.toBe(undefined);
|
expect(cachedRequest.headers['if-modified-since']).not.toBe(undefined);
|
||||||
|
|
||||||
await page.setCacheEnabled(false);
|
await page.setCacheEnabled(false);
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
const [nonCachedRequest] = await Promise.all([
|
const [nonCachedRequest] = await Promise.all([
|
||||||
server.waitForRequest('/cached/one-style.html'),
|
server.waitForRequest('/cached/one-style.html'),
|
||||||
page.goto(server.PREFIX + '/cached/one-style.html'),
|
page.goto(server.PREFIX + '/cached/one-style.html'),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue