Title: [110374] trunk/Source/WebCore
Revision
110374
Author
[email protected]
Date
2012-03-10 06:28:14 -0800 (Sat, 10 Mar 2012)

Log Message

ShadowTree uses weak iteration patterns
https://bugs.webkit.org/show_bug.cgi?id=80572

Reviewed by Dimitri Glazkov.


This patch moves various ShadowTree to using a better iteration pattern
in which we collect all the ShadowRoots we're planning to iterate into
a vector and then iterate over them.

* dom/ShadowTree.cpp:
(ShadowRootVector):
(WebCore::ShadowRootVector::ShadowRootVector):
(WebCore):
(WebCore::ShadowTree::removeAllShadowRoots):
(WebCore::ShadowTree::insertedIntoDocument):
(WebCore::ShadowTree::removedFromDocument):
(WebCore::ShadowTree::insertedIntoTree):
(WebCore::ShadowTree::removedFromTree):
(WebCore::ShadowTree::willRemove):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (110373 => 110374)


--- trunk/Source/WebCore/ChangeLog	2012-03-10 13:26:01 UTC (rev 110373)
+++ trunk/Source/WebCore/ChangeLog	2012-03-10 14:28:14 UTC (rev 110374)
@@ -1,3 +1,27 @@
+2012-03-10  MORITA Hajime  <[email protected]>
+
+        ShadowTree uses weak iteration patterns
+        https://bugs.webkit.org/show_bug.cgi?id=80572
+
+        Reviewed by Dimitri Glazkov.
+
+        Patch by Adam Barth.
+
+        This patch moves various ShadowTree to using a better iteration pattern
+        in which we collect all the ShadowRoots we're planning to iterate into
+        a vector and then iterate over them.
+
+        * dom/ShadowTree.cpp:
+        (ShadowRootVector):
+        (WebCore::ShadowRootVector::ShadowRootVector):
+        (WebCore):
+        (WebCore::ShadowTree::removeAllShadowRoots):
+        (WebCore::ShadowTree::insertedIntoDocument):
+        (WebCore::ShadowTree::removedFromDocument):
+        (WebCore::ShadowTree::insertedIntoTree):
+        (WebCore::ShadowTree::removedFromTree):
+        (WebCore::ShadowTree::willRemove):
+
 2012-03-10  Sheriff Bot  <[email protected]>
 
         Unreviewed, rolling out r110363.

Modified: trunk/Source/WebCore/dom/ShadowTree.cpp (110373 => 110374)


--- trunk/Source/WebCore/dom/ShadowTree.cpp	2012-03-10 13:26:01 UTC (rev 110373)
+++ trunk/Source/WebCore/dom/ShadowTree.cpp	2012-03-10 14:28:14 UTC (rev 110374)
@@ -39,6 +39,15 @@
 
 namespace WebCore {
 
+class ShadowRootVector : public Vector<RefPtr<ShadowRoot> > {
+public:
+    explicit ShadowRootVector(ShadowTree* tree)
+    {
+        for (ShadowRoot* root = tree->youngestShadowRoot(); root; root = root->olderShadowRoot())
+            append(root);
+    }
+};
+
 ShadowTree::ShadowTree()
     : m_needsRecalculateContent(false)
 {
@@ -100,6 +109,7 @@
     if (!hasShadowRoot())
         return;
 
+    // Dont protect this ref count.
     Element* shadowHost = host();
 
     while (RefPtr<ShadowRoot> oldRoot = m_shadowRoots.removeHead()) {
@@ -125,32 +135,37 @@
 
 void ShadowTree::insertedIntoDocument()
 {
-    for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
-        root->insertedIntoDocument();
+    ShadowRootVector roots(this);
+    for (size_t i = 0; i < roots.size(); ++i)
+        roots[i]->insertedIntoDocument();
 }
 
 void ShadowTree::removedFromDocument()
 {
-    for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
-        root->removedFromDocument();
+    ShadowRootVector roots(this);
+    for (size_t i = 0; i < roots.size(); ++i)
+        roots[i]->removedFromDocument();
 }
 
 void ShadowTree::insertedIntoTree(bool deep)
 {
-    for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
-        root->insertedIntoTree(deep);
+    ShadowRootVector roots(this);
+    for (size_t i = 0; i < roots.size(); ++i)
+        roots[i]->insertedIntoTree(deep);
 }
 
 void ShadowTree::removedFromTree(bool deep)
 {
-    for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
-        root->removedFromTree(deep);
+    ShadowRootVector roots(this);
+    for (size_t i = 0; i < roots.size(); ++i)
+        roots[i]->removedFromTree(deep);
 }
 
 void ShadowTree::willRemove()
 {
-    for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
-        root->willRemove();
+    ShadowRootVector roots(this);
+    for (size_t i = 0; i < roots.size(); ++i)
+        roots[i]->willRemove();
 }
 
 void ShadowTree::setParentTreeScope(TreeScope* scope)
@@ -181,7 +196,6 @@
     host->attachAsNode();
 }
 
-
 void ShadowTree::detach()
 {
     for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to