Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

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