void RemoteScrollingCoordinatorProxy::connectStateNodeLayers(ScrollingStateTree& stateTree, const RemoteLayerTreeHost& layerTreeHost) { for (auto it : stateTree.nodeMap()) { ScrollingStateNode* currNode = it.value; switch (currNode->nodeType()) { case ScrollingNode: { ScrollingStateScrollingNode* scrollingStateNode = toScrollingStateScrollingNode(currNode); if (scrollingStateNode->hasChangedProperty(ScrollingStateNode::ScrollLayer)) scrollingStateNode->setLayer(layerTreeHost.getLayer(scrollingStateNode->layer())); if (scrollingStateNode->hasChangedProperty(ScrollingStateScrollingNode::CounterScrollingLayer)) scrollingStateNode->setCounterScrollingLayer(layerTreeHost.getLayer(scrollingStateNode->counterScrollingLayer())); // FIXME: we should never have header and footer layers coming from the WebProcess. if (scrollingStateNode->hasChangedProperty(ScrollingStateScrollingNode::HeaderLayer)) scrollingStateNode->setHeaderLayer(layerTreeHost.getLayer(scrollingStateNode->headerLayer())); if (scrollingStateNode->hasChangedProperty(ScrollingStateScrollingNode::FooterLayer)) scrollingStateNode->setFooterLayer(layerTreeHost.getLayer(scrollingStateNode->footerLayer())); break; } case FixedNode: if (currNode->hasChangedProperty(ScrollingStateNode::ScrollLayer)) currNode->setLayer(layerTreeHost.getLayer(currNode->layer())); break; case StickyNode: if (currNode->hasChangedProperty(ScrollingStateNode::ScrollLayer)) currNode->setLayer(layerTreeHost.getLayer(currNode->layer())); break; } } }
void ScrollingTree::removeDestroyedNodes(const ScrollingStateTree& stateTree) { for (const auto& removedNodeID : stateTree.removedNodes()) { m_nodeMap.remove(removedNodeID); if (removedNodeID == m_latchedNode) clearLatchedNode(); } }
// This copy constructor is used for cloning nodes in the tree, and it doesn't make sense // to clone the relationship pointers, so don't copy that information from the original node. ScrollingStateNode::ScrollingStateNode(const ScrollingStateNode& stateNode, ScrollingStateTree& adoptiveTree) : m_nodeType(stateNode.nodeType()) , m_nodeID(stateNode.scrollingNodeID()) , m_changedProperties(stateNode.changedProperties()) , m_scrollingStateTree(adoptiveTree) , m_parent(nullptr) { if (hasChangedProperty(ScrollLayer)) setLayer(stateNode.layer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); scrollingStateTree().addNode(this); }
ScrollingStateFrameScrollingNode::ScrollingStateFrameScrollingNode(const ScrollingStateFrameScrollingNode& stateNode, ScrollingStateTree& adoptiveTree) : ScrollingStateScrollingNode(stateNode, adoptiveTree) #if PLATFORM(MAC) , m_verticalScrollerImp(stateNode.verticalScrollerImp()) , m_horizontalScrollerImp(stateNode.horizontalScrollerImp()) #endif , m_eventTrackingRegions(stateNode.eventTrackingRegions()) , m_requestedScrollPosition(stateNode.requestedScrollPosition()) , m_frameScaleFactor(stateNode.frameScaleFactor()) , m_topContentInset(stateNode.topContentInset()) , m_headerHeight(stateNode.headerHeight()) , m_footerHeight(stateNode.footerHeight()) , m_synchronousScrollingReasons(stateNode.synchronousScrollingReasons()) , m_behaviorForFixed(stateNode.scrollBehaviorForFixedElements()) , m_requestedScrollPositionRepresentsProgrammaticScroll(stateNode.requestedScrollPositionRepresentsProgrammaticScroll()) , m_fixedElementsLayoutRelativeToFrame(stateNode.fixedElementsLayoutRelativeToFrame()) { if (hasChangedProperty(ScrolledContentsLayer)) setScrolledContentsLayer(stateNode.scrolledContentsLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(CounterScrollingLayer)) setCounterScrollingLayer(stateNode.counterScrollingLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(InsetClipLayer)) setInsetClipLayer(stateNode.insetClipLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(ContentShadowLayer)) setContentShadowLayer(stateNode.contentShadowLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(HeaderLayer)) setHeaderLayer(stateNode.headerLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(FooterLayer)) setFooterLayer(stateNode.footerLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); }
void RemoteScrollingCoordinatorProxy::connectStateNodeLayers(ScrollingStateTree& stateTree, const RemoteLayerTreeHost& layerTreeHost, bool& fixedOrStickyLayerChanged) { for (auto& currNode : stateTree.nodeMap().values()) { if (currNode->hasChangedProperty(ScrollingStateNode::ScrollLayer)) currNode->setLayer(layerTreeHost.getLayer(currNode->layer())); switch (currNode->nodeType()) { case FrameScrollingNode: { ScrollingStateFrameScrollingNode* scrollingStateNode = toScrollingStateFrameScrollingNode(currNode); if (scrollingStateNode->hasChangedProperty(ScrollingStateFrameScrollingNode::ScrolledContentsLayer)) scrollingStateNode->setScrolledContentsLayer(layerTreeHost.getLayer(scrollingStateNode->scrolledContentsLayer())); if (scrollingStateNode->hasChangedProperty(ScrollingStateFrameScrollingNode::CounterScrollingLayer)) scrollingStateNode->setCounterScrollingLayer(layerTreeHost.getLayer(scrollingStateNode->counterScrollingLayer())); if (scrollingStateNode->hasChangedProperty(ScrollingStateFrameScrollingNode::InsetClipLayer)) scrollingStateNode->setInsetClipLayer(layerTreeHost.getLayer(scrollingStateNode->insetClipLayer())); if (scrollingStateNode->hasChangedProperty(ScrollingStateFrameScrollingNode::ContentShadowLayer)) scrollingStateNode->setContentShadowLayer(layerTreeHost.getLayer(scrollingStateNode->contentShadowLayer())); // FIXME: we should never have header and footer layers coming from the WebProcess. if (scrollingStateNode->hasChangedProperty(ScrollingStateFrameScrollingNode::HeaderLayer)) scrollingStateNode->setHeaderLayer(layerTreeHost.getLayer(scrollingStateNode->headerLayer())); if (scrollingStateNode->hasChangedProperty(ScrollingStateFrameScrollingNode::FooterLayer)) scrollingStateNode->setFooterLayer(layerTreeHost.getLayer(scrollingStateNode->footerLayer())); break; } case OverflowScrollingNode: { ScrollingStateOverflowScrollingNode* scrollingStateNode = toScrollingStateOverflowScrollingNode(currNode); if (scrollingStateNode->hasChangedProperty(ScrollingStateOverflowScrollingNode::ScrolledContentsLayer)) scrollingStateNode->setScrolledContentsLayer(layerTreeHost.getLayer(scrollingStateNode->scrolledContentsLayer())); break; } case FixedNode: if (currNode->hasChangedProperty(ScrollingStateNode::ScrollLayer)) fixedOrStickyLayerChanged = true; break; case StickyNode: if (currNode->hasChangedProperty(ScrollingStateNode::ScrollLayer)) fixedOrStickyLayerChanged = true; break; } } }
void ScrollingTree::removeDestroyedNodes(const ScrollingStateTree& stateTree) { for (const auto& removedNode : stateTree.removedNodes()) { ScrollingTreeNode* node = m_nodeMap.take(removedNode); if (!node) continue; if (node->scrollingNodeID() == m_latchedNode) clearLatchedNode(); // Never destroy the root node. There will be a new root node in the state tree, and we will // associate it with our existing root node in updateTreeFromStateNode(). if (node->parent()) m_rootNode->removeChild(node); } }
void RemoteScrollingTreeTextStream::dump(const ScrollingStateTree& stateTree, bool changedPropertiesOnly) { RemoteScrollingTreeTextStream& ts = *this; dumpProperty(ts, "has changed properties", stateTree.hasChangedProperties()); dumpProperty(ts, "has new root node", stateTree.hasNewRootStateNode()); if (stateTree.rootStateNode()) recursiveDumpNodes(*stateTree.rootStateNode(), changedPropertiesOnly); if (!stateTree.removedNodes().isEmpty()) dumpProperty<Vector<ScrollingNodeID>>(ts, "removed-nodes", stateTree.removedNodes()); }
ScrollingStateScrollingNode::ScrollingStateScrollingNode(const ScrollingStateScrollingNode& stateNode, ScrollingStateTree& adoptiveTree) : ScrollingStateNode(stateNode, adoptiveTree) #if PLATFORM(MAC) , m_verticalScrollbarPainter(stateNode.verticalScrollbarPainter()) , m_horizontalScrollbarPainter(stateNode.horizontalScrollbarPainter()) #endif , m_viewportSize(stateNode.viewportSize()) , m_totalContentsSize(stateNode.totalContentsSize()) , m_scrollPosition(stateNode.scrollPosition()) , m_scrollOrigin(stateNode.scrollOrigin()) , m_scrollableAreaParameters(stateNode.scrollableAreaParameters()) , m_nonFastScrollableRegion(stateNode.nonFastScrollableRegion()) , m_frameScaleFactor(stateNode.frameScaleFactor()) , m_wheelEventHandlerCount(stateNode.wheelEventHandlerCount()) , m_synchronousScrollingReasons(stateNode.synchronousScrollingReasons()) , m_behaviorForFixed(stateNode.scrollBehaviorForFixedElements()) , m_headerHeight(stateNode.headerHeight()) , m_footerHeight(stateNode.footerHeight()) , m_requestedScrollPosition(stateNode.requestedScrollPosition()) , m_requestedScrollPositionRepresentsProgrammaticScroll(stateNode.requestedScrollPositionRepresentsProgrammaticScroll()) , m_topContentInset(stateNode.topContentInset()) { if (hasChangedProperty(ScrolledContentsLayer)) setScrolledContentsLayer(stateNode.scrolledContentsLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(CounterScrollingLayer)) setCounterScrollingLayer(stateNode.counterScrollingLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(InsetClipLayer)) setInsetClipLayer(stateNode.insetClipLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(ContentShadowLayer)) setContentShadowLayer(stateNode.contentShadowLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(HeaderLayer)) setHeaderLayer(stateNode.headerLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); if (hasChangedProperty(FooterLayer)) setFooterLayer(stateNode.footerLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); }
ScrollingStateOverflowScrollingNode::ScrollingStateOverflowScrollingNode(const ScrollingStateOverflowScrollingNode& stateNode, ScrollingStateTree& adoptiveTree) : ScrollingStateScrollingNode(stateNode, adoptiveTree) { if (hasChangedProperty(ScrolledContentsLayer)) setScrolledContentsLayer(stateNode.scrolledContentsLayer().toRepresentation(adoptiveTree.preferredLayerRepresentation())); }