Changeset 131238 in webkit


Ignore:
Timestamp:
Oct 12, 2012, 4:51:46 PM (13 years ago)
Author:
Beth Dakin
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):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r131235 r131238  
     12012-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
    1372012-10-12  Brady Eidson  <beidson@apple.com>
    238
  • trunk/Source/WebCore/page/scrolling/ScrollingStateNode.cpp

    r131221 r131238  
    8383
    8484    if (size_t index = m_children->find(node)) {
     85        m_scrollingStateTree->didRemoveNode(node->scrollingNodeID());
    8586        m_children->remove(index);
    8687        return;
  • trunk/Source/WebCore/page/scrolling/ScrollingStateTree.cpp

    r130989 r131238  
    4747PassOwnPtr<ScrollingStateTree> ScrollingStateTree::commit()
    4848{
    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);
    5155
    5256    // Now the clone tree has changed properties, and the original tree does not.
    53     treeState->setHasChangedProperties(true);
     57    treeStateClone->m_hasChangedProperties = true;
    5458    m_hasChangedProperties = false;
    5559
    56     return treeState.release();
     60    return treeStateClone.release();
    5761}
    5862
     
    6266
    6367    if (node == m_rootStateNode) {
     68        didRemoveNode(m_rootStateNode->scrollingNodeID());
    6469        m_rootStateNode = 0;
    6570        return;
     
    6772
    6873    m_rootStateNode->removeChild(node);
     74}
     75
     76void ScrollingStateTree::didRemoveNode(ScrollingNodeID nodeID)
     77{
     78    m_nodesRemovedSinceLastCommit.append(nodeID);
    6979}
    7080
  • trunk/Source/WebCore/page/scrolling/ScrollingStateTree.h

    r130989 r131238  
    6262
    6363    void removeNode(ScrollingStateNode*);
     64    void didRemoveNode(ScrollingNodeID);
     65    const Vector<ScrollingNodeID>& removedNodes() const { return m_nodesRemovedSinceLastCommit; }
    6466
    6567    void rootLayerDidChange();
     
    7173    ScrollingStateTree();
    7274
     75    PassOwnPtr<ScrollingStateTree> clone();
     76
    7377    OwnPtr<ScrollingStateScrollingNode> m_rootStateNode;
     78    Vector<ScrollingNodeID> m_nodesRemovedSinceLastCommit;
    7479    bool m_hasChangedProperties;
    7580};
  • trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm

    r131221 r131238  
    259259
    260260    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.
    264261    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]);
    265269}
    266270
Note: See TracChangeset for help on using the changeset viewer.