feat(firefox): ensure that new pages get browser context userAgent option (#872)

This commit is contained in:
Dmitry Gozman 2020-02-06 19:01:03 -08:00 committed by GitHub
parent bc912596b8
commit c33a12d8f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 5 deletions

View File

@ -9,7 +9,7 @@
"main": "index.js", "main": "index.js",
"playwright": { "playwright": {
"chromium_revision": "737027", "chromium_revision": "737027",
"firefox_revision": "1021", "firefox_revision": "1025",
"webkit_revision": "1134" "webkit_revision": "1134"
}, },
"scripts": { "scripts": {

View File

@ -56,6 +56,7 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
helper.addEventListener(this._connection, 'Target.targetCreated', this._onTargetCreated.bind(this)), helper.addEventListener(this._connection, 'Target.targetCreated', this._onTargetCreated.bind(this)),
helper.addEventListener(this._connection, 'Target.targetDestroyed', this._onTargetDestroyed.bind(this)), helper.addEventListener(this._connection, 'Target.targetDestroyed', this._onTargetDestroyed.bind(this)),
helper.addEventListener(this._connection, 'Target.targetInfoChanged', this._onTargetInfoChanged.bind(this)), helper.addEventListener(this._connection, 'Target.targetInfoChanged', this._onTargetInfoChanged.bind(this)),
helper.addEventListener(this._connection, 'Target.attachedToTarget', this._onAttachedToTarget.bind(this)),
]; ];
} }
@ -64,7 +65,9 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
} }
async newContext(options: BrowserContextOptions = {}): Promise<BrowserContext> { async newContext(options: BrowserContextOptions = {}): Promise<BrowserContext> {
const {browserContextId} = await this._connection.send('Target.createBrowserContext'); const {browserContextId} = await this._connection.send('Target.createBrowserContext', {
userAgent: options.userAgent
});
// TODO: move ignoreHTTPSErrors to browser context level. // TODO: move ignoreHTTPSErrors to browser context level.
if (options.ignoreHTTPSErrors) if (options.ignoreHTTPSErrors)
await this._connection.send('Browser.setIgnoreHTTPSErrors', { enabled: true }); await this._connection.send('Browser.setIgnoreHTTPSErrors', { enabled: true });
@ -143,6 +146,13 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
target._url = url; target._url = url;
} }
_onAttachedToTarget(payload: Protocol.Target.attachedToTargetPayload) {
const {targetId, type} = payload.targetInfo;
const target = this._targets.get(targetId)!;
if (type === 'page')
target.page();
}
async close() { async close() {
await Promise.all(this.browserContexts().map(context => context.close())); await Promise.all(this.browserContexts().map(context => context.close()));
helper.removeEventListeners(this._eventListeners); helper.removeEventListeners(this._eventListeners);

View File

@ -99,7 +99,7 @@ export class FFConnection extends platform.EventEmitter {
const sessionId = object.params.sessionId; const sessionId = object.params.sessionId;
const session = new FFSession(this, object.params.targetInfo.type, sessionId, message => this._rawSend({...message, sessionId})); const session = new FFSession(this, object.params.targetInfo.type, sessionId, message => this._rawSend({...message, sessionId}));
this._sessions.set(sessionId, session); this._sessions.set(sessionId, session);
} else if (object.method === 'Browser.detachedFromTarget') { } else if (object.method === 'Target.detachedFromTarget') {
const session = this._sessions.get(object.params.sessionId); const session = this._sessions.get(object.params.sessionId);
if (session) { if (session) {
session._onClosed(); session._onClosed();

View File

@ -89,8 +89,6 @@ export class FFPage implements PageDelegate {
promises.push(this._session.send('Page.setBypassCSP', { enabled: true })); promises.push(this._session.send('Page.setBypassCSP', { enabled: true }));
if (options.javaScriptEnabled === false) if (options.javaScriptEnabled === false)
promises.push(this._session.send('Page.setJavascriptEnabled', { enabled: false })); promises.push(this._session.send('Page.setJavascriptEnabled', { enabled: false }));
if (options.userAgent)
promises.push(this._session.send('Page.setUserAgent', { userAgent: options.userAgent }));
await Promise.all(promises); await Promise.all(promises);
} }

View File

@ -31,6 +31,19 @@ module.exports.describe = function({testRunner, expect, playwright, CHROMIUM, WE
await context.close(); await context.close();
expect(browser.browserContexts().length).toBe(0); expect(browser.browserContexts().length).toBe(0);
}); });
it.skip(CHROMIUM)('popup should inherit user agent', async function({newContext, server}) {
const context = await newContext({
userAgent: 'hey'
});
const page = await context.newPage();
await page.goto(server.EMPTY_PAGE);
const evaluatePromise = page.evaluate(url => window.open(url), server.PREFIX + '/dummy.html');
const popupPromise = page.waitForEvent('popup');
const request = await server.waitForRequest('/dummy.html');
await evaluatePromise;
await popupPromise;
expect(request.headers['user-agent']).toBe('hey');
});
it('window.open should use parent tab context', async function({newContext, server}) { it('window.open should use parent tab context', async function({newContext, server}) {
const context = await newContext(); const context = await newContext();
const page = await context.newPage(); const page = await context.newPage();