Title: [136098] trunk/Source/WebCore
Revision
136098
Author
shin...@chromium.org
Date
2012-11-28 22:23:58 -0800 (Wed, 28 Nov 2012)

Log Message

[Shadow] ShadowRoot should cache InsertionPointList.
https://bugs.webkit.org/show_bug.cgi?id=103212

Reviewed by Hajime Morita.

When distributing or invalidating distribution, we used to traverse all descendent nodes in Shadow DOM.
If ShadowRoot has a InsertionPoint list, we can just traverse the list.

No new tests, should be covered by existing tests.

* dom/ShadowRoot.cpp:
(WebCore::ShadowRoot::insertionPointList):
(WebCore):
* dom/ShadowRoot.h:
(ShadowRoot):
* html/shadow/ContentDistributor.cpp:
(WebCore::ShadowRootContentDistributionData::ShadowRootContentDistributionData):
(WebCore::ShadowRootContentDistributionData::invalidateInsertionPointList):
(WebCore):
(WebCore::ShadowRootContentDistributionData::ensureInsertionPointList): Creates InsertionPoint list
if it's not created and return it.
(WebCore::ContentDistributor::distribute): Traverse InsertionPointList instead of all descendent nodes in Shadow DOM.
(WebCore::ContentDistributor::invalidate): ditto.
* html/shadow/ContentDistributor.h:
(WebCore::ShadowRootContentDistributionData::incrementNumberOfShadowElementChildren): Invalidate InsertionPointList cache.
(WebCore::ShadowRootContentDistributionData::decrementNumberOfShadowElementChildren): ditto.
(WebCore::ShadowRootContentDistributionData::incrementNumberOfContentElementChildren): ditto.
(WebCore::ShadowRootContentDistributionData::decrementNumberOfContentElementChildren): ditto.
(ShadowRootContentDistributionData):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (136097 => 136098)


--- trunk/Source/WebCore/ChangeLog	2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/ChangeLog	2012-11-29 06:23:58 UTC (rev 136098)
@@ -1,3 +1,35 @@
+2012-11-28  Shinya Kawanaka  <shin...@chromium.org>
+
+        [Shadow] ShadowRoot should cache InsertionPointList.
+        https://bugs.webkit.org/show_bug.cgi?id=103212
+
+        Reviewed by Hajime Morita.
+
+        When distributing or invalidating distribution, we used to traverse all descendent nodes in Shadow DOM.
+        If ShadowRoot has a InsertionPoint list, we can just traverse the list.
+
+        No new tests, should be covered by existing tests.
+
+        * dom/ShadowRoot.cpp:
+        (WebCore::ShadowRoot::insertionPointList):
+        (WebCore):
+        * dom/ShadowRoot.h:
+        (ShadowRoot):
+        * html/shadow/ContentDistributor.cpp:
+        (WebCore::ShadowRootContentDistributionData::ShadowRootContentDistributionData):
+        (WebCore::ShadowRootContentDistributionData::invalidateInsertionPointList):
+        (WebCore):
+        (WebCore::ShadowRootContentDistributionData::ensureInsertionPointList): Creates InsertionPoint list
+        if it's not created and return it.
+        (WebCore::ContentDistributor::distribute): Traverse InsertionPointList instead of all descendent nodes in Shadow DOM.
+        (WebCore::ContentDistributor::invalidate): ditto.
+        * html/shadow/ContentDistributor.h:
+        (WebCore::ShadowRootContentDistributionData::incrementNumberOfShadowElementChildren): Invalidate InsertionPointList cache.
+        (WebCore::ShadowRootContentDistributionData::decrementNumberOfShadowElementChildren): ditto.
+        (WebCore::ShadowRootContentDistributionData::incrementNumberOfContentElementChildren): ditto.
+        (WebCore::ShadowRootContentDistributionData::decrementNumberOfContentElementChildren): ditto.
+        (ShadowRootContentDistributionData):
+
 2012-11-28  Michael Pruett  <mich...@68k.org>
 
         IndexedDB: Remove duplicate toWireString() and createFromWire() methods in JSC SerializedScriptValue

