@@ -138,7 +138,7 @@ index 040c7b124dec6bb254563bbe74fe50012cb077a3..b4e6b8132786af70e8ad0dce88b67c28
138
138
const transportProvider = {
139
139
setListener(upgradeListener) {
140
140
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
141
- index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344ddf2f9464 100644
141
+ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..74d392e71ce3a0b1a0c640cc9149777794164e7b 100644
142
142
--- a/docshell/base/nsDocShell.cpp
143
143
+++ b/docshell/base/nsDocShell.cpp
144
144
@@ -53,6 +53,7 @@
@@ -174,7 +174,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d
174
174
if (!isSubFrame && !isRoot) {
175
175
/*
176
176
* We don't want to send OnLocationChange notifications when
177
- @@ -3363,6 +3368,72 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) {
177
+ @@ -3363,6 +3368,85 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) {
178
178
return NS_OK;
179
179
}
180
180
@@ -203,6 +203,19 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d
203
203
+ }
204
204
+
205
205
+ NS_IMETHODIMP
206
+ + nsDocShell::GetLanguageOverride(nsAString& aLanguageOverride) {
207
+ + MOZ_ASSERT(aEnabled);
208
+ + aLanguageOverride = mLanguageOverride;
209
+ + return NS_OK;
210
+ + }
211
+ +
212
+ + NS_IMETHODIMP
213
+ + nsDocShell::SetLanguageOverride(const nsAString& aLanguageOverride) {
214
+ + mLanguageOverride = aLanguageOverride;
215
+ + return NS_OK;
216
+ + }
217
+ +
218
+ + NS_IMETHODIMP
206
219
+ nsDocShell::GetFileInputInterceptionEnabled(bool* aEnabled) {
207
220
+ MOZ_ASSERT(aEnabled);
208
221
+ *aEnabled = mFileInputInterceptionEnabled;
@@ -247,7 +260,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d
247
260
NS_IMETHODIMP
248
261
nsDocShell::GetIsNavigating(bool* aOut) {
249
262
*aOut = mIsNavigating;
250
- @@ -12138,6 +12209 ,9 @@ class OnLinkClickEvent : public Runnable {
263
+ @@ -12138,6 +12222 ,9 @@ class OnLinkClickEvent : public Runnable {
251
264
mNoOpenerImplied, nullptr, nullptr,
252
265
mIsUserTriggered, mTriggeringPrincipal, mCsp);
253
266
}
@@ -257,7 +270,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d
257
270
return NS_OK;
258
271
}
259
272
260
- @@ -12227,6 +12301 ,9 @@ nsresult nsDocShell::OnLinkClick(
273
+ @@ -12227,6 +12314 ,9 @@ nsresult nsDocShell::OnLinkClick(
261
274
this, aContent, aURI, target, aFileName, aPostDataStream,
262
275
aHeadersDataStream, noOpenerImplied, aIsUserTriggered, aIsTrusted,
263
276
aTriggeringPrincipal, aCsp);
@@ -268,7 +281,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d
268
281
}
269
282
270
283
diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h
271
- index bd8327aae45f1d56acf0d5e61519c7cf469462f3..89cb1a417f129b75ee7e6ec322d121d579d25ef0 100644
284
+ index bd8327aae45f1d56acf0d5e61519c7cf469462f3..bb1bdf6aadf8276ed46c435e00e0bc4ff9ce91df 100644
272
285
--- a/docshell/base/nsDocShell.h
273
286
+++ b/docshell/base/nsDocShell.h
274
287
@@ -13,6 +13,7 @@
@@ -310,18 +323,19 @@ index bd8327aae45f1d56acf0d5e61519c7cf469462f3..89cb1a417f129b75ee7e6ec322d121d5
310
323
// Handles retrieval of subframe session history for nsDocShell::LoadURI. If a
311
324
// load is requested in a subframe of the current DocShell, the subframe
312
325
// loadType may need to reflect the loadType of the parent document, or in
313
- @@ -1296,6 +1307,9 @@ class nsDocShell final : public nsDocLoader,
326
+ @@ -1296,6 +1307,10 @@ class nsDocShell final : public nsDocLoader,
314
327
bool mUseStrictSecurityChecks : 1;
315
328
bool mObserveErrorPages : 1;
316
329
bool mCSSErrorReportingEnabled : 1;
317
330
+ bool mFileInputInterceptionEnabled: 1;
318
331
+ bool mBypassCSPEnabled : 1;
332
+ + nsString mLanguageOverride;
319
333
+ RefPtr<nsGeolocationService> mGeolocationOverrideService;
320
334
bool mAllowAuth : 1;
321
335
bool mAllowKeywordFixup : 1;
322
336
bool mIsOffScreenBrowser : 1;
323
337
diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl
324
- index db95b181388e8ab3c074b3b6e036dc971633e396..bd2ab50b8a5a6f6e3b9618061b752ea52caa239c 100644
338
+ index db95b181388e8ab3c074b3b6e036dc971633e396..b550e4abdb37d9ca942796d86758377ecbc3f461 100644
325
339
--- a/docshell/base/nsIDocShell.idl
326
340
+++ b/docshell/base/nsIDocShell.idl
327
341
@@ -44,6 +44,7 @@ interface nsIURI;
@@ -332,7 +346,7 @@ index db95b181388e8ab3c074b3b6e036dc971633e396..bd2ab50b8a5a6f6e3b9618061b752ea5
332
346
interface nsIDocShellLoadInfo;
333
347
interface nsIEditor;
334
348
interface nsIEditingSession;
335
- @@ -1132,4 +1133,10 @@ interface nsIDocShell : nsIDocShellTreeItem
349
+ @@ -1132,4 +1133,12 @@ interface nsIDocShell : nsIDocShellTreeItem
336
350
* @see nsISHEntry synchronizeLayoutHistoryState().
337
351
*/
338
352
void synchronizeLayoutHistoryState();
@@ -341,6 +355,8 @@ index db95b181388e8ab3c074b3b6e036dc971633e396..bd2ab50b8a5a6f6e3b9618061b752ea5
341
355
+
342
356
+ attribute boolean bypassCSPEnabled;
343
357
+
358
+ + attribute AString languageOverride;
359
+ +
344
360
+ void setGeolocationOverride(in nsIDOMGeoPosition position);
345
361
};
346
362
diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp
@@ -369,6 +385,55 @@ index 394004780db4017d6ff1561febd4b379705c6302..941ef9f97a4851e785edaf25c0913a1c
369
385
// If this is a data document - no need to set CSP.
370
386
if (mLoadedAsData) {
371
387
return NS_OK;
388
+ diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp
389
+ index 061f19c31fa396d9ff7aedc4c0e175b3d5bf521f..4cf9c16bb1b275debd326ea860e27dd76c4f8a56 100644
390
+ --- a/dom/base/Navigator.cpp
391
+ +++ b/dom/base/Navigator.cpp
392
+ @@ -313,14 +313,18 @@ void Navigator::GetAppName(nsAString& aAppName, CallerType aCallerType) const {
393
+ * An empty array will be returned if there is no valid languages.
394
+ */
395
+ /* static */
396
+ - void Navigator::GetAcceptLanguages(nsTArray<nsString>& aLanguages) {
397
+ + void Navigator::GetAcceptLanguages(const nsString* aLanguageOverride, nsTArray<nsString>& aLanguages) {
398
+ MOZ_ASSERT(NS_IsMainThread());
399
+
400
+ aLanguages.Clear();
401
+
402
+ // E.g. "de-de, en-us,en".
403
+ nsAutoString acceptLang;
404
+ - Preferences::GetLocalizedString("intl.accept_languages", acceptLang);
405
+ + if (aLanguageOverride && aLanguageOverride->Length())
406
+ + acceptLang = *aLanguageOverride;
407
+ + else
408
+ + Preferences::GetLocalizedString("intl.accept_languages", acceptLang);
409
+ +
410
+
411
+ // Split values on commas.
412
+ nsCharSeparatedTokenizer langTokenizer(acceptLang, ',');
413
+ @@ -376,7 +380,9 @@ void Navigator::GetLanguage(nsAString& aLanguage) {
414
+ }
415
+
416
+ void Navigator::GetLanguages(nsTArray<nsString>& aLanguages) {
417
+ - GetAcceptLanguages(aLanguages);
418
+ + nsString languageOverride;
419
+ + mWindow->GetDocShell()->GetLanguageOverride(languageOverride);
420
+ + GetAcceptLanguages(&languageOverride, aLanguages);
421
+
422
+ // The returned value is cached by the binding code. The window listen to the
423
+ // accept languages change and will clear the cache when needed. It has to
424
+ diff --git a/dom/base/Navigator.h b/dom/base/Navigator.h
425
+ index 1ad4f2a680177e309ff3614b17663201c8c3b68e..a867a49b16475f2a5f8be68967568bf571731ca7 100644
426
+ --- a/dom/base/Navigator.h
427
+ +++ b/dom/base/Navigator.h
428
+ @@ -218,7 +218,7 @@ class Navigator final : public nsISupports, public nsWrapperCache {
429
+
430
+ StorageManager* Storage();
431
+
432
+ - static void GetAcceptLanguages(nsTArray<nsString>& aLanguages);
433
+ + static void GetAcceptLanguages(const nsString* aLanguageOverride, nsTArray<nsString>& aLanguages);
434
+
435
+ dom::MediaCapabilities* MediaCapabilities();
436
+ dom::MediaSession* MediaSession();
372
437
diff --git a/dom/geolocation/Geolocation.cpp b/dom/geolocation/Geolocation.cpp
373
438
index f2bb0d880f179bb37e915fe5b32692ac4307ecf7..835c8f9098ffe4f63aeac0286faa33ade21f9a0f 100644
374
439
--- a/dom/geolocation/Geolocation.cpp
@@ -548,6 +613,29 @@ index f0c28cfdae1c9ac33013e9688e0142d161763543..a38ab106e37dbab58e91ef5a873f8954
548
613
nsAutoString policyStr(
549
614
nsContentUtils::TrimWhitespace<nsContentUtils::IsHTMLWhitespace>(
550
615
aPolicyStr));
616
+ diff --git a/dom/workers/RuntimeService.cpp b/dom/workers/RuntimeService.cpp
617
+ index ddc2aac728a772d4830504419d63123ffc4ee928..4a9fd6d8a437c0fefce144d85c3274672ab54ea3 100644
618
+ --- a/dom/workers/RuntimeService.cpp
619
+ +++ b/dom/workers/RuntimeService.cpp
620
+ @@ -1065,7 +1065,7 @@ void PrefLanguagesChanged(const char* /* aPrefName */, void* /* aClosure */) {
621
+ AssertIsOnMainThread();
622
+
623
+ nsTArray<nsString> languages;
624
+ - Navigator::GetAcceptLanguages(languages);
625
+ + Navigator::GetAcceptLanguages(nullptr, languages);
626
+
627
+ RuntimeService* runtime = RuntimeService::GetService();
628
+ if (runtime) {
629
+ @@ -1269,8 +1269,7 @@ bool RuntimeService::RegisterWorker(WorkerPrivate* aWorkerPrivate) {
630
+ }
631
+
632
+ // The navigator overridden properties should have already been read.
633
+ -
634
+ - Navigator::GetAcceptLanguages(mNavigatorProperties.mLanguages);
635
+ + Navigator::GetAcceptLanguages(nullptr, mNavigatorProperties.mLanguages);
636
+ mNavigatorPropertiesLoaded = true;
637
+ }
638
+
551
639
diff --git a/extensions/permissions/nsPermissionManager.cpp b/extensions/permissions/nsPermissionManager.cpp
552
640
index 5de630a1db847a09651b310928bb7bc4d4f66f29..0268bc2bdfb3bfda2ef6e01a5dd24209723903fa 100644
553
641
--- a/extensions/permissions/nsPermissionManager.cpp
@@ -2610,10 +2698,10 @@ index 0000000000000000000000000000000000000000..be70ea364f9534bb3b344f64970366c3
2610
2698
+
2611
2699
diff --git a/juggler/content/PageAgent.js b/juggler/content/PageAgent.js
2612
2700
new file mode 100644
2613
- index 0000000000000000000000000000000000000000..2fbf254062eef50c2298916120f83a8000a5388d
2701
+ index 0000000000000000000000000000000000000000..17ddd1ac290baf820bd9aa1b6aaf629f6627dc65
2614
2702
--- /dev/null
2615
2703
+++ b/juggler/content/PageAgent.js
2616
- @@ -0,0 +1,940 @@
2704
+ @@ -0,0 +1,945 @@
2617
2705
+ "use strict";
2618
2706
+ const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
2619
2707
+ const Ci = Components.interfaces;
@@ -2790,6 +2878,7 @@ index 0000000000000000000000000000000000000000..2fbf254062eef50c2298916120f83a80
2790
2878
+ setFileInputFiles: this._setFileInputFiles.bind(this),
2791
2879
+ setInterceptFileChooserDialog: this._setInterceptFileChooserDialog.bind(this),
2792
2880
+ setGeolocationOverride: this._setGeolocationOverride.bind(this),
2881
+ + setLanguageOverride: this._setLanguageOverride.bind(this),
2793
2882
+ }),
2794
2883
+ ];
2795
2884
+ this._enabled = false;
@@ -2952,6 +3041,10 @@ index 0000000000000000000000000000000000000000..2fbf254062eef50c2298916120f83a80
2952
3041
+ }
2953
3042
+ }
2954
3043
+
3044
+ + _setLanguageOverride({ language }) {
3045
+ + this._docShell.languageOverride = language;
3046
+ + }
3047
+ +
2955
3048
+ _linkClicked(sync, anchorElement) {
2956
3049
+ if (anchorElement.ownerGlobal.docShell !== this._docShell)
2957
3050
+ return;
@@ -5077,10 +5170,10 @@ index 0000000000000000000000000000000000000000..e1f1e21a20768d707a92ffffc8a7c114
5077
5170
+ this.NetworkHandler = NetworkHandler;
5078
5171
diff --git a/juggler/protocol/PageHandler.js b/juggler/protocol/PageHandler.js
5079
5172
new file mode 100644
5080
- index 0000000000000000000000000000000000000000..e0b9ee6f25dc94d7c049fc40a61a1b7e70fa38c2
5173
+ index 0000000000000000000000000000000000000000..c2e7ba3ee96c9d6f3da56a274c760b36816631a0
5081
5174
--- /dev/null
5082
5175
+++ b/juggler/protocol/PageHandler.js
5083
- @@ -0,0 +1,353 @@
5176
+ @@ -0,0 +1,357 @@
5084
5177
+ "use strict";
5085
5178
+
5086
5179
+ const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
@@ -5375,6 +5468,10 @@ index 0000000000000000000000000000000000000000..e0b9ee6f25dc94d7c049fc40a61a1b7e
5375
5468
+ return await this._contentPage.send('setGeolocationOverride', options);
5376
5469
+ }
5377
5470
+
5471
+ + async setLanguageOverride(options) {
5472
+ + return await this._contentPage.send('setLanguageOverride', options);
5473
+ + }
5474
+ +
5378
5475
+ }
5379
5476
+
5380
5477
+ class Dialog {
@@ -5585,10 +5682,10 @@ index 0000000000000000000000000000000000000000..78b6601b91d0b7fcda61114e6846aa07
5585
5682
+ this.EXPORTED_SYMBOLS = ['t', 'checkScheme'];
5586
5683
diff --git a/juggler/protocol/Protocol.js b/juggler/protocol/Protocol.js
5587
5684
new file mode 100644
5588
- index 0000000000000000000000000000000000000000..c915c4b2c1dde6941c9fcf424b0a6de36dea0088
5685
+ index 0000000000000000000000000000000000000000..cb775900073f83e5e6892b84f8ff782dc8f5bc04
5589
5686
--- /dev/null
5590
5687
+++ b/juggler/protocol/Protocol.js
5591
- @@ -0,0 +1,752 @@
5688
+ @@ -0,0 +1,757 @@
5592
5689
+ const {t, checkScheme} = ChromeUtils.import('chrome://juggler/content/protocol/PrimitiveTypes.js');
5593
5690
+
5594
5691
+ // Protocol-specific types.
@@ -6315,6 +6412,11 @@ index 0000000000000000000000000000000000000000..c915c4b2c1dde6941c9fcf424b0a6de3
6315
6412
+ longitude: t.Optional(t.Number),
6316
6413
+ accuracy: t.Optional(t.Number)
6317
6414
+ }
6415
+ + },
6416
+ + 'setLanguageOverride': {
6417
+ + params: {
6418
+ + language: t.String,
6419
+ + }
6318
6420
+ }
6319
6421
+ },
6320
6422
+ };
0 commit comments