Title: [131238] trunk/Source/WebCore
Revision
131238
Author
bda...@apple.com
Date
2012-10-12 16:51:46 -0700 (Fri, 12 Oct 2012)

Log Message

https://bugs.webkit.org/show_bug.cgi?id=99211
When ScrollingStateNodes are destroyed, they should be removed 
ScrollingCoordinator's HashMap

Reviewed by Sam Weinig.

This patch adds a new member variable to ScrollingStateTree. It's a 
Vector of ScrollingNodeIDs. It will contain the IDs of nodes that 
have been removed from the tree since the last time the tree was 
committed.
* page/scrolling/ScrollingStateTree.cpp:
(WebCore::ScrollingStateTree::ScrollingStateTree):

When we do commit, copy the Vector over into the cloned tree, and 
then clear our own Vector.
(WebCore::ScrollingStateTree::commit):

Call didRemoveNode().
(WebCore::ScrollingStateTree::removeNode):

Append the removed node's id to the vector.
(WebCore::ScrollingStateTree::didRemoveNode):
(WebCore):
* page/scrolling/ScrollingStateTree.h:
(ScrollingStateTree):

Call didRemoveNode().
* page/scrolling/ScrollingStateNode.cpp:
(WebCore::ScrollingStateNode::removeChild):

Fix the FIXME!
* page/scrolling/mac/ScrollingCoordinatorMac.mm:
(WebCore::ScrollingCoordinatorMac::detachFromStateTree):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (131237 => 131238)


--- trunk/Source/WebCore/ChangeLog	2012-10-12 23:49:56 UTC (rev 131237)
+++ trunk/Source/WebCore/ChangeLog	2012-10-12 23:51:46 UTC (rev 131238)
@@ -1,3 +1,39 @@
+2012-10-12  Beth Dakin  <bda...@apple.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=99211
+        When ScrollingStateNodes are destroyed, they should be removed 
+        ScrollingCoordinator's HashMap
+
+        Reviewed by Sam Weinig.
+
+        This patch adds a new member variable to ScrollingStateTree. It's a 
+        Vector of ScrollingNodeIDs. It will contain the IDs of nodes that 
+        have been removed from the tree since the last time the tree was 
+        committed.
+        * page/scrolling/ScrollingStateTree.cpp:
+        (WebCore::ScrollingStateTree::ScrollingStateTree):
+
+        When we do commit, copy the Vector over into the cloned tree, and 
+        then clear our own Vector.
+        (WebCore::ScrollingStateTree::commit):
+
+        Call didRemoveNode().
+        (WebCore::ScrollingStateTree::removeNode):
+
+        Append the removed node's id to the vector.
+        (WebCore::ScrollingStateTree::didRemoveNode):
+        (WebCore):
+        * page/scrolling/ScrollingStateTree.h:
+        (ScrollingStateTree):
+
+        Call didRemoveNode().
+        * page/scrolling/ScrollingStateNode.cpp:
+        (WebCore::ScrollingStateNode::removeChild):
+
+        Fix the FIXME!
+        * page/scrolling/mac/ScrollingCoordinatorMac.mm:
+        (WebCore::ScrollingCoordinatorMac::detachFromStateTree):
+
 2012-10-12  Brady Eidson  <beid...@apple.com>
 
         Setup basic NetworkProcess messaging and initialization.

Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateNode.cpp (131237 => 131238)


--- trunk/Source/WebCore/page/scrolling/ScrollingStateNode.cpp	2012-10-12 23:49:56 UTC (rev 131237)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateNode.cpp	2012-10-12 23:51:46 UTC (rev 131238)
@@ -82,6 +82,7 @@
         return;
 
     if (size_t index = m_children->find(node)) {
+        m_scrollingStateTree->didRemoveNode(node->scrollingNodeID());
         m_children->remove(index);
         return;
     }

Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateTree.cpp (131237 => 131238)


