Skip to content

Commit 8ed88c9

Browse files
authored
feat(webkit): introduce BrowserContext({language}) (#972)
1 parent 8006b2c commit 8ed88c9

File tree

9 files changed

+58
-12
lines changed

9 files changed

+58
-12
lines changed

src/browserContext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export type BrowserContextOptions = {
4444
javaScriptEnabled?: boolean,
4545
bypassCSP?: boolean,
4646
userAgent?: string,
47+
language?: string,
4748
timezoneId?: string,
4849
geolocation?: types.Geolocation,
4950
permissions?: { [key: string]: string[] };

src/chromium/crNetworkManager.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,6 @@ export class CRNetworkManager {
7979
});
8080
}
8181

82-
async setUserAgent(userAgent: string) {
83-
await this._client.send('Network.setUserAgentOverride', { userAgent });
84-
}
85-
8682
async setCacheEnabled(enabled: boolean) {
8783
this._userCacheDisabled = !enabled;
8884
await this._updateProtocolCacheDisabled();

src/chromium/crPage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ export class CRPage implements PageDelegate {
110110
promises.push(this._updateViewport(true /* updateTouch */));
111111
if (options.javaScriptEnabled === false)
112112
promises.push(this._client.send('Emulation.setScriptExecutionDisabled', { value: true }));
113-
if (options.userAgent)
114-
this._networkManager.setUserAgent(options.userAgent);
113+
if (options.userAgent || options.language)
114+
promises.push(this._client.send('Emulation.setUserAgentOverride', { userAgent: options.userAgent || '', acceptLanguage: options.language }));
115115
if (options.timezoneId)
116116
promises.push(emulateTimezone(this._client, options.timezoneId));
117117
if (options.geolocation)

src/frames.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,8 @@ export class Frame {
323323
}
324324

325325
async goto(url: string, options: GotoOptions = {}): Promise<network.Response | null> {
326-
let referer = (this._page._state.extraHTTPHeaders || {})['referer'];
326+
const headers = (this._page._state.extraHTTPHeaders || {});
327+
let referer = headers['referer'] || headers['Referer'];
327328
if (options.referer !== undefined) {
328329
if (referer !== undefined && referer !== options.referer)
329330
throw new Error('"referer" is already specified as extra HTTP header');

src/page.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ export class Page extends platform.EventEmitter {
272272
for (const key of Object.keys(headers)) {
273273
const value = headers[key];
274274
assert(helper.isString(value), `Expected value of header "${key}" to be String, but "${typeof value}" is found.`);
275-
this._state.extraHTTPHeaders[key.toLowerCase()] = value;
275+
this._state.extraHTTPHeaders[key] = value;
276276
}
277277
return this._delegate.setExtraHTTPHeaders(headers);
278278
}

src/webkit/wkBrowser.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ export class WKBrowser extends platform.EventEmitter implements Browser {
7878
const context = this._createBrowserContext(browserContextId, options);
7979
if (options.ignoreHTTPSErrors)
8080
await this._browserSession.send('Browser.setIgnoreCertificateErrors', { browserContextId, ignore: true });
81+
if (options.language)
82+
await this._browserSession.send('Browser.setLanguages', { browserContextId, languages: [options.language] });
8183
await context._initialize();
8284
this._contexts.set(browserContextId, context);
8385
return context;

src/webkit/wkPage.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,12 @@ export class WKPage implements PageDelegate {
142142
}
143143
if (contextOptions.bypassCSP)
144144
promises.push(session.send('Page.setBypassCSP', { enabled: true }));
145-
if (this._page._state.extraHTTPHeaders !== null)
146-
promises.push(session.send('Network.setExtraHTTPHeaders', { headers: this._page._state.extraHTTPHeaders }));
145+
if (this._page._state.extraHTTPHeaders || contextOptions.language) {
146+
const headers = this._page._state.extraHTTPHeaders || {};
147+
if (contextOptions.language)
148+
headers['Accept-Language'] = contextOptions.language;
149+
promises.push(session.send('Network.setExtraHTTPHeaders', { headers }));
150+
}
147151
if (this._page._state.hasTouch)
148152
promises.push(session.send('Page.setTouchEmulationEnabled', { enabled: true }));
149153
if (contextOptions.timezoneId) {
@@ -375,7 +379,11 @@ export class WKPage implements PageDelegate {
375379
}
376380

377381
async setExtraHTTPHeaders(headers: network.Headers): Promise<void> {
378-
await this._updateState('Network.setExtraHTTPHeaders', { headers });
382+
const copy = { ...headers };
383+
const language = this._page.context()._options.language;
384+
if (language)
385+
copy['Accept-Language'] = language;
386+
await this._updateState('Network.setExtraHTTPHeaders', { headers: copy });
379387
}
380388

381389
async setEmulateMedia(mediaType: types.MediaType | null, colorScheme: types.ColorScheme | null): Promise<void> {

test/browsercontext.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ module.exports.describe = function({testRunner, expect, playwright, CHROMIUM, WE
107107
});
108108
});
109109

110-
describe('BrowserContext({setUserAgent})', function() {
110+
describe('BrowserContext({userAgent})', function() {
111111
it('should work', async({newPage, server}) => {
112112
{
113113
const page = await newPage();

test/emulation.spec.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,44 @@ module.exports.describe = function({testRunner, expect, playwright, headless, FF
223223
});
224224
});
225225

226+
describe.skip(CHROMIUM || FFOX)('BrowserContext({language})', function() {
227+
it('should affect accept-language header', async({newPage, server}) => {
228+
const page = await newPage({ language: 'fr-CH' });
229+
const [request] = await Promise.all([
230+
server.waitForRequest('/empty.html'),
231+
page.goto(server.EMPTY_PAGE),
232+
]);
233+
expect(request.headers['accept-language']).toBe('fr-CH');
234+
expect(await page.evaluate(() => navigator.language)).toBe('fr-CH');
235+
});
236+
it('should format number', async({newPage, server}) => {
237+
{
238+
const page = await newPage();
239+
await page.goto(server.EMPTY_PAGE);
240+
expect(await page.evaluate(() => (1000000.50).toLocaleString())).toBe('1,000,000.5');
241+
}
242+
{
243+
const page = await newPage({ language: 'fr-CH' });
244+
await page.goto(server.EMPTY_PAGE);
245+
expect(await page.evaluate(() => (1000000.50).toLocaleString())).toBe('1 000 000,5');
246+
}
247+
});
248+
it('should format date', async({newPage, server}) => {
249+
{
250+
const page = await newPage();
251+
await page.goto(server.EMPTY_PAGE);
252+
expect(await page.evaluate(() => new Date(1479579154987).toString())).toBe(
253+
'Sat Nov 19 2016 10:12:34 GMT-0800 (PST)');
254+
}
255+
{
256+
const page = await newPage({ language: 'de-de', timezoneId: 'Europe/Berlin' });
257+
await page.goto(server.EMPTY_PAGE);
258+
expect(await page.evaluate(() => new Date(1479579154987).toString())).toBe(
259+
'Sat Nov 19 2016 19:12:34 GMT+0100 (Mitteleuropäische Normalzeit)');
260+
}
261+
});
262+
});
263+
226264
describe('focus', function() {
227265
it.skip(!headless)('should think that it is focused by default', async({page}) => {
228266
expect(await page.evaluate('document.hasFocus()')).toBe(true);

0 commit comments

Comments
 (0)