feat(webkit): introduce BrowserContext({language}) (#972)

This commit is contained in:
Pavel Feldman 2020-02-13 12:24:17 -08:00 committed by GitHub
parent 8006b2c01f
commit 8ed88c910a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 58 additions and 12 deletions

View File

@ -44,6 +44,7 @@ export type BrowserContextOptions = {
javaScriptEnabled?: boolean,
bypassCSP?: boolean,
userAgent?: string,
language?: string,
timezoneId?: string,
geolocation?: types.Geolocation,
permissions?: { [key: string]: string[] };

View File

@ -79,10 +79,6 @@ export class CRNetworkManager {
});
}
async setUserAgent(userAgent: string) {
await this._client.send('Network.setUserAgentOverride', { userAgent });
}
async setCacheEnabled(enabled: boolean) {
this._userCacheDisabled = !enabled;
await this._updateProtocolCacheDisabled();

View File

@ -110,8 +110,8 @@ export class CRPage implements PageDelegate {
promises.push(this._updateViewport(true /* updateTouch */));
if (options.javaScriptEnabled === false)
promises.push(this._client.send('Emulation.setScriptExecutionDisabled', { value: true }));
if (options.userAgent)
this._networkManager.setUserAgent(options.userAgent);
if (options.userAgent || options.language)
promises.push(this._client.send('Emulation.setUserAgentOverride', { userAgent: options.userAgent || '', acceptLanguage: options.language }));
if (options.timezoneId)
promises.push(emulateTimezone(this._client, options.timezoneId));
if (options.geolocation)

View File

@ -323,7 +323,8 @@ export class Frame {
}
async goto(url: string, options: GotoOptions = {}): Promise<network.Response | null> {
let referer = (this._page._state.extraHTTPHeaders || {})['referer'];
const headers = (this._page._state.extraHTTPHeaders || {});
let referer = headers['referer'] || headers['Referer'];
if (options.referer !== undefined) {
if (referer !== undefined && referer !== options.referer)
throw new Error('"referer" is already specified as extra HTTP header');

View File

@ -272,7 +272,7 @@ export class Page extends platform.EventEmitter {
for (const key of Object.keys(headers)) {
const value = headers[key];
assert(helper.isString(value), `Expected value of header "${key}" to be String, but "${typeof value}" is found.`);
this._state.extraHTTPHeaders[key.toLowerCase()] = value;
this._state.extraHTTPHeaders[key] = value;
}
return this._delegate.setExtraHTTPHeaders(headers);
}

View File

@ -78,6 +78,8 @@ export class WKBrowser extends platform.EventEmitter implements Browser {
const context = this._createBrowserContext(browserContextId, options);
if (options.ignoreHTTPSErrors)
await this._browserSession.send('Browser.setIgnoreCertificateErrors', { browserContextId, ignore: true });
if (options.language)
await this._browserSession.send('Browser.setLanguages', { browserContextId, languages: [options.language] });
await context._initialize();
this._contexts.set(browserContextId, context);
return context;

View File

@ -142,8 +142,12 @@ export class WKPage implements PageDelegate {
}
if (contextOptions.bypassCSP)
promises.push(session.send('Page.setBypassCSP', { enabled: true }));
if (this._page._state.extraHTTPHeaders !== null)
promises.push(session.send('Network.setExtraHTTPHeaders', { headers: this._page._state.extraHTTPHeaders }));
if (this._page._state.extraHTTPHeaders || contextOptions.language) {
const headers = this._page._state.extraHTTPHeaders || {};
if (contextOptions.language)
headers['Accept-Language'] = contextOptions.language;
promises.push(session.send('Network.setExtraHTTPHeaders', { headers }));
}
if (this._page._state.hasTouch)
promises.push(session.send('Page.setTouchEmulationEnabled', { enabled: true }));
if (contextOptions.timezoneId) {
@ -375,7 +379,11 @@ export class WKPage implements PageDelegate {
}
async setExtraHTTPHeaders(headers: network.Headers): Promise<void> {
await this._updateState('Network.setExtraHTTPHeaders', { headers });
const copy = { ...headers };
const language = this._page.context()._options.language;
if (language)
copy['Accept-Language'] = language;
await this._updateState('Network.setExtraHTTPHeaders', { headers: copy });
}
async setEmulateMedia(mediaType: types.MediaType | null, colorScheme: types.ColorScheme | null): Promise<void> {

View File

@ -107,7 +107,7 @@ module.exports.describe = function({testRunner, expect, playwright, CHROMIUM, WE
});
});
describe('BrowserContext({setUserAgent})', function() {
describe('BrowserContext({userAgent})', function() {
it('should work', async({newPage, server}) => {
{
const page = await newPage();

View File

@ -223,6 +223,44 @@ module.exports.describe = function({testRunner, expect, playwright, headless, FF
});
});
describe.skip(CHROMIUM || FFOX)('BrowserContext({language})', function() {
it('should affect accept-language header', async({newPage, server}) => {
const page = await newPage({ language: 'fr-CH' });
const [request] = await Promise.all([
server.waitForRequest('/empty.html'),
page.goto(server.EMPTY_PAGE),
]);
expect(request.headers['accept-language']).toBe('fr-CH');
expect(await page.evaluate(() => navigator.language)).toBe('fr-CH');
});
it('should format number', async({newPage, server}) => {
{
const page = await newPage();
await page.goto(server.EMPTY_PAGE);
expect(await page.evaluate(() => (1000000.50).toLocaleString())).toBe('1,000,000.5');
}
{
const page = await newPage({ language: 'fr-CH' });
await page.goto(server.EMPTY_PAGE);
expect(await page.evaluate(() => (1000000.50).toLocaleString())).toBe('1 000 000,5');
}
});
it('should format date', async({newPage, server}) => {
{
const page = await newPage();
await page.goto(server.EMPTY_PAGE);
expect(await page.evaluate(() => new Date(1479579154987).toString())).toBe(
'Sat Nov 19 2016 10:12:34 GMT-0800 (PST)');
}
{
const page = await newPage({ language: 'de-de', timezoneId: 'Europe/Berlin' });
await page.goto(server.EMPTY_PAGE);
expect(await page.evaluate(() => new Date(1479579154987).toString())).toBe(
'Sat Nov 19 2016 19:12:34 GMT+0100 (Mitteleuropäische Normalzeit)');
}
});
});
describe('focus', function() {
it.skip(!headless)('should think that it is focused by default', async({page}) => {
expect(await page.evaluate('document.hasFocus()')).toBe(true);