⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 276140 in webkit


Ignore:
Timestamp:
Apr 16, 2021, 9:50:28 AM (5 years ago)
Author:
Russell Epstein
Message:

Apply patch. rdar://problem/76375504

Location:
branches/safari-611-branch/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-611-branch/Source/WebCore/ChangeLog

    r276132 r276140  
     12021-04-16  Russell Epstein  <repstein@apple.com>
     2
     3        Apply patch. rdar://problem/76375504
     4
     5    2021-04-16  Antti Koivisto  <antti@apple.com>
     6
     7            Animated pseudo element style resolved against wrong parent style
     8            https://bugs.webkit.org/show_bug.cgi?id=223990
     9            rdar://74997361
     10
     11            In createAnimatedElementUpdate we get the parent and parent box styles from the parent stack.
     12            This is wrong for pseudo elements. Their parent style should the host style which is not pushed to the stack.
     13
     14            This matters in style adjuster which may apply wrong adjustments as a result.
     15
     16            Test: fast/animation/pseudo-element-style-adjuster.html
     17
     18            * style/StyleTreeResolver.cpp:
     19            (WebCore::Style::TreeResolver::resolveElement):
     20            (WebCore::Style::TreeResolver::resolvePseudoStyle):
     21            (WebCore::Style::TreeResolver::createAnimatedElementUpdate):
     22
     23            Make static and provide the parent and parent box styles as parameters.
     24
     25            * style/StyleTreeResolver.h:
     26
    1272021-04-15  Russell Epstein  <repstein@apple.com>
    228
  • branches/safari-611-branch/Source/WebCore/style/StyleTreeResolver.cpp

    r276132 r276140  
    222222    }
    223223
    224     auto update = createAnimatedElementUpdate(WTFMove(newStyle), styleable, parent().change);
     224    auto update = createAnimatedElementUpdate(WTFMove(newStyle), styleable, parent().change, parent().style, parentBoxStyle());
    225225    auto descendantsToResolve = computeDescendantsToResolve(update.change, element.styleValidity(), parent().descendantsToResolve);
    226226
     
    278278    if (!elementUpdate.style->hasPseudoStyle(pseudoId))
    279279        return { };
    280 
    281     auto pseudoStyle = scope().resolver.pseudoStyleForElement(element, { pseudoId }, *elementUpdate.style, parentBoxStyleForPseudo(elementUpdate), &scope().selectorFilter);
     280   
     281    auto& parentStyle = *elementUpdate.style;
     282    auto* parentBoxStyle = parentBoxStyleForPseudo(elementUpdate);
     283   
     284    auto pseudoStyle = scope().resolver.pseudoStyleForElement(element, { pseudoId }, parentStyle, parentBoxStyle, &scope().selectorFilter);
    282285    if (!pseudoStyle)
    283286        return { };
     
    287290        return { };
    288291
    289     return createAnimatedElementUpdate(WTFMove(pseudoStyle), { element, pseudoId }, elementUpdate.change);
     292    return createAnimatedElementUpdate(WTFMove(pseudoStyle), { element, pseudoId }, elementUpdate.change, parentStyle, parentBoxStyle);
    290293}
    291294
     
    316319}
    317320
    318 ElementUpdate TreeResolver::createAnimatedElementUpdate(std::unique_ptr<RenderStyle> newStyle, const Styleable& styleable, Change parentChange)
     321ElementUpdate TreeResolver::createAnimatedElementUpdate(std::unique_ptr<RenderStyle> newStyle, const Styleable& styleable, Change parentChange, const RenderStyle& parentStyle, const RenderStyle* parentBoxStyle)
    319322{
    320323    auto& element = styleable.element;
     324    auto& document = element.document();
    321325    auto* oldStyle = element.renderOrDisplayContentsStyle(styleable.pseudoId);
    322326
     
    326330    // on the document timeline. Note that we get timeline() on the Document here because we need a timeline created
    327331    // in case no Web Animations have been created through the JS API.
    328     if (element.document().backForwardCacheState() == Document::NotInBackForwardCache && !element.document().renderView()->printing()) {
     332    if (document.backForwardCacheState() == Document::NotInBackForwardCache && !document.renderView()->printing()) {
    329333        if (oldStyle && (oldStyle->hasTransitions() || newStyle->hasTransitions()))
    330             m_document.timeline().updateCSSTransitionsForStyleable(styleable, *oldStyle, *newStyle);
     334            document.timeline().updateCSSTransitionsForStyleable(styleable, *oldStyle, *newStyle);
    331335
    332336        // The order in which CSS Transitions and CSS Animations are updated matters since CSS Transitions define the after-change style
     
    335339        if ((oldStyle && oldStyle->hasAnimations()) || newStyle->hasAnimations()) {
    336340            // FIXME: Remove this hack and pass the parent style via updateCSSAnimationsForStyleable.
    337             scope().resolver.setParentElementStyleForKeyframes(&parent().style);
    338 
    339             m_document.timeline().updateCSSAnimationsForStyleable(styleable, oldStyle, *newStyle);
     341            scope().resolver.setParentElementStyleForKeyframes(&parentStyle);
     342
     343            document.timeline().updateCSSAnimationsForStyleable(styleable, oldStyle, *newStyle);
    340344
    341345            scope().resolver.setParentElementStyleForKeyframes(nullptr);
     
    354358        newStyle = WTFMove(animatedStyle);
    355359
    356         Adjuster adjuster(m_document, parent().style, parentBoxStyle(), styleable.pseudoId == PseudoId::None ? &element : nullptr);
     360        Adjuster adjuster(document, parentStyle, parentBoxStyle, styleable.pseudoId == PseudoId::None ? &element : nullptr);
    357361        adjuster.adjustAnimatedStyle(*newStyle, animationImpact);
    358362    } else
  • branches/safari-611-branch/Source/WebCore/style/StyleTreeResolver.h

    r276132 r276140  
    6262    ElementUpdates resolveElement(Element&);
    6363
    64     ElementUpdate createAnimatedElementUpdate(std::unique_ptr<RenderStyle>, const Styleable&, Change);
     64    ElementUpdate createAnimatedElementUpdate(std::unique_ptr<RenderStyle>, const Styleable&, Change, const RenderStyle& parentStyle, const RenderStyle* parentBoxStyle);
    6565    Optional<ElementUpdate> resolvePseudoStyle(Element&, const ElementUpdate&, PseudoId);
    6666
Note: See TracChangeset for help on using the changeset viewer.