Changeset 165542 in webkit


Ignore:
Timestamp:
Mar 13, 2014, 10:29:09 AM (11 years ago)
Author:
Antti Koivisto
Message:

Remove StyleResolver::State::m_parentNode
https://bugs.webkit.org/show_bug.cgi?id=130194

Reviewed by Andreas Kling.

This variable was the "parent" node where the style was being inherited from, not the actual parent.
The code would also recompute it even though the call sites generally know the rendering parent already.

If we consistently pass parent style to StyleResolver::styleForElement we won't need the variable and
the associated code. We also get rid of one more client of NodeRenderingTraversal.

  • css/MediaQueryMatcher.cpp:

(WebCore::MediaQueryMatcher::prepareEvaluator):

  • css/SVGCSSStyleSelector.cpp:

(WebCore::StyleResolver::applySVGProperty):

  • css/StyleMedia.cpp:

(WebCore::StyleMedia::matchMedium):

  • css/StyleResolver.cpp:

(WebCore::StyleResolver::State::clear):
(WebCore::StyleResolver::StyleResolver):
(WebCore::StyleResolver::State::initForStyleResolve):
(WebCore::StyleResolver::applyProperty):

  • css/StyleResolver.h:

(WebCore::StyleResolver::document):
(WebCore::StyleResolver::State::State):

  • dom/Element.cpp:

(WebCore::Element::customStyleForRenderer):

Add parentStyle parameter.

  • dom/Element.h:
  • dom/PseudoElement.cpp:

(WebCore::PseudoElement::customStyleForRenderer):

  • dom/PseudoElement.h:
  • html/HTMLOptGroupElement.cpp:

(WebCore::HTMLOptGroupElement::didAttachRenderers):
(WebCore::HTMLOptGroupElement::updateNonRenderStyle):
(WebCore::HTMLOptGroupElement::customStyleForRenderer):

  • html/HTMLOptGroupElement.h:
  • html/HTMLOptionElement.cpp:

(WebCore::HTMLOptionElement::didAttachRenderers):
(WebCore::HTMLOptionElement::updateNonRenderStyle):
(WebCore::HTMLOptionElement::customStyleForRenderer):

  • html/HTMLOptionElement.h:
  • html/HTMLTitleElement.cpp:

(WebCore::HTMLTitleElement::textWithDirection):

  • html/shadow/TextControlInnerElements.cpp:

(WebCore::TextControlInnerElement::customStyleForRenderer):
(WebCore::TextControlInnerTextElement::customStyleForRenderer):

  • html/shadow/TextControlInnerElements.h:
  • rendering/RenderNamedFlowFragment.cpp:

(WebCore::RenderNamedFlowFragment::computeStyleInRegion):
(WebCore::RenderNamedFlowFragment::computeChildrenStyleInRegion):
(WebCore::RenderNamedFlowFragment::setRegionObjectsRegionStyle):

  • rendering/RenderNamedFlowFragment.h:
  • style/StyleResolveTree.cpp:

(WebCore::Style::styleForElement):

This used to be Element::styleForRenderer. It is now a standalone static.

(WebCore::Style::elementInsideRegionNeedsRenderer):
(WebCore::Style::createRendererIfNeeded):
(WebCore::Style::resolveLocal):

  • svg/SVGElement.cpp:

(WebCore::SVGElement::customStyleForRenderer):

  • svg/SVGElement.h:
