bool RemoteScrollingCoordinatorTransaction::decode(IPC::ArgumentDecoder& decoder) { int numNodes; if (!decoder.decode(numNodes)) return false; bool hasNewRootNode; if (!decoder.decode(hasNewRootNode)) return false; m_scrollingStateTree = ScrollingStateTree::create(); for (int i = 0; i < numNodes; ++i) { ScrollingNodeType nodeType; if (!decoder.decodeEnum(nodeType)) return false; ScrollingNodeID nodeID; if (!decoder.decode(nodeID)) return false; ScrollingNodeID parentNodeID; if (!decoder.decode(parentNodeID)) return false; m_scrollingStateTree->attachNode(nodeType, nodeID, parentNodeID); ScrollingStateNode* newNode = m_scrollingStateTree->stateNodeForID(nodeID); ASSERT(newNode); ASSERT(!parentNodeID || newNode->parent()); switch (nodeType) { case FrameScrollingNode: case OverflowScrollingNode: if (!decoder.decode(*toScrollingStateScrollingNode(newNode))) return false; break; case FixedNode: if (!decoder.decode(*toScrollingStateFixedNode(newNode))) return false; break; case StickyNode: if (!decoder.decode(*toScrollingStateStickyNode(newNode))) return false; break; } } m_scrollingStateTree->setHasNewRootStateNode(hasNewRootNode); // Removed nodes Vector<ScrollingNodeID> removedNodes; if (!decoder.decode(removedNodes)) return false; if (removedNodes.size()) m_scrollingStateTree->setRemovedNodes(removedNodes); return true; }
void AsyncScrollingCoordinator::updateViewportConstrainedNode(ScrollingNodeID nodeID, const ViewportConstraints& constraints, GraphicsLayer* graphicsLayer) { ASSERT(supportsFixedPositionLayers()); ScrollingStateNode* node = m_scrollingStateTree->stateNodeForID(nodeID); if (!node) return; switch (constraints.constraintType()) { case ViewportConstraints::FixedPositionConstraint: { ScrollingStateFixedNode* fixedNode = toScrollingStateFixedNode(node); fixedNode->setLayer(graphicsLayer); fixedNode->updateConstraints((const FixedPositionViewportConstraints&)constraints); break; } case ViewportConstraints::StickyPositionConstraint: { ScrollingStateStickyNode* stickyNode = toScrollingStateStickyNode(node); stickyNode->setLayer(graphicsLayer); stickyNode->updateConstraints((const StickyPositionViewportConstraints&)constraints); break; } } }
static void encodeNodeAndDescendants(IPC::ArgumentEncoder& encoder, const ScrollingStateNode& stateNode) { switch (stateNode.nodeType()) { case FrameScrollingNode: case OverflowScrollingNode: encoder << toScrollingStateScrollingNode(stateNode); break; case FixedNode: encoder << toScrollingStateFixedNode(stateNode); break; case StickyNode: encoder << toScrollingStateStickyNode(stateNode); break; } if (!stateNode.children()) return; for (size_t i = 0; i < stateNode.children()->size(); ++i) { const OwnPtr<ScrollingStateNode>& child = stateNode.children()->at(i); encodeNodeAndDescendants(encoder, *child.get()); } }