diff options
Diffstat (limited to 'layout/inspector/tests/test_getCSSStyleRules.html')
-rw-r--r-- | layout/inspector/tests/test_getCSSStyleRules.html | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/layout/inspector/tests/test_getCSSStyleRules.html b/layout/inspector/tests/test_getCSSStyleRules.html new file mode 100644 index 0000000000..e504c3294b --- /dev/null +++ b/layout/inspector/tests/test_getCSSStyleRules.html @@ -0,0 +1,204 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Test for bug 1359217</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"> +</head> +<body> +<iframe id="test"></iframe> +<pre id="log"> +<script> +/** + * This test checks that getCSSStyleRules returns correct style set in + * various cases. To avoid effects from UA sheets, most of the tests use + * an element with "unknowntagname". + */ + +const InspectorUtils = SpecialPowers.InspectorUtils; + +let iframe = document.getElementById("test"); + +SimpleTest.waitForExplicitFinish(); + +function* getStyleRules(elem) { + let rules = InspectorUtils.getCSSStyleRules(elem); + for (let i = 0; i < rules.length; i++) { + yield rules[i]; + } +} + +// This will check that value of z-index property declarations in the +// rules from getCSSStyleRules matches the given content. +function checkRules(doc, rulesContent, queryStr = "unknowntagname") { + let elem = doc.querySelector(queryStr); + let rules = [...getStyleRules(elem)]; + is(rules.length, rulesContent.length, "Rule length should match"); + if (rules.length != rulesContent.length) { + return; + } + for (let i = 0; i < rules.length; i++) { + let style = rules[i].style; + let expectation = rulesContent[i].toString(); + is(style.length, 1, "Should contain only one declaration"); + is(style.zIndex, expectation, "Should match expectation"); + } +} + +const tests = [ + { + title: "Add new stylesheet", + async run(doc) { + checkRules(doc, [1]); + let link = doc.createElement("link"); + link.rel = "stylesheet"; + link.href = "getCSSStyleRules-2.css"; + let load = new Promise(resolve => { link.onload = resolve; }); + doc.head.appendChild(link); + await load; + checkRules(doc, [1, 2]); + }, + }, + { + title: "Remove stylesheet", + async run(doc) { + checkRules(doc, [1]); + doc.querySelector("link").remove(); + checkRules(doc, []); + }, + }, + { + title: "Enable stylesheet", + async run(doc) { + // Set disabled flag before we invoke the utils. + let link = doc.querySelector("link"); + link.sheet.disabled = true; + checkRules(doc, []); + link.sheet.disabled = false; + checkRules(doc, [1]); + }, + }, + { + title: "Disable stylesheet", + async run(doc) { + checkRules(doc, [1]); + doc.querySelector("link").sheet.disabled = true; + checkRules(doc, []); + }, + }, + { + title: "Change stylesheet set", + base: "alternate", + async run(doc) { + checkRules(doc, []); + doc.selectedStyleSheetSet = "x"; + checkRules(doc, [1]); + doc.selectedStyleSheetSet = ""; + checkRules(doc, []); + }, + }, + { + title: "Add and remove rules", + async run(doc) { + checkRules(doc, [1]); + + let sheet = doc.querySelector("link").sheet; + info("Inserting style rule"); + sheet.insertRule("unknowntagname { z-index: 3; }", 1); + checkRules(doc, [1, 3]); + + info("Removing style rule"); + sheet.deleteRule(0); + checkRules(doc, [3]); + + info("Inserting media rule"); + sheet.insertRule("@media all { unknowntagname { z-index: 4; } }", 1); + checkRules(doc, [3, 4]); + + info("Inserting supports rule"); + sheet.insertRule( + "@supports (z-index: 0) { unknowntagname { z-index: 5; } }", 1); + checkRules(doc, [3, 5, 4]); + + info("Inserting import rule"); + sheet.insertRule("@import url(getCSSStyleRules-2.css);", 0); + // There is no notification we can get when the associated style + // sheet gets loaded, so we have to query it. + while (true) { + try { + sheet.cssRules[0].styleSheet.cssRules; + break; + } catch (e) { + if (e.name == "InvalidAccessError") { + await new Promise(resolve => requestAnimationFrame(resolve)); + } else { + throw e; + } + } + } + checkRules(doc, [2, 3, 5, 4]); + + info("Removing supports rule"); + sheet.deleteRule(2); + checkRules(doc, [2, 3, 4]); + + info("Removing media rule"); + sheet.deleteRule(2); + checkRules(doc, [2, 3]); + + info("Removing import rule"); + sheet.deleteRule(0); + checkRules(doc, [3]); + }, + }, + { + title: "Check UA sheets", + async run(doc) { + doc.querySelector("link").remove(); + checkRules(doc, []); + let elem = doc.querySelector("unknowntagname"); + elem.setAttribute("dir", ""); + let seenUnicodeBidi = false; + for (let rule of getStyleRules(elem)) { + if (rule.style.unicodeBidi == "isolate") { + seenUnicodeBidi = true; + break; + } + } + ok(seenUnicodeBidi, "Should have unicode-bidi " + + "declaration from UA stylesheet html.css"); + }, + }, + { + title: "Check adopted sheets", + async run(doc, win) { + checkRules(doc, [1]); + let sheet = new win.CSSStyleSheet(); + sheet.replaceSync(`unknowntagname { z-index: 5 }`); + doc.adoptedStyleSheets.push(sheet); + checkRules(doc, [1, 5]); + }, + }, +]; + +add_task(async function runTests() { + for (let i = 0; i < tests.length; i++) { + let test = tests[i]; + info(`Test ${i}: ${test.title}`); + iframe.src = "about:blank"; + if (!test.base) { + test.base = "default"; + } + iframe.src = `file_getCSSStyleRules-${test.base}.html`; + await new Promise(resolve => { iframe.onload = resolve; }); + try { + await test.run(iframe.contentDocument, iframe.contentWindow); + } catch (e) { + ok(false, "JavaScript error: " + e); + } + } +}); +</script> +</pre> +</body> +</html> |