fix(webkit): use cross-process loader ids (#486)
This commit is contained in:
parent
5b1aef4c20
commit
5fa39dde3f
|
|
@ -10,7 +10,7 @@
|
|||
"playwright": {
|
||||
"chromium_revision": "724623",
|
||||
"firefox_revision": "1011",
|
||||
"webkit_revision": "1084"
|
||||
"webkit_revision": "1087"
|
||||
},
|
||||
"scripts": {
|
||||
"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> {
|
||||
this._page._validateNavigationReferrer(referer);
|
||||
const response = await this._session.send('Page.navigate', { url, referer, frameId: frame._id });
|
||||
return { newDocumentId: response.navigationId || undefined, isSameDocument: !response.navigationId };
|
||||
}
|
||||
|
|
|
|||
|
|
@ -219,6 +219,11 @@ export class FrameManager {
|
|||
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) {
|
||||
for (const child of frame.childFrames())
|
||||
this._removeFramesRecursively(child);
|
||||
|
|
@ -304,8 +309,11 @@ export class Frame {
|
|||
|
||||
async goto(url: string, options?: GotoOptions): Promise<network.Response | null> {
|
||||
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;
|
||||
}
|
||||
const watcher = new LifecycleWatcher(this, options, false /* supportUrlMatch */);
|
||||
|
||||
let navigateResult: GotoResult;
|
||||
|
|
@ -973,6 +981,10 @@ class LifecycleWatcher {
|
|||
}
|
||||
}
|
||||
|
||||
_onProvisionalLoadFailed(documentId: string, error: string) {
|
||||
this._onAbortedNewDocumentNavigation(this._frame, documentId, error);
|
||||
}
|
||||
|
||||
_onLifecycleEvent(frame: Frame) {
|
||||
this._checkLifecycleComplete();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ export class WKBrowser extends platform.EventEmitter implements Browser {
|
|||
this._eventListeners = [
|
||||
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.provisionalLoadFailed', event => this._onProvisionalLoadFailed(event)),
|
||||
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);
|
||||
}
|
||||
|
||||
_onProvisionalLoadFailed(event: Protocol.Browser.provisionalLoadFailedPayload) {
|
||||
const pageProxy = this._pageProxies.get(event.pageProxyId)!;
|
||||
pageProxy.handleProvisionalLoadFailed(event);
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
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> {
|
||||
await this._session.send('Page.navigate', { url, frameId: frame._id, referrer });
|
||||
return {}; // We cannot get loaderId of cross-process navigation in advance.
|
||||
if (this._pageProxySession.isDisposed())
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -64,6 +64,12 @@ export class WKPageProxy {
|
|||
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> {
|
||||
if (!this._pagePromise)
|
||||
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);
|
||||
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(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(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/' });
|
||||
const [request1, request2] = await Promise.all([
|
||||
server.waitForRequest('/grid.html'),
|
||||
server.waitForRequest('/digits/1.png'),
|
||||
page.goto(server.PREFIX + '/grid.html', {
|
||||
referer: 'http://google.com/',
|
||||
}),
|
||||
]);
|
||||
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');
|
||||
let error;
|
||||
await page.goto(server.PREFIX + '/grid.html', {
|
||||
referer: 'http://google.com/',
|
||||
}).catch(e => error = e);
|
||||
expect(error.message).toBe('"referer" is already specified as extra HTTP header');
|
||||
});
|
||||
it('should override referrer-policy', async({page, server}) => {
|
||||
server.setRoute('/grid.html', (req, res) => {
|
||||
|
|
|
|||
|
|
@ -781,6 +781,9 @@ module.exports.describe = function({testRunner, expect, headless, playwright, FF
|
|||
describe('Page.setCacheEnabled', function() {
|
||||
it('should enable or disable the cache based on the state passed', async({page, server}) => {
|
||||
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([
|
||||
server.waitForRequest('/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);
|
||||
|
||||
await page.setCacheEnabled(false);
|
||||
await page.goto(server.EMPTY_PAGE);
|
||||
const [nonCachedRequest] = await Promise.all([
|
||||
server.waitForRequest('/cached/one-style.html'),
|
||||
page.goto(server.PREFIX + '/cached/one-style.html'),
|
||||
|
|
|
|||
Loading…
Reference in a new issue