| <!DOCTYPE html> | 
 | <script src="../../../resources/js-test.js"></script> | 
 | <style> | 
 |     #hovered { width: 100px; height: 100px; background-color: orange } | 
 |     #hovered::first-letter { color: lime } | 
 |     #hovered:hover { background-color: green } | 
 |     #hovered:hover + div #target { background-color: green } | 
 | </style> | 
 | <div id="hovered"> | 
 |     <div></div> | 
 |     <div></div> | 
 | </div> | 
 | <div> | 
 |     <div></div> | 
 |     <div></div> | 
 |     <div></div> | 
 |     <div></div> | 
 |     <div></div> | 
 |     <div id="target">This text, and the orange square, should have a green background when the orange square is hovered.</div> | 
 | </div> | 
 | <script> | 
 | description("Sibling invalidation with :hover and ::first-letter"); | 
 |  | 
 | function hoverElement(element) { | 
 |     eventSender.mouseMoveTo(0, 0); | 
 |     document.body.offsetLeft; // force layout. | 
 |     var x = element.offsetLeft + 1; | 
 |     var y = element.offsetTop + 1; | 
 |     eventSender.mouseMoveTo(x, y); | 
 | } | 
 |  | 
 | var transparent = "rgba(0, 0, 0, 0)"; | 
 | var green = "rgb(0, 128, 0)"; | 
 |  | 
 | shouldBe("getComputedStyle(target).backgroundColor", "transparent"); | 
 |  | 
 | shouldBeDefined("window.eventSender"); | 
 |  | 
 | if (window.eventSender) | 
 |     hoverElement(hovered); | 
 |  | 
 | // Recalc #hovered (1), its subtree (2) due to ::first-letter, and #target (1). | 
 | // In total: 4. | 
 | if (window.internals) | 
 |     shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "4"); | 
 |  | 
 | shouldBe("getComputedStyle(target).backgroundColor", "green"); | 
 |  | 
 | </script> |