--- trunk/Source/WebCore/page/scrolling/ScrollingStateTree.cpp	2012-10-12 23:49:56 UTC (rev 131237)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateTree.cpp	2012-10-12 23:51:46 UTC (rev 131238)
@@ -46,14 +46,18 @@
 
 PassOwnPtr<ScrollingStateTree> ScrollingStateTree::commit()
 {
-    OwnPtr<ScrollingStateTree> treeState = ScrollingStateTree::create();
-    treeState->setRootStateNode(static_pointer_cast<ScrollingStateScrollingNode>(m_rootStateNode->cloneAndResetNode()));
+    // This function clones and resets the current state tree, but leaves the tree structure intact. 
+    OwnPtr<ScrollingStateTree> treeStateClone = ScrollingStateTree::create();
+    treeStateClone->setRootStateNode(static_pointer_cast<ScrollingStateScrollingNode>(m_rootStateNode->cloneAndResetNode()));
 
+    // Copy the IDs of the nodes that have been removed since the last commit into the clone.
+    treeStateClone->m_nodesRemovedSinceLastCommit.swap(m_nodesRemovedSinceLastCommit);
+
     // Now the clone tree has changed properties, and the original tree does not.
-    treeState->setHasChangedProperties(true);
+    treeStateClone->m_hasChangedProperties = true;
     m_hasChangedProperties = false;
 
-    return treeState.release();
+    return treeStateClone.release();
 }
 
 void ScrollingStateTree::removeNode(ScrollingStateNode* node)
@@ -61,6 +65,7 @@
     ASSERT(m_rootStateNode);
 
     if (node == m_rootStateNode) {
+        didRemoveNode(m_rootStateNode->scrollingNodeID());
         m_rootStateNode = 0;
         return;
     }
@@ -68,6 +73,11 @@
     m_rootStateNode->removeChild(node);
 }
 
+void ScrollingStateTree::didRemoveNode(ScrollingNodeID nodeID)
+{
+    m_nodesRemovedSinceLastCommit.append(nodeID);
+}
+
 void ScrollingStateTree::rootLayerDidChange()
 {
     // If the root layer has changed, then destroyed and re-created the root state node. That means that the

Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateTree.h (131237 => 131238)


--- trunk/Source/WebCore/page/scrolling/ScrollingStateTree.h	2012-10-12 23:49:56 UTC (rev 131237)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateTree.h	2012-10-12 23:51:46 UTC (rev 131238)
@@ -61,6 +61,8 @@
     PassOwnPtr<ScrollingStateTree> commit();
 
     void removeNode(ScrollingStateNode*);
+    void didRemoveNode(ScrollingNodeID);
+    const Vector<ScrollingNodeID>& removedNodes() const { return m_nodesRemovedSinceLastCommit; }
 
     void rootLayerDidChange();
 
@@ -70,7 +72,10 @@
 private:
     ScrollingStateTree();
 
+    PassOwnPtr<ScrollingStateTree> clone();
+
     OwnPtr<ScrollingStateScrollingNode> m_rootStateNode;
+    Vector<ScrollingNodeID> m_nodesRemovedSinceLastCommit;
     bool m_hasChangedProperties;
 };
 

Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm (131237 => 131238)


--- trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm	2012-10-12 23:49:56 UTC (rev 131237)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm	2012-10-12 23:51:46 UTC (rev 131238)
@@ -258,10 +258,14 @@
         return;
 
     ScrollingStateNode* node = m_stateNodeMap.take(scrollLayerID);
+    m_scrollingStateTree->removeNode(node);
 
-    // FIXME: removeNode() will destroy children, and those children might still be in the HashMap.
-    // This will be a big problem once there are actually children in the tree.
-    m_scrollingStateTree->removeNode(node);
+    // ScrollingStateTree::removeNode() will destroy children, so we have to make sure we remove those children
+    // from the HashMap.
+   const Vector<ScrollingNodeID>& removedNodes = m_scrollingStateTree->removedNodes();
+    size_t size = removedNodes.size();
+    for (size_t i = 0; i < size; ++i)
+        m_stateNodeMap.remove(removedNodes[i]);
 }
 
 void ScrollingCoordinatorMac::clearStateTree()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to