From 840e69b85ca8017e9cb7835a8290d1982c495680 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Fri, 20 Mar 2020 17:03:20 -0700 Subject: [PATCH] browser(firefox): emulate language (#1452) https://github.com/pavelfeldman/gecko-dev/commit/1e29e6f2311520dfc560ba31787186aa1eac2785 --- browser_patches/firefox/BUILD_NUMBER | 2 +- .../firefox/patches/bootstrap.diff | 130 ++++++++++++++++-- 2 files changed, 117 insertions(+), 15 deletions(-) diff --git a/browser_patches/firefox/BUILD_NUMBER b/browser_patches/firefox/BUILD_NUMBER index 408adce179..026c5e4b8f 100644 --- a/browser_patches/firefox/BUILD_NUMBER +++ b/browser_patches/firefox/BUILD_NUMBER @@ -1 +1 @@ -1044 +1045 diff --git a/browser_patches/firefox/patches/bootstrap.diff b/browser_patches/firefox/patches/bootstrap.diff index 7721f77196..64929d483c 100644 --- a/browser_patches/firefox/patches/bootstrap.diff +++ b/browser_patches/firefox/patches/bootstrap.diff @@ -138,7 +138,7 @@ index 040c7b124dec6bb254563bbe74fe50012cb077a3..b4e6b8132786af70e8ad0dce88b67c28 const transportProvider = { setListener(upgradeListener) { diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp -index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344ddf2f9464 100644 +index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..74d392e71ce3a0b1a0c640cc9149777794164e7b 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -53,6 +53,7 @@ @@ -174,7 +174,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d if (!isSubFrame && !isRoot) { /* * We don't want to send OnLocationChange notifications when -@@ -3363,6 +3368,72 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) { +@@ -3363,6 +3368,85 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) { return NS_OK; } @@ -203,6 +203,19 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d +} + +NS_IMETHODIMP ++nsDocShell::GetLanguageOverride(nsAString& aLanguageOverride) { ++ MOZ_ASSERT(aEnabled); ++ aLanguageOverride = mLanguageOverride; ++ return NS_OK; ++} ++ ++NS_IMETHODIMP ++nsDocShell::SetLanguageOverride(const nsAString& aLanguageOverride) { ++ mLanguageOverride = aLanguageOverride; ++ return NS_OK; ++} ++ ++NS_IMETHODIMP +nsDocShell::GetFileInputInterceptionEnabled(bool* aEnabled) { + MOZ_ASSERT(aEnabled); + *aEnabled = mFileInputInterceptionEnabled; @@ -247,7 +260,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d NS_IMETHODIMP nsDocShell::GetIsNavigating(bool* aOut) { *aOut = mIsNavigating; -@@ -12138,6 +12209,9 @@ class OnLinkClickEvent : public Runnable { +@@ -12138,6 +12222,9 @@ class OnLinkClickEvent : public Runnable { mNoOpenerImplied, nullptr, nullptr, mIsUserTriggered, mTriggeringPrincipal, mCsp); } @@ -257,7 +270,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d return NS_OK; } -@@ -12227,6 +12301,9 @@ nsresult nsDocShell::OnLinkClick( +@@ -12227,6 +12314,9 @@ nsresult nsDocShell::OnLinkClick( this, aContent, aURI, target, aFileName, aPostDataStream, aHeadersDataStream, noOpenerImplied, aIsUserTriggered, aIsTrusted, aTriggeringPrincipal, aCsp); @@ -268,7 +281,7 @@ index 344bd4a9f524616b98c664d4fb2b2154927ea7c8..abcc9be78508a9788c3b4872a1eb344d } diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h -index bd8327aae45f1d56acf0d5e61519c7cf469462f3..89cb1a417f129b75ee7e6ec322d121d579d25ef0 100644 +index bd8327aae45f1d56acf0d5e61519c7cf469462f3..bb1bdf6aadf8276ed46c435e00e0bc4ff9ce91df 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -13,6 +13,7 @@ @@ -310,18 +323,19 @@ index bd8327aae45f1d56acf0d5e61519c7cf469462f3..89cb1a417f129b75ee7e6ec322d121d5 // Handles retrieval of subframe session history for nsDocShell::LoadURI. If a // load is requested in a subframe of the current DocShell, the subframe // loadType may need to reflect the loadType of the parent document, or in -@@ -1296,6 +1307,9 @@ class nsDocShell final : public nsDocLoader, +@@ -1296,6 +1307,10 @@ class nsDocShell final : public nsDocLoader, bool mUseStrictSecurityChecks : 1; bool mObserveErrorPages : 1; bool mCSSErrorReportingEnabled : 1; + bool mFileInputInterceptionEnabled: 1; + bool mBypassCSPEnabled : 1; ++ nsString mLanguageOverride; + RefPtr mGeolocationOverrideService; bool mAllowAuth : 1; bool mAllowKeywordFixup : 1; bool mIsOffScreenBrowser : 1; diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl -index db95b181388e8ab3c074b3b6e036dc971633e396..bd2ab50b8a5a6f6e3b9618061b752ea52caa239c 100644 +index db95b181388e8ab3c074b3b6e036dc971633e396..b550e4abdb37d9ca942796d86758377ecbc3f461 100644 --- a/docshell/base/nsIDocShell.idl +++ b/docshell/base/nsIDocShell.idl @@ -44,6 +44,7 @@ interface nsIURI; @@ -332,7 +346,7 @@ index db95b181388e8ab3c074b3b6e036dc971633e396..bd2ab50b8a5a6f6e3b9618061b752ea5 interface nsIDocShellLoadInfo; interface nsIEditor; interface nsIEditingSession; -@@ -1132,4 +1133,10 @@ interface nsIDocShell : nsIDocShellTreeItem +@@ -1132,4 +1133,12 @@ interface nsIDocShell : nsIDocShellTreeItem * @see nsISHEntry synchronizeLayoutHistoryState(). */ void synchronizeLayoutHistoryState(); @@ -341,6 +355,8 @@ index db95b181388e8ab3c074b3b6e036dc971633e396..bd2ab50b8a5a6f6e3b9618061b752ea5 + + attribute boolean bypassCSPEnabled; + ++ attribute AString languageOverride; ++ + void setGeolocationOverride(in nsIDOMGeoPosition position); }; diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp @@ -369,6 +385,55 @@ index 394004780db4017d6ff1561febd4b379705c6302..941ef9f97a4851e785edaf25c0913a1c // If this is a data document - no need to set CSP. if (mLoadedAsData) { return NS_OK; +diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp +index 061f19c31fa396d9ff7aedc4c0e175b3d5bf521f..4cf9c16bb1b275debd326ea860e27dd76c4f8a56 100644 +--- a/dom/base/Navigator.cpp ++++ b/dom/base/Navigator.cpp +@@ -313,14 +313,18 @@ void Navigator::GetAppName(nsAString& aAppName, CallerType aCallerType) const { + * An empty array will be returned if there is no valid languages. + */ + /* static */ +-void Navigator::GetAcceptLanguages(nsTArray& aLanguages) { ++void Navigator::GetAcceptLanguages(const nsString* aLanguageOverride, nsTArray& aLanguages) { + MOZ_ASSERT(NS_IsMainThread()); + + aLanguages.Clear(); + + // E.g. "de-de, en-us,en". + nsAutoString acceptLang; +- Preferences::GetLocalizedString("intl.accept_languages", acceptLang); ++ if (aLanguageOverride && aLanguageOverride->Length()) ++ acceptLang = *aLanguageOverride; ++ else ++ Preferences::GetLocalizedString("intl.accept_languages", acceptLang); ++ + + // Split values on commas. + nsCharSeparatedTokenizer langTokenizer(acceptLang, ','); +@@ -376,7 +380,9 @@ void Navigator::GetLanguage(nsAString& aLanguage) { + } + + void Navigator::GetLanguages(nsTArray& aLanguages) { +- GetAcceptLanguages(aLanguages); ++ nsString languageOverride; ++ mWindow->GetDocShell()->GetLanguageOverride(languageOverride); ++ GetAcceptLanguages(&languageOverride, aLanguages); + + // The returned value is cached by the binding code. The window listen to the + // accept languages change and will clear the cache when needed. It has to +diff --git a/dom/base/Navigator.h b/dom/base/Navigator.h +index 1ad4f2a680177e309ff3614b17663201c8c3b68e..a867a49b16475f2a5f8be68967568bf571731ca7 100644 +--- a/dom/base/Navigator.h ++++ b/dom/base/Navigator.h +@@ -218,7 +218,7 @@ class Navigator final : public nsISupports, public nsWrapperCache { + + StorageManager* Storage(); + +- static void GetAcceptLanguages(nsTArray& aLanguages); ++ static void GetAcceptLanguages(const nsString* aLanguageOverride, nsTArray& aLanguages); + + dom::MediaCapabilities* MediaCapabilities(); + dom::MediaSession* MediaSession(); diff --git a/dom/geolocation/Geolocation.cpp b/dom/geolocation/Geolocation.cpp index f2bb0d880f179bb37e915fe5b32692ac4307ecf7..835c8f9098ffe4f63aeac0286faa33ade21f9a0f 100644 --- a/dom/geolocation/Geolocation.cpp @@ -548,6 +613,29 @@ index f0c28cfdae1c9ac33013e9688e0142d161763543..a38ab106e37dbab58e91ef5a873f8954 nsAutoString policyStr( nsContentUtils::TrimWhitespace( aPolicyStr)); +diff --git a/dom/workers/RuntimeService.cpp b/dom/workers/RuntimeService.cpp +index ddc2aac728a772d4830504419d63123ffc4ee928..4a9fd6d8a437c0fefce144d85c3274672ab54ea3 100644 +--- a/dom/workers/RuntimeService.cpp ++++ b/dom/workers/RuntimeService.cpp +@@ -1065,7 +1065,7 @@ void PrefLanguagesChanged(const char* /* aPrefName */, void* /* aClosure */) { + AssertIsOnMainThread(); + + nsTArray languages; +- Navigator::GetAcceptLanguages(languages); ++ Navigator::GetAcceptLanguages(nullptr, languages); + + RuntimeService* runtime = RuntimeService::GetService(); + if (runtime) { +@@ -1269,8 +1269,7 @@ bool RuntimeService::RegisterWorker(WorkerPrivate* aWorkerPrivate) { + } + + // The navigator overridden properties should have already been read. +- +- Navigator::GetAcceptLanguages(mNavigatorProperties.mLanguages); ++ Navigator::GetAcceptLanguages(nullptr, mNavigatorProperties.mLanguages); + mNavigatorPropertiesLoaded = true; + } + diff --git a/extensions/permissions/nsPermissionManager.cpp b/extensions/permissions/nsPermissionManager.cpp index 5de630a1db847a09651b310928bb7bc4d4f66f29..0268bc2bdfb3bfda2ef6e01a5dd24209723903fa 100644 --- a/extensions/permissions/nsPermissionManager.cpp @@ -2610,10 +2698,10 @@ index 0000000000000000000000000000000000000000..be70ea364f9534bb3b344f64970366c3 + diff --git a/juggler/content/PageAgent.js b/juggler/content/PageAgent.js new file mode 100644 -index 0000000000000000000000000000000000000000..2fbf254062eef50c2298916120f83a8000a5388d +index 0000000000000000000000000000000000000000..17ddd1ac290baf820bd9aa1b6aaf629f6627dc65 --- /dev/null +++ b/juggler/content/PageAgent.js -@@ -0,0 +1,940 @@ +@@ -0,0 +1,945 @@ +"use strict"; +const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); +const Ci = Components.interfaces; @@ -2790,6 +2878,7 @@ index 0000000000000000000000000000000000000000..2fbf254062eef50c2298916120f83a80 + setFileInputFiles: this._setFileInputFiles.bind(this), + setInterceptFileChooserDialog: this._setInterceptFileChooserDialog.bind(this), + setGeolocationOverride: this._setGeolocationOverride.bind(this), ++ setLanguageOverride: this._setLanguageOverride.bind(this), + }), + ]; + this._enabled = false; @@ -2952,6 +3041,10 @@ index 0000000000000000000000000000000000000000..2fbf254062eef50c2298916120f83a80 + } + } + ++ _setLanguageOverride({ language }) { ++ this._docShell.languageOverride = language; ++ } ++ + _linkClicked(sync, anchorElement) { + if (anchorElement.ownerGlobal.docShell !== this._docShell) + return; @@ -5077,10 +5170,10 @@ index 0000000000000000000000000000000000000000..e1f1e21a20768d707a92ffffc8a7c114 +this.NetworkHandler = NetworkHandler; diff --git a/juggler/protocol/PageHandler.js b/juggler/protocol/PageHandler.js new file mode 100644 -index 0000000000000000000000000000000000000000..e0b9ee6f25dc94d7c049fc40a61a1b7e70fa38c2 +index 0000000000000000000000000000000000000000..c2e7ba3ee96c9d6f3da56a274c760b36816631a0 --- /dev/null +++ b/juggler/protocol/PageHandler.js -@@ -0,0 +1,353 @@ +@@ -0,0 +1,357 @@ +"use strict"; + +const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js'); @@ -5375,6 +5468,10 @@ index 0000000000000000000000000000000000000000..e0b9ee6f25dc94d7c049fc40a61a1b7e + return await this._contentPage.send('setGeolocationOverride', options); + } + ++ async setLanguageOverride(options) { ++ return await this._contentPage.send('setLanguageOverride', options); ++ } ++ +} + +class Dialog { @@ -5585,10 +5682,10 @@ index 0000000000000000000000000000000000000000..78b6601b91d0b7fcda61114e6846aa07 +this.EXPORTED_SYMBOLS = ['t', 'checkScheme']; diff --git a/juggler/protocol/Protocol.js b/juggler/protocol/Protocol.js new file mode 100644 -index 0000000000000000000000000000000000000000..c915c4b2c1dde6941c9fcf424b0a6de36dea0088 +index 0000000000000000000000000000000000000000..cb775900073f83e5e6892b84f8ff782dc8f5bc04 --- /dev/null +++ b/juggler/protocol/Protocol.js -@@ -0,0 +1,752 @@ +@@ -0,0 +1,757 @@ +const {t, checkScheme} = ChromeUtils.import('chrome://juggler/content/protocol/PrimitiveTypes.js'); + +// Protocol-specific types. @@ -6315,6 +6412,11 @@ index 0000000000000000000000000000000000000000..c915c4b2c1dde6941c9fcf424b0a6de3 + longitude: t.Optional(t.Number), + accuracy: t.Optional(t.Number) + } ++ }, ++ 'setLanguageOverride': { ++ params: { ++ language: t.String, ++ } + } + }, +};