Changeset 172599 in webkit


Ignore:
Timestamp:
Aug 14, 2014 12:38:37 PM (10 years ago)
Author:
Antti Koivisto
Message:

Make inherited style and parent renderer references
https://bugs.webkit.org/show_bug.cgi?id=135857

Reviewed by Andreas Kling.

We don't recurse into non-rendered subtrees anymore so they can't be null.
Also stop using Element::renderStyle() as it differs from e->renderer().style() in
some rare cases (that should be fixed).

  • style/StyleResolveTree.cpp:

(WebCore::Style::RenderTreePosition::parent):
(WebCore::Style::RenderTreePosition::RenderTreePosition):
(WebCore::Style::RenderTreePosition::canInsert):
(WebCore::Style::RenderTreePosition::insert):
(WebCore::Style::RenderTreePosition::computeNextSibling):
(WebCore::Style::shouldCreateRenderer):
(WebCore::Style::styleForElement):
(WebCore::Style::createRendererIfNeeded):
(WebCore::Style::textRendererIsNeeded):
(WebCore::Style::createTextRendererIfNeeded):
(WebCore::Style::updateTextRendererAfterContentChange):
(WebCore::Style::attachChildren):
(WebCore::Style::attachDistributedChildren):
(WebCore::Style::attachShadowRoot):
(WebCore::Style::resetStyleForNonRenderedDescendants):
(WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded):
(WebCore::Style::attachRenderTree):
(WebCore::Style::resolveLocal):
(WebCore::Style::resolveShadowTree):
(WebCore::Style::updateBeforeOrAfterPseudoElement):
(WebCore::Style::resolveTree):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r172597 r172599  
     12014-08-14  Antti Koivisto  <antti@apple.com>
     2
     3        Make inherited style and parent renderer references
     4        https://bugs.webkit.org/show_bug.cgi?id=135857
     5
     6        Reviewed by Andreas Kling.
     7
     8        We don't recurse into non-rendered subtrees anymore so they can't be null.
     9        Also stop using Element::renderStyle() as it differs from e->renderer().style() in
     10        some rare cases (that should be fixed).
     11
     12        * style/StyleResolveTree.cpp:
     13        (WebCore::Style::RenderTreePosition::parent):
     14        (WebCore::Style::RenderTreePosition::RenderTreePosition):
     15        (WebCore::Style::RenderTreePosition::canInsert):
     16        (WebCore::Style::RenderTreePosition::insert):
     17        (WebCore::Style::RenderTreePosition::computeNextSibling):
     18        (WebCore::Style::shouldCreateRenderer):
     19        (WebCore::Style::styleForElement):
     20        (WebCore::Style::createRendererIfNeeded):
     21        (WebCore::Style::textRendererIsNeeded):
     22        (WebCore::Style::createTextRendererIfNeeded):
     23        (WebCore::Style::updateTextRendererAfterContentChange):
     24        (WebCore::Style::attachChildren):
     25        (WebCore::Style::attachDistributedChildren):
     26        (WebCore::Style::attachShadowRoot):
     27        (WebCore::Style::resetStyleForNonRenderedDescendants):
     28        (WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded):
     29        (WebCore::Style::attachRenderTree):
     30        (WebCore::Style::resolveLocal):
     31        (WebCore::Style::resolveShadowTree):
     32        (WebCore::Style::updateBeforeOrAfterPseudoElement):
     33        (WebCore::Style::resolveTree):
     34
    1352014-08-14  Antti Koivisto  <antti@apple.com>
    236
  • trunk/Source/WebCore/style/StyleResolveTree.cpp

    r172517 r172599  
    6666public:
    6767    explicit RenderTreePosition(RenderView&);
    68     explicit RenderTreePosition(RenderElement* parent);
    69     RenderTreePosition(RenderElement* parent, RenderObject* nextSibling);
    70 
    71     RenderElement* parent() { return m_parent; }
    72     const RenderElement* parent() const { return m_parent; }
     68    explicit RenderTreePosition(RenderElement& parent);
     69    RenderTreePosition(RenderElement& parent, RenderObject* nextSibling);
     70
     71    RenderElement& parent() { return m_parent; }
     72    const RenderElement& parent() const { return m_parent; }
    7373
    7474    void insert(RenderObject&);
     
    8080
    8181private:
    82     RenderElement* m_parent;
     82    RenderElement& m_parent;
    8383    RenderObject* m_nextSibling;
    8484    bool m_hasValidNextSibling;
     
    8888};
    8989
    90 static void attachRenderTree(Element&, RenderStyle* inheritedStyle, RenderTreePosition&, PassRefPtr<RenderStyle>);
     90static void attachRenderTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, PassRefPtr<RenderStyle>);
    9191static void attachTextRenderer(Text&, RenderTreePosition&);
    9292static void detachRenderTree(Element&, DetachType);
    9393static void resolveTextNode(Text&, RenderTreePosition&);
    94 static void resolveTree(Element&, RenderStyle* inheritedStyle, RenderTreePosition&, Change);
     94static void resolveTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change);
    9595
    9696Change determineChange(const RenderStyle* s1, const RenderStyle* s2)
     
    173173
    174174RenderTreePosition::RenderTreePosition(RenderView& root)
    175     : m_parent(&root)
     175    : m_parent(root)
    176176    , m_nextSibling(nullptr)
    177177    , m_hasValidNextSibling(true)
     
    182182}
    183183
    184 RenderTreePosition::RenderTreePosition(RenderElement* parent)
     184RenderTreePosition::RenderTreePosition(RenderElement& parent)
    185185    : m_parent(parent)
    186186    , m_nextSibling(nullptr)
     
    192192}
    193193
    194 RenderTreePosition::RenderTreePosition(RenderElement* parent, RenderObject* nextSibling)
     194RenderTreePosition::RenderTreePosition(RenderElement& parent, RenderObject* nextSibling)
    195195    : m_parent(parent)
    196196    , m_nextSibling(nextSibling)
     
    204204bool RenderTreePosition::canInsert(RenderElement& renderer) const
    205205{
    206     ASSERT(m_parent);
    207206    ASSERT(!renderer.parent());
    208     return m_parent->isChildAllowed(renderer, renderer.style());
     207    return m_parent.isChildAllowed(renderer, renderer.style());
    209208}
    210209
    211210bool RenderTreePosition::canInsert(RenderText& renderer) const
    212211{
    213     ASSERT(m_parent);
    214212    ASSERT(!renderer.parent());
    215     return m_parent->isChildAllowed(renderer, m_parent->style());
     213    return m_parent.isChildAllowed(renderer, m_parent.style());
    216214}
    217215
    218216void RenderTreePosition::insert(RenderObject& renderer)
    219217{
    220     ASSERT(m_parent);
    221218    ASSERT(m_hasValidNextSibling);
    222     m_parent->addChild(&renderer, m_nextSibling);
     219    m_parent.addChild(&renderer, m_nextSibling);
    223220}
    224221
    225222void RenderTreePosition::computeNextSibling(const Node& node)
    226223{
    227     ASSERT(m_parent);
    228224    ASSERT(!node.renderer());
    229225    if (m_hasValidNextSibling) {
    230226        // Stop validating at some point so the assert doesn't make us O(N^2) on debug builds.
    231         ASSERT(m_parent->isRenderView() || ++m_assertionLimitCounter > 20 || nextSiblingRenderer(node, *m_parent) == m_nextSibling);
    232         return;
    233     }
    234     m_nextSibling = nextSiblingRenderer(node, *m_parent);
     227        ASSERT(m_parent.isRenderView() || ++m_assertionLimitCounter > 20 || nextSiblingRenderer(node, m_parent) == m_nextSibling);
     228        return;
     229    }
     230    m_nextSibling = nextSiblingRenderer(node, m_parent);
    235231    m_hasValidNextSibling = true;
    236232}
     
    244240}
    245241
    246 static bool shouldCreateRenderer(const Element& element, const RenderElement* parentRenderer)
     242static bool shouldCreateRenderer(const Element& element, const RenderElement& parentRenderer)
    247243{
    248244    if (!element.document().shouldCreateRenderers())
    249245        return false;
    250     if (!parentRenderer)
    251         return false;
    252     if (!parentRenderer->canHaveChildren() && !(element.isPseudoElement() && parentRenderer->canHaveGeneratedChildren()))
    253         return false;
    254     if (parentRenderer->element() && !parentRenderer->element()->childShouldCreateRenderer(element))
     246    if (!parentRenderer.canHaveChildren() && !(element.isPseudoElement() && parentRenderer.canHaveGeneratedChildren()))
     247        return false;
     248    if (parentRenderer.element() && !parentRenderer.element()->childShouldCreateRenderer(element))
    255249        return false;
    256250    return true;
    257251}
    258252
    259 static PassRef<RenderStyle> styleForElement(Element& element, RenderStyle* inheritedStyle)
    260 {
    261     if (element.hasCustomStyleResolveCallbacks() && inheritedStyle) {
    262         if (RefPtr<RenderStyle> style = element.customStyleForRenderer(*inheritedStyle))
     253static PassRef<RenderStyle> styleForElement(Element& element, RenderStyle& inheritedStyle)
     254{
     255    if (element.hasCustomStyleResolveCallbacks()) {
     256        if (RefPtr<RenderStyle> style = element.customStyleForRenderer(inheritedStyle))
    263257            return style.releaseNonNull();
    264258    }
    265     return element.document().ensureStyleResolver().styleForElement(&element, inheritedStyle);
     259    return element.document().ensureStyleResolver().styleForElement(&element, &inheritedStyle);
    266260}
    267261
     
    279273#endif
    280274
    281 static void createRendererIfNeeded(Element& element, RenderStyle* inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)
     275static void createRendererIfNeeded(Element& element, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)
    282276{
    283277    ASSERT(!element.renderer());
     
    302296
    303297    RenderTreePosition insertionPosition = parentFlowRenderer
    304         ? RenderTreePosition(parentFlowRenderer, parentFlowRenderer->nextRendererForElement(element))
     298        ? RenderTreePosition(*parentFlowRenderer, parentFlowRenderer->nextRendererForElement(element))
    305299        : renderTreePosition;
    306300
     
    315309    // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style
    316310    // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail.
    317     newRenderer->setFlowThreadState(insertionPosition.parent()->flowThreadState());
     311    newRenderer->setFlowThreadState(insertionPosition.parent().flowThreadState());
    318312
    319313    // Code below updateAnimations() can depend on Element::renderer() already being set.
     
    329323    Document& document = element.document();
    330324    if (document.webkitIsFullScreen() && document.webkitCurrentFullScreenElement() == &element) {
    331         newRenderer = RenderFullScreen::wrapRenderer(newRenderer, insertionPosition.parent(), document);
     325        newRenderer = RenderFullScreen::wrapRenderer(newRenderer, &insertionPosition.parent(), document);
    332326        if (!newRenderer)
    333327            return;
     
    378372static bool textRendererIsNeeded(const Text& textNode, const RenderTreePosition& renderTreePosition)
    379373{
    380     if (!renderTreePosition.parent())
    381         return false;
    382     const RenderElement& parentRenderer = *renderTreePosition.parent();
     374    const RenderElement& parentRenderer = renderTreePosition.parent();
    383375    if (!parentRenderer.canHaveChildren())
    384376        return false;
     
    428420        return;
    429421
    430     auto newRenderer = textNode.createTextRenderer(renderTreePosition.parent()->style());
     422    auto newRenderer = textNode.createTextRenderer(renderTreePosition.parent().style());
    431423    ASSERT(newRenderer);
    432424
     
    438430    // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style
    439431    // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail.
    440     newRenderer->setFlowThreadState(renderTreePosition.parent()->flowThreadState());
     432    newRenderer->setFlowThreadState(renderTreePosition.parent().flowThreadState());
    441433
    442434    textNode.setRenderer(newRenderer.get());
     
    467459    bool hadRenderer = textNode.renderer();
    468460
    469     RenderTreePosition renderTreePosition(renderingParentNode->renderer());
     461    RenderTreePosition renderTreePosition(*renderingParentNode->renderer());
    470462    resolveTextNode(textNode, renderTreePosition);
    471463
     
    474466}
    475467
    476 static void attachChildren(ContainerNode& current, RenderStyle* inheritedStyle, RenderTreePosition& renderTreePosition)
     468static void attachChildren(ContainerNode& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)
    477469{
    478470    for (Node* child = current.firstChild(); child; child = child->nextSibling()) {
     
    491483}
    492484
    493 static void attachDistributedChildren(InsertionPoint& insertionPoint, RenderStyle* inheritedStyle, RenderTreePosition& renderTreePosition)
     485static void attachDistributedChildren(InsertionPoint& insertionPoint, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)
    494486{
    495487    if (ShadowRoot* shadowRoot = insertionPoint.containingShadowRoot())
     
    520512{
    521513    ASSERT(shadowRoot.hostElement());
    522 
    523     RenderTreePosition renderTreePosition(shadowRoot.hostElement()->renderer());
    524     attachChildren(shadowRoot, shadowRoot.hostElement()->renderStyle(), renderTreePosition);
     514    ASSERT(shadowRoot.hostElement()->renderer());
     515
     516    auto& renderer = *shadowRoot.hostElement()->renderer();
     517    RenderTreePosition renderTreePosition(renderer);
     518    attachChildren(shadowRoot, renderer.style(), renderTreePosition);
    525519
    526520    shadowRoot.clearNeedsStyleRecalc();
     
    558552static void resetStyleForNonRenderedDescendants(Element& current)
    559553{
    560     ASSERT(!current.renderStyle());
     554    ASSERT(!current.renderer());
    561555    for (auto& child : childrenOfType<Element>(current)) {
    562556        ASSERT(!child.renderer());
     
    591585    RefPtr<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId);
    592586    setBeforeOrAfterPseudoElement(current, pseudoElement, pseudoId);
    593     attachRenderTree(*pseudoElement, current.renderStyle(), renderTreePosition, nullptr);
    594 }
    595 
    596 static void attachRenderTree(Element& current, RenderStyle* inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)
     587    attachRenderTree(*pseudoElement, *current.renderStyle(), renderTreePosition, nullptr);
     588}
     589
     590static void attachRenderTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)
    597591{
    598592    PostResolutionCallbackDisabler callbackDisabler(current.document());
     
    611605    createRendererIfNeeded(current, inheritedStyle, renderTreePosition, resolvedStyle);
    612606
    613     if (RenderStyle* style = current.renderStyle()) {
     607    if (auto* renderer = current.renderer()) {
    614608        StyleResolverParentPusher parentPusher(&current);
    615609
    616         RenderTreePosition childRenderTreePosition(current.renderer());
     610        RenderTreePosition childRenderTreePosition(*renderer);
    617611        attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE, childRenderTreePosition);
    618612
     
    623617            parentPusher.push();
    624618
    625         attachChildren(current, style, childRenderTreePosition);
     619        attachChildren(current, renderer->style(), childRenderTreePosition);
    626620
    627621        if (AXObjectCache* cache = current.document().axObjectCache())
     
    735729}
    736730
    737 static Change resolveLocal(Element& current, RenderStyle* inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange)
     731static Change resolveLocal(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange)
    738732{
    739733    Change localChange = Detach;
     
    803797{
    804798    ASSERT(shadowRoot.hostElement() == &host);
    805     RenderTreePosition renderTreePosition(host.renderer());
     799    ASSERT(host.renderer());
     800    RenderTreePosition renderTreePosition(*host.renderer());
    806801    for (Node* child = shadowRoot.firstChild(); child; child = child->nextSibling()) {
    807802        if (child->renderer())
     
    812807        }
    813808        if (child->isElementNode())
    814             resolveTree(*toElement(child), host.renderStyle(), renderTreePosition, change);
     809            resolveTree(*toElement(child), host.renderer()->style(), renderTreePosition, change);
    815810    }
    816811
     
    821816static void updateBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId, RenderTreePosition& renderTreePosition)
    822817{
     818    ASSERT(current.renderer());
    823819    if (PseudoElement* existingPseudoElement = beforeOrAfterPseudoElement(current, pseudoId)) {
    824820        if (existingPseudoElement->renderer())
     
    826822
    827823        if (needsPseudoElement(current, pseudoId))
    828             resolveTree(*existingPseudoElement, current.renderStyle(), renderTreePosition, current.needsStyleRecalc() ? Force : change);
     824            resolveTree(*existingPseudoElement, current.renderer()->style(), renderTreePosition, current.needsStyleRecalc() ? Force : change);
    829825        else
    830826            clearBeforeOrAfterPseudoElement(current, pseudoId);
     
    886882#endif // PLATFORM(IOS)
    887883
    888 void resolveTree(Element& current, RenderStyle* inheritedStyle, RenderTreePosition& renderTreePosition, Change change)
     884void resolveTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)
    889885{
    890886    ASSERT(change != Detach);
     
    911907        current.resetComputedStyle();
    912908
    913     if (inheritedStyle && (change >= Inherit || current.needsStyleRecalc()))
     909    if (change >= Inherit || current.needsStyleRecalc())
    914910        change = resolveLocal(current, inheritedStyle, renderTreePosition, change);
    915911
    916     RenderStyle* style = current.renderStyle();
    917 
    918     if (change != Detach && style) {
     912    auto* renderer = current.renderer();
     913
     914    if (change != Detach && renderer) {
    919915        StyleResolverParentPusher parentPusher(&current);
    920916
     
    926922        }
    927923
    928         RenderTreePosition childRenderTreePosition(current.renderer());
     924        RenderTreePosition childRenderTreePosition(*renderer);
    929925        updateBeforeOrAfterPseudoElement(current, change, BEFORE, childRenderTreePosition);
    930926
     
    949945            if (change >= Inherit || childElement->childNeedsStyleRecalc() || childElement->needsStyleRecalc()) {
    950946                parentPusher.push();
    951                 resolveTree(*childElement, style, childRenderTreePosition, change);
     947                resolveTree(*childElement, renderer->style(), childRenderTreePosition, change);
    952948            }
    953949            forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
     
    957953        updateBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition);
    958954    }
    959     if (change != Detach && !style)
     955    if (change != Detach && !renderer)
    960956        resetStyleForNonRenderedDescendants(current);
    961957
     
    993989        return;
    994990    RenderTreePosition renderTreePosition(*document.renderView());
    995     resolveTree(*documentElement, document.renderStyle(), renderTreePosition, change);
     991    resolveTree(*documentElement, *document.renderStyle(), renderTreePosition, change);
    996992}
    997993
Note: See TracChangeset for help on using the changeset viewer.