| <html> | |
| <head> | |
| <script src="../../http/tests/inspector/resources/protocol-test.js"></script> | |
| <style> | |
| .empty-rule { | |
| } | |
| </style> | |
| <style> | |
| .parent-without-declarations { | |
| .child-rule { | |
| color: red; | |
| } | |
| } | |
| </style> | |
| <script> | |
| function test() { | |
| let suite = ProtocolTest.createAsyncSuite("CSS.setStyleText.NoDeclarations"); | |
| async function authorRuleForSelector(elementSelector, selectorText) { | |
| let { root } = await InspectorProtocol.awaitCommand({ method: "DOM.getDocument" }); | |
| let { nodeId } = await InspectorProtocol.awaitCommand({ | |
| method: "DOM.querySelector", | |
| params: { nodeId: root.nodeId, selector: elementSelector }, | |
| }); | |
| let { matchedCSSRules } = await InspectorProtocol.awaitCommand({ | |
| method: "CSS.getMatchedStylesForNode", | |
| params: { nodeId }, | |
| }); | |
| return matchedCSSRules | |
| .map(({ rule }) => rule) | |
| .find((rule) => rule.origin === "author" && rule.selectorList.text === selectorText); | |
| } | |
| async function styleSheetText(styleSheetId) { | |
| let { text } = await InspectorProtocol.awaitCommand({ | |
| method: "CSS.getStyleSheetText", | |
| params: { styleSheetId }, | |
| }); | |
| return text; | |
| } | |
| suite.addTestCase({ | |
| name: "CSS.setStyleText.NoDeclarations.EmptyRule", | |
| description: "Setting the first declaration of a rule with an empty body should write it to the style sheet text.", | |
| test: async () => { | |
| let rule = await authorRuleForSelector("#empty-rule-target", ".empty-rule"); | |
| ProtocolTest.expectNotNull(rule, "Should find the `.empty-rule` author rule."); | |
| if (!rule) | |
| return; | |
| ProtocolTest.expectEqual(rule.style.cssProperties.length, 0, "Rule should start with no declarations."); | |
| let { style } = await InspectorProtocol.awaitCommand({ | |
| method: "CSS.setStyleText", | |
| params: { styleId: rule.style.styleId, text: "color: green;" }, | |
| }); | |
| ProtocolTest.expectEqual(style.cssProperties.length, 1, "Style should have one declaration after the edit."); | |
| ProtocolTest.expectEqual(style.cssProperties[0].text, "color: green;", "Declaration text should be `color: green;`."); | |
| ProtocolTest.expectNotNull(style.cssProperties[0].range, "Declaration should have a source range."); | |
| ProtocolTest.expectEqual(await styleSheetText(rule.ruleId.styleSheetId), "\n.empty-rule {color: green;}\n", "Style sheet text should contain the new declaration."); | |
| }, | |
| }); | |
| suite.addTestCase({ | |
| name: "CSS.setStyleText.NoDeclarations.ParentOfOnlyChildRules", | |
| description: "Setting the first declaration of a style rule that only contains child rules should not overwrite those child rules.", | |
| test: async () => { | |
| let rule = await authorRuleForSelector("#parent-without-declarations-target", ".parent-without-declarations"); | |
| ProtocolTest.expectNotNull(rule, "Should find the `.parent-without-declarations` author rule."); | |
| if (!rule) | |
| return; | |
| ProtocolTest.expectEqual(rule.style.cssProperties.length, 0, "Rule should start with no declarations of its own."); | |
| let { style } = await InspectorProtocol.awaitCommand({ | |
| method: "CSS.setStyleText", | |
| params: { styleId: rule.style.styleId, text: "color: green;" }, | |
| }); | |
| ProtocolTest.expectEqual(style.cssProperties.length, 1, "Style should have one declaration after the edit."); | |
| ProtocolTest.expectNotNull(style.cssProperties[0].range, "Declaration should have a source range."); | |
| let text = await styleSheetText(rule.ruleId.styleSheetId); | |
| ProtocolTest.expectTrue(text.includes(".child-rule {\n color: red;\n }"), "Style sheet text should still contain the untouched child rule."); | |
| ProtocolTest.expectEqual(text, "\n.parent-without-declarations {color: green;\n .child-rule {\n color: red;\n }\n}\n", "New declaration should be inserted at the start of the rule body."); | |
| }, | |
| }); | |
| suite.runTestCasesAndFinish(); | |
| } | |
| </script> | |
| </head> | |
| <body onload="runTest()"> | |
| <p>Tests that CSS.setStyleText writes the first declaration of a rule that has none into the style sheet text.</p> | |
| <div id="empty-rule-target" class="empty-rule"></div> | |
| <div id="parent-without-declarations-target" class="parent-without-declarations"><div class="child-rule"></div></div> | |
| </body> | |
| </html> |