Changeset 172517 in webkit


Ignore:
Timestamp:
Aug 13, 2014, 3:13:43 AM (11 years ago)
Author:
Antti Koivisto
Message:

Don't recurse into non-rendered subtrees when computing style
https://bugs.webkit.org/show_bug.cgi?id=135844

Reviewed by Andreas Kling.

  • style/StyleResolveTree.cpp:

(WebCore::Style::resetStyleForNonRenderedDescendants):

Do a simple reset of the style dirty bits and any computed style in non-renderer subtrees.

(WebCore::Style::attachRenderTree):
(WebCore::Style::resolveTree):

Don't recurse into descendants if the element does not create a renderer.
We didn't compute style anyway in such subtrees.

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r172513 r172517  
     12014-08-13  Antti Koivisto  <antti@apple.com>
     2
     3        Don't recurse into non-rendered subtrees when computing style
     4        https://bugs.webkit.org/show_bug.cgi?id=135844
     5
     6        Reviewed by Andreas Kling.
     7
     8        * style/StyleResolveTree.cpp:
     9        (WebCore::Style::resetStyleForNonRenderedDescendants):
     10       
     11        Do a simple reset of the style dirty bits and any computed style in non-renderer subtrees.
     12
     13        (WebCore::Style::attachRenderTree):
     14        (WebCore::Style::resolveTree):
     15       
     16        Don't recurse into descendants if the element does not create a renderer.
     17        We didn't compute style anyway in such subtrees.
     18
    1192014-08-11  Myles C. Maxfield  <mmaxfield@apple.com>
    220
  • trunk/Source/WebCore/style/StyleResolveTree.cpp

    r172505 r172517  
    556556}
    557557
     558static void resetStyleForNonRenderedDescendants(Element& current)
     559{
     560    ASSERT(!current.renderStyle());
     561    for (auto& child : childrenOfType<Element>(current)) {
     562        ASSERT(!child.renderer());
     563        if (child.needsStyleRecalc()) {
     564            child.resetComputedStyle();
     565            child.clearNeedsStyleRecalc();
     566        }
     567        if (child.childNeedsStyleRecalc()) {
     568            resetStyleForNonRenderedDescendants(child);
     569            child.clearChildNeedsStyleRecalc();
     570        }
     571    }
     572}
     573
    558574static bool needsPseudoElement(Element& current, PseudoId pseudoId)
    559575{
     
    583599    WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
    584600
     601    if (isInsertionPoint(current)) {
     602        attachDistributedChildren(toInsertionPoint(current), inheritedStyle, renderTreePosition);
     603        current.clearNeedsStyleRecalc();
     604        current.clearChildNeedsStyleRecalc();
     605        return;
     606    }
     607
    585608    if (current.hasCustomStyleResolveCallbacks())
    586609        current.willAttachRenderers();
     
    588611    createRendererIfNeeded(current, inheritedStyle, renderTreePosition, resolvedStyle);
    589612
    590     StyleResolverParentPusher parentPusher(&current);
    591 
    592     RenderTreePosition childRenderTreePosition(current.renderer());
    593     attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE, childRenderTreePosition);
    594 
    595     if (ShadowRoot* shadowRoot = current.shadowRoot()) {
    596         parentPusher.push();
    597         attachShadowRoot(*shadowRoot);
    598     } else if (current.firstChild())
    599         parentPusher.push();
    600 
    601     if (isInsertionPoint(current))
    602         attachDistributedChildren(toInsertionPoint(current), inheritedStyle, renderTreePosition);
    603     else
    604         attachChildren(current, current.renderStyle(), childRenderTreePosition);
     613    if (RenderStyle* style = current.renderStyle()) {
     614        StyleResolverParentPusher parentPusher(&current);
     615
     616        RenderTreePosition childRenderTreePosition(current.renderer());
     617        attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE, childRenderTreePosition);
     618
     619        if (ShadowRoot* shadowRoot = current.shadowRoot()) {
     620            parentPusher.push();
     621            attachShadowRoot(*shadowRoot);
     622        } else if (current.firstChild())
     623            parentPusher.push();
     624
     625        attachChildren(current, style, childRenderTreePosition);
     626
     627        if (AXObjectCache* cache = current.document().axObjectCache())
     628            cache->updateCacheAfterNodeIsAttached(&current);
     629
     630        attachBeforeOrAfterPseudoElementIfNeeded(current, AFTER, childRenderTreePosition);
     631
     632        current.updateFocusAppearanceAfterAttachIfNeeded();
     633    } else
     634        resetStyleForNonRenderedDescendants(current);
    605635
    606636    current.clearNeedsStyleRecalc();
    607637    current.clearChildNeedsStyleRecalc();
    608 
    609     if (AXObjectCache* cache = current.document().axObjectCache())
    610         cache->updateCacheAfterNodeIsAttached(&current);
    611 
    612     attachBeforeOrAfterPseudoElementIfNeeded(current, AFTER, childRenderTreePosition);
    613 
    614     current.updateFocusAppearanceAfterAttachIfNeeded();
    615638
    616639    if (current.hasCustomStyleResolveCallbacks())
     
    867890    ASSERT(change != Detach);
    868891
     892    if (isInsertionPoint(current)) {
     893        current.clearNeedsStyleRecalc();
     894        current.clearChildNeedsStyleRecalc();
     895        return;
     896    }
     897
    869898    if (current.hasCustomStyleResolveCallbacks()) {
    870899        if (!current.willRecalcStyle(change))
     
    885914        change = resolveLocal(current, inheritedStyle, renderTreePosition, change);
    886915
    887     if (change != Detach) {
     916    RenderStyle* style = current.renderStyle();
     917
     918    if (change != Detach && style) {
    888919        StyleResolverParentPusher parentPusher(&current);
    889920
     
    918949            if (change >= Inherit || childElement->childNeedsStyleRecalc() || childElement->needsStyleRecalc()) {
    919950                parentPusher.push();
    920                 resolveTree(*childElement, current.renderStyle(), childRenderTreePosition, change);
     951                resolveTree(*childElement, style, childRenderTreePosition, change);
    921952            }
    922953            forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
     
    926957        updateBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition);
    927958    }
     959    if (change != Detach && !style)
     960        resetStyleForNonRenderedDescendants(current);
    928961
    929962    current.clearNeedsStyleRecalc();
Note: See TracChangeset for help on using the changeset viewer.