Changeset 128331 in webkit


Ignore:
Timestamp:
Sep 12, 2012 9:54:55 AM (12 years ago)
Author:
morrita@google.com
Message:

[Scoped Style] NodeRareData::m_numberOfScopedHTMLStyleChildren could be replaced with a node flag.
https://bugs.webkit.org/show_bug.cgi?id=96450

Reviewed by Dimitri Glazkov.

This change gets rid of NodeRareData::m_numberOfScopedHTMLStyleChildren
by replacing it with a Node flag called HasScopedHTMLStyleChildFlag.
Instead of tracking the number of certain node, this chagne compute the number
when necessary.

Now we no longer need to hit rareData() for each hasScopedHTMLStyleChild() call.
Note that because such a re-counting occurs only when the scoped <style> elements
leave the tree, the performance impact is negligible.

No new tests. Covered by existing tests.

  • dom/Node.cpp:

(WebCore):

  • dom/Node.h:

(WebCore::Node::hasScopedHTMLStyleChild):
(WebCore::Node::setHasScopedHTMLStyleChild):
(Node):

  • dom/NodeRareData.h:

(WebCore::NodeRareData::NodeRareData):
(NodeRareData):

  • html/HTMLStyleElement.cpp:

(WebCore::HTMLStyleElement::isRegisteredAsScoped):
(WebCore):
(WebCore::Node::registerScopedHTMLStyleChild):
(WebCore::Node::unregisterScopedHTMLStyleChild):
(WebCore::Node::numberOfScopedHTMLStyleChildren):
(WebCore::HTMLStyleElement::unregisterWithScopingNode):

  • html/HTMLStyleElement.h:

