Changeset 220202 in webkit


Ignore:
Timestamp:
Aug 3, 2017 6:20:30 AM (7 years ago)
Author:
commit-queue@webkit.org
Message:

Don't always recalc the style of display: contents elements.
https://bugs.webkit.org/show_bug.cgi?id=172753

Patch by Emilio Cobos Álvarez <ecobos@igalia.com> on 2017-08-03
Reviewed by Antti Koivisto.

No new tests (no functionality change). This only removes an
inefficiency.

  • dom/Element.cpp:

(WebCore::Element::existingComputedStyle):

  • dom/Element.h:
  • style/RenderTreeUpdater.cpp:

(WebCore::RenderTreeUpdater::updateRenderTree):
(WebCore::RenderTreeUpdater::updateElementRenderer):

  • style/StyleTreeResolver.cpp:

(WebCore::Style::renderOrDisplayContentsStyle):
(WebCore::Style::TreeResolver::resolveElement):
(WebCore::Style::TreeResolver::createAnimatedElementUpdate):
(WebCore::Style::shouldResolveElement):
(WebCore::Style::TreeResolver::resolveComposedTree):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r220188 r220202  
     12017-08-03  Emilio Cobos Álvarez  <ecobos@igalia.com>
     2
     3        Don't always recalc the style of display: contents elements.
     4        https://bugs.webkit.org/show_bug.cgi?id=172753
     5
     6        Reviewed by Antti Koivisto.
     7
     8        No new tests (no functionality change). This only removes an
     9        inefficiency.
     10
     11        * dom/Element.cpp:
     12        (WebCore::Element::existingComputedStyle):
     13        * dom/Element.h:
     14        * style/RenderTreeUpdater.cpp:
     15        (WebCore::RenderTreeUpdater::updateRenderTree):
     16        (WebCore::RenderTreeUpdater::updateElementRenderer):
     17        * style/StyleTreeResolver.cpp:
     18        (WebCore::Style::renderOrDisplayContentsStyle):
     19        (WebCore::Style::TreeResolver::resolveElement):
     20        (WebCore::Style::TreeResolver::createAnimatedElementUpdate):
     21        (WebCore::Style::shouldResolveElement):
     22        (WebCore::Style::TreeResolver::resolveComposedTree):
     23
    1242017-08-02  Devin Rousso  <drousso@apple.com>
    225
  • trunk/Source/WebCore/dom/Element.cpp

    r219856 r220202  
    26692669}
    26702670
    2671 const RenderStyle* Element::existingComputedStyle()
     2671const RenderStyle* Element::existingComputedStyle() const
    26722672{
    26732673    if (auto* renderTreeStyle = renderStyle())
  • trunk/Source/WebCore/dom/Element.h

    r219237 r220202  
    508508    LayoutRect absoluteEventHandlerBounds(bool& includesFixedPositionElements) override;
    509509
     510    const RenderStyle* existingComputedStyle() const;
     511
    510512    void setBeforePseudoElement(Ref<PseudoElement>&&);
    511513    void setAfterPseudoElement(Ref<PseudoElement>&&);
     
    646648    void removeShadowRoot();
    647649
    648     const RenderStyle* existingComputedStyle();
    649650    const RenderStyle& resolveComputedStyle();
    650651
  • trunk/Source/WebCore/style/RenderTreeUpdater.cpp

    r218345 r220202  
    158158        if (auto* renderer = node.renderer())
    159159            renderTreePosition().invalidateNextSibling(*renderer);
     160        else if (is<Element>(node) && downcast<Element>(node).hasDisplayContents())
     161            renderTreePosition().invalidateNextSibling();
    160162
    161163        if (is<Text>(node)) {
     
    171173
    172174        auto* elementUpdate = m_styleUpdate->elementUpdate(element);
    173         if (!elementUpdate) {
     175
     176        // We hop through display: contents elements in findRenderingRoot, so
     177        // there may be other updates down the tree.
     178        if (!elementUpdate && !element.hasDisplayContents()) {
    174179            it.traverseNextSkippingChildren();
    175180            continue;
    176181        }
    177182
    178         updateElementRenderer(element, *elementUpdate);
     183        if (elementUpdate)
     184            updateElementRenderer(element, *elementUpdate);
    179185
    180186        bool mayHaveRenderedDescendants = element.renderer() || (element.hasDisplayContents() && shouldCreateRenderer(element, renderTreePosition().parent()));
     
    275281        else
    276282            element.storeDisplayContentsStyle(RenderStyle::clonePtr(*update.style));
    277         // Render tree position needs to be recomputed as rendering siblings may be found from the display:contents subtree.
    278         renderTreePosition().invalidateNextSibling();
    279283    }
    280284
  • trunk/Source/WebCore/style/StyleTreeResolver.cpp

    r219544 r220202  
    170170}
    171171
     172static const RenderStyle* renderOrDisplayContentsStyle(const Element& element)
     173{
     174    if (auto* renderStyle = element.renderStyle())
     175        return renderStyle;
     176    if (element.hasDisplayContents())
     177        return element.existingComputedStyle();
     178    return nullptr;
     179}
     180
    172181ElementUpdate TreeResolver::resolveElement(Element& element)
    173182{
     
    182191        return { };
    183192
    184     auto* existingStyle = element.renderStyle();
     193    auto* existingStyle = renderOrDisplayContentsStyle(element);
    185194
    186195    if (m_didSeePendingStylesheet && (!existingStyle || existingStyle->isNotFinal())) {
     
    251260
    252261    if (!renderer) {
    253         auto keepsDisplayContents = newStyle->display() == CONTENTS && element.hasDisplayContents();
    254         // Some inherited property might have changed.
    255         return makeUpdate(WTFMove(newStyle), keepsDisplayContents ? Inherit : Detach);
     262        auto change = Detach;
     263        if (auto* oldStyle = renderOrDisplayContentsStyle(element))
     264            change = determineChange(*oldStyle, *newStyle);
     265        return makeUpdate(WTFMove(newStyle), change);
    256266    }
    257267
     
    334344        return true;
    335345    if (parentChange == NoInherit) {
    336         auto* existingStyle = element.renderStyle();
     346        auto* existingStyle = renderOrDisplayContentsStyle(element);
    337347        if (existingStyle && existingStyle->hasExplicitlyInheritedProperties())
    338348            return true;
    339349    }
    340350    if (element.needsStyleRecalc())
    341         return true;
    342     if (element.hasDisplayContents())
    343351        return true;
    344352    if (shouldResolvePseudoElement(element.beforePseudoElement()))
     
    420428            parent.elementNeedingStyleRecalcAffectsNextSiblingElementStyle = element.affectsNextSiblingElementStyle();
    421429
    422         auto* style = element.renderStyle();
     430        auto* style = renderOrDisplayContentsStyle(element);
    423431        auto change = NoChange;
    424432
Note: See TracChangeset for help on using the changeset viewer.