blob: f5df953142cf8c134d5457ea92bd209ee722581a [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test() {
let nodeStyles = null;
let suite = InspectorTest.createAsyncSuite("AddCSSProperty");
function getMatchedStyle(selector, resolve) {
for (let rule of nodeStyles.matchedRules) {
if (rule.selectorText === selector)
return rule.style;
}
InspectorTest.fail(`No style found for selector "${selector}"`);
resolve();
}
suite.addTestCase({
name: "AddCSSProperty.AppendAfterMissingSemicolon",
test(resolve, reject) {
let styleDeclaration = getMatchedStyle(".rule-a", resolve);
styleDeclaration.locked = true;
let newProperty = styleDeclaration.newBlankProperty(1);
newProperty.name = "color";
newProperty.rawValue = "green";
InspectorTest.expectEqual(styleDeclaration.text, `\n font-size: 14px;\n color: green;\n`, "`color: green` property should be appended.");
styleDeclaration.locked = false;
resolve();
}
});
suite.addTestCase({
name: "AddCSSProperty.InsertBeforeAndAfter",
test(resolve, reject) {
let styleDeclaration = getMatchedStyle(".rule-b", resolve);
styleDeclaration.locked = true;
let newProperty = styleDeclaration.newBlankProperty(0);
newProperty.name = "color";
newProperty.rawValue = "green";
let expected = `\n color: green;\n outline: 2px solid brown;\n`;
InspectorTest.expectEqual(styleDeclaration.text, expected, "`color: green` property should be inserted before the first property.");
styleDeclaration = getMatchedStyle(".rule-b", resolve);
newProperty = styleDeclaration.newBlankProperty(2);
newProperty.name = "display";
newProperty.rawValue = "block";
expected = `\n color: green;\n outline: 2px solid brown;\n display: block;\n`;
InspectorTest.expectEqual(styleDeclaration.text, expected, "`display: block` property should be appended at the end.");
styleDeclaration.locked = false;
resolve();
}
});
suite.addTestCase({
name: "AddCSSProperty.InsertBetween",
test(resolve, reject) {
let styleDeclaration = getMatchedStyle(".rule-c", resolve);
styleDeclaration.locked = true;
let newProperty = styleDeclaration.newBlankProperty(1);
newProperty.name = "font-family";
newProperty.rawValue = "fantasy";
let expected = `\n background-color: peachpuff;\n font-family: fantasy;\n color: burlywood;\n`;
InspectorTest.expectEqual(styleDeclaration.text, expected, "`font-family: fantasy` property should be inserted after the first property.");
styleDeclaration.locked = false;
resolve();
}
});
suite.addTestCase({
name: "AddCSSProperty.AppendAfterCommentedOutProperty",
test(resolve, reject) {
let styleDeclaration = getMatchedStyle(".rule-d", resolve);
styleDeclaration.locked = true;
let newProperty = styleDeclaration.newBlankProperty(2);
newProperty.name = "display";
newProperty.rawValue = "inline";
const expected = `\n font-size: 14px;\n /* color: red; */\n display: inline;\n`;
InspectorTest.expectEqual(styleDeclaration.text, expected, "`display: inline` property should be appended.");
styleDeclaration.locked = false;
resolve();
}
});
suite.addTestCase({
name: "AddCSSProperty.AppendAfterCommentedOutPropertyWithoutSemicolon",
test(resolve, reject) {
let styleDeclaration = getMatchedStyle(".rule-e", resolve);
styleDeclaration.locked = true;
let newProperty = styleDeclaration.newBlankProperty(2);
newProperty.name = "display";
newProperty.rawValue = "inline";
const expected = `\n font-size: 14px;\n /* color: red; */\n display: inline;\n`;
InspectorTest.expectEqual(styleDeclaration.text, expected, "`display: inline` property should be appended.");
styleDeclaration.locked = false;
resolve();
}
});
WI.domManager.requestDocument((documentNode) => {
documentNode.querySelector("#x", (contentNodeId) => {
if (contentNodeId) {
let domNode = WI.domManager.nodeForId(contentNodeId);
nodeStyles = WI.cssManager.stylesForNode(domNode);
if (nodeStyles.needsRefresh) {
nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
suite.runTestCasesAndFinish()
});
} else
suite.runTestCasesAndFinish();
} else {
InspectorTest.fail("DOM node not found.");
InspectorTest.completeTest();
}
});
});
}
</script>
</head>
<body onload="runTest()">
<p>Testing that CSSStyleDeclaration updates after inserting new CSS properties.</p>
<style>
.rule-a {font-size: 14px}
.rule-b {
outline: 2px solid brown;
}
.rule-c {
background-color: peachpuff;
color: burlywood
}
.rule-d {
font-size: 14px;
/* color: red; */
}
.rule-e {
font-size: 14px;
/* color: red */
}
</style>
<div id="x" class="rule-a rule-b rule-c rule-d rule-e" style="width: 100px"></div>
</body>
</html>