| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| <style> |
| * { |
| color: black; |
| } |
| [CamelCase] { |
| color: pink; |
| } |
| </style> |
| </head> |
| <body> |
| <div> |
| <!-- With renderer --> |
| <target></target> |
| </div> |
| <div style="display:none;"> |
| <!-- Without renderer --> |
| <target></target> |
| </div> |
| </body> |
| <script> |
| // It is okay to increase the amount of invalidation in this test for correctness if necessary. |
| description('Test that we only invalidate the style when changing an attribute referenced by a stylesheet. This test requires the internals object to work properly.'); |
| |
| function shouldNeedStyleRecalc(expected) { |
| var testFunction = expected ? shouldBeTrue : shouldBeFalse; |
| testFunction("window.internals.nodeNeedsStyleRecalc(document.querySelectorAll(\"target\")[0])"); |
| testFunction("window.internals.nodeNeedsStyleRecalc(document.querySelectorAll(\"target\")[1])"); |
| } |
| |
| function setAttribute(name, value) { |
| var allTargets = document.querySelectorAll("target"); |
| allTargets[0].setAttribute(name, value); |
| allTargets[1].setAttribute(name, value); |
| } |
| |
| function removeAttribute(name) { |
| var allTargets = document.querySelectorAll("target"); |
| allTargets[0].removeAttribute(name); |
| allTargets[1].removeAttribute(name); |
| } |
| |
| function getStyle() { |
| var allTargets = document.querySelectorAll("target"); |
| getComputedStyle(allTargets[0]).color; |
| getComputedStyle(allTargets[1]).color; |
| } |
| |
| // Force a layout to ensure we don't have dirty styles. |
| var offsetTop = document.documentElement.offsetTop; |
| shouldNeedStyleRecalc(false); |
| |
| debug("Changing the attribute 'foo', it is not referenced by any stylesheet and should not cause any invalidation."); |
| setAttribute("foo", "bar"); |
| shouldNeedStyleRecalc(false); |
| |
| debug("Changing the attribute 'CamelCase'. It is used by the stylesheet and should cause the target to be invalidated."); |
| setAttribute("CamelCase", ""); |
| shouldNeedStyleRecalc(true); |
| |
| debug("Getting the computed style should for the style to be resolved."); |
| getStyle(); |
| shouldNeedStyleRecalc(false); |
| |
| debug("Removing the attribute should also invalidate the style."); |
| removeAttribute("CamelCase"); |
| shouldNeedStyleRecalc(true); |
| |
| debug("Getting the computed style should for the style to be resolved."); |
| getStyle(); |
| shouldNeedStyleRecalc(false) |
| |
| debug("Changing the attribute 'camelcase'. It is not used as such by the stylesheet, but in HTML attribute names are case-insensitive and we should still invalidate the style."); |
| setAttribute("camelcase", ""); |
| shouldNeedStyleRecalc(true); |
| |
| debug("Getting the computed style should for the style to be resolved."); |
| getStyle(); |
| shouldNeedStyleRecalc(false); |
| |
| debug("Removing the attribute should also invalidate the style."); |
| removeAttribute("CamelCase"); |
| shouldNeedStyleRecalc(true); |
| |
| debug("Getting the computed style should for the style to be resolved."); |
| getStyle(); |
| shouldNeedStyleRecalc(false) |
| |
| debug("Changing the attribute 'CAMELCASE'. It is not used as such by the stylesheet, but in HTML attribute names are case-insensitive and we should still invalidate the style."); |
| setAttribute("CAMELCASE", ""); |
| shouldNeedStyleRecalc(true); |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </html> |