void AsyncScrollingCoordinator::frameViewRootLayerDidChange(FrameView& frameView) { ASSERT(isMainThread()); ASSERT(m_page); if (!coordinatesScrollingForFrameView(frameView)) return; // FIXME: In some navigation scenarios, the FrameView has no RenderView or that RenderView has not been composited. // This needs cleaning up: https://bugs.webkit.org/show_bug.cgi?id=132724 if (!frameView.scrollLayerID()) return; // If the root layer does not have a ScrollingStateNode, then we should create one. ensureRootStateNodeForFrameView(frameView); ASSERT(m_scrollingStateTree->rootStateNode()); ScrollingCoordinator::frameViewRootLayerDidChange(frameView); ScrollingStateFrameScrollingNode* node = downcast<ScrollingStateFrameScrollingNode>(m_scrollingStateTree->stateNodeForID(frameView.scrollLayerID())); node->setLayer(scrollLayerForFrameView(frameView)); node->setScrolledContentsLayer(rootContentLayerForFrameView(frameView)); node->setCounterScrollingLayer(counterScrollingLayerForFrameView(frameView)); node->setInsetClipLayer(insetClipLayerForFrameView(frameView)); node->setContentShadowLayer(contentShadowLayerForFrameView(frameView)); node->setHeaderLayer(headerLayerForFrameView(frameView)); node->setFooterLayer(footerLayerForFrameView(frameView)); node->setScrollBehaviorForFixedElements(frameView.scrollBehaviorForFixedElements()); }
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 AsyncScrollingCoordinator::updateFrameScrollingNode(ScrollingNodeID nodeID, GraphicsLayer* layer, GraphicsLayer* scrolledContentsLayer, GraphicsLayer* counterScrollingLayer, GraphicsLayer* insetClipLayer, const ScrollingGeometry* scrollingGeometry) { ScrollingStateFrameScrollingNode* node = toScrollingStateFrameScrollingNode(m_scrollingStateTree->stateNodeForID(nodeID)); ASSERT(node); if (!node) return; node->setLayer(layer); node->setInsetClipLayer(insetClipLayer); node->setScrolledContentsLayer(scrolledContentsLayer); node->setCounterScrollingLayer(counterScrollingLayer); if (scrollingGeometry) { node->setScrollOrigin(scrollingGeometry->scrollOrigin); node->setScrollPosition(scrollingGeometry->scrollPosition); node->setTotalContentsSize(scrollingGeometry->contentSize); node->setScrollableAreaSize(scrollingGeometry->scrollableAreaSize); } }