- Revision
- 262076
- Author
- [email protected]
- Date
- 2020-05-22 14:52:37 -0700 (Fri, 22 May 2020)
Log Message
Make sure we clean up CFTimerRefs when destroying scrolling tree nodes
https://bugs.webkit.org/show_bug.cgi?id=212278
<rdar://problem/63548212>
Reviewed by Tim Horton.
When destroying scrolling tree nodes, make sure we explicitly stop the RunLoop::Timers,
and do this for all nodes when clearing the m_nodeMap, not just for orphaned nodes as
was done in r262042.
* page/scrolling/ScrollingTree.cpp:
(WebCore::ScrollingTree::commitTreeState):
(WebCore::ScrollingTree::updateTreeFromStateNodeRecursive):
(WebCore::ScrollingTree::removeAllNodes):
* page/scrolling/ScrollingTree.h:
* page/scrolling/ScrollingTreeNode.h:
(WebCore::ScrollingTreeNode::willBeDestroyed):
(WebCore::ScrollingTreeNode::wasRemovedFromTree): Deleted.
* page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.h:
* page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm:
(WebCore::ScrollingTreeFrameScrollingNodeMac::willBeDestroyed):
(WebCore::ScrollingTreeFrameScrollingNodeMac::wasRemovedFromTree): Deleted.
* page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h:
* page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm:
(WebCore::ScrollingTreeOverflowScrollingNodeMac::willBeDestroyed):
(WebCore::ScrollingTreeOverflowScrollingNodeMac::wasRemovedFromTree): Deleted.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (262075 => 262076)
--- trunk/Source/WebCore/ChangeLog 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/ChangeLog 2020-05-22 21:52:37 UTC (rev 262076)
@@ -1,3 +1,32 @@
+2020-05-22 Simon Fraser <[email protected]>
+
+ Make sure we clean up CFTimerRefs when destroying scrolling tree nodes
+ https://bugs.webkit.org/show_bug.cgi?id=212278
+ <rdar://problem/63548212>
+
+ Reviewed by Tim Horton.
+
+ When destroying scrolling tree nodes, make sure we explicitly stop the RunLoop::Timers,
+ and do this for all nodes when clearing the m_nodeMap, not just for orphaned nodes as
+ was done in r262042.
+
+ * page/scrolling/ScrollingTree.cpp:
+ (WebCore::ScrollingTree::commitTreeState):
+ (WebCore::ScrollingTree::updateTreeFromStateNodeRecursive):
+ (WebCore::ScrollingTree::removeAllNodes):
+ * page/scrolling/ScrollingTree.h:
+ * page/scrolling/ScrollingTreeNode.h:
+ (WebCore::ScrollingTreeNode::willBeDestroyed):
+ (WebCore::ScrollingTreeNode::wasRemovedFromTree): Deleted.
+ * page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.h:
+ * page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm:
+ (WebCore::ScrollingTreeFrameScrollingNodeMac::willBeDestroyed):
+ (WebCore::ScrollingTreeFrameScrollingNodeMac::wasRemovedFromTree): Deleted.
+ * page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h:
+ * page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm:
+ (WebCore::ScrollingTreeOverflowScrollingNodeMac::willBeDestroyed):
+ (WebCore::ScrollingTreeOverflowScrollingNodeMac::wasRemovedFromTree): Deleted.
+
2020-05-22 Andres Gonzalez <[email protected]>
Updates to the isolated tree must happen before posting notifications to clients.
Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp (262075 => 262076)
--- trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp 2020-05-22 21:52:37 UTC (rev 262076)
@@ -260,7 +260,7 @@
m_latchingController.nodeWasRemoved(nodeID);
if (auto node = m_nodeMap.take(nodeID))
- node->wasRemovedFromTree();
+ node->willBeDestroyed();
}
LOG_WITH_STREAM(ScrollingTree, stream << "committed ScrollingTree" << scrollingTreeAsText(ScrollingStateTreeAsTextBehaviorDebug));
@@ -269,7 +269,7 @@
void ScrollingTree::updateTreeFromStateNodeRecursive(const ScrollingStateNode* stateNode, CommitTreeState& state)
{
if (!stateNode) {
- m_nodeMap.clear();
+ removeAllNodes();
m_rootNode = nullptr;
return;
}
@@ -289,7 +289,7 @@
// This is the root node. Clear the node map.
ASSERT(stateNode->isFrameScrollingNode());
m_rootNode = downcast<ScrollingTreeFrameScrollingNode>(node.get());
- m_nodeMap.clear();
+ removeAllNodes();
}
m_nodeMap.set(nodeID, node.get());
}
@@ -338,6 +338,14 @@
#endif
}
+void ScrollingTree::removeAllNodes()
+{
+ for (auto iter : m_nodeMap)
+ iter.value->willBeDestroyed();
+
+ m_nodeMap.clear();
+}
+
void ScrollingTree::applyLayerPositionsAfterCommit()
{
// Scrolling tree needs to make adjustments only if the UI side positions have changed.
Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.h (262075 => 262076)
--- trunk/Source/WebCore/page/scrolling/ScrollingTree.h 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.h 2020-05-22 21:52:37 UTC (rev 262076)
@@ -206,6 +206,8 @@
WEBCORE_EXPORT virtual RefPtr<ScrollingTreeNode> scrollingNodeForPoint(FloatPoint);
WEBCORE_EXPORT virtual OptionSet<EventListenerRegionType> eventListenerRegionTypesForPoint(FloatPoint) const;
virtual void receivedWheelEvent(const PlatformWheelEvent&) { }
+
+ void removeAllNodes();
RefPtr<ScrollingTreeFrameScrollingNode> m_rootNode;
Modified: trunk/Source/WebCore/page/scrolling/ScrollingTreeNode.h (262075 => 262076)
--- trunk/Source/WebCore/page/scrolling/ScrollingTreeNode.h 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTreeNode.h 2020-05-22 21:52:37 UTC (rev 262076)
@@ -62,7 +62,7 @@
virtual void commitStateAfterChildren(const ScrollingStateNode&) { }
virtual void didCompleteCommitForNode() { }
- virtual void wasRemovedFromTree() { }
+ virtual void willBeDestroyed() { }
ScrollingTreeNode* parent() const { return m_parent; }
void setParent(ScrollingTreeNode* parent) { m_parent = parent; }
Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.h (262075 => 262076)
--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.h 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.h 2020-05-22 21:52:37 UTC (rev 262076)
@@ -63,7 +63,7 @@
unsigned exposedUnfilledArea() const;
private:
- void wasRemovedFromTree() final;
+ void willBeDestroyed() final;
FloatPoint adjustedScrollPosition(const FloatPoint&, ScrollClamping) const override;
Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm (262075 => 262076)
--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm 2020-05-22 21:52:37 UTC (rev 262076)
@@ -57,7 +57,7 @@
ScrollingTreeFrameScrollingNodeMac::~ScrollingTreeFrameScrollingNodeMac() = default;
-void ScrollingTreeFrameScrollingNodeMac::wasRemovedFromTree()
+void ScrollingTreeFrameScrollingNodeMac::willBeDestroyed()
{
m_delegate.nodeWillBeDestroyed();
}
Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h (262075 => 262076)
--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.h 2020-05-22 21:52:37 UTC (rev 262076)
@@ -53,7 +53,7 @@
ScrollingEventResult handleWheelEvent(const PlatformWheelEvent&) override;
private:
- void wasRemovedFromTree() final;
+ void willBeDestroyed() final;
ScrollingTreeScrollingNodeDelegateMac m_delegate;
};
Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm (262075 => 262076)
--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm 2020-05-22 21:45:47 UTC (rev 262075)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeOverflowScrollingNodeMac.mm 2020-05-22 21:52:37 UTC (rev 262076)
@@ -49,7 +49,7 @@
ScrollingTreeOverflowScrollingNodeMac::~ScrollingTreeOverflowScrollingNodeMac() = default;
-void ScrollingTreeOverflowScrollingNodeMac::wasRemovedFromTree()
+void ScrollingTreeOverflowScrollingNodeMac::willBeDestroyed()
{
m_delegate.nodeWillBeDestroyed();
}