Title: [271367] trunk
Revision
271367
Author
[email protected]
Date
2021-01-11 10:12:19 -0800 (Mon, 11 Jan 2021)

Log Message

REGRESSION (r258321): CSS rules using :first-of-type are applied to any/all siblings in a group under certain circumstances
https://bugs.webkit.org/show_bug.cgi?id=218256
<rdar://problem/70749584>

Reviewed by Simon Fraser.

Source/WebCore:

More accurate invalidation for :hover resulted in smaller style updates that revealed a bug in the way we
mark style non-shareable. We reset style relation bits when resolving the parent but may fail to set them again if we
don't re-resolve all children.

Test case by Eben Packwood.

Test: fast/css/positional-selector-style-sharing.html

* style/StyleRelations.cpp:
(WebCore::Style::commitRelationsToRenderStyle):

Just mark all styles affected by relations non-shareable. This is achieved via various bit tests but there
is no reason not to set the simplest no-sharing bit. Since this forces real style resolution the parent
bits will also get properly reset.

LayoutTests:

* fast/css/positional-selector-style-sharing-expected.html: Added.
* fast/css/positional-selector-style-sharing.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (271366 => 271367)


--- trunk/LayoutTests/ChangeLog	2021-01-11 18:04:47 UTC (rev 271366)
+++ trunk/LayoutTests/ChangeLog	2021-01-11 18:12:19 UTC (rev 271367)
@@ -1,3 +1,14 @@
+2021-01-11  Antti Koivisto  <[email protected]>
+
+        REGRESSION (r258321): CSS rules using :first-of-type are applied to any/all siblings in a group under certain circumstances
+        https://bugs.webkit.org/show_bug.cgi?id=218256
+        <rdar://problem/70749584>
+
+        Reviewed by Simon Fraser.
+
+        * fast/css/positional-selector-style-sharing-expected.html: Added.
+        * fast/css/positional-selector-style-sharing.html: Added.
+
 2021-01-11  Sam Weinig  <[email protected]>
 
         Support lab(), lch(), gray() and color(lab ...) colors

Added: trunk/LayoutTests/fast/css/positional-selector-style-sharing-expected.html (0 => 271367)


--- trunk/LayoutTests/fast/css/positional-selector-style-sharing-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/positional-selector-style-sharing-expected.html	2021-01-11 18:12:19 UTC (rev 271367)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<style>
+td {
+    vertical-align: baseline;
+}
+td:first-child {
+    color: red;
+}
+</style>
+</head>
+<body>
+<table>
+<tr>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+<tr>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+<tr>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+<tr>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+</table>
+</body>
+</html>

Added: trunk/LayoutTests/fast/css/positional-selector-style-sharing.html (0 => 271367)


--- trunk/LayoutTests/fast/css/positional-selector-style-sharing.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/positional-selector-style-sharing.html	2021-01-11 18:12:19 UTC (rev 271367)
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<style>
+*:hover {
+    transition: all 0s ease;
+}
+td {
+    vertical-align: baseline;
+}
+.nth-child td:nth-child(3n+1) {
+    color: red;
+}
+.first-of-type td:first-of-type {
+    color: red;
+}
+.nth-of-type td:nth-of-type(1) {
+    color: red;
+}
+.first-child td:first-child {
+    color: red;
+}
+</style>
+</head>
+<body>
+<table>
+<tr class="nth-child">
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td class="hover-target">Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+<tr class="first-of-type">
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td class="hover-target">Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+<tr class="nth-of-type">
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td class="hover-target">Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+<tr class="first-child">
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td class="hover-target">Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+<td>Lorem ipsum dolor sit, amet consectetur adipisicing elit</td>
+</tr>
+</table>
+<script>
+
+async function test() {
+    if (!window.testRunner)
+        return;
+
+    await new Promise(requestAnimationFrame);
+
+    for (hoverTarget of document.querySelectorAll(".hover-target")) {
+        eventSender.mouseMoveTo(hoverTarget.offsetLeft + 10, hoverTarget.offsetTop + 10);
+        await new Promise(requestAnimationFrame);
+    }
+}
+test();
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (271366 => 271367)


--- trunk/Source/WebCore/ChangeLog	2021-01-11 18:04:47 UTC (rev 271366)
+++ trunk/Source/WebCore/ChangeLog	2021-01-11 18:12:19 UTC (rev 271367)
@@ -1,5 +1,28 @@
 2021-01-11  Antti Koivisto  <[email protected]>
 
+        REGRESSION (r258321): CSS rules using :first-of-type are applied to any/all siblings in a group under certain circumstances
+        https://bugs.webkit.org/show_bug.cgi?id=218256
+        <rdar://problem/70749584>
+
+        Reviewed by Simon Fraser.
+
+        More accurate invalidation for :hover resulted in smaller style updates that revealed a bug in the way we
+        mark style non-shareable. We reset style relation bits when resolving the parent but may fail to set them again if we
+        don't re-resolve all children.
+
+        Test case by Eben Packwood.
+
+        Test: fast/css/positional-selector-style-sharing.html
+
+        * style/StyleRelations.cpp:
+        (WebCore::Style::commitRelationsToRenderStyle):
+
+        Just mark all styles affected by relations non-shareable. This is achieved via various bit tests but there
+        is no reason not to set the simplest no-sharing bit. Since this forces real style resolution the parent
+        bits will also get properly reset.
+
+2021-01-11  Antti Koivisto  <[email protected]>
+
         [LFC][Integration] Factor marked text style collection code out of InlineTextBox
         https://bugs.webkit.org/show_bug.cgi?id=220249
         <rdar://problem/72976067>

Modified: trunk/Source/WebCore/style/StyleRelations.cpp (271366 => 271367)


--- trunk/Source/WebCore/style/StyleRelations.cpp	2021-01-11 18:04:47 UTC (rev 271366)
+++ trunk/Source/WebCore/style/StyleRelations.cpp	2021-01-11 18:12:19 UTC (rev 271367)
@@ -36,6 +36,9 @@
 
 std::unique_ptr<Relations> commitRelationsToRenderStyle(RenderStyle& style, const Element& element, const Relations& relations)
 {
+    if (!relations.isEmpty())
+        style.setUnique();
+
     std::unique_ptr<Relations> remainingRelations;
 
     auto appendStyleRelation = [&remainingRelations] (const Relation& relation) {
@@ -61,7 +64,6 @@
             style.setLastChildState();
             break;
         case Relation::Unique:
-            style.setUnique();
             break;
         case Relation::AffectedByPreviousSibling:
         case Relation::DescendantsAffectedByPreviousSibling:
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to