- 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: