| <!doctype html> |
| <html> |
| <head> |
| <script src="../../../resources/js-test-pre.js"></script> |
| <style> |
| rightmost .target { |
| color:rgb(0,0,0); |
| background-color:rgb(0, 0, 0); |
| } |
| rightmost .target:last-child { |
| color:rgb(1,2,3); |
| } |
| rightmost .target:not(:last-child) { |
| background-color:rgb(4, 5, 6); |
| } |
| |
| ancestor .target { |
| color:rgb(255, 255, 255); |
| background-color:rgb(255, 255, 255); |
| } |
| ancestor .parent:last-child .target { |
| color:rgb(7, 8, 9); |
| } |
| ancestor .parent:not(:last-child) .target { |
| background-color:rgb(10, 11, 12); |
| } |
| </style> |
| </head> |
| <body> |
| <div style="display:none"> |
| <rightmost> |
| <span id="target1" class="target"></span> |
| <span id="target2" class="target"></span> |
| <span id="target3" class="target"></span> |
| </rightmost> |
| <ancestor> |
| <span class="parent"> |
| <span id="target4" class="target"></span> |
| </span> |
| <span class="parent"> |
| <span id="target5" class="target"></span> |
| </span> |
| <span class="parent"> |
| <span id="target6" class="target"></span> |
| </span> |
| </ancestor> |
| </div> |
| </body> |
| <script> |
| description("When updating the tree, the style needs to be invalidated when the :last-child changes, even if there is no renderer."); |
| |
| debug("Base case for rightmost element with :last-child"); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).color', 'rgb(0, 0, 0)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target2")).color', 'rgb(0, 0, 0)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target3")).color', 'rgb(1, 2, 3)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).backgroundColor', 'rgb(4, 5, 6)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target2")).backgroundColor', 'rgb(4, 5, 6)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target3")).backgroundColor', 'rgb(0, 0, 0)'); |
| |
| |
| var target3 = document.getElementById("target3"); |
| var parentElement = target1.parentElement; |
| parentElement.removeChild(target3); |
| |
| debug("Removed first child (target3)"); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).color', 'rgb(0, 0, 0)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target2")).color', 'rgb(1, 2, 3)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).backgroundColor', 'rgb(4, 5, 6)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target2")).backgroundColor', 'rgb(0, 0, 0)'); |
| |
| parentElement.insertBefore(target3, parentElement.firstChild); |
| |
| debug("Add back target3 at the start"); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target3")).color', 'rgb(0, 0, 0)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).color', 'rgb(0, 0, 0)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target2")).color', 'rgb(1, 2, 3)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target3")).backgroundColor', 'rgb(4, 5, 6)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target1")).backgroundColor', 'rgb(4, 5, 6)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target2")).backgroundColor', 'rgb(0, 0, 0)'); |
| |
| debug("Base case for a styled element with an ancestor affected by :last-child"); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).color', 'rgb(255, 255, 255)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target5")).color', 'rgb(255, 255, 255)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target6")).color', 'rgb(7, 8, 9)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).backgroundColor', 'rgb(10, 11, 12)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target5")).backgroundColor', 'rgb(10, 11, 12)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target6")).backgroundColor', 'rgb(255, 255, 255)'); |
| |
| var target6Parent = document.getElementById("target6").parentElement; |
| var parentElement = target6Parent.parentElement; |
| parentElement.removeChild(target6Parent); |
| |
| debug("Removed last child (target6's parent)"); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).color', 'rgb(255, 255, 255)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target5")).color', 'rgb(7, 8, 9)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).backgroundColor', 'rgb(10, 11, 12)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target5")).backgroundColor', 'rgb(255, 255, 255)'); |
| debug("Add back target6's parent at the end"); |
| parentElement.insertBefore(target6Parent, parentElement.firstChild); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target6")).color', 'rgb(255, 255, 255)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).color', 'rgb(255, 255, 255)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target5")).color', 'rgb(7, 8, 9)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target6")).backgroundColor', 'rgb(10, 11, 12)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target4")).backgroundColor', 'rgb(10, 11, 12)'); |
| shouldBeEqualToString('getComputedStyle(document.getElementById("target5")).backgroundColor', 'rgb(255, 255, 255)'); |
| </script> |
| <script src="../../../resources/js-test-post.js"></script> |
| </html> |