Title: [275277] trunk
Revision
275277
Author
an...@apple.com
Date
2021-03-31 05:16:18 -0700 (Wed, 31 Mar 2021)

Log Message

Animated pseudo element style resolved against wrong parent style
https://bugs.webkit.org/show_bug.cgi?id=223990
rdar://74997361

Reviewed by Antoine Quint.
Source/WebCore:

In createAnimatedElementUpdate we get the parent and parent box styles from the parent stack.
This is wrong for pseudo elements. Their parent style should the host style which is not pushed to the stack.

This matters in style adjuster which may apply wrong adjustments as a result.

Test: fast/animation/pseudo-element-style-adjuster.html

* style/StyleTreeResolver.cpp:
(WebCore::Style::TreeResolver::resolveElement):
(WebCore::Style::TreeResolver::resolvePseudoStyle):
(WebCore::Style::TreeResolver::createAnimatedElementUpdate):

Make static and provide the parent and parent box styles as parameters.

* style/StyleTreeResolver.h:

LayoutTests:

* fast/animation/pseudo-element-style-adjuster-expected.html: Added.
* fast/animation/pseudo-element-style-adjuster.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (275276 => 275277)


--- trunk/LayoutTests/ChangeLog	2021-03-31 11:16:12 UTC (rev 275276)
+++ trunk/LayoutTests/ChangeLog	2021-03-31 12:16:18 UTC (rev 275277)
@@ -1,3 +1,14 @@
+2021-03-31  Antti Koivisto  <an...@apple.com>
+
+        Animated pseudo element style resolved against wrong parent style
+        https://bugs.webkit.org/show_bug.cgi?id=223990
+        rdar://74997361
+
+        Reviewed by Antoine Quint.
+
+        * fast/animation/pseudo-element-style-adjuster-expected.html: Added.
+        * fast/animation/pseudo-element-style-adjuster.html: Added.
+
 2021-03-31  Youenn Fablet  <you...@apple.com>
 
         Apply permission policy to geolocation

Added: trunk/LayoutTests/fast/animation/pseudo-element-style-adjuster-expected.html (0 => 275277)


--- trunk/LayoutTests/fast/animation/pseudo-element-style-adjuster-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/animation/pseudo-element-style-adjuster-expected.html	2021-03-31 12:16:18 UTC (rev 275277)
@@ -0,0 +1,8 @@
+<style>
+.flex { display:flex; }
+.host::before { display:inline-block; content:'On the same'; }
+.host::after { display:inline-block; content:'line'; color:green; }
+</style>
+<div class=flex>
+<div class=host> </div>
+</div>

Added: trunk/LayoutTests/fast/animation/pseudo-element-style-adjuster.html (0 => 275277)


--- trunk/LayoutTests/fast/animation/pseudo-element-style-adjuster.html	                        (rev 0)
+++ trunk/LayoutTests/fast/animation/pseudo-element-style-adjuster.html	2021-03-31 12:16:18 UTC (rev 275277)
@@ -0,0 +1,12 @@
+<style>
+@keyframes anim {
+  from { color:red; }
+  to { color:green; }
+}
+.flex { display:flex; }
+.host::before { display:inline-block; content:'On the same'; }
+.host::after { display:inline-block; content:'line'; animation-duration:0s; animation-name:anim; animation-fill-mode:forwards; }
+</style>
+<div class=flex>
+<div class=host> </div>
+</div>

Modified: trunk/Source/WebCore/ChangeLog (275276 => 275277)


--- trunk/Source/WebCore/ChangeLog	2021-03-31 11:16:12 UTC (rev 275276)
+++ trunk/Source/WebCore/ChangeLog	2021-03-31 12:16:18 UTC (rev 275277)
@@ -1,3 +1,27 @@
+2021-03-31  Antti Koivisto  <an...@apple.com>
+
+        Animated pseudo element style resolved against wrong parent style
+        https://bugs.webkit.org/show_bug.cgi?id=223990
+        rdar://74997361
+
+        Reviewed by Antoine Quint.
+        
+        In createAnimatedElementUpdate we get the parent and parent box styles from the parent stack.
+        This is wrong for pseudo elements. Their parent style should the host style which is not pushed to the stack.
+        
+        This matters in style adjuster which may apply wrong adjustments as a result.
+
+        Test: fast/animation/pseudo-element-style-adjuster.html
+
+        * style/StyleTreeResolver.cpp:
+        (WebCore::Style::TreeResolver::resolveElement):
+        (WebCore::Style::TreeResolver::resolvePseudoStyle):
+        (WebCore::Style::TreeResolver::createAnimatedElementUpdate):
+        
+        Make static and provide the parent and parent box styles as parameters.
+        
+        * style/StyleTreeResolver.h:
+
 2021-03-31  Youenn Fablet  <you...@apple.com>
 
         Apply permission policy to geolocation

Modified: trunk/Source/WebCore/style/StyleTreeResolver.cpp (275276 => 275277)


--- trunk/Source/WebCore/style/StyleTreeResolver.cpp	2021-03-31 11:16:12 UTC (rev 275276)
+++ trunk/Source/WebCore/style/StyleTreeResolver.cpp	2021-03-31 12:16:18 UTC (rev 275277)
@@ -222,7 +222,7 @@
         m_document.setHasNodesWithNonFinalStyle();
     }
 
-    auto update = createAnimatedElementUpdate(WTFMove(newStyle), styleable, parent().change);
+    auto update = createAnimatedElementUpdate(WTFMove(newStyle), styleable, parent().change, parent().style, parentBoxStyle());
     auto descendantsToResolve = computeDescendantsToResolve(update.change, element.styleValidity(), parent().descendantsToResolve);
 
     if (&element == m_document.documentElement()) {
@@ -278,8 +278,11 @@
         return { };
     if (!elementUpdate.style->hasPseudoStyle(pseudoId))
         return { };
-
-    auto pseudoStyle = scope().resolver.pseudoStyleForElement(element, { pseudoId }, *elementUpdate.style, parentBoxStyleForPseudo(elementUpdate), &scope().selectorFilter);
+    
+    auto& parentStyle = *elementUpdate.style;
+    auto* parentBoxStyle = parentBoxStyleForPseudo(elementUpdate);
+    
+    auto pseudoStyle = scope().resolver.pseudoStyleForElement(element, { pseudoId }, parentStyle, parentBoxStyle, &scope().selectorFilter);
     if (!pseudoStyle)
         return { };
 
@@ -287,7 +290,7 @@
     if (!pseudoElementRendererIsNeeded(pseudoStyle.get()) && !hasAnimations)
         return { };
 
-    return createAnimatedElementUpdate(WTFMove(pseudoStyle), { element, pseudoId }, elementUpdate.change);
+    return createAnimatedElementUpdate(WTFMove(pseudoStyle), { element, pseudoId }, elementUpdate.change, parentStyle, parentBoxStyle);
 }
 
 const RenderStyle* TreeResolver::parentBoxStyle() const
@@ -316,9 +319,10 @@
     }
 }
 
-ElementUpdate TreeResolver::createAnimatedElementUpdate(std::unique_ptr<RenderStyle> newStyle, const Styleable& styleable, Change parentChange)
+ElementUpdate TreeResolver::createAnimatedElementUpdate(std::unique_ptr<RenderStyle> newStyle, const Styleable& styleable, Change parentChange, const RenderStyle& parentStyle, const RenderStyle* parentBoxStyle)
 {
     auto& element = styleable.element;
+    auto& document = element.document();
     auto* oldStyle = element.renderOrDisplayContentsStyle(styleable.pseudoId);
 
     OptionSet<AnimationImpact> animationImpact;
@@ -326,15 +330,15 @@
     // First, we need to make sure that any new CSS animation occuring on this element has a matching WebAnimation
     // on the document timeline. Note that we get timeline() on the Document here because we need a timeline created
     // in case no Web Animations have been created through the JS API.
-    if (element.document().backForwardCacheState() == Document::NotInBackForwardCache && !element.document().renderView()->printing()) {
+    if (document.backForwardCacheState() == Document::NotInBackForwardCache && !document.renderView()->printing()) {
         if (oldStyle && (oldStyle->hasTransitions() || newStyle->hasTransitions()))
-            m_document.timeline().updateCSSTransitionsForStyleable(styleable, *oldStyle, *newStyle);
+            document.timeline().updateCSSTransitionsForStyleable(styleable, *oldStyle, *newStyle);
 
         // The order in which CSS Transitions and CSS Animations are updated matters since CSS Transitions define the after-change style
         // to use CSS Animations as defined in the previous style change event. As such, we update CSS Animations after CSS Transitions
         // such that when CSS Transitions are updated the CSS Animations data is the same as during the previous style change event.
         if ((oldStyle && oldStyle->hasAnimations()) || newStyle->hasAnimations())
-            m_document.timeline().updateCSSAnimationsForStyleable(styleable, oldStyle, *newStyle, &parent().style);
+            document.timeline().updateCSSAnimationsForStyleable(styleable, oldStyle, *newStyle, &parentStyle);
     }
 
     // Now we can update all Web animations, which will include CSS Animations as well
@@ -345,10 +349,10 @@
         styleable.setLastStyleChangeEventStyle(RenderStyle::clonePtr(*newStyle));
         // Apply all keyframe effects to the new style.
         auto animatedStyle = RenderStyle::clonePtr(*newStyle);
-        animationImpact = styleable.applyKeyframeEffects(*animatedStyle, *previousLastStyleChangeEventStyle, &parent().style);
+        animationImpact = styleable.applyKeyframeEffects(*animatedStyle, *previousLastStyleChangeEventStyle, &parentStyle);
         newStyle = WTFMove(animatedStyle);
 
-        Adjuster adjuster(m_document, parent().style, parentBoxStyle(), styleable.pseudoId == PseudoId::None ? &element : nullptr);
+        Adjuster adjuster(document, parentStyle, parentBoxStyle, styleable.pseudoId == PseudoId::None ? &element : nullptr);
         adjuster.adjustAnimatedStyle(*newStyle, animationImpact);
     } else
         styleable.setLastStyleChangeEventStyle(nullptr);

Modified: trunk/Source/WebCore/style/StyleTreeResolver.h (275276 => 275277)


--- trunk/Source/WebCore/style/StyleTreeResolver.h	2021-03-31 11:16:12 UTC (rev 275276)
+++ trunk/Source/WebCore/style/StyleTreeResolver.h	2021-03-31 12:16:18 UTC (rev 275277)
@@ -61,7 +61,7 @@
 
     ElementUpdates resolveElement(Element&);
 
-    ElementUpdate createAnimatedElementUpdate(std::unique_ptr<RenderStyle>, const Styleable&, Change);
+    static ElementUpdate createAnimatedElementUpdate(std::unique_ptr<RenderStyle>, const Styleable&, Change, const RenderStyle& parentStyle, const RenderStyle* parentBoxStyle);
     Optional<ElementUpdate> resolvePseudoStyle(Element&, const ElementUpdate&, PseudoId);
 
     struct Scope : RefCounted<Scope> {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to