| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script> |
| function test() { |
| let suite = InspectorTest.createAsyncSuite("OverriddenProperty"); |
| |
| function logProperty(property) { |
| let text = property.formattedText || "REMOVED"; |
| if (property.overridden) |
| text += " overridden"; |
| InspectorTest.log(text); |
| } |
| |
| function getNodeStyles(selector, callback) { |
| WI.domManager.requestDocument((documentNode) => { |
| WI.domManager.querySelector(documentNode.id, selector, (contentNodeId) => { |
| if (!contentNodeId) { |
| InspectorTest.fail("DOM node not found."); |
| InspectorTest.completeTest(); |
| return; |
| } |
| |
| let domNode = WI.domManager.nodeForId(contentNodeId); |
| let nodeStyles = WI.cssManager.stylesForNode(domNode); |
| |
| if (nodeStyles.needsRefresh) { |
| nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => { |
| callback(nodeStyles); |
| }); |
| } else |
| callback(nodeStyles); |
| }); |
| }); |
| } |
| |
| function getStyleDeclaration(selector, callback, resolve) { |
| getNodeStyles(selector, (nodeStyles) => { |
| let matchedRule = null; |
| for (let rule of nodeStyles.matchedRules) { |
| if (rule.selectorText === selector) { |
| matchedRule = rule; |
| break; |
| } |
| } |
| |
| if (!matchedRule) { |
| InspectorTest.fail(`Couldn't find ${selector}`); |
| resolve(); |
| return; |
| } |
| |
| callback(matchedRule.style) |
| }); |
| } |
| |
| suite.addTestCase({ |
| name: "OverriddenProperty.effectivePropertyRemoved", |
| description: "Test that CSSProperty.prototype.overridden is cleared when the overriding (effective) property is removed.", |
| test(resolve, reject) { |
| getNodeStyles("#x", (nodeStyles) => { |
| let inlineStyle = nodeStyles.inlineStyle; |
| let styleRule = nodeStyles.matchedRules[0]; |
| let inlineStyleProperty = inlineStyle.enabledProperties[0]; |
| let styleRuleProperty = styleRule.style.enabledProperties[0]; |
| |
| function log() { |
| logProperty(inlineStyleProperty); |
| logProperty(styleRuleProperty); |
| InspectorTest.log(""); |
| } |
| |
| log(); |
| |
| inlineStyleProperty.remove(); |
| |
| styleRuleProperty.addEventListener(WI.CSSProperty.Event.OverriddenStatusChanged, (event) => { |
| // FIXME: <https://webkit.org/b/195651> OverriddenStatusChanged may fire more than once. |
| if (styleRuleProperty.overridden) |
| return; |
| |
| InspectorTest.log("OverriddenStatusChanged event fired."); |
| log(); |
| resolve(); |
| }); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "OverriddenProperty.OverriddenByShorthand", |
| test(resolve, reject) { |
| getStyleDeclaration(".longhand-overridden-by-shorthand", (style) => { |
| const dontCreateIfMissing = true; |
| let borderTopColorProperty = style.propertyForName("border-top-color", dontCreateIfMissing); |
| InspectorTest.expectTrue(borderTopColorProperty.overridden, "border-top-color is overridden."); |
| |
| let borderColorProperty = style.propertyForName("border-color", dontCreateIfMissing); |
| InspectorTest.expectFalse(borderColorProperty.overridden, "border-color is NOT overridden."); |
| |
| resolve(); |
| }, reject); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "OverriddenProperty.OverriddenByImportantShorthand", |
| test(resolve, reject) { |
| getStyleDeclaration(".longhand-overridden-by-important-shorthand", (style) => { |
| const dontCreateIfMissing = true; |
| let borderColorProperty = style.propertyForName("border-color", dontCreateIfMissing); |
| InspectorTest.expectFalse(borderColorProperty.overridden, "border-color is NOT overridden."); |
| |
| let borderTopColorProperty = style.propertyForName("border-top-color", dontCreateIfMissing); |
| InspectorTest.expectTrue(borderTopColorProperty.overridden, "border-top-color is overridden."); |
| |
| resolve(); |
| }, reject); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "OverriddenProperty.NotOverriddenByImportantLonghand", |
| test(resolve, reject) { |
| getStyleDeclaration(".shorthand-overridden-by-important-longhand", (style) => { |
| const dontCreateIfMissing = true; |
| let borderTopColorProperty = style.propertyForName("border-top-color", dontCreateIfMissing); |
| InspectorTest.expectFalse(borderTopColorProperty.overridden, "border-top-color is NOT overridden."); |
| |
| let borderColorProperty = style.propertyForName("border-color", dontCreateIfMissing); |
| InspectorTest.expectFalse(borderColorProperty.overridden, "border-color is NOT overridden."); |
| |
| resolve(); |
| }, reject); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "OverriddenProperty.NotOverriddenByLonghand", |
| test(resolve, reject) { |
| getStyleDeclaration(".shorthand-not-overridden-by-longhand", (style) => { |
| const dontCreateIfMissing = true; |
| let borderColorProperty = style.propertyForName("border-color", dontCreateIfMissing); |
| InspectorTest.expectFalse(borderColorProperty.overridden, "border-color is NOT overridden."); |
| |
| let borderTopColorProperty = style.propertyForName("border-top-color", dontCreateIfMissing); |
| InspectorTest.expectFalse(borderTopColorProperty.overridden, "border-top-color is NOT overridden."); |
| |
| resolve(); |
| }, reject); |
| } |
| }); |
| |
| suite.runTestCasesAndFinish(); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>Test that CSSProperty.prototype.overridden is set correctly.</p> |
| <style> |
| #x { |
| color: red; |
| } |
| |
| .longhand-overridden-by-shorthand { |
| border-top-color: red; |
| border-color: green; |
| } |
| |
| .longhand-overridden-by-important-shorthand { |
| border-color: green !important; |
| border-top-color: red; |
| } |
| |
| .shorthand-overridden-by-important-longhand { |
| border-top-color: red !important; |
| border-color: green; |
| } |
| |
| .shorthand-not-overridden-by-longhand { |
| border-color: green; |
| border-top-color: red; |
| } |
| </style> |
| <div id="x" style="color: green"></div> |
| <div class="longhand-overridden-by-shorthand"></div> |
| <div class="longhand-overridden-by-important-shorthand"></div> |
| <div class="shorthand-overridden-by-important-longhand"></div> |
| <div class="shorthand-not-overridden-by-longhand"></div> |
| </body> |
| </html> |