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:
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