tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 2e2bb17d71f8de9b1dc59fc93899e368b065ab4a
parent dfe7f6ab0791f55bedb80a08e2a74043ea39f373
Author: Pier Angelo Vendrame <pierov@torproject.org>
Date:   Mon, 24 Nov 2025 12:56:40 +0000

Bug 1985996 - Check spoof english in XMLPrettyPrinter. r=eemeli,smaug

Differential Revision: https://phabricator.services.mozilla.com/D263100

Diffstat:
Mdom/l10n/DOMLocalization.cpp | 6++++++
Mdom/l10n/DOMLocalization.h | 2++
Mdom/l10n/DocumentL10n.cpp | 21+++++++++++++++++++++
Mdom/l10n/DocumentL10n.h | 4++++
Mdom/xml/nsXMLPrettyPrinter.cpp | 8+++++++-
Mintl/l10n/Localization.cpp | 8++++++++
Mintl/l10n/Localization.h | 3+++
7 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/dom/l10n/DOMLocalization.cpp b/dom/l10n/DOMLocalization.cpp @@ -48,6 +48,12 @@ DOMLocalization::DOMLocalization(nsIGlobalObject* aGlobal, bool aIsSync, mMutations = new L10nMutations(this); } +DOMLocalization::DOMLocalization(nsIGlobalObject* aGlobal, bool aIsSync, + const nsTArray<nsCString>& aLocales) + : Localization(aGlobal, aIsSync, aLocales) { + mMutations = new L10nMutations(this); +} + already_AddRefed<DOMLocalization> DOMLocalization::Constructor( const GlobalObject& aGlobal, const Sequence<dom::OwningUTF8StringOrResourceId>& aResourceIds, diff --git a/dom/l10n/DOMLocalization.h b/dom/l10n/DOMLocalization.h @@ -118,6 +118,8 @@ class DOMLocalization : public intl::Localization { DOMLocalization(nsIGlobalObject* aGlobal, bool aSync); DOMLocalization(nsIGlobalObject* aGlobal, bool aIsSync, const intl::ffi::LocalizationRc* aRaw); + DOMLocalization(nsIGlobalObject* aGlobal, bool aSync, + const nsTArray<nsCString>& aLocales); protected: virtual ~DOMLocalization(); diff --git a/dom/l10n/DocumentL10n.cpp b/dom/l10n/DocumentL10n.cpp @@ -48,6 +48,19 @@ RefPtr<DocumentL10n> DocumentL10n::Create(Document* aDocument, bool aSync) { return l10n.forget(); } +RefPtr<DocumentL10n> DocumentL10n::Create(Document* aDocument, bool aSync, + const nsTArray<nsCString>& aLocales) { + RefPtr<DocumentL10n> l10n = new DocumentL10n(aDocument, aSync, aLocales); + + IgnoredErrorResult rv; + l10n->mReady = Promise::Create(l10n->mGlobal, rv); + if (NS_WARN_IF(rv.Failed())) { + return nullptr; + } + + return l10n.forget(); +} + DocumentL10n::DocumentL10n(Document* aDocument, bool aSync) : DOMLocalization(aDocument->GetScopeObject(), aSync), mDocument(aDocument), @@ -55,6 +68,14 @@ DocumentL10n::DocumentL10n(Document* aDocument, bool aSync) mContentSink = do_QueryInterface(aDocument->GetCurrentContentSink()); } +DocumentL10n::DocumentL10n(Document* aDocument, bool aSync, + const nsTArray<nsCString>& aLocales) + : DOMLocalization(aDocument->GetScopeObject(), aSync, aLocales), + mDocument(aDocument), + mState(DocumentL10nState::Constructed) { + mContentSink = do_QueryInterface(aDocument->GetCurrentContentSink()); +} + JSObject* DocumentL10n::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { return DocumentL10n_Binding::Wrap(aCx, this, aGivenProto); diff --git a/dom/l10n/DocumentL10n.h b/dom/l10n/DocumentL10n.h @@ -47,9 +47,13 @@ class DocumentL10n final : public DOMLocalization { NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DocumentL10n, DOMLocalization) static RefPtr<DocumentL10n> Create(Document* aDocument, bool aSync); + static RefPtr<DocumentL10n> Create(Document* aDocument, bool aSync, + const nsTArray<nsCString>& aLocales); protected: explicit DocumentL10n(Document* aDocument, bool aSync); + explicit DocumentL10n(Document* aDocument, bool aSync, + const nsTArray<nsCString>& aLocales); virtual ~DocumentL10n() = default; RefPtr<Document> mDocument; diff --git a/dom/xml/nsXMLPrettyPrinter.cpp b/dom/xml/nsXMLPrettyPrinter.cpp @@ -101,7 +101,13 @@ nsresult nsXMLPrettyPrinter::PrettyPrint(Document* aDocument, // Create a DocumentL10n, as the XML document is not allowed to have one. // Make it sync so that the test for bug 590812 does not require a setTimeout. - RefPtr<DocumentL10n> l10n = DocumentL10n::Create(aDocument, true); + RefPtr<DocumentL10n> l10n; + if (aDocument->ShouldResistFingerprinting(RFPTarget::JSLocale)) { + AutoTArray<nsCString, 1> langs = {nsRFPService::GetSpoofedJSLocale()}; + l10n = DocumentL10n::Create(aDocument, true, langs); + } else { + l10n = DocumentL10n::Create(aDocument, true); + } NS_ENSURE_TRUE(l10n, NS_ERROR_UNEXPECTED); l10n->AddResourceId("dom/XMLPrettyPrint.ftl"_ns); diff --git a/intl/l10n/Localization.cpp b/intl/l10n/Localization.cpp @@ -164,6 +164,14 @@ Localization::Localization(nsIGlobalObject* aGlobal, bool aIsSync, RegisterObservers(); } +Localization::Localization(nsIGlobalObject* aGlobal, bool aIsSync, + const nsTArray<nsCString>& aLocales) + : mGlobal(aGlobal) { + nsTArray<ffi::GeckoResourceId> resIds; + ffi::localization_new_with_locales(&resIds, aIsSync, nullptr, &aLocales, + getter_AddRefs(mRaw)); +} + /* static */ bool Localization::IsAPIEnabled(JSContext* aCx, JSObject* aObject) { JS::Rooted<JSObject*> obj(aCx, aObject); diff --git a/intl/l10n/Localization.h b/intl/l10n/Localization.h @@ -156,6 +156,9 @@ class Localization : public nsIObserver, Localization(nsIGlobalObject* aGlobal, bool aIsSync, const ffi::LocalizationRc* aRaw); + Localization(nsIGlobalObject* aGlobal, bool aIsSync, + const nsTArray<nsCString>& aLocales); + virtual ~Localization(); void RegisterObservers();