Changeset 142505 in webkit


Ignore:
Timestamp:
Feb 11, 2013 1:28:18 PM (11 years ago)
Author:
Simon Fraser
Message:

ScrollingTree node maps keep getting larger
https://bugs.webkit.org/show_bug.cgi?id=109348

Reviewed by Sam Weinig.

When navigating between pages, nodes would get left in the ScrollingTree's
node map, and the ScrollingStateTree's node map, so these would get larger
and larger as you browse.

Simplify map maintenance by clearing the map when setting a new root node
(which happens on the first commit of a new page). Also, don't keep root nodes
around, but create them afresh for each page, which simplifies their ID
management.

This is closer to the original behavior; keeping the root nodes around was
a fix for bug 99668, but we avoid regressing that fix by bailing early
from frameViewLayoutUpdated() if there is no root state node (we'll get
called again anyway).

This now allows state nodeIDs to be purely read-only.

  • page/scrolling/ScrollingStateNode.h:
  • page/scrolling/ScrollingStateTree.cpp:

(WebCore::ScrollingStateTree::ScrollingStateTree):
(WebCore::ScrollingStateTree::attachNode):
(WebCore::ScrollingStateTree::clear):
(WebCore::ScrollingStateTree::removeNode):

  • page/scrolling/ScrollingTree.cpp:

(WebCore::ScrollingTree::updateTreeFromStateNode):

  • page/scrolling/mac/ScrollingCoordinatorMac.mm:

(WebCore::ScrollingCoordinatorMac::frameViewLayoutUpdated):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r142504 r142505  
     12013-02-11  Simon Fraser  <simon.fraser@apple.com>
     2
     3        ScrollingTree node maps keep getting larger
     4        https://bugs.webkit.org/show_bug.cgi?id=109348
     5
     6        Reviewed by Sam Weinig.
     7
     8        When navigating between pages, nodes would get left in the ScrollingTree's
     9        node map, and the ScrollingStateTree's node map, so these would get larger
     10        and larger as you browse.
     11       
     12        Simplify map maintenance by clearing the map when setting a new root node
     13        (which happens on the first commit of a new page). Also, don't keep root nodes
     14        around, but create them afresh for each page, which simplifies their ID
     15        management.
     16       
     17        This is closer to the original behavior; keeping the root nodes around was
     18        a fix for bug 99668, but we avoid regressing that fix by bailing early
     19        from frameViewLayoutUpdated() if there is no root state node (we'll get
     20        called again anyway).
     21       
     22        This now allows state nodeIDs to be purely read-only.
     23
     24        * page/scrolling/ScrollingStateNode.h:
     25        * page/scrolling/ScrollingStateTree.cpp:
     26        (WebCore::ScrollingStateTree::ScrollingStateTree):
     27        (WebCore::ScrollingStateTree::attachNode):
     28        (WebCore::ScrollingStateTree::clear):
     29        (WebCore::ScrollingStateTree::removeNode):
     30        * page/scrolling/ScrollingTree.cpp:
     31        (WebCore::ScrollingTree::updateTreeFromStateNode):
     32        * page/scrolling/mac/ScrollingCoordinatorMac.mm:
     33        (WebCore::ScrollingCoordinatorMac::frameViewLayoutUpdated):
     34
    1352013-02-11  Simon Fraser  <simon.fraser@apple.com>
    236
  • trunk/Source/WebCore/page/scrolling/ScrollingStateNode.h

    r141704 r142505  
    8080
    8181    ScrollingNodeID scrollingNodeID() const { return m_nodeID; }
    82     void setScrollingNodeID(ScrollingNodeID nodeID) { m_nodeID = nodeID; }
    8382
    8483    ScrollingStateNode* parent() const { return m_parent; }
  • trunk/Source/WebCore/page/scrolling/ScrollingStateTree.cpp

    r142504 r142505  
    4242
    4343ScrollingStateTree::ScrollingStateTree()
    44     : m_rootStateNode(ScrollingStateScrollingNode::create(this, 0))
    45     , m_hasChangedProperties(false)
     44    : m_hasChangedProperties(false)
    4645{
    4746}
     
    7170        clear();
    7271
    73         rootStateNode()->setScrollingNodeID(newNodeID);
     72        setRootStateNode(ScrollingStateScrollingNode::create(this, newNodeID));
    7473        newNode = rootStateNode();
    7574    } else {
     
    121120{
    122121    removeNode(rootStateNode());
     122    m_stateNodeMap.clear();
    123123}
    124124
     
    141141void ScrollingStateTree::removeNode(ScrollingStateNode* node)
    142142{
     143    if (!node)
     144        return;
     145
     146    if (node == m_rootStateNode) {
     147        didRemoveNode(node->scrollingNodeID());
     148        m_rootStateNode = nullptr;
     149        return;
     150    }
     151
    143152    ASSERT(m_rootStateNode);
    144153    m_rootStateNode->removeChild(node);
  • trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp

    r141704 r142505  
    160160        ScrollingNodeID nodeID = stateNode->scrollingNodeID();
    161161        if (!stateNode->parent()) {
    162             // This is the root node.
    163             if (!m_rootNode)
    164                 m_rootNode = ScrollingTreeScrollingNode::create(this, nodeID);
    165 
     162            // This is the root node. Nuke the node map.
     163            m_nodeMap.clear();
     164
     165            m_rootNode = ScrollingTreeScrollingNode::create(this, nodeID);
    166166            m_nodeMap.set(nodeID, m_rootNode.get());
    167167            m_rootNode->update(stateNode);
  • trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm

    r142504 r142505  
    108108    ASSERT(m_page);
    109109
     110    // If there isn't a root node yet, don't do anything. We'll be called again after creating one.
     111    if (!m_scrollingStateTree->rootStateNode())
     112        return;
     113
    110114    // Compute the region of the page that we can't do fast scrolling for. This currently includes
    111115    // all scrollable areas, such as subframes, overflow divs and list boxes. We need to do this even if the
Note: See TracChangeset for help on using the changeset viewer.