| var testCount = 17; |
| var testDocuments = []; |
| var testSheets = []; |
| var expectedResults = []; |
| |
| function buildTestFrame(content) |
| { |
| var iframe = document.createElement("iframe"); |
| iframe.setAttribute("width", "100"); |
| iframe.setAttribute("height", "50"); |
| document.body.appendChild(iframe); |
| var iframeDocument = iframe.contentDocument; |
| iframeDocument.body.innerHTML = content; |
| return iframeDocument; |
| } |
| |
| function buildTestFrames(content) |
| { |
| for (var i = 0; i < testCount; ++i) |
| testDocuments.push(buildTestFrame(content)); |
| } |
| |
| function printRules(ruleList) |
| { |
| for (var i = 0; i < ruleList.length; ++i) |
| debug(ruleList[i].cssText); |
| } |
| |
| function printTestResults(index) |
| { |
| testElement = testDocuments[index].getElementById('testdiv'); |
| |
| debug("Test " + index); |
| debug("--------------------------------------"); |
| shouldBe("getComputedStyle(testElement, null).getPropertyValue('background-color')", expectedResults[index]); |
| debug(""); |
| printRules(testSheets[index].cssRules); |
| debug(""); |
| } |
| |
| function finishedTests() |
| { |
| for (var i = 0; i < testSheets.length; ++i) |
| printTestResults(i); |
| |
| finishJSTest(); |
| } |
| |
| function ensureCSSOM(ruleList) |
| { |
| // Touch all CSSOM objects to force wrapper creation. |
| for (var i = 0; i < ruleList.length; ++i) { |
| ruleList[i].style; |
| ruleList[i].media; |
| ruleList[i].selectorText; |
| ruleList[i].name; |
| ruleList[i].keyText; |
| ruleList[i].cssText; |
| if (ruleList[i].cssRules) |
| ensureCSSOM(ruleList[i].cssRules); |
| } |
| } |
| |
| function mutationTest(index, testString, expectColor) |
| { |
| var sheet = testSheets[index]; |
| eval(testString); |
| expectedResults[index] = expectColor == "red" ? "'rgb(255, 0, 0)'" : "'rgb(0, 128, 0)'"; |
| } |
| |
| function executeTests(createCSSOMObjectBeforeTest) |
| { |
| if (createCSSOMObjectBeforeTest) { |
| for (var i = 0; i < testSheets.length; ++i) |
| ensureCSSOM(testSheets[i].cssRules); |
| } |
| |
| mutationTest(0, '', 'red'); |
| |
| mutationTest(1, 'sheet.insertRule("#testdiv { background-color: green; }", 3)', 'green'); |
| mutationTest(2, 'sheet.deleteRule(1)'); |
| mutationTest(3, 'sheet.cssRules[1].insertRule("#testdiv { background-color: green; }", 1)', 'green'); |
| mutationTest(4, 'sheet.cssRules[1].deleteRule(0)', 'green'); |
| mutationTest(5, 'sheet.cssRules[1].cssRules[0].style.setProperty("background-color", "green", "")', 'green'); |
| mutationTest(6, 'sheet.cssRules[1].cssRules[0].style.removeProperty("background-color")', 'green'); |
| mutationTest(7, 'sheet.cssRules[1].cssRules[0].style.cssText = "background-color: green"', 'green'); |
| mutationTest(8, 'sheet.cssRules[1].cssRules[0].selectorText = "#dontmatch"', 'green'); |
| mutationTest(9, 'sheet.cssRules[1].media.mediaText = "print"', 'green'); |
| |
| var testString = '\ |
| sheet.cssRules[1].media.appendMedium("print");\ |
| sheet.cssRules[1].media.deleteMedium("all");\ |
| '; |
| mutationTest(10, testString, 'green'); |
| |
| var testString = '\ |
| sheet.deleteRule(2);\ |
| sheet.insertRule("#testdiv { background-color: green; }", 0);\ |
| sheet.deleteRule(1);\ |
| sheet.deleteRule(3);\ |
| sheet.deleteRule(1);\ |
| sheet.deleteRule(1);\ |
| '; |
| mutationTest(11, testString, 'green'); |
| |
| var importRule = '@import "data:text/css;charset=utf-8,%23testdiv%7Bbackground-color%3Agreen%20!important%7D";'; |
| mutationTest(12, "sheet.insertRule('"+importRule+"', 0)", 'green'); |
| |
| mutationTest(13, 'sheet.cssRules[2].selectorText = "foo"', 'red'); |
| mutationTest(14, 'sheet.cssRules[3].insertRule("40% { left: 40px; }")', 'red'); |
| mutationTest(15, 'sheet.cssRules[3].deleteRule("100%")', 'red'); |
| mutationTest(16, 'sheet.cssRules[4].style.setProperty("font-family", "Bar", "")', 'red'); |
| |
| setTimeout(finishedTests, 80); |
| } |
| |
| function runTestsAfterLoadComplete(createCSSOMObjectBeforeTest) |
| { |
| var complete = true; |
| for (var i = 0; i < testDocuments.length; ++i) { |
| var sheet = testDocuments[i].styleSheets.length == 1 ? testDocuments[i].styleSheets[0] : null; |
| if (sheet) |
| testSheets[i] = sheet; |
| else |
| complete = false; |
| } |
| if (!complete) { |
| setTimeout(runTestsAfterLoadComplete, 10); |
| return; |
| } |
| executeTests(createCSSOMObjectBeforeTest); |
| } |
| |
| function runTests(createCSSOMObjectBeforeTest) |
| { |
| buildTestFrames("<link rel=stylesheet href=resources/shared.css><div id=testdiv>Test</div>"); |
| |
| runTestsAfterLoadComplete(createCSSOMObjectBeforeTest); |
| } |