summaryrefslogtreecommitdiffstats
path: root/parser/xml/test/unit/test_sanitizer_style.js
diff options
context:
space:
mode:
Diffstat (limited to 'parser/xml/test/unit/test_sanitizer_style.js')
-rw-r--r--parser/xml/test/unit/test_sanitizer_style.js125
1 files changed, 125 insertions, 0 deletions
diff --git a/parser/xml/test/unit/test_sanitizer_style.js b/parser/xml/test/unit/test_sanitizer_style.js
new file mode 100644
index 0000000000..6f00295cda
--- /dev/null
+++ b/parser/xml/test/unit/test_sanitizer_style.js
@@ -0,0 +1,125 @@
+const { AppConstants } = ChromeUtils.importESModule(
+ "resource://gre/modules/AppConstants.sys.mjs"
+);
+
+if (AppConstants.platform != "android") {
+ // We load HTML documents, which try to track link state, which requires
+ // the history service, which requires a profile.
+ do_get_profile();
+}
+
+const kTestCases = [
+ {
+ // bug 1602843
+ data: `@font-face { font-family: 'ab<\\/style><img src onerror=alert(1)>'}`,
+ sanitized: `@font-face { font-family: 'ab<\\/style><img src onerror=alert(1)>'}`,
+ },
+ {
+ // bug 1680084
+ data: `<!--
+/* Font Definitions */
+@font-face
+ {font-family:"Cambria Math";
+ panose-1:2 4 5 3 5 4 6 3 2 4;}
+@font-face
+ {font-family:"Yu Gothic";
+ panose-1:2 11 4 0 0 0 0 0 0 0;}
+@font-face
+ {font-family:"Yu Gothic";
+ panose-1:2 11 4 0 0 0 0 0 0 0;}
+/* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {margin:0mm;
+ text-align:justify;
+ text-justify:inter-ideograph;
+ font-size:10.5pt;
+ font-family:"Yu Gothic";}
+span.17
+ {mso-style-type:personal-compose;
+ font-family:"Yu Gothic";
+ color:windowtext;}
+.MsoChpDefault
+ {mso-style-type:export-only;
+ font-family:"Yu Gothic";}
+/* Page Definitions */
+@page WordSection1
+ {size:612.0pt 792.0pt;
+ margin:99.25pt 30.0mm 30.0mm 30.0mm;}
+div.WordSection1
+ {page:WordSection1}
+-->`,
+ sanitized: `@font-face
+ {font-family:"Cambria Math";
+ panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
+ {font-family:"Yu Gothic";
+ panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
+ {font-family:"Yu Gothic";
+ panose-1:2 11 4 0 0 0 0 0 0 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {margin:0mm;
+ text-align:justify;
+ text-justify:inter-ideograph;
+ font-size:10.5pt;
+ font-family:"Yu Gothic";}.MsoChpDefault
+ {mso-style-type:export-only;
+ font-family:"Yu Gothic";}div.WordSection1
+ {page:WordSection1}`,
+ },
+];
+
+const kConditionalCSSTestCases = [
+ {
+ data: `#foo { display: none } @media (min-width: 300px) { #bar { display: none } }`,
+ sanitized: `#foo { display: none }`,
+ },
+ {
+ data: `@media (min-width: 300px) { #bar { display: none } }`,
+ sanitized: ``,
+ },
+];
+
+function run_test() {
+ if (AppConstants.platform != "android") {
+ // xpcshell tests are weird. They fake shutdown after the test finishes. This upsets this test
+ // because it will try to create the history service to check for visited state on the links
+ // we're parsing.
+ // Creating the history service midway through shutdown breaks.
+ // We can't catch this in the history component because we're not *actually* shutting down,
+ // and so the app startup's service's `shuttingDown` bool is false, even though normally that
+ // is set to true *before* profile-change-teardown notifications are fired.
+ // To work around this, just force the history service to be created earlier:
+
+ let { PlacesUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/PlacesUtils.sys.mjs"
+ );
+ Assert.ok(
+ PlacesUtils.history.databaseStatus <= 1,
+ "ensure places database is successfully initialized."
+ );
+ }
+
+ var ParserUtils = Cc["@mozilla.org/parserutils;1"].getService(
+ Ci.nsIParserUtils
+ );
+ var sanitizeFlags =
+ ParserUtils.SanitizerDropForms |
+ ParserUtils.SanitizerDropNonCSSPresentation |
+ ParserUtils.SanitizerAllowStyle;
+
+ for (let { data, sanitized } of kTestCases) {
+ let out = ParserUtils.sanitize(`<style>${data}</style>`, sanitizeFlags);
+ info(out);
+ Assert.equal(
+ `<html><head><style>${sanitized}</style></head><body></body></html>`,
+ out
+ );
+ }
+
+ for (let { data, sanitized } of kConditionalCSSTestCases) {
+ let out = ParserUtils.removeConditionalCSS(`<style>${data}</style>`);
+ info(out);
+ Assert.equal(
+ `<html><head><style>${sanitized}</style></head><body></body></html>`,
+ out
+ );
+ }
+}