// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "third_party/blink/renderer/core/dom/part_root.h" #include "base/containers/contains.h" #include "third_party/blink/renderer/core/dom/child_node_list.h" #include "third_party/blink/renderer/core/dom/child_node_part.h" #include "third_party/blink/renderer/core/dom/comment.h" #include "third_party/blink/renderer/core/dom/container_node.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/document_part_root.h" #include "third_party/blink/renderer/core/dom/element_traversal.h" #include "third_party/blink/renderer/core/dom/node_cloning_data.h" #include "third_party/blink/renderer/core/dom/node_traversal.h" #include "third_party/blink/renderer/core/dom/part.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" namespace blink { void PartRoot::Trace(Visitor* visitor) const { … } void PartRoot::AddPart(Part& new_part) { … } // If we're removing the first Part in the cached part list, then just remove // that Part and keep the parts list clean. Otherwise mark it dirty and clear // the cached list. // TODO(crbug.com/1453291) The above case happens when we're moving the entire // tree that contains Parts, or the *first* part of the tree that contains // Parts. If we're moving the *last* part of the tree, it would be possible // to detect that situation and remove parts from the end of the parts list. // The tricky bit there is that we need to know that we're // doing that, and we only know it's true when we get to the last removal // and we've removed the entire end of the list of parts. // TODO(crbug.com/1453291) The comment for this function should get updated // if we get rid of part tracking. void PartRoot::RemovePart(Part& part) { … } // static void PartRoot::CloneParts(const Node& source_node, Node& destination_node, NodeCloningData& data) { … } void PartRoot::SwapPartsList(PartRoot& other) { … } // |getParts| must always return the contained parts list subject to these // rules: // 1. parts are returned in DOM tree order. If more than one part refers to the // same Node, parts are returned in the order they were constructed. // 2. parts referring to nodes that aren't in a document, not in the same // document as the owning DocumentPartRoot, or not contained by the root // Element of the DocumentPartRoot are not returned. // 3. parts referring to invalid parts are not returned. For example, a // ChildNodePart whose previous_node comes after its next_node. // To rebuild the parts list, we simply traverse the entire tree under the // PartRoot (from FirstIncludedChildNode to LastIncludedChildNode), and collect // any Parts we find. If we find a ChildNodePart (or other PartRoot), we ignore // Parts until we exit the Partroot. void PartRoot::RebuildPartsList() { … } namespace { // This is used only in the case of DOMPartsAPIMinimal enabled, and it just // fresh-builds the parts list, and/or just the node lists, every time with no // caching. void BuildPartsList(PartRoot& part_root, PartRoot::PartList* part_list, PartRoot::PartNodeList* node_part_nodes, PartRoot::PartNodeList* child_node_part_nodes) { … } } // namespace const PartRoot::PartNodeList& PartRoot::getNodePartNodes() { … } const PartRoot::PartNodeList& PartRoot::getChildNodePartNodes() { … } const PartRoot::PartList& PartRoot::getParts() { … } // static PartRoot* PartRoot::GetPartRootFromUnion(PartRootUnion* root_union) { … } // static PartRootUnion* PartRoot::GetUnionFromPartRoot(PartRoot* root) { … } } // namespace blink