nsresult HTMLContentElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, nsIContent* aBindingParent, bool aCompileEventHandlers) { nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent, aBindingParent, aCompileEventHandlers); NS_ENSURE_SUCCESS(rv, rv); ShadowRoot* containingShadow = GetContainingShadow(); if (containingShadow) { nsINode* parentNode = nsINode::GetParentNode(); while (parentNode && parentNode != containingShadow) { if (parentNode->IsElement() && parentNode->AsElement()->IsHTML(nsGkAtoms::content)) { // Content element in fallback content is not an insertion point. return NS_OK; } parentNode = parentNode->GetParentNode(); } // If the content element is being inserted into a ShadowRoot, // add this element to the list of insertion points. mIsInsertionPoint = true; containingShadow->AddInsertionPoint(this); containingShadow->SetInsertionPointChanged(); } return NS_OK; }
void HTMLContentElement::UnbindFromTree(bool aDeep, bool aNullParent) { if (mIsInsertionPoint) { ShadowRoot* containingShadow = GetContainingShadow(); // Make sure that containingShadow exists, it may have been nulled // during unlinking in which case the ShadowRoot is going away. if (containingShadow) { containingShadow->RemoveInsertionPoint(this); // Remove all the assigned nodes now that the // insertion point now that the insertion point is // no longer a descendant of a ShadowRoot. ClearMatchedNodes(); containingShadow->SetInsertionPointChanged(); } mIsInsertionPoint = false; } nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent); }