(HTMLStyleElement):

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r128329 r128331  
     12012-09-11 MORITA Hajime  <morrita@google.com>
     2
     3        [Scoped Style] NodeRareData::m_numberOfScopedHTMLStyleChildren could be replaced with a node flag.
     4        https://bugs.webkit.org/show_bug.cgi?id=96450
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        This change gets rid of NodeRareData::m_numberOfScopedHTMLStyleChildren
     9        by replacing it with a Node flag called HasScopedHTMLStyleChildFlag.
     10        Instead of tracking the number of certain node, this chagne compute the number
     11        when necessary.
     12
     13        Now we no longer need to hit rareData() for each hasScopedHTMLStyleChild() call.
     14        Note that because such a re-counting occurs only when the scoped <style> elements
     15        leave the tree, the performance impact is negligible.
     16
     17        No new tests. Covered by existing tests.
     18
     19        * dom/Node.cpp:
     20        (WebCore):
     21        * dom/Node.h:
     22        (WebCore::Node::hasScopedHTMLStyleChild):
     23        (WebCore::Node::setHasScopedHTMLStyleChild):
     24        (Node):
     25        * dom/NodeRareData.h:
     26        (WebCore::NodeRareData::NodeRareData):
     27        (NodeRareData):
     28        * html/HTMLStyleElement.cpp:
     29        (WebCore::HTMLStyleElement::isRegisteredAsScoped):
     30        (WebCore):
     31        (WebCore::Node::registerScopedHTMLStyleChild):
     32        (WebCore::Node::unregisterScopedHTMLStyleChild):
     33        (WebCore::Node::numberOfScopedHTMLStyleChildren):
     34        (WebCore::HTMLStyleElement::unregisterWithScopingNode):
     35        * html/HTMLStyleElement.h:
     36        (HTMLStyleElement):
     37
    1382012-09-12  Dimitri Glazkov  <dglazkov@chromium.org>
    239
  • trunk/Source/WebCore/dom/Node.cpp

    r128006 r128331  
    25362536#endif // ENABLE(MUTATION_OBSERVERS)
    25372537
    2538 #if ENABLE(STYLE_SCOPED)
    2539 bool Node::hasScopedHTMLStyleChild() const
    2540 {
    2541     return hasRareData() && rareData()->hasScopedHTMLStyleChild();
    2542 }
    2543 
    2544 size_t Node::numberOfScopedHTMLStyleChildren() const
    2545 {
    2546     return hasRareData() ? rareData()->numberOfScopedHTMLStyleChildren() : 0;
    2547 }
    2548 
    2549 void Node::registerScopedHTMLStyleChild()
    2550 {
    2551     ensureRareData()->registerScopedHTMLStyleChild();
    2552 }
    2553 
    2554 void Node::unregisterScopedHTMLStyleChild()
    2555 {
    2556     ASSERT(hasRareData());
    2557     if (hasRareData())
    2558         rareData()->unregisterScopedHTMLStyleChild();
    2559 }
    2560 #else
    2561 bool Node::hasScopedHTMLStyleChild() const
    2562 {
    2563     return 0;
    2564 }
    2565 
    2566 size_t Node::numberOfScopedHTMLStyleChildren() const
    2567 {
    2568     return 0;
    2569 }
    2570 #endif
    2571 
    25722538void Node::handleLocalEvents(Event* event)
    25732539{
  • trunk/Source/WebCore/dom/Node.h

    r128006 r128331  
    350350    void clearHasAttrList() { clearFlag(HasAttrListFlag); }
    351351
     352    bool hasScopedHTMLStyleChild() const { return getFlag(HasScopedHTMLStyleChildFlag); }
     353    void setHasScopedHTMLStyleChild(bool flag) { setFlag(flag, HasScopedHTMLStyleChildFlag); }
     354
    352355    enum ShouldSetAttached {
    353356        SetAttached,
     
    659662#endif // ENABLE(MUTATION_OBSERVERS)
    660663
    661 #if ENABLE(STYLE_SCOPED)
    662664    void registerScopedHTMLStyleChild();
    663665    void unregisterScopedHTMLStyleChild();
    664 #endif
    665     bool hasScopedHTMLStyleChild() const;
    666666    size_t numberOfScopedHTMLStyleChildren() const;
    667667
     
    711711        InNamedFlowFlag = 1 << 26,
    712712        HasAttrListFlag = 1 << 27,
    713         HasCustomCallbacksFlag = 1 << 28
     713        HasCustomCallbacksFlag = 1 << 28,
     714        HasScopedHTMLStyleChildFlag = 1 << 29
    714715    };
    715716
    716     // 4 bits remaining
     717    // 3 bits remaining
    717718
    718719    bool getFlag(NodeFlags mask) const { return m_nodeFlags & mask; }
  • trunk/Source/WebCore/dom/NodeRareData.h

    r126926 r128331  
    187187        , m_isFocused(false)
    188188        , m_needsFocusAppearanceUpdateSoonAfterAttach(false)
    189 #if ENABLE(STYLE_SCOPED)
    190         , m_numberOfScopedHTMLStyleChildren(0)
    191 #endif
    192189    {
    193190    }
     
    309306
    310307        m_itemType->setValue(value);
    311     }
    312 #endif
    313 
    314 #if ENABLE(STYLE_SCOPED)
    315     void registerScopedHTMLStyleChild()
    316     {
    317         ++m_numberOfScopedHTMLStyleChildren;
    318     }
    319 
    320     void unregisterScopedHTMLStyleChild()
    321     {
    322         ASSERT(m_numberOfScopedHTMLStyleChildren > 0);
    323         if (m_numberOfScopedHTMLStyleChildren > 0)
    324             --m_numberOfScopedHTMLStyleChildren;
    325     }
    326 
    327     bool hasScopedHTMLStyleChild() const
    328     {
    329         return m_numberOfScopedHTMLStyleChildren;
    330     }
    331 
    332     size_t numberOfScopedHTMLStyleChildren() const
    333     {
    334         return m_numberOfScopedHTMLStyleChildren;
    335308    }
    336309#endif
     
    365338    mutable RefPtr<DOMSettableTokenList> m_itemType;
    366339#endif
    367 
    368 #if ENABLE(STYLE_SCOPED)
    369     size_t m_numberOfScopedHTMLStyleChildren;
    370 #endif
    371340};
    372341
  • trunk/Source/WebCore/html/HTMLStyleElement.cpp

    r121344 r128331  
    124124
    125125#if ENABLE(STYLE_SCOPED)
     126inline bool HTMLStyleElement::isRegisteredAsScoped() const
     127{
     128    // Note: We cannot rely on the 'scoped' attribute still being present when this method is invoked.
     129    // Therefore we cannot rely on scoped()!
     130    if (m_scopedStyleRegistrationState == NotRegistered)
     131        return false;
     132    if (!ContextFeatures::styleScopedEnabled(document()))
     133        return false;
     134    return true;
     135}
     136
     137// These three Node methods are placed here to
     138// make the header inclusion dependency sane.
     139
     140inline void Node::registerScopedHTMLStyleChild()
     141{
     142    setHasScopedHTMLStyleChild(true);
     143}
     144
     145inline void Node::unregisterScopedHTMLStyleChild()
     146{
     147    ASSERT(hasScopedHTMLStyleChild());
     148    setHasScopedHTMLStyleChild(numberOfScopedHTMLStyleChildren());
     149}
     150
     151size_t Node::numberOfScopedHTMLStyleChildren() const
     152{
     153    size_t count = 0;
     154    for (Node* child = firstChild(); child; child = child->nextSibling()) {
     155        if (child->hasTagName(styleTag) && static_cast<HTMLStyleElement*>(child)->isRegisteredAsScoped())
     156            count++;
     157    }
     158
     159    return count;
     160}
     161
    126162void HTMLStyleElement::registerWithScopingNode(bool scoped)
    127163{
     
    155191void HTMLStyleElement::unregisterWithScopingNode(ContainerNode* scope)
    156192{
    157     // Note: We cannot rely on the 'scoped' element still being present when this method is invoked.
    158     // Therefore we cannot rely on scoped()!
    159193    ASSERT(m_scopedStyleRegistrationState != NotRegistered || !ContextFeatures::styleScopedEnabled(document()));
    160     if (m_scopedStyleRegistrationState == NotRegistered)
    161         return;
    162     if (!ContextFeatures::styleScopedEnabled(document()))
     194    if (!isRegisteredAsScoped())
    163195        return;
    164196
     
    173205
    174206    m_scopedStyleRegistrationState = NotRegistered;
     207}
     208#else
     209size_t Node::numberOfScopedHTMLStyleChildren() const
     210{
     211    return 0;
    175212}
    176213#endif
  • trunk/Source/WebCore/html/HTMLStyleElement.h

    r120062 r128331  
    4646    void setScoped(bool);
    4747    Element* scopingElement() const;
     48    bool isRegisteredAsScoped() const;
    4849#endif
    4950
Note: See TracChangeset for help on using the changeset viewer.