Changeset 131238 in webkit
- Timestamp:
- Oct 12, 2012, 4:51:46 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r131235 r131238 1 2012-10-12 Beth Dakin <bdakin@apple.com> 2 3 https://bugs.webkit.org/show_bug.cgi?id=99211 4 When ScrollingStateNodes are destroyed, they should be removed 5 ScrollingCoordinator's HashMap 6 7 Reviewed by Sam Weinig. 8 9 This patch adds a new member variable to ScrollingStateTree. It's a 10 Vector of ScrollingNodeIDs. It will contain the IDs of nodes that 11 have been removed from the tree since the last time the tree was 12 committed. 13 * page/scrolling/ScrollingStateTree.cpp: 14 (WebCore::ScrollingStateTree::ScrollingStateTree): 15 16 When we do commit, copy the Vector over into the cloned tree, and 17 then clear our own Vector. 18 (WebCore::ScrollingStateTree::commit): 19 20 Call didRemoveNode(). 21 (WebCore::ScrollingStateTree::removeNode): 22 23 Append the removed node's id to the vector. 24 (WebCore::ScrollingStateTree::didRemoveNode): 25 (WebCore): 26 * page/scrolling/ScrollingStateTree.h: 27 (ScrollingStateTree): 28 29 Call didRemoveNode(). 30 * page/scrolling/ScrollingStateNode.cpp: 31 (WebCore::ScrollingStateNode::removeChild): 32 33 Fix the FIXME! 34 * page/scrolling/mac/ScrollingCoordinatorMac.mm: 35 (WebCore::ScrollingCoordinatorMac::detachFromStateTree): 36 1 37 2012-10-12 Brady Eidson <beidson@apple.com> 2 38 -
trunk/Source/WebCore/page/scrolling/ScrollingStateNode.cpp
r131221 r131238 83 83 84 84 if (size_t index = m_children->find(node)) { 85 m_scrollingStateTree->didRemoveNode(node->scrollingNodeID()); 85 86 m_children->remove(index); 86 87 return; -
trunk/Source/WebCore/page/scrolling/ScrollingStateTree.cpp
r130989 r131238 47 47 PassOwnPtr<ScrollingStateTree> ScrollingStateTree::commit() 48 48 { 49 OwnPtr<ScrollingStateTree> treeState = ScrollingStateTree::create(); 50 treeState->setRootStateNode(static_pointer_cast<ScrollingStateScrollingNode>(m_rootStateNode->cloneAndResetNode())); 49 // This function clones and resets the current state tree, but leaves the tree structure intact. 50 OwnPtr<ScrollingStateTree> treeStateClone = ScrollingStateTree::create(); 51 treeStateClone->setRootStateNode(static_pointer_cast<ScrollingStateScrollingNode>(m_rootStateNode->cloneAndResetNode())); 52 53 // Copy the IDs of the nodes that have been removed since the last commit into the clone. 54 treeStateClone->m_nodesRemovedSinceLastCommit.swap(m_nodesRemovedSinceLastCommit); 51 55 52 56 // Now the clone tree has changed properties, and the original tree does not. 53 treeState ->setHasChangedProperties(true);57 treeStateClone->m_hasChangedProperties = true; 54 58 m_hasChangedProperties = false; 55 59 56 return treeState .release();60 return treeStateClone.release(); 57 61 } 58 62 … … 62 66 63 67 if (node == m_rootStateNode) { 68 didRemoveNode(m_rootStateNode->scrollingNodeID()); 64 69 m_rootStateNode = 0; 65 70 return; … … 67 72 68 73 m_rootStateNode->removeChild(node); 74 } 75 76 void ScrollingStateTree::didRemoveNode(ScrollingNodeID nodeID) 77 { 78 m_nodesRemovedSinceLastCommit.append(nodeID); 69 79 } 70 80 -
trunk/Source/WebCore/page/scrolling/ScrollingStateTree.h
r130989 r131238 62 62 63 63 void removeNode(ScrollingStateNode*); 64 void didRemoveNode(ScrollingNodeID); 65 const Vector<ScrollingNodeID>& removedNodes() const { return m_nodesRemovedSinceLastCommit; } 64 66 65 67 void rootLayerDidChange(); … … 71 73 ScrollingStateTree(); 72 74 75 PassOwnPtr<ScrollingStateTree> clone(); 76 73 77 OwnPtr<ScrollingStateScrollingNode> m_rootStateNode; 78 Vector<ScrollingNodeID> m_nodesRemovedSinceLastCommit; 74 79 bool m_hasChangedProperties; 75 80 }; -
trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm
r131221 r131238 259 259 260 260 ScrollingStateNode* node = m_stateNodeMap.take(scrollLayerID); 261 262 // FIXME: removeNode() will destroy children, and those children might still be in the HashMap.263 // This will be a big problem once there are actually children in the tree.264 261 m_scrollingStateTree->removeNode(node); 262 263 // ScrollingStateTree::removeNode() will destroy children, so we have to make sure we remove those children 264 // from the HashMap. 265 const Vector<ScrollingNodeID>& removedNodes = m_scrollingStateTree->removedNodes(); 266 size_t size = removedNodes.size(); 267 for (size_t i = 0; i < size; ++i) 268 m_stateNodeMap.remove(removedNodes[i]); 265 269 } 266 270
Note:
See TracChangeset
for help on using the changeset viewer.