summaryrefslogtreecommitdiffstats
path: root/layout/style/test/test_non_content_accessible_properties.html
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/test/test_non_content_accessible_properties.html')
-rw-r--r--layout/style/test/test_non_content_accessible_properties.html85
1 files changed, 85 insertions, 0 deletions
diff --git a/layout/style/test/test_non_content_accessible_properties.html b/layout/style/test/test_non_content_accessible_properties.html
new file mode 100644
index 0000000000..220ddf2d26
--- /dev/null
+++ b/layout/style/test/test_non_content_accessible_properties.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe></iframe>
+<iframe srcdoc="Foo"></iframe>
+<script>
+const CHROME_ONLY_PROPERTIES = [
+ "-moz-window-input-region-margin",
+ "-moz-window-shadow",
+ "-moz-window-opacity",
+ "-moz-window-transform",
+ "-moz-window-transform-origin",
+ "-moz-default-appearance",
+ "-moz-user-focus",
+];
+
+const UA_ONLY_PROPERTIES = [
+ "-x-span",
+ "-x-lang",
+ "-x-text-scale",
+ "-moz-control-character-visibility",
+ "-moz-top-layer",
+ "-moz-script-level",
+ "-moz-math-display",
+ "-moz-math-variant",
+ "-moz-inert",
+ "-moz-min-font-size-ratio",
+ // TODO: This should ideally be in CHROME_ONLY_PROPERTIES, but due to how
+ // [Pref] and [ChromeOnly] interact in WebIDL, the former wins.
+ "-moz-context-properties",
+];
+
+function testInWin(win) {
+ const doc = win.document;
+ const sheet = doc.createElement("style");
+ const div = doc.createElement("div");
+ doc.documentElement.appendChild(sheet);
+ doc.documentElement.appendChild(div);
+
+ sheet.textContent = `div { color: initial }`;
+ assert_equals(sheet.sheet.cssRules[0].style.length, 1, `sanity: ${doc.documentURI}`);
+
+ for (const prop of CHROME_ONLY_PROPERTIES.concat(UA_ONLY_PROPERTIES)) {
+ sheet.textContent = `div { ${prop}: initial }`;
+ let block = sheet.sheet.cssRules[0].style;
+ assert_false(prop in block, `${prop} shouldn't be exposed in CSS2Properties`);
+
+ let isUAOnly = UA_ONLY_PROPERTIES.includes(prop);
+ assert_equals(prop in SpecialPowers.wrap(block), !isUAOnly, `${prop} should be exposed to chrome code if needed`);
+
+ assert_equals(
+ block.length,
+ 0,
+ `${prop} shouldn't be parsed in ${doc.documentURI}`
+ );
+ block.setProperty(prop, "initial");
+ assert_equals(
+ block.length,
+ 0,
+ `${prop} shouldn't be settable via CSSOM in ${doc.documentURI}`
+ );
+ assert_equals(
+ win.getComputedStyle(div).getPropertyValue(prop),
+ "",
+ `${prop} shouldn't be accessible via CSSOM in ${doc.documentURI}`
+ );
+ assert_false(
+ win.CSS.supports(prop + ': initial'),
+ `${prop} shouldn't be exposed in CSS.supports in ${doc.documentURI}`
+ );
+ assert_false(
+ win.CSS.supports(prop, 'initial'),
+ `${prop} shouldn't be exposed in CSS.supports in ${doc.documentURI} (2-value version)`
+ );
+ }
+}
+
+let t = async_test("test non-content-accessible props");
+onload = t.step_func_done(function() {
+ testInWin(window);
+ for (let f of document.querySelectorAll("iframe")) {
+ testInWin(f.contentWindow);
+ }
+});
+</script>