void AsyncScrollingCoordinator::updateFrameScrollingNode(ScrollingNodeID nodeID, GraphicsLayer* layer, GraphicsLayer* scrolledContentsLayer, GraphicsLayer* counterScrollingLayer, GraphicsLayer* insetClipLayer, const ScrollingGeometry* scrollingGeometry) { ScrollingStateFrameScrollingNode* node = downcast<ScrollingStateFrameScrollingNode>(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->setReachableContentsSize(scrollingGeometry->reachableContentSize); node->setScrollableAreaSize(scrollingGeometry->scrollableAreaSize); } }
void AsyncScrollingCoordinator::frameViewLayoutUpdated(FrameView& frameView) { ASSERT(isMainThread()); ASSERT(m_page); // If there isn't a root node yet, don't do anything. We'll be called again after creating one. if (!m_scrollingStateTree->rootStateNode()) return; // Compute the region of the page that we can't do fast scrolling for. This currently includes // all scrollable areas, such as subframes, overflow divs and list boxes. We need to do this even if the // frame view whose layout was updated is not the main frame. // In the future, we may want to have the ability to set non-fast scrolling regions for more than // just the root node. But right now, this concept only applies to the root. m_scrollingStateTree->rootStateNode()->setNonFastScrollableRegion(absoluteNonFastScrollableRegion()); m_nonFastScrollableRegionDirty = false; if (!coordinatesScrollingForFrameView(frameView)) return; ScrollingStateFrameScrollingNode* node = downcast<ScrollingStateFrameScrollingNode>(m_scrollingStateTree->stateNodeForID(frameView.scrollLayerID())); if (!node) return; Scrollbar* verticalScrollbar = frameView.verticalScrollbar(); Scrollbar* horizontalScrollbar = frameView.horizontalScrollbar(); node->setScrollbarPaintersFromScrollbars(verticalScrollbar, horizontalScrollbar); node->setFrameScaleFactor(frameView.frame().frameScaleFactor()); node->setHeaderHeight(frameView.headerHeight()); node->setFooterHeight(frameView.footerHeight()); node->setTopContentInset(frameView.topContentInset()); node->setScrollOrigin(frameView.scrollOrigin()); node->setScrollableAreaSize(frameView.visibleContentRect().size()); node->setTotalContentsSize(frameView.totalContentsSize()); node->setReachableContentsSize(frameView.totalContentsSize()); node->setFixedElementsLayoutRelativeToFrame(frameView.fixedElementsLayoutRelativeToFrame()); #if ENABLE(CSS_SCROLL_SNAP) frameView.updateSnapOffsets(); updateScrollSnapPropertiesWithFrameView(frameView); #endif #if PLATFORM(COCOA) Page* page = frameView.frame().page(); if (page && page->expectsWheelEventTriggers()) { LOG(WheelEventTestTriggers, " AsyncScrollingCoordinator::frameViewLayoutUpdated: Expects wheel event test trigger=%d", page->expectsWheelEventTriggers()); node->setExpectsWheelEventTestTrigger(page->expectsWheelEventTriggers()); } #endif ScrollableAreaParameters scrollParameters; scrollParameters.horizontalScrollElasticity = frameView.horizontalScrollElasticity(); scrollParameters.verticalScrollElasticity = frameView.verticalScrollElasticity(); scrollParameters.hasEnabledHorizontalScrollbar = horizontalScrollbar && horizontalScrollbar->enabled(); scrollParameters.hasEnabledVerticalScrollbar = verticalScrollbar && verticalScrollbar->enabled(); scrollParameters.horizontalScrollbarMode = frameView.horizontalScrollbarMode(); scrollParameters.verticalScrollbarMode = frameView.verticalScrollbarMode(); node->setScrollableAreaParameters(scrollParameters); }