void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChild) { ASSERT(newChild); ASSERT(nextChild); ASSERT(nextChild->parentNode() == this); ASSERT(!newChild->isDocumentFragment()); #if ENABLE(TEMPLATE_ELEMENT) ASSERT(!hasTagName(HTMLNames::templateTag)); #endif if (nextChild->previousSibling() == newChild || nextChild == newChild) // nothing to do return; if (&document() != &newChild->document()) document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); insertBeforeCommon(nextChild, newChild.get()); newChild->updateAncestorConnectedSubframeCountForInsertion(); ChildListMutationScope(this).childAdded(newChild.get()); childrenChanged(true, newChild->previousSibling(), nextChild, 1); ChildNodeInsertionNotifier(this).notify(newChild.get()); }
void ContainerNode::parserAppendChild(PassRefPtr<Node> newChild) { ASSERT(newChild); ASSERT(!newChild->parentNode()); // Use appendChild if you need to handle reparenting (and want DOM mutation events). ASSERT(!newChild->isDocumentFragment()); ASSERT(!hasTagName(HTMLNames::templateTag)); if (document() != newChild->document()) document()->adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); Node* last = m_lastChild; { NoEventDispatchAssertion assertNoEventDispatch; // FIXME: This method should take a PassRefPtr. appendChildToContainer(newChild.get(), this); treeScope()->adoptIfNeeded(newChild.get()); } newChild->updateAncestorConnectedSubframeCountForInsertion(); ChildListMutationScope(this).childAdded(newChild.get()); childrenChanged(true, last, 0, 1); ChildNodeInsertionNotifier(this).notify(newChild.get()); }
void ElementShadow::addShadowRoot(Element* shadowHost, PassRefPtr<ShadowRoot> shadowRoot, ShadowRoot::ShadowRootType type, ExceptionCode& ec) { ASSERT(shadowHost); ASSERT(shadowRoot); if (!validateShadowRoot(shadowHost->document(), shadowRoot.get(), ec)) return; if (type == ShadowRoot::AuthorShadowRoot) shadowHost->willAddAuthorShadowRoot(); shadowRoot->setHost(shadowHost); shadowRoot->setParentTreeScope(shadowHost->treeScope()); m_shadowRoots.push(shadowRoot.get()); m_distributor.didShadowBoundaryChange(shadowHost); ChildNodeInsertionNotifier(shadowHost).notify(shadowRoot.get()); // Existence of shadow roots requires the host and its children to do traversal using ComposedShadowTreeWalker. shadowHost->setNeedsShadowTreeWalker(); // FIXME(94905): ShadowHost should be reattached during recalcStyle. // Set some flag here and recreate shadow hosts' renderer in // Element::recalcStyle. if (shadowHost->attached()) shadowHost->lazyReattach(); InspectorInstrumentation::didPushShadowRoot(shadowHost, shadowRoot.get()); }
static void updateTreeAfterInsertion(ContainerNode* parent, Node* child, bool shouldLazyAttach) { ASSERT(parent->refCount()); ASSERT(child->refCount()); #if ENABLE(MUTATION_OBSERVERS) ChildListMutationScope(parent).childAdded(child); #endif #if ENABLE(UNDO_MANAGER) if (UndoManager::isRecordingAutomaticTransaction(parent)) UndoManager::addTransactionStep(NodeInsertingDOMTransactionStep::create(parent, child)); #endif parent->childrenChanged(false, child->previousSibling(), child->nextSibling(), 1); ChildNodeInsertionNotifier(parent).notify(child); // FIXME: Attachment should be the first operation in this function, but some code // (for example, HTMLFormControlElement's autofocus support) requires this ordering. if (parent->attached() && !child->attached() && child->parentNode() == parent) { if (shouldLazyAttach) child->lazyAttach(); else child->attach(); } dispatchChildInsertionEvents(child); }
static void updateTreeAfterInsertion(ContainerNode* parent, Node* child, AttachBehavior attachBehavior) { ASSERT(parent->refCount()); ASSERT(child->refCount()); ChildListMutationScope(parent).childAdded(child); parent->childrenChanged(false, child->previousSibling(), child->nextSibling(), 1); ChildNodeInsertionNotifier(parent).notify(child); // FIXME: Attachment should be the first operation in this function, but some code // (for example, HTMLFormControlElement's autofocus support) requires this ordering. if (parent->attached() && !child->attached() && child->parentNode() == parent) { if (attachBehavior == AttachLazily) { if (child->isElementNode()) toElement(child)->lazyAttach(); else if (child->isTextNode()) { child->setAttached(true); child->setNeedsStyleRecalc(); } } else attachChild(child); } dispatchChildInsertionEvents(child); }
void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChild) { ASSERT(newChild); ASSERT(nextChild); ASSERT(nextChild->parentNode() == this); NodeVector targets; collectTargetNodes(newChild.get(), targets); if (targets.isEmpty()) return; if (nextChild->previousSibling() == newChild || nextChild == newChild) // nothing to do return; RefPtr<Node> next = nextChild; RefPtr<Node> nextChildPreviousSibling = nextChild->previousSibling(); for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) { Node* child = it->get(); insertBeforeCommon(next.get(), child); childrenChanged(true, nextChildPreviousSibling.get(), nextChild, 1); ChildNodeInsertionNotifier(this).notify(child); } }
void ContainerNode::parserAppendChild(PassRefPtr<Node> newChild) { ASSERT(newChild); ASSERT(!newChild->parentNode()); // Use appendChild if you need to handle reparenting (and want DOM mutation events). ASSERT(!newChild->isDocumentFragment()); #if ENABLE(TEMPLATE_ELEMENT) ASSERT(!hasTagName(HTMLNames::templateTag)); #endif if (&document() != &newChild->document()) document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); { NoEventDispatchAssertion assertNoEventDispatch; // FIXME: This method should take a PassRefPtr. appendChildToContainer(newChild.get(), *this); treeScope().adoptIfNeeded(newChild.get()); } newChild->updateAncestorConnectedSubframeCountForInsertion(); ChildListMutationScope(*this).childAdded(*newChild); notifyChildInserted(*newChild, ChildChangeSourceParser); ChildNodeInsertionNotifier(*this).notify(*newChild); newChild->setNeedsStyleRecalc(ReconstructRenderTree); }
void ContainerNode::updateTreeAfterInsertion(Node& child) { ASSERT(child.refCount()); ChildListMutationScope(*this).childAdded(child); notifyChildInserted(child, ChildChangeSourceAPI); ChildNodeInsertionNotifier(*this).notify(child); child.setNeedsStyleRecalc(ReconstructRenderTree); dispatchChildInsertionEvents(child); }
void ContainerNode::parserAppendChild(PassRefPtr<Node> newChild) { ASSERT(newChild); ASSERT(!newChild->parentNode()); // Use appendChild if you need to handle reparenting (and want DOM mutation events). Node* last = m_lastChild; { NoEventDispatchAssertion assertNoEventDispatch; // FIXME: This method should take a PassRefPtr. appendChildToContainer(newChild.get(), this); treeScope()->adoptIfNeeded(newChild.get()); } childrenChanged(true, last, 0, 1); ChildNodeInsertionNotifier(this).notify(newChild.get()); }
ShadowRoot* ElementShadow::addShadowRoot(Element* shadowHost, ShadowRoot::ShadowRootType type) { RefPtr<ShadowRoot> shadowRoot = ShadowRoot::create(shadowHost->document(), type); shadowRoot->setParentOrShadowHostNode(shadowHost); shadowRoot->setParentTreeScope(shadowHost->treeScope()); m_shadowRoots.push(shadowRoot.get()); m_distributor.didShadowBoundaryChange(shadowHost); ChildNodeInsertionNotifier(shadowHost).notify(shadowRoot.get()); if (shadowHost->attached()) shadowHost->lazyReattach(); InspectorInstrumentation::didPushShadowRoot(shadowHost, shadowRoot.get()); return shadowRoot.get(); }
void ShadowTree::addShadowRoot(Element* shadowHost, PassRefPtr<ShadowRoot> shadowRoot, ExceptionCode& ec) { ASSERT(shadowHost); ASSERT(shadowRoot); if (!validateShadowRoot(shadowHost->document(), shadowRoot.get(), ec)) return; shadowRoot->setShadowHost(shadowHost); ChildNodeInsertionNotifier(shadowHost).notify(shadowRoot.get()); if (shadowHost->attached()) { shadowRoot->lazyAttach(); detach(); shadowHost->detachChildren(); } m_shadowRoots.push(shadowRoot.get()); InspectorInstrumentation::didPushShadowRoot(shadowHost, shadowRoot.get()); }
ShadowRoot* ElementShadow::addShadowRoot(Element& shadowHost, ShadowRoot::ShadowRootType type) { RefPtr<ShadowRoot> shadowRoot = ShadowRoot::create(&shadowHost.document(), type); shadowRoot->setParentOrShadowHostNode(&shadowHost); shadowRoot->setParentTreeScope(&shadowHost.treeScope()); m_shadowRoots.push(shadowRoot.get()); ChildNodeInsertionNotifier(shadowHost).notify(*shadowRoot); setNeedsDistributionRecalc(); shadowHost.lazyReattachIfAttached(); // addShadowRoot() affects apply-author-styles. However, we know that the youngest shadow root has not had any children yet. // The youngest shadow root's apply-author-styles is default (false). So we can just set m_applyAuthorStyles false. m_applyAuthorStyles = false; shadowHost.didAddShadowRoot(*shadowRoot); InspectorInstrumentation::didPushShadowRoot(&shadowHost, shadowRoot.get()); return shadowRoot.get(); }
ShadowRoot* ElementShadow::addShadowRoot(Element* shadowHost, ShadowRoot::ShadowRootType type) { ASSERT(!m_shadowRoot); m_shadowRoot = ShadowRoot::create(shadowHost->document(), type); m_shadowRoot->setParentOrShadowHostNode(shadowHost); m_shadowRoot->setParentTreeScope(shadowHost->treeScope()); m_distributor.didShadowBoundaryChange(shadowHost); ChildNodeInsertionNotifier(shadowHost).notify(m_shadowRoot.get()); // Existence of shadow roots requires the host and its children to do traversal using ComposedShadowTreeWalker. shadowHost->setNeedsShadowTreeWalker(); // FIXME(94905): ShadowHost should be reattached during recalcStyle. // Set some flag here and recreate shadow hosts' renderer in // Element::recalcStyle. if (shadowHost->attached()) shadowHost->lazyReattach(); InspectorInstrumentation::didPushShadowRoot(shadowHost, m_shadowRoot.get()); return m_shadowRoot.get(); }