blob: 462fee62337d92765dfe62cd8f4de0db7c103bca [file] [log] [blame]
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; }", 2)', '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].appendRule("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);
}