Location:
trunk/Source/WebCore
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r165540 r165542  
     12014-03-13  Antti Koivisto  <antti@apple.com>
     2
     3        Remove StyleResolver::State::m_parentNode
     4        https://bugs.webkit.org/show_bug.cgi?id=130194
     5
     6        Reviewed by Andreas Kling.
     7
     8        This variable was the "parent" node where the style was being inherited from, not the actual parent.
     9        The code would also recompute it even though the call sites generally know the rendering parent already.
     10
     11        If we consistently pass parent style to StyleResolver::styleForElement we won't need the variable and
     12        the associated code. We also get rid of one more client of NodeRenderingTraversal.
     13
     14        * css/MediaQueryMatcher.cpp:
     15        (WebCore::MediaQueryMatcher::prepareEvaluator):
     16        * css/SVGCSSStyleSelector.cpp:
     17        (WebCore::StyleResolver::applySVGProperty):
     18        * css/StyleMedia.cpp:
     19        (WebCore::StyleMedia::matchMedium):
     20        * css/StyleResolver.cpp:
     21        (WebCore::StyleResolver::State::clear):
     22        (WebCore::StyleResolver::StyleResolver):
     23        (WebCore::StyleResolver::State::initForStyleResolve):
     24        (WebCore::StyleResolver::applyProperty):
     25        * css/StyleResolver.h:
     26        (WebCore::StyleResolver::document):
     27        (WebCore::StyleResolver::State::State):
     28        * dom/Element.cpp:
     29        (WebCore::Element::customStyleForRenderer):
     30       
     31            Add parentStyle parameter.
     32
     33        * dom/Element.h:
     34        * dom/PseudoElement.cpp:
     35        (WebCore::PseudoElement::customStyleForRenderer):
     36        * dom/PseudoElement.h:
     37        * html/HTMLOptGroupElement.cpp:
     38        (WebCore::HTMLOptGroupElement::didAttachRenderers):
     39        (WebCore::HTMLOptGroupElement::updateNonRenderStyle):
     40        (WebCore::HTMLOptGroupElement::customStyleForRenderer):
     41        * html/HTMLOptGroupElement.h:
     42        * html/HTMLOptionElement.cpp:
     43        (WebCore::HTMLOptionElement::didAttachRenderers):
     44        (WebCore::HTMLOptionElement::updateNonRenderStyle):
     45        (WebCore::HTMLOptionElement::customStyleForRenderer):
     46        * html/HTMLOptionElement.h:
     47        * html/HTMLTitleElement.cpp:
     48        (WebCore::HTMLTitleElement::textWithDirection):
     49        * html/shadow/TextControlInnerElements.cpp:
     50        (WebCore::TextControlInnerElement::customStyleForRenderer):
     51        (WebCore::TextControlInnerTextElement::customStyleForRenderer):
     52        * html/shadow/TextControlInnerElements.h:
     53        * rendering/RenderNamedFlowFragment.cpp:
     54        (WebCore::RenderNamedFlowFragment::computeStyleInRegion):
     55        (WebCore::RenderNamedFlowFragment::computeChildrenStyleInRegion):
     56        (WebCore::RenderNamedFlowFragment::setRegionObjectsRegionStyle):
     57        * rendering/RenderNamedFlowFragment.h:
     58        * style/StyleResolveTree.cpp:
     59        (WebCore::Style::styleForElement):
     60       
     61            This used to be Element::styleForRenderer. It is now a standalone static.
     62
     63        (WebCore::Style::elementInsideRegionNeedsRenderer):
     64        (WebCore::Style::createRendererIfNeeded):
     65        (WebCore::Style::resolveLocal):
     66        * svg/SVGElement.cpp:
     67        (WebCore::SVGElement::customStyleForRenderer):
     68        * svg/SVGElement.h:
     69
    1702014-03-13  Zalan Bujtas  <zalan@apple.com>
    271
  • trunk/Source/WebCore/css/MediaQueryMatcher.cpp

    r162772 r165542  
    8585        return nullptr;
    8686
    87     RefPtr<RenderStyle> rootStyle = m_document->ensureStyleResolver().styleForElement(documentElement, 0 /*defaultParent*/, DisallowStyleSharing, MatchOnlyUserAgentRules);
     87    RefPtr<RenderStyle> rootStyle = m_document->ensureStyleResolver().styleForElement(documentElement, m_document->renderStyle(), DisallowStyleSharing, MatchOnlyUserAgentRules);
    8888
    8989    return std::make_unique<MediaQueryEvaluator>(mediaType(), m_document->frame(), rootStyle.get());
  • trunk/Source/WebCore/css/SVGCSSStyleSelector.cpp

    r163751 r165542  
    111111    SVGRenderStyle& svgStyle = state.style()->accessSVGStyle();
    112112
    113     bool isInherit = state.parentNode() && value->isInheritedValue();
    114     bool isInitial = value->isInitialValue() || (!state.parentNode() && value->isInheritedValue());
     113    bool isInherit = state.parentStyle() && value->isInheritedValue();
     114    bool isInitial = value->isInitialValue() || (!state.parentStyle() && value->isInheritedValue());
    115115
    116116    // What follows is a list that maps the CSS properties into their
  • trunk/Source/WebCore/css/StyleMedia.cpp

    r153926 r165542  
    6161        return false;
    6262
    63     RefPtr<RenderStyle> rootStyle = document->ensureStyleResolver().styleForElement(documentElement, 0 /*defaultParent*/, DisallowStyleSharing, MatchOnlyUserAgentRules);
     63    RefPtr<RenderStyle> rootStyle = document->ensureStyleResolver().styleForElement(documentElement, document->renderStyle(), DisallowStyleSharing, MatchOnlyUserAgentRules);
    6464
    6565    RefPtr<MediaQuerySet> media = MediaQuerySet::create();
  • trunk/Source/WebCore/css/StyleResolver.cpp

    r165465 r165542  
    8989#include "MediaQueryEvaluator.h"
    9090#include "NodeRenderStyle.h"
    91 #include "NodeRenderingTraversal.h"
    9291#include "Page.h"
    9392#include "PageRuleCollector.h"
     
    239238    m_styledElement = nullptr;
    240239    m_parentStyle = nullptr;
    241     m_parentNode = nullptr;
    242240    m_regionForStyling = nullptr;
    243241    m_pendingImageProperties.clear();
     
    286284
    287285    if (root)
    288         m_rootDefaultStyle = styleForElement(root, 0, DisallowStyleSharing, MatchOnlyUserAgentRules);
     286        m_rootDefaultStyle = styleForElement(root, m_document.renderStyle(), DisallowStyleSharing, MatchOnlyUserAgentRules);
    289287
    290288    if (m_rootDefaultStyle && view)
     
    412410
    413411    if (e) {
    414         m_parentNode = e->isPseudoElement() ? toPseudoElement(e)->hostElement() : NodeRenderingTraversal::parent(e);
    415412        bool resetStyleInheritance = hasShadowRootParent(*e) && toShadowRoot(e->parentNode())->resetStyleInheritance();
    416         m_parentStyle = resetStyleInheritance ? 0 :
    417             parentStyle ? parentStyle :
    418             m_parentNode ? m_parentNode->renderStyle() : 0;
    419     } else {
    420         m_parentNode = 0;
     413        m_parentStyle = resetStyleInheritance ? nullptr : parentStyle;
     414    } else
    421415        m_parentStyle = parentStyle;
    422     }
    423416
    424417    Node* docElement = e ? e->document().documentElement() : 0;
     
    21262119    }
    21272120
    2128     bool isInherit = state.parentNode() && value->isInheritedValue();
    2129     bool isInitial = value->isInitialValue() || (!state.parentNode() && value->isInheritedValue());
     2121    bool isInherit = state.parentStyle() && value->isInheritedValue();
     2122    bool isInitial = value->isInitialValue() || (!state.parentStyle() && value->isInheritedValue());
    21302123
    21312124    ASSERT(!isInherit || !isInitial); // isInherit -> !isInitial && isInitial -> !isInherit
    2132     ASSERT(!isInherit || (state.parentNode() && state.parentStyle())); // isInherit -> (state.parentNode() && state.parentStyle())
    21332125
    21342126    if (!state.applyPropertyToRegularStyle() && (!state.applyPropertyToVisitedLinkStyle() || !isValidVisitedLinkProperty(id))) {
  • trunk/Source/WebCore/css/StyleResolver.h

    r164869 r165542  
    144144    void popParentElement(Element*);
    145145
    146     PassRef<RenderStyle> styleForElement(Element*, RenderStyle* parentStyle = 0, StyleSharingBehavior = AllowStyleSharing,
    147         RuleMatchingBehavior = MatchAllRules, RenderRegion* regionForStyling = 0);
     146    PassRef<RenderStyle> styleForElement(Element*, RenderStyle* parentStyle, StyleSharingBehavior = AllowStyleSharing,
     147        RuleMatchingBehavior = MatchAllRules, RenderRegion* regionForStyling = nullptr);
    148148
    149149    void keyframeStylesForAnimation(Element*, const RenderStyle*, KeyframeList&);
     
    159159    Element* element() { return m_state.element(); }
    160160    Document& document() { return m_document; }
    161     bool hasParentNode() const { return m_state.parentNode(); }
    162161
    163162    // FIXME: It could be better to call m_ruleSets.appendAuthorStyleSheets() directly after we factor StyleRsolver further.
     
    337336        : m_element(0)
    338337        , m_styledElement(0)
    339         , m_parentNode(0)
    340338        , m_parentStyle(0)
    341339        , m_rootElementStyle(0)
     
    362360        PassRef<RenderStyle> takeStyle() { return m_style.releaseNonNull(); }
    363361
    364         const ContainerNode* parentNode() const { return m_parentNode; }
    365362        void setParentStyle(PassRef<RenderStyle> parentStyle) { m_parentStyle = std::move(parentStyle); }
    366363        RenderStyle* parentStyle() const { return m_parentStyle.get(); }
     
    409406        RefPtr<RenderStyle> m_style;
    410407        StyledElement* m_styledElement;
    411         ContainerNode* m_parentNode;
    412408        RefPtr<RenderStyle> m_parentStyle;
    413409        RenderStyle* m_rootElementStyle;
  • trunk/Source/WebCore/dom/Element.cpp

    r165465 r165542  
    13871387}
    13881388
    1389 PassRef<RenderStyle> Element::styleForRenderer()
    1390 {
    1391     if (hasCustomStyleResolveCallbacks()) {
    1392         if (RefPtr<RenderStyle> style = customStyleForRenderer())
    1393             return style.releaseNonNull();
    1394     }
    1395 
    1396     return document().ensureStyleResolver().styleForElement(this);
    1397 }
    1398 
    13991389ShadowRoot* Element::shadowRoot() const
    14001390{
     
    28952885}
    28962886
    2897 PassRefPtr<RenderStyle> Element::customStyleForRenderer()
     2887PassRefPtr<RenderStyle> Element::customStyleForRenderer(RenderStyle&)
    28982888{
    28992889    ASSERT(hasCustomStyleResolveCallbacks());
  • trunk/Source/WebCore/dom/Element.h

    r165046 r165542  
    525525    virtual bool isSpellCheckingEnabled() const;
    526526
    527     PassRef<RenderStyle> styleForRenderer();
    528 
    529527    RenderNamedFlowFragment* renderNamedFlowFragment() const;
    530528
     
    559557    virtual void willDetachRenderers();
    560558    virtual void didDetachRenderers();
     559    virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle);
    561560
    562561    void setBeforePseudoElement(PassRefPtr<PseudoElement>);
     
    579578    virtual void childrenChanged(const ChildChange&) override;
    580579    virtual void removeAllEventListeners() override final;
    581 
    582     virtual PassRefPtr<RenderStyle> customStyleForRenderer();
    583580
    584581    void clearTabIndexExplicitlyIfNeeded();   
  • trunk/Source/WebCore/dom/PseudoElement.cpp

    r163079 r165542  
    7171}
    7272
    73 PassRefPtr<RenderStyle> PseudoElement::customStyleForRenderer()
     73PassRefPtr<RenderStyle> PseudoElement::customStyleForRenderer(RenderStyle& parentStyle)
    7474{
    75     return m_hostElement->renderer()->getCachedPseudoStyle(m_pseudoId);
     75    return m_hostElement->renderer()->getCachedPseudoStyle(m_pseudoId, &parentStyle);
    7676}
    7777
  • trunk/Source/WebCore/dom/PseudoElement.h

    r162158 r165542  
    4646    void clearHostElement() { m_hostElement = nullptr; }
    4747
    48     virtual PassRefPtr<RenderStyle> customStyleForRenderer() override;
     48    virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override;
    4949    virtual void didAttachRenderers() override;
    5050    virtual bool rendererIsNeeded(const RenderStyle&) override;
  • trunk/Source/WebCore/html/HTMLOptGroupElement.cpp

    r155795 r165542  
    9797    // renderer like <optgroup> or if it doesn't allow children like <select>.
    9898    if (!m_style && parentNode()->renderStyle())
    99         updateNonRenderStyle();
     99        updateNonRenderStyle(*parentNode()->renderStyle());
    100100}
    101101
     
    105105}
    106106
    107 void HTMLOptGroupElement::updateNonRenderStyle()
     107void HTMLOptGroupElement::updateNonRenderStyle(RenderStyle& parentStyle)
    108108{
    109     m_style = document().ensureStyleResolver().styleForElement(this);
     109    m_style = document().ensureStyleResolver().styleForElement(this, &parentStyle);
    110110}
    111111
     
    115115}
    116116
    117 PassRefPtr<RenderStyle> HTMLOptGroupElement::customStyleForRenderer()
     117PassRefPtr<RenderStyle> HTMLOptGroupElement::customStyleForRenderer(RenderStyle& parentStyle)
    118118{
    119119    // styleForRenderer is called whenever a new style should be associated
    120120    // with an Element so now is a good time to update our cached style.
    121     updateNonRenderStyle();
     121    updateNonRenderStyle(parentStyle);
    122122    return m_style;
    123123}
  • trunk/Source/WebCore/html/HTMLOptGroupElement.h

    r162158 r165542  
    5555
    5656    // <optgroup> never has a renderer so we manually manage a cached style.
    57     void updateNonRenderStyle();
     57    void updateNonRenderStyle(RenderStyle& parentStyle);
    5858    virtual RenderStyle* nonRendererStyle() const override;
    59     virtual PassRefPtr<RenderStyle> customStyleForRenderer() override;
     59    virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override;
    6060
    6161    void recalcSelectOptions();
  • trunk/Source/WebCore/html/HTMLOptionElement.cpp

    r160599 r165542  
    9595    // renderer like <optgroup> or if it doesn't allow children like <select>.
    9696    if (!m_style && parentNode()->renderStyle())
    97         updateNonRenderStyle();
     97        updateNonRenderStyle(*parentNode()->renderStyle());
    9898}
    9999
     
    301301}
    302302
    303 void HTMLOptionElement::updateNonRenderStyle()
    304 {
    305     m_style = document().ensureStyleResolver().styleForElement(this);
     303void HTMLOptionElement::updateNonRenderStyle(RenderStyle& parentStyle)
     304{
     305    m_style = document().ensureStyleResolver().styleForElement(this, &parentStyle);
    306306}
    307307
     
    311311}
    312312
    313 PassRefPtr<RenderStyle> HTMLOptionElement::customStyleForRenderer()
     313PassRefPtr<RenderStyle> HTMLOptionElement::customStyleForRenderer(RenderStyle& parentStyle)
    314314{
    315315    // styleForRenderer is called whenever a new style should be associated
    316316    // with an Element so now is a good time to update our cached style.
    317     updateNonRenderStyle();
     317    updateNonRenderStyle(parentStyle);
    318318    return m_style;
    319319}
  • trunk/Source/WebCore/html/HTMLOptionElement.h

    r162158 r165542  
    8383
    8484    // <option> never has a renderer so we manually manage a cached style.
    85     void updateNonRenderStyle();
     85    void updateNonRenderStyle(RenderStyle& parentStyle);
    8686    virtual RenderStyle* nonRendererStyle() const override;
    87     virtual PassRefPtr<RenderStyle> customStyleForRenderer() override;
     87    virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override;
    8888
    8989    virtual void didRecalcStyle(Style::Change) override;
  • trunk/Source/WebCore/html/HTMLTitleElement.cpp

    r157854 r165542  
    2828#include "RenderStyle.h"
    2929#include "StyleInheritedData.h"
     30#include "StyleResolver.h"
    3031#include "Text.h"
    3132#include "TextNodeTraversal.h"
     
    8687        direction = computedStyle->direction();
    8788    else {
    88         Ref<RenderStyle> style(styleForRenderer());
     89        Ref<RenderStyle> style(document().ensureStyleResolver().styleForElement(this, parentElement() ? parentElement()->renderStyle() : nullptr));
    8990        direction = style.get().direction();
    9091    }
  • trunk/Source/WebCore/html/shadow/TextControlInnerElements.cpp

    r164184 r165542  
    7575}
    7676
    77 PassRefPtr<RenderStyle> TextControlInnerElement::customStyleForRenderer()
     77PassRefPtr<RenderStyle> TextControlInnerElement::customStyleForRenderer(RenderStyle&)
    7878{
    7979    RenderTextControlSingleLine* parentRenderer = toRenderTextControlSingleLine(shadowHost()->renderer());
     
    123123}
    124124
    125 PassRefPtr<RenderStyle> TextControlInnerTextElement::customStyleForRenderer()
     125PassRefPtr<RenderStyle> TextControlInnerTextElement::customStyleForRenderer(RenderStyle&)
    126126{
    127127    RenderTextControl* parentRenderer = toRenderTextControl(shadowHost()->renderer());
  • trunk/Source/WebCore/html/shadow/TextControlInnerElements.h

    r162158 r165542  
    5151protected:
    5252    TextControlInnerElement(Document&);
    53     virtual PassRefPtr<RenderStyle> customStyleForRenderer() override;
     53    virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override;
    5454
    5555private:
     
    6868    TextControlInnerTextElement(Document&);
    6969    virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
    70     virtual PassRefPtr<RenderStyle> customStyleForRenderer() override;
     70    virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override;
    7171    virtual bool isMouseFocusable() const override { return false; }
    7272    virtual bool isTextControlInnerTextElement() const override { return true; }
  • trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp

    r165377 r165542  
    3535#include "RenderBoxRegionInfo.h"
    3636#include "RenderFlowThread.h"
     37#include "RenderIterator.h"
    3738#include "RenderNamedFlowThread.h"
    3839#include "RenderView.h"
     
    350351}
    351352
    352 PassRefPtr<RenderStyle> RenderNamedFlowFragment::computeStyleInRegion(const RenderObject* object)
    353 {
    354     ASSERT(object);
    355     ASSERT(!object->isAnonymous());
    356     ASSERT(object->node() && object->node()->isElementNode());
     353PassRefPtr<RenderStyle> RenderNamedFlowFragment::computeStyleInRegion(RenderElement& renderer, RenderStyle& parentStyle)
     354{
     355    ASSERT(!renderer.isAnonymous());
    357356
    358357    // FIXME: Region styling fails for pseudo-elements because the renderers don't have a node.
    359     Element* element = toElement(object->node());
    360     RefPtr<RenderStyle> renderObjectRegionStyle = object->view().document().ensureStyleResolver().styleForElement(element, 0, DisallowStyleSharing, MatchAllRules, this);
     358    RefPtr<RenderStyle> renderObjectRegionStyle = renderer.view().document().ensureStyleResolver().styleForElement(renderer.element(), &parentStyle, DisallowStyleSharing, MatchAllRules, this);
    361359
    362360    return renderObjectRegionStyle.release();
    363361}
    364362
    365 void RenderNamedFlowFragment::computeChildrenStyleInRegion(const RenderElement* object)
    366 {
    367     for (RenderObject* child = object->firstChild(); child; child = child->nextSibling()) {
    368 
    369         auto it = m_renderObjectRegionStyle.find(child);
     363void RenderNamedFlowFragment::computeChildrenStyleInRegion(RenderElement& renderer)
     364{
     365    for (auto& child : childrenOfType<RenderObject>(renderer)) {
     366
     367        auto it = m_renderObjectRegionStyle.find(&child);
    370368
    371369        RefPtr<RenderStyle> childStyleInRegion;
     
    375373            objectRegionStyleCached = true;
    376374        } else {
    377             if (child->isAnonymous() || child->isInFlowRenderFlowThread())
    378                 childStyleInRegion = RenderStyle::createAnonymousStyleWithDisplay(&object->style(), child->style().display());
    379             else if (child->isText())
    380                 childStyleInRegion = RenderStyle::clone(&object->style());
     375            if (child.isAnonymous() || child.isInFlowRenderFlowThread())
     376                childStyleInRegion = RenderStyle::createAnonymousStyleWithDisplay(&renderer.style(), child.style().display());
     377            else if (child.isText())
     378                childStyleInRegion = RenderStyle::clone(&renderer.style());
    381379            else
    382                 childStyleInRegion = computeStyleInRegion(child);
    383         }
    384 
    385         setObjectStyleInRegion(child, childStyleInRegion, objectRegionStyleCached);
    386 
    387         if (child->isRenderElement())
     380                childStyleInRegion = computeStyleInRegion(toRenderElement(child), renderer.style());
     381        }
     382
     383        setObjectStyleInRegion(&child, childStyleInRegion, objectRegionStyleCached);
     384
     385        if (child.isRenderElement())
    388386            computeChildrenStyleInRegion(toRenderElement(child));
    389387    }
     
    453451            objectRegionStyleCached = true;
    454452        } else
    455             objectStyleInRegion = computeStyleInRegion(object);
     453            objectStyleInRegion = computeStyleInRegion(*object, style());
    456454
    457455        setObjectStyleInRegion(object, objectStyleInRegion, objectRegionStyleCached);
    458456
    459         computeChildrenStyleInRegion(object);
     457        computeChildrenStyleInRegion(*object);
    460458    }
    461459}
  • trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h

    r165377 r165542  
    123123    virtual const char* renderName() const override { return "RenderNamedFlowFragment"; }
    124124
    125     PassRefPtr<RenderStyle> computeStyleInRegion(const RenderObject*);
    126     void computeChildrenStyleInRegion(const RenderElement*);
     125    PassRefPtr<RenderStyle> computeStyleInRegion(RenderElement&, RenderStyle& parentStyle);
     126    void computeChildrenStyleInRegion(RenderElement&);
    127127    void setObjectStyleInRegion(RenderObject*, PassRefPtr<RenderStyle>, bool objectRegionStyleCached);
    128128
  • trunk/Source/WebCore/style/StyleResolveTree.cpp

    r165465 r165542  
    164164}
    165165
     166static PassRef<RenderStyle> styleForElement(Element& element, RenderStyle& parentStyle)
     167{
     168    if (element.hasCustomStyleResolveCallbacks()) {
     169        if (RefPtr<RenderStyle> style = element.customStyleForRenderer(parentStyle))
     170            return style.releaseNonNull();
     171    }
     172    return element.document().ensureStyleResolver().styleForElement(&element, &parentStyle);
     173}
     174
    166175// Check the specific case of elements that are children of regions but are flowed into a flow thread themselves.
    167176static bool elementInsideRegionNeedsRenderer(Element& element, const ContainerNode& renderingParentNode, RefPtr<RenderStyle>& style)
     
    177186
    178187    if (!style)
    179         style = element.styleForRenderer();
     188        style = styleForElement(element, *renderingParentNode.renderStyle());
    180189
    181190    // Children of this element will only be allowed to be flowed into other flow-threads if display is NOT none.
     
    217226
    218227    if (!style)
    219         style = element.styleForRenderer();
     228        style = styleForElement(element, *renderingParentNode.renderStyle());
    220229
    221230    RenderNamedFlowThread* parentFlowRenderer = 0;
     
    662671    Document& document = current.document();
    663672    if (currentStyle && current.styleChangeType() != ReconstructRenderTree) {
    664         newStyle = current.styleForRenderer();
     673        newStyle = styleForElement(current, *renderingParentNode.renderStyle());
    665674        localChange = determineChange(currentStyle.get(), newStyle.get());
    666675    }
  • trunk/Source/WebCore/svg/SVGElement.cpp

    r165045 r165542  
    769769}
    770770
    771 PassRefPtr<RenderStyle> SVGElement::customStyleForRenderer()
     771PassRefPtr<RenderStyle> SVGElement::customStyleForRenderer(RenderStyle& parentStyle)
    772772{
    773773    if (!correspondingElement())
    774         return document().ensureStyleResolver().styleForElement(this);
    775 
    776     RenderStyle* style = 0;
    777     if (Element* parent = parentOrShadowHostElement()) {
    778         if (auto renderer = parent->renderer())
    779             style = &renderer->style();
    780     }
    781 
    782     return document().ensureStyleResolver().styleForElement(correspondingElement(), style, DisallowStyleSharing);
     774        return document().ensureStyleResolver().styleForElement(this, &parentStyle);
     775
     776    return document().ensureStyleResolver().styleForElement(correspondingElement(), &parentStyle, DisallowStyleSharing);
    783777}
    784778
  • trunk/Source/WebCore/svg/SVGElement.h

    r164856 r165542  
    113113    static void synchronizeAllAnimatedSVGAttribute(SVGElement*);
    114114 
    115     virtual PassRefPtr<RenderStyle> customStyleForRenderer() override;
     115    virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override;
    116116
    117117    static void synchronizeRequiredFeatures(SVGElement* contextElement);
Note: See TracChangeset for help on using the changeset viewer.