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:
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();