ScrollingNodeID ScrollingStateTree::attachNode(ScrollingNodeType nodeType, ScrollingNodeID newNodeID, ScrollingNodeID parentID) { ASSERT(newNodeID); if (ScrollingStateNode* node = stateNodeForID(newNodeID)) { ScrollingStateNode* parent = stateNodeForID(parentID); if (!parent) return newNodeID; if (node->parent() == parent) return newNodeID; // The node is being re-parented. To do that, we'll remove it, and then re-create a new node. removeNode(node); } ScrollingStateNode* newNode = 0; if (!parentID) { // If we're resetting the root node, we should clear the HashMap and destroy the current children. clear(); setRootStateNode(ScrollingStateFrameScrollingNode::create(*this, newNodeID)); newNode = rootStateNode(); m_hasNewRootStateNode = true; } else { ScrollingStateNode* parent = stateNodeForID(parentID); if (!parent) return 0; switch (nodeType) { case FixedNode: { OwnPtr<ScrollingStateFixedNode> fixedNode = ScrollingStateFixedNode::create(*this, newNodeID); newNode = fixedNode.get(); parent->appendChild(fixedNode.release()); break; } case StickyNode: { OwnPtr<ScrollingStateStickyNode> stickyNode = ScrollingStateStickyNode::create(*this, newNodeID); newNode = stickyNode.get(); parent->appendChild(stickyNode.release()); break; } case FrameScrollingNode: { OwnPtr<ScrollingStateFrameScrollingNode> scrollingNode = ScrollingStateFrameScrollingNode::create(*this, newNodeID); newNode = scrollingNode.get(); parent->appendChild(scrollingNode.release()); break; } case OverflowScrollingNode: { OwnPtr<ScrollingStateOverflowScrollingNode> scrollingNode = ScrollingStateOverflowScrollingNode::create(*this, newNodeID); newNode = scrollingNode.get(); parent->appendChild(scrollingNode.release()); break; } } } m_stateNodeMap.set(newNodeID, newNode); return newNodeID; }
ScrollingNodeID ScrollingStateTree::attachNode(ScrollingNodeType nodeType, ScrollingNodeID newNodeID, ScrollingNodeID parentID) { ASSERT(newNodeID); if (ScrollingStateNode* node = stateNodeForID(newNodeID)) { if (!parentID) return newNodeID; ScrollingStateNode* parent = stateNodeForID(parentID); if (!parent) return newNodeID; if (node->parent() == parent) return newNodeID; // The node is being re-parented. To do that, we'll remove it, and then re-create a new node. removeNodeAndAllDescendants(node, SubframeNodeRemoval::Orphan); } ScrollingStateNode* newNode = nullptr; if (!parentID) { // If we're resetting the root node, we should clear the HashMap and destroy the current children. clear(); setRootStateNode(ScrollingStateFrameScrollingNode::create(*this, newNodeID)); newNode = rootStateNode(); m_hasNewRootStateNode = true; } else { ScrollingStateNode* parent = stateNodeForID(parentID); if (!parent) return 0; if (nodeType == FrameScrollingNode && parentID) { if (RefPtr<ScrollingStateNode> orphanedNode = m_orphanedSubframeNodes.take(newNodeID)) { newNode = orphanedNode.get(); parent->appendChild(orphanedNode.release()); } } if (!newNode) { RefPtr<ScrollingStateNode> stateNode = createNode(nodeType, newNodeID); newNode = stateNode.get(); parent->appendChild(stateNode.release()); } } m_stateNodeMap.set(newNodeID, newNode); m_nodesRemovedSinceLastCommit.remove(newNodeID); return newNodeID; }