static void collectTargetNodes(Node* node, NodeVector& nodes) { if (node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) { nodes.append(node); return; } getChildNodes(node, nodes); }
void notifyNodeInsertedIntoDocument(ContainerNode& insertionPoint, Node& node, NodeVector& postInsertionNotificationTargets) { ASSERT(insertionPoint.inDocument()); if (node.insertedInto(insertionPoint) == Node::InsertionShouldCallFinishedInsertingSubtree) postInsertionNotificationTargets.append(node); if (is<ContainerNode>(node)) notifyDescendantInsertedIntoDocument(insertionPoint, downcast<ContainerNode>(node), postInsertionNotificationTargets); }
void notifyNodeInsertedIntoTree(ContainerNode& insertionPoint, ContainerNode& node, NodeVector& postInsertionNotificationTargets) { NoEventDispatchAssertion assertNoEventDispatch; ASSERT(!insertionPoint.inDocument()); if (node.insertedInto(insertionPoint) == Node::InsertionShouldCallFinishedInsertingSubtree) postInsertionNotificationTargets.append(node); notifyDescendantInsertedIntoTree(insertionPoint, node, postInsertionNotificationTargets); }
static void collectChildrenAndRemoveFromOldParent(Node* node, NodeVector& nodes, ExceptionCode& ec) { if (node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) { nodes.append(node); if (ContainerNode* oldParent = node->parentNode()) oldParent->removeChild(node, ec); return; } getChildNodes(node, nodes); toContainerNode(node)->removeChildren(); }
static void collectChildrenAndRemoveFromOldParent(Node& node, NodeVector& nodes, ExceptionCode& ec) { if (!node.isDocumentFragment()) { nodes.append(node); if (ContainerNode* oldParent = node.parentNode()) oldParent->removeChild(&node, ec); return; } getChildNodes(node, nodes); toContainerNode(node).removeChildren(); }
// this differs from other remove functions because it forcibly removes all the children, // regardless of read-only status or event exceptions, e.g. void ContainerNode::removeChildren() { if (!m_firstChild) return; // The container node can be removed from event handlers. RefPtr<ContainerNode> protect(this); // Exclude this node when looking for the focused or full screen Node since // only children will be removed. // FIXME: We should call these inside the loop below. Right now you can focus // a node with mutation events and it'll never get blured. document()->removeFocusedNodeOfSubtree(this, true); document()->removeFullScreenElementOfSubtree(this, true); ChildListMutationScope mutation(this); NodeVector removedChildren; { WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; while (RefPtr<Node> child = m_firstChild) { // Dispatch synchronous events like mutation and unload events. dispatchChildRemovalEvents(child.get()); ChildFrameDisconnector(child.get()).disconnect(); // FIXME: In theory this can fire focus events when the selection // changes, but there's no obvious way to test it. document()->nodeWillBeRemoved(child.get()); // If an event moved the child start over. if (child != m_firstChild) continue; mutation.willRemoveChild(child.get()); child->notifyMutationObserversNodeWillDetach(); removeBetween(0, child->nextSibling(), child.get()); removedChildren.append(child.release()); } // FIXME: We could avoid walking all the children twice by calling // notify inside the loop and childrenChanged after but that would mean // calling childrenChanged in a different order than all other methods. // Figure out if this is safe. childrenChanged(false, 0, 0, -static_cast<int>(removedChildren.size())); for (size_t i = 0; i < removedChildren.size(); ++i) ChildNodeRemovalNotifier(this).notify(removedChildren[i].get()); } dispatchSubtreeModifiedEvent(); }
// this differs from other remove functions because it forcibly removes all the children, // regardless of read-only status or event exceptions, e.g. void ContainerNode::removeChildren() { if (!m_firstChild) return; // The container node can be removed from event handlers. Ref<ContainerNode> protect(*this); // exclude this node when looking for removed focusedNode since only children will be removed document().removeFocusedNodeOfSubtree(this, true); #if ENABLE(FULLSCREEN_API) document().removeFullScreenElementOfSubtree(this, true); #endif // Do any prep work needed before actually starting to detach // and remove... e.g. stop loading frames, fire unload events. willRemoveChildren(*this); NodeVector removedChildren; { WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; { NoEventDispatchAssertion assertNoEventDispatch; removedChildren.reserveInitialCapacity(countChildNodes()); while (RefPtr<Node> n = m_firstChild) { removedChildren.append(*m_firstChild); removeBetween(0, m_firstChild->nextSibling(), *m_firstChild); } } ChildChange change = { AllChildrenRemoved, nullptr, nullptr, ChildChangeSourceAPI }; childrenChanged(change); for (size_t i = 0; i < removedChildren.size(); ++i) ChildNodeRemovalNotifier(*this).notify(removedChildren[i].get()); } if (document().svgExtensions()) { Element* shadowHost = this->shadowHost(); if (!shadowHost || !shadowHost->hasTagName(SVGNames::useTag)) document().accessSVGExtensions()->rebuildElements(); } dispatchSubtreeModifiedEvent(); }
// this differs from other remove functions because it forcibly removes all the children, // regardless of read-only status or event exceptions, e.g. void ContainerNode::removeChildren() { if (!m_firstChild) return; // The container node can be removed from event handlers. RefPtr<ContainerNode> protect(this); // exclude this node when looking for removed focusedNode since only children will be removed document().removeFocusedNodeOfSubtree(this, true); #if ENABLE(FULLSCREEN_API) document().removeFullScreenElementOfSubtree(this, true); #endif // Do any prep work needed before actually starting to detach // and remove... e.g. stop loading frames, fire unload events. willRemoveChildren(protect.get()); NodeVector removedChildren; { WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; { NoEventDispatchAssertion assertNoEventDispatch; removedChildren.reserveInitialCapacity(childNodeCount()); while (RefPtr<Node> n = m_firstChild) { removedChildren.append(m_firstChild); removeBetween(0, m_firstChild->nextSibling(), m_firstChild); } } childrenChanged(false, 0, 0, -static_cast<int>(removedChildren.size())); for (size_t i = 0; i < removedChildren.size(); ++i) ChildNodeRemovalNotifier(this).notify(removedChildren[i].get()); } dispatchSubtreeModifiedEvent(); }