Modified: trunk/Source/WebCore/dom/ShadowRoot.cpp (136097 => 136098)


--- trunk/Source/WebCore/dom/ShadowRoot.cpp	2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/dom/ShadowRoot.cpp	2012-11-29 06:23:58 UTC (rev 136098)
@@ -312,6 +312,14 @@
     owner()->invalidateDistribution();
 }
 
+const Vector<InsertionPoint*>& ShadowRoot::insertionPointList()
+{
+    typedef Vector<InsertionPoint*> InsertionPointVector;
+    DEFINE_STATIC_LOCAL(InsertionPointVector, emptyVector, ());
+
+    return distributionData() ? distributionData()->ensureInsertionPointList(this) : emptyVector;
+}
+
 void ShadowRoot::registerScopedHTMLStyleChild()
 {
     ++m_numberOfStyles;

Modified: trunk/Source/WebCore/dom/ShadowRoot.h (136097 => 136098)


--- trunk/Source/WebCore/dom/ShadowRoot.h	2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/dom/ShadowRoot.h	2012-11-29 06:23:58 UTC (rev 136098)
@@ -104,6 +104,8 @@
     bool hasElementShadow() const;
     unsigned countElementShadow() const;
 
+    const Vector<InsertionPoint*>& insertionPointList();
+
     virtual void registerScopedHTMLStyleChild() OVERRIDE;
     virtual void unregisterScopedHTMLStyleChild() OVERRIDE;
 

Modified: trunk/Source/WebCore/html/shadow/ContentDistributor.cpp (136097 => 136098)


--- trunk/Source/WebCore/html/shadow/ContentDistributor.cpp	2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/html/shadow/ContentDistributor.cpp	2012-11-29 06:23:58 UTC (rev 136098)
@@ -63,10 +63,35 @@
     , m_numberOfShadowElementChildren(0)
     , m_numberOfContentElementChildren(0)
     , m_numberOfElementShadowChildren(0)
+    , m_insertionPointListIsValid(false)
 {
 }
 
+void ShadowRootContentDistributionData::invalidateInsertionPointList()
+{
+    m_insertionPointListIsValid = false;
+    m_insertionPointList.clear();
+}
 
+const Vector<InsertionPoint*>& ShadowRootContentDistributionData::ensureInsertionPointList(ShadowRoot* shadowRoot)
+{
+    if (m_insertionPointListIsValid)
+        return m_insertionPointList;
+
+    m_insertionPointListIsValid = true;
+    ASSERT(m_insertionPointList.isEmpty());
+
+    if (!shadowRoot->hasInsertionPoint())
+        return m_insertionPointList;
+
+    for (Node* node = shadowRoot; node; node = node->traverseNextNode(shadowRoot)) {
+        if (node->isInsertionPoint())
+            m_insertionPointList.append(toInsertionPoint(node));
+    }
+
+    return m_insertionPointList;
+}
+
 ContentDistributor::ContentDistributor()
     : m_validity(Undetermined)
 {
@@ -116,17 +141,18 @@
     for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->olderShadowRoot()) {
         HTMLShadowElement* firstActiveShadowInsertionPoint = 0;
 
-        for (Node* node = root; node; node = node->traverseNextNode(root)) {
-            if (!isActiveInsertionPoint(node))
+        const Vector<InsertionPoint*>& insertionPoints = root->insertionPointList();
+        for (size_t i = 0; i < insertionPoints.size(); ++i) {
+            InsertionPoint* point = insertionPoints[i];
+            if (!point->isActive())
                 continue;
-            InsertionPoint* point = toInsertionPoint(node);
 
-            if (isHTMLShadowElement(node)) {
+            if (isHTMLShadowElement(point)) {
                 if (!firstActiveShadowInsertionPoint)
-                    firstActiveShadowInsertionPoint = toHTMLShadowElement(node);
+                    firstActiveShadowInsertionPoint = toHTMLShadowElement(point);
             } else {
                 distributeSelectionsTo(point, pool, distributed);
-                if (ElementShadow* shadow = node->parentNode()->isElementNode() ? toElement(node->parentNode())->shadow() : 0)
+                if (ElementShadow* shadow = point->parentNode()->isElementNode() ? toElement(point->parentNode())->shadow() : 0)
                     shadow->invalidateDistribution();
             }
         }
@@ -157,13 +183,10 @@
 
     for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->olderShadowRoot()) {
         root->setAssignedTo(0);
-
-        for (Node* node = root; node; node = node->traverseNextNode(root)) {
-            if (!node->isInsertionPoint())
-                continue;
+        const Vector<InsertionPoint*>& insertionPoints = root->insertionPointList();
+        for (size_t i = 0; i < insertionPoints.size(); ++i) {
             needsReattach = needsReattach || true;
-            InsertionPoint* point = toInsertionPoint(node);
-            point->clearDistribution();
+            insertionPoints[i]->clearDistribution();
         }
     }
 

Modified: trunk/Source/WebCore/html/shadow/ContentDistributor.h (136097 => 136098)


--- trunk/Source/WebCore/html/shadow/ContentDistributor.h	2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/html/shadow/ContentDistributor.h	2012-11-29 06:23:58 UTC (rev 136098)
@@ -75,12 +75,12 @@
     InsertionPoint* insertionPointAssignedTo() const { return m_insertionPointAssignedTo; }
     void setInsertionPointAssignedTo(InsertionPoint* insertionPoint) { m_insertionPointAssignedTo = insertionPoint; }
 
-    void incrementNumberOfShadowElementChildren() { ++m_numberOfShadowElementChildren; }
-    void decrementNumberOfShadowElementChildren() { ASSERT(m_numberOfShadowElementChildren > 0); --m_numberOfShadowElementChildren; }
+    void incrementNumberOfShadowElementChildren() { ++m_numberOfShadowElementChildren; invalidateInsertionPointList(); }
+    void decrementNumberOfShadowElementChildren() { ASSERT(m_numberOfShadowElementChildren > 0); --m_numberOfShadowElementChildren; invalidateInsertionPointList(); }
     bool hasShadowElementChildren() const { return m_numberOfShadowElementChildren > 0; }
 
-    void incrementNumberOfContentElementChildren() { ++m_numberOfContentElementChildren; }
-    void decrementNumberOfContentElementChildren() { ASSERT(m_numberOfContentElementChildren > 0); --m_numberOfContentElementChildren; }
+    void incrementNumberOfContentElementChildren() { ++m_numberOfContentElementChildren; invalidateInsertionPointList(); }
+    void decrementNumberOfContentElementChildren() { ASSERT(m_numberOfContentElementChildren > 0); --m_numberOfContentElementChildren; invalidateInsertionPointList(); }
     bool hasContentElementChildren() const { return m_numberOfContentElementChildren > 0; }
 
     void incrementNumberOfElementShadowChildren() { ++m_numberOfElementShadowChildren; }
@@ -88,11 +88,16 @@
     unsigned numberOfElementShadowChildren() const { return m_numberOfElementShadowChildren; }
     bool hasElementShadowChildren() const { return m_numberOfElementShadowChildren > 0; }
 
+    void invalidateInsertionPointList();
+    const Vector<InsertionPoint*>& ensureInsertionPointList(ShadowRoot*);
+
 private:
     InsertionPoint* m_insertionPointAssignedTo;
     unsigned m_numberOfShadowElementChildren;
     unsigned m_numberOfContentElementChildren;
     unsigned m_numberOfElementShadowChildren;
+    bool m_insertionPointListIsValid;
+    Vector<InsertionPoint*> m_insertionPointList;
 };
 
 class ContentDistributor {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to