bool ArgumentCoder<ScrollingStateScrollingNode>::decode(ArgumentDecoder& decoder, ScrollingStateScrollingNode& node) { if (!decoder.decode(static_cast<ScrollingStateNode&>(node))) return false; SCROLLING_NODE_DECODE(ViewportSize, FloatSize, setViewportSize); SCROLLING_NODE_DECODE(TotalContentsSize, IntSize, setTotalContentsSize); SCROLLING_NODE_DECODE(ScrollPosition, FloatPoint, setScrollPosition); SCROLLING_NODE_DECODE(ScrollOrigin, IntPoint, setScrollOrigin); SCROLLING_NODE_DECODE(FrameScaleFactor, float, setFrameScaleFactor); SCROLLING_NODE_DECODE(NonFastScrollableRegion, Region, setNonFastScrollableRegion); SCROLLING_NODE_DECODE(WheelEventHandlerCount, int, setWheelEventHandlerCount); SCROLLING_NODE_DECODE(ReasonsForSynchronousScrolling, SynchronousScrollingReasons, setSynchronousScrollingReasons); SCROLLING_NODE_DECODE(ScrollableAreaParams, ScrollableAreaParameters, setScrollableAreaParameters); SCROLLING_NODE_DECODE_ENUM(BehaviorForFixedElements, ScrollBehaviorForFixedElements, setScrollBehaviorForFixedElements); if (node.hasChangedProperty(ScrollingStateScrollingNode::RequestedScrollPosition)) { FloatPoint scrollPosition; if (!decoder.decode(scrollPosition)) return false; bool representsProgrammaticScroll; if (!decoder.decode(representsProgrammaticScroll)) return false; node.setRequestedScrollPosition(scrollPosition, representsProgrammaticScroll); } SCROLLING_NODE_DECODE(HeaderHeight, int, setHeaderHeight); SCROLLING_NODE_DECODE(FooterHeight, int, setFooterHeight); SCROLLING_NODE_DECODE(TopContentInset, float, setTopContentInset); if (node.hasChangedProperty(ScrollingStateScrollingNode::ScrolledContentsLayer)) { GraphicsLayer::PlatformLayerID layerID; if (!decoder.decode(layerID)) return false; node.setScrolledContentsLayer(layerID); } if (node.hasChangedProperty(ScrollingStateScrollingNode::CounterScrollingLayer)) { GraphicsLayer::PlatformLayerID layerID; if (!decoder.decode(layerID)) return false; node.setCounterScrollingLayer(layerID); } return true; }
bool AsyncScrollingCoordinator::requestScrollPositionUpdate(FrameView* frameView, const IntPoint& scrollPosition) { ASSERT(isMainThread()); ASSERT(m_page); if (!coordinatesScrollingForFrameView(frameView)) return false; if (frameView->inProgrammaticScroll() || frameView->frame().document()->inPageCache()) updateScrollPositionAfterAsyncScroll(frameView->scrollLayerID(), scrollPosition, frameView->inProgrammaticScroll(), SetScrollingLayerPosition); // If this frame view's document is being put into the page cache, we don't want to update our // main frame scroll position. Just let the FrameView think that we did. if (frameView->frame().document()->inPageCache()) return true; ScrollingStateScrollingNode* stateNode = toScrollingStateScrollingNode(m_scrollingStateTree->stateNodeForID(frameView->scrollLayerID())); if (!stateNode) return false; stateNode->setRequestedScrollPosition(scrollPosition, frameView->inProgrammaticScroll()); return true; }