tor-browser

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

commit 49afdd3f03383104282d0908bcc5761a8d97cf63
parent 563e9d64a2cf1c2558829b4552af683c44b0de82
Author: Pier Angelo Vendrame <pierov@torproject.org>
Date:   Mon,  1 Dec 2025 13:41:42 +0000

Bug 1666613 - Do not rely on intl.css for text direction in parsererror. r=dom-core,hsivonen,firefox-style-system-reviewers,emilio

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

Diffstat:
Mdom/xml/nsXMLContentSink.cpp | 15++++++++-------
Adom/xml/test/file_bug1666613.xml | 1+
Mdom/xml/test/mochitest.toml | 3+++
Adom/xml/test/test_bug1666613.html | 45+++++++++++++++++++++++++++++++++++++++++++++
Mlayout/style/res/ua.css | 5+++++
5 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/dom/xml/nsXMLContentSink.cpp b/dom/xml/nsXMLContentSink.cpp @@ -29,6 +29,7 @@ #include "mozilla/dom/ScriptLoader.h" #include "mozilla/dom/nsCSPUtils.h" #include "mozilla/dom/txMozillaXSLTProcessor.h" +#include "mozilla/intl/LocaleService.h" #include "nsCOMPtr.h" #include "nsCRT.h" #include "nsContentCreatorFunctions.h" @@ -1391,12 +1392,6 @@ nsXMLContentSink::ReportError(const char16_t* aErrorText, } // prepare to set <parsererror> as the document root - rv = HandleProcessingInstruction( - u"xml-stylesheet", - u"href=\"chrome://global/locale/intl.css\" type=\"text/css\""); - NS_ENSURE_SUCCESS(rv, rv); - - const char16_t* noAtts[] = {0, 0}; constexpr auto errorNs = u"http://www.mozilla.org/newlayout/xml/parsererror.xml"_ns; @@ -1405,7 +1400,12 @@ nsXMLContentSink::ReportError(const char16_t* aErrorText, parsererror.Append((char16_t)0xFFFF); parsererror.AppendLiteral("parsererror"); - rv = HandleStartElement(parsererror.get(), noAtts, 0, (uint32_t)-1, 0); + const char16_t* dirAttr[] = {u"dir", u"ltr", 0, 0}; + if (intl::LocaleService::GetInstance()->IsAppLocaleRTL() && + !mDocument->ShouldResistFingerprinting(RFPTarget::JSLocale)) { + dirAttr[1] = u"rtl"; + } + rv = HandleStartElement(parsererror.get(), dirAttr, 0, 2, 0); NS_ENSURE_SUCCESS(rv, rv); rv = HandleCharacterData(aErrorText, NS_strlen(aErrorText), false); @@ -1415,6 +1415,7 @@ nsXMLContentSink::ReportError(const char16_t* aErrorText, sourcetext.Append((char16_t)0xFFFF); sourcetext.AppendLiteral("sourcetext"); + const char16_t* noAtts[] = {0, 0}; rv = HandleStartElement(sourcetext.get(), noAtts, 0, (uint32_t)-1, 0); NS_ENSURE_SUCCESS(rv, rv); diff --git a/dom/xml/test/file_bug1666613.xml b/dom/xml/test/file_bug1666613.xml @@ -0,0 +1 @@ +<invalid diff --git a/dom/xml/test/mochitest.toml b/dom/xml/test/mochitest.toml @@ -4,6 +4,7 @@ support-files = [ "file_bug293347xslt.xml", "file_bug343870.xml", "file_bug691215.xml", + "file_bug1666613.xml", ] ["test_bug232004.xhtml"] @@ -19,3 +20,5 @@ skip-if = [ "http2", "http3", ] + +["test_bug1666613.html"] diff --git a/dom/xml/test/test_bug1666613.html b/dom/xml/test/test_bug1666613.html @@ -0,0 +1,45 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Test for Bug 1666613</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> + <style>iframe { width: 90%; }</style> +</head> +<body> +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1666613">Mozilla Bug 691215</a> +<p id="display"></p> +<script class="testbody" type="text/javascript"> + +SimpleTest.waitForExplicitFinish(); + +function checkDir(expected) { + return new Promise(resolve => { + let iframe = document.createElement("iframe"); + document.body.append(iframe); + iframe.onload = () => { + let parserError = iframe.contentDocument.documentElement; + is(parserError.getAttribute("dir"), expected); + resolve(); + }; + iframe.src = "file_bug1666613.xml"; + }); +} + +async function sanityTest() { + await checkDir("ltr"); + await pseudoBidiTest(); +} + +async function pseudoBidiTest() { + await SpecialPowers.pushPrefEnv({ + set: [["intl.l10n.pseudo", "bidi"]] + }); + await checkDir("rtl"); + SimpleTest.finish(); +} + +sanityTest(); +</script> +</body> +</html> diff --git a/layout/style/res/ua.css b/layout/style/res/ua.css @@ -444,6 +444,10 @@ parsererror|parsererror { color: black; } +parsererror|parsererror[dir="rtl"] { + direction: rtl; +} + parsererror|sourcetext { display: block; white-space: pre; @@ -453,6 +457,7 @@ parsererror|sourcetext { color: red; font-weight: bold; font-size: 12pt; + direction: ltr; } /* Custom content container in the CanvasFrame, positioned on top of everything