mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(webkit): use cross-process loader ids (#484)
This commit is contained in:
parent
fb1b3d9a89
commit
d341b43023
@ -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);
|
||||||
@ -973,6 +978,10 @@ class LifecycleWatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onProvisionalLoadFailed(documentId: string, error: string) {
|
||||||
|
this._onAbortedNewDocumentNavigation(this._frame, documentId, error);
|
||||||
|
}
|
||||||
|
|
||||||
_onLifecycleEvent(frame: Frame) {
|
_onLifecycleEvent(frame: Frame) {
|
||||||
this._checkLifecycleComplete();
|
this._checkLifecycleComplete();
|
||||||
}
|
}
|
||||||
|
12
src/page.ts
12
src/page.ts
@ -171,6 +171,18 @@ export class Page extends platform.EventEmitter {
|
|||||||
this.emit(Events.Page.FileChooser, fileChooser);
|
this.emit(Events.Page.FileChooser, fileChooser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_validateNavigationReferrer(referrer: string | undefined) {
|
||||||
|
if (!referrer)
|
||||||
|
return;
|
||||||
|
if (!this._state.extraHTTPHeaders)
|
||||||
|
return;
|
||||||
|
const header = this._state.extraHTTPHeaders['referer'];
|
||||||
|
if (!header)
|
||||||
|
return;
|
||||||
|
if (header !== referrer)
|
||||||
|
throw new Error('"referer" is already specified as extra HTTP header');
|
||||||
|
}
|
||||||
|
|
||||||
browserContext(): BrowserContext {
|
browserContext(): BrowserContext {
|
||||||
return this._browserContext;
|
return this._browserContext;
|
||||||
}
|
}
|
||||||
|
@ -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,12 @@ 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 });
|
this._page._validateNavigationReferrer(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 {
|
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,26 @@ 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 use 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([
|
try {
|
||||||
server.waitForRequest('/grid.html'),
|
const [request1, request2] = await Promise.all([
|
||||||
server.waitForRequest('/digits/1.png'),
|
server.waitForRequest('/grid.html'),
|
||||||
page.goto(server.PREFIX + '/grid.html', {
|
server.waitForRequest('/digits/1.png'),
|
||||||
referer: 'http://google.com/',
|
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(request1.headers['referer']).toBe('http://google.com/');
|
||||||
expect(request2.headers['referer']).toBe('http://microsoft.com/');
|
// Make sure subresources use referer specified by setExtraHTTPHeaders.
|
||||||
expect(page.url()).toBe(server.PREFIX + '/grid.html');
|
expect(request2.headers['referer']).toBe('http://microsoft.com/');
|
||||||
|
expect(page.url()).toBe(server.PREFIX + '/grid.html');
|
||||||
|
} catch (error) {
|
||||||
|
if (FFOX || WEBKIT)
|
||||||
|
expect(error.message).toBe('"referer" is already specified as extra HTTP header');
|
||||||
|
else
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
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'),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user