15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2001 Dirk Mueller (mueller@kde.org) 5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ContainerNode.h" 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h" 27d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/dom/ChildFrameDisconnector.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ChildListMutationScope.h" 2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/ClassCollection.h" 30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/dom/ElementTraversal.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h" 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/NameNodeList.h" 331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/NodeChildRemovalTracker.h" 34e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/NodeRareData.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeRenderStyle.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h" 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/SelectorQuery.h" 3876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/dom/StaticNodeList.h" 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/StyleEngine.h" 40f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/dom/shadow/ElementShadow.h" 41f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h" 421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MutationEvent.h" 43e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/html/HTMLCollection.h" 44a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "core/html/HTMLFrameOwnerElement.h" 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/HTMLTagCollection.h" 4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/RadioNodeList.h" 47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h" 48521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/rendering/InlineTextBox.h" 49521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/rendering/RenderText.h" 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h" 518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/rendering/RenderView.h" 52e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "platform/EventDispatchForbiddenScope.h" 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/ScriptForbiddenScope.h" 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)using namespace HTMLNames; 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic void dispatchChildInsertionEvents(Node&); 606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochstatic void dispatchChildRemovalEvents(Node&); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 63e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned EventDispatchForbiddenScope::s_count = 0; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static void collectChildrenAndRemoveFromOldParent(Node& node, NodeVector& nodes, ExceptionState& exceptionState) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (node.isDocumentFragment()) { 69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) DocumentFragment& fragment = toDocumentFragment(node); 70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) getChildNodes(fragment, nodes); 71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) fragment.removeChildren(); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) nodes.append(&node); 75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (ContainerNode* oldParent = node.parentNode()) 76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) oldParent->removeChild(&node, exceptionState); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 79323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ContainerNode::removeDetachedChildren() 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 82f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ASSERT(!connectedSubframeCount()); 8319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT(needsAttach()); 84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch removeDetachedChildrenInContainer(*this); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 86323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void ContainerNode::parserTakeAllChildrenFrom(ContainerNode& oldParent) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 90f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) while (RefPtrWillBeRawPtr<Node> child = oldParent.firstChild()) { 9119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) oldParent.parserRemoveChild(*child); 92f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) treeScope().adoptIfNeeded(*child); 938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) parserAppendChild(child.get()); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContainerNode::~ContainerNode() 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 99323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(needsAttach()); 100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 101f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) willBeDeletedFromDocument(); 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) removeDetachedChildren(); 103323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool ContainerNode::isChildTypeAllowed(const Node& child) const 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 10819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (!child.isDocumentFragment()) 10951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return childTypeAllowed(child.nodeType()); 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 111f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (Node* node = toDocumentFragment(child).firstChild(); node; node = node->nextSibling()) { 11251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!childTypeAllowed(node->nodeType())) 113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool ContainerNode::containsConsideringHostElements(const Node& newChild) const 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (isInShadowTree() || document().isTemplateDocument()) 12151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return newChild.containsIncludingHostElements(*this); 12251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return newChild.contains(this); 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool ContainerNode::checkAcceptChild(const Node* newChild, const Node* oldChild, ExceptionState& exceptionState) const 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 127e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // Not mentioned in spec: throw NotFoundError if newChild is null 128df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (!newChild) { 129a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "The new child element is null."); 130df95704c49daea886ddad70775bda23618d6274dBen Murdoch return false; 131df95704c49daea886ddad70775bda23618d6274dBen Murdoch } 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Use common case fast path if possible. 13451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if ((newChild->isElementNode() || newChild->isTextNode()) && isElementNode()) { 13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(isChildTypeAllowed(*newChild)); 13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (containsConsideringHostElements(*newChild)) { 137a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "The new child element contains the parent."); 138df95704c49daea886ddad70775bda23618d6274dBen Murdoch return false; 139df95704c49daea886ddad70775bda23618d6274dBen Murdoch } 140df95704c49daea886ddad70775bda23618d6274dBen Murdoch return true; 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // This should never happen, but also protect release builds from tree corruption. 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!newChild->isPseudoElement()); 145df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (newChild->isPseudoElement()) { 146a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "The new child element is a pseudo-element."); 147df95704c49daea886ddad70775bda23618d6274dBen Murdoch return false; 148df95704c49daea886ddad70775bda23618d6274dBen Murdoch } 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 15051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (containsConsideringHostElements(*newChild)) { 151a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "The new child element contains the parent."); 152df95704c49daea886ddad70775bda23618d6274dBen Murdoch return false; 153df95704c49daea886ddad70775bda23618d6274dBen Murdoch } 154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (oldChild && isDocumentNode()) { 15651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!toDocument(this)->canReplaceChild(*newChild, *oldChild)) { 1571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // FIXME: Adjust 'Document::canReplaceChild' to return some additional detail (or an error message). 158a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "Failed to replace child."); 159df95704c49daea886ddad70775bda23618d6274dBen Murdoch return false; 160df95704c49daea886ddad70775bda23618d6274dBen Murdoch } 16151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } else if (!isChildTypeAllowed(*newChild)) { 162a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "Nodes of type '" + newChild->nodeName() + "' may not be inserted inside nodes of type '" + nodeName() + "'."); 163df95704c49daea886ddad70775bda23618d6274dBen Murdoch return false; 164e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 166df95704c49daea886ddad70775bda23618d6274dBen Murdoch return true; 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 169a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool ContainerNode::checkAcceptChildGuaranteedNodeTypes(const Node& newChild, ExceptionState& exceptionState) const 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 17151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(isChildTypeAllowed(newChild)); 17251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (newChild.contains(this)) { 173a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(HierarchyRequestError, "The new child element contains the parent."); 174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 179197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtrWillBeRawPtr<Node> ContainerNode::insertBefore(PassRefPtrWillBeRawPtr<Node> newChild, Node* refChild, ExceptionState& exceptionState) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 181a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#if !ENABLE(OILPAN) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check that this node is not "floating". 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If it is, it can be deleted as a side effect of sending mutation events. 184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(refCount() || parentOrShadowHostNode()); 185a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#endif 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 187f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> protect(this); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // insertBefore(node, 0) is equivalent to appendChild(node) 190e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (!refChild) { 191197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return appendChild(newChild, exceptionState); 192e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make sure adding the new child is OK. 195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!checkAcceptChild(newChild.get(), 0, exceptionState)) { 196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (exceptionState.hadException()) 197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 20019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT(newChild); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 202e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // NotFoundError: Raised if refChild is not a child of this node 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (refChild->parentNode() != this) { 204a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "The node before which the new node is to be inserted is not a child of this node."); 205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 208197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // nothing to do 209197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (refChild->previousSibling() == newChild || refChild == newChild) 210197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 212f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> next = refChild; 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeVector targets; 21551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState); 21651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.hadException()) 217197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (targets.isEmpty()) 219197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // We need this extra check because collectChildrenAndRemoveFromOldParent() can fire mutation events. 222197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!checkAcceptChildGuaranteedNodeTypes(*newChild, exceptionState)) { 223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (exceptionState.hadException()) 224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 226197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 228bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) InspectorInstrumentation::willInsertDOMNode(this); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 230f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ChildListMutationScope mutation(*this); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) { 232f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(*it); 233f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Node& child = **it; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Due to arbitrary code running in response to a DOM mutation event it's 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // possible that "next" is no longer a child of "this". 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It's also possible that "child" has been inserted elsewhere. 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In either of those cases, we'll just stop. 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next->parentNode() != this) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 241f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (child.parentNode()) 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) treeScope().adoptIfNeeded(child); 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 246f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) insertBeforeCommon(*next, child); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) updateTreeAfterInsertion(child); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchSubtreeModifiedEvent(); 252197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 256f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void ContainerNode::insertBeforeCommon(Node& nextChild, Node& newChild) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 258e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 259f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ScriptForbiddenScope forbidScript; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 261f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(!newChild.parentNode()); // Use insertBefore if you need to handle reparenting (and want DOM mutation events). 262f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(!newChild.nextSibling()); 263f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(!newChild.previousSibling()); 264f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(!newChild.isShadowRoot()); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 266f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Node* prev = nextChild.previousSibling(); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_lastChild != prev); 268f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) nextChild.setPreviousSibling(&newChild); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (prev) { 270323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(firstChild() != nextChild); 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(prev->nextSibling() == nextChild); 272f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) prev->setNextSibling(&newChild); 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 274323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(firstChild() == nextChild); 275f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_firstChild = &newChild; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 277f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) newChild.setParentOrShadowHostNode(this); 278f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) newChild.setPreviousSibling(prev); 279f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) newChild.setNextSibling(&nextChild); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ContainerNode::appendChildCommon(Node& child) 2835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 2845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) child.setParentOrShadowHostNode(this); 2855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_lastChild) { 2875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) child.setPreviousSibling(m_lastChild); 2885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_lastChild->setNextSibling(&child); 2895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } else { 2905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) setFirstChild(&child); 2915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 2935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) setLastChild(&child); 2945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 2955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 296f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void ContainerNode::parserInsertBefore(PassRefPtrWillBeRawPtr<Node> newChild, Node& nextChild) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(newChild); 29919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT(nextChild.parentNode() == this); 300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!newChild->isDocumentFragment()); 301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(!isHTMLTemplateElement(this)); 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 303f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (nextChild.previousSibling() == newChild || &nextChild == newChild) // nothing to do 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 306c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtrWillBeRawPtr<Node> protect(this); 307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 3081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (document() != newChild->document()) 3098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) insertBeforeCommon(nextChild, *newChild); 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) newChild->updateAncestorConnectedSubframeCountForInsertion(); 314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 315f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ChildListMutationScope(*this).childAdded(*newChild); 316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 317c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) notifyNodeInserted(*newChild, ChildrenChangeSourceParser); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 320197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtrWillBeRawPtr<Node> ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& exceptionState) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 322a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#if !ENABLE(OILPAN) 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check that this node is not "floating". 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If it is, it can be deleted as a side effect of sending mutation events. 325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(refCount() || parentOrShadowHostNode()); 326a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#endif 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 328f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> protect(this); 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (oldChild == newChild) // nothing to do 331197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return oldChild; 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!oldChild) { 334a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "The node to be replaced is null."); 335197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 338197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtrWillBeRawPtr<Node> child = oldChild; 339197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make sure replacing the old child with the new is ok 341197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!checkAcceptChild(newChild.get(), child.get(), exceptionState)) { 342197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (exceptionState.hadException()) 343197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 344197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return child; 345197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 347e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // NotFoundError: Raised if oldChild is not a child of this node. 348197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (child->parentNode() != this) { 349a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "The node to be replaced is not a child of this node."); 350197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 353f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ChildListMutationScope mutation(*this); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtrWillBeRawPtr<Node> next = child->nextSibling(); 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Remove the node we're replacing 358197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch removeChild(child, exceptionState); 35951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.hadException()) 360197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next && (next->previousSibling() == newChild || next == newChild)) // nothing to do 363197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return child; 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Does this one more time because removeChild() fires a MutationEvent. 366197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!checkAcceptChild(newChild.get(), child.get(), exceptionState)) { 367197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (exceptionState.hadException()) 368197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 369197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return child; 370197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeVector targets; 37351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState); 37451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.hadException()) 375197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Does this yet another check because collectChildrenAndRemoveFromOldParent() fires a MutationEvent. 378197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!checkAcceptChild(newChild.get(), child.get(), exceptionState)) { 379197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (exceptionState.hadException()) 380197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 381197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return child; 382197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 384bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) InspectorInstrumentation::willInsertDOMNode(this); 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Add the new child(ren) 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) { 388f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(*it); 389f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Node& child = **it; 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Due to arbitrary code running in response to a DOM mutation event it's 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // possible that "next" is no longer a child of "this". 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It's also possible that "child" has been inserted elsewhere. 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In either of those cases, we'll just stop. 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next && next->parentNode() != this) 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 397f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (child.parentNode()) 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) treeScope().adoptIfNeeded(child); 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Add child before "next". 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 404e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next) 406f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) insertBeforeCommon(*next, child); 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 4085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) appendChildCommon(child); 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) updateTreeAfterInsertion(child); 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchSubtreeModifiedEvent(); 415197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return child; 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ContainerNode::willRemoveChild(Node& child) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 42051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(child.parentNode() == this); 42151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ChildListMutationScope(*this).willRemoveChild(child); 422f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) child.notifyMutationObserversNodeWillDetach(); 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchChildRemovalEvents(child); 42451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) document().nodeWillBeRemoved(child); // e.g. mutation event listener can create a new range. 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ChildFrameDisconnector(child).disconnect(); 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ContainerNode::willRemoveChildren() 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeVector children; 43151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) getChildNodes(*this, children); 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ChildListMutationScope mutation(*this); 43409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (NodeVector::const_iterator it = children.begin(); it != children.end(); ++it) { 435f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(*it); 436f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Node& child = **it; 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutation.willRemoveChild(child); 438f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) child.notifyMutationObserversNodeWillDetach(); 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchChildRemovalEvents(child); 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ChildFrameDisconnector(*this).disconnect(ChildFrameDisconnector::DescendantsOnly); 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 445197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if !ENABLE(OILPAN) 446197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ContainerNode::removeDetachedChildrenInContainer(ContainerNode& container) 447197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 448197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // List of nodes to be deleted. 449197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Node* head = 0; 450197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Node* tail = 0; 451197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 452197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch addChildNodesToDeletionQueue(head, tail, container); 453197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 454197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Node* n; 455197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Node* next; 456197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch while ((n = head) != 0) { 457197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT_WITH_SECURITY_IMPLICATION(n->m_deletionHasBegun); 458197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 459197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch next = n->nextSibling(); 460197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch n->setNextSibling(0); 461197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 462197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch head = next; 463197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (next == 0) 464197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch tail = 0; 465197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 466197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (n->hasChildren()) 467197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch addChildNodesToDeletionQueue(head, tail, toContainerNode(*n)); 468197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 469197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch delete n; 470197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 471197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 472197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 473197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ContainerNode::addChildNodesToDeletionQueue(Node*& head, Node*& tail, ContainerNode& container) 474197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 475197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // We have to tell all children that their parent has died. 476197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Node* next = 0; 477197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (Node* n = container.firstChild(); n; n = next) { 478197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT_WITH_SECURITY_IMPLICATION(!n->m_deletionHasBegun); 479197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 480197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch next = n->nextSibling(); 481197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch n->setNextSibling(0); 482197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch n->setParentOrShadowHostNode(0); 483197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch container.setFirstChild(next); 484197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (next) 485197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch next->setPreviousSibling(0); 486197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 487197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!n->refCount()) { 488197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(SECURITY_ASSERT) 489197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch n->m_deletionHasBegun = true; 490197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 491197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Add the node to the list of nodes to be deleted. 492197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Reuse the nextSibling pointer for this purpose. 493197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (tail) 494197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch tail->setNextSibling(n); 495197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else 496197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch head = n; 497197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 498197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch tail = n; 499197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } else { 500197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtrWillBeRawPtr<Node> protect(n); // removedFromDocument may remove all references to this node. 501197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch container.document().adoptIfNeeded(*n); 502197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (n->inDocument()) 503197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch container.notifyNodeRemoved(*n); 504197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 505197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 506197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 507197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch container.setLastChild(0); 508197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 509197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 510197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContainerNode::disconnectDescendantFrames() 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 513f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ChildFrameDisconnector(*this).disconnect(); 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 516323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void ContainerNode::trace(Visitor* visitor) 517323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 518323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_firstChild); 519323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_lastChild); 520323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) Node::trace(visitor); 521323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 522323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 523197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtrWillBeRawPtr<Node> ContainerNode::removeChild(PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& exceptionState) 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#if !ENABLE(OILPAN) 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check that this node is not "floating". 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If it is, it can be deleted as a side effect of sending mutation events. 528926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(refCount() || parentOrShadowHostNode()); 529a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#endif 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 531f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> protect(this); 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 533e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // NotFoundError: Raised if oldChild is not a child of this node. 53409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: We should never really get PseudoElements in here, but editing will sometimes 53509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // attempt to remove them still. We should fix that and enable this ASSERT. 53609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // ASSERT(!oldChild->isPseudoElement()) 53709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!oldChild || oldChild->parentNode() != this || oldChild->isPseudoElement()) { 538a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "The node to be removed is not a child of this node."); 539197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 542f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> child = oldChild; 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().removeFocusedElementOfSubtree(child.get()); 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Events fired when blurring currently focused node might have moved this 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // child into a different parent. 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->parentNode() != this) { 549a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "The node to be removed is no longer a child of this node. Perhaps it was moved in a 'blur' event handler?"); 550197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 553f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) willRemoveChild(*child); 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mutation events might have moved this child into a different parent. 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->parentNode() != this) { 557a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NotFoundError, "The node to be removed is no longer a child of this node. Perhaps it was moved in response to a mutation?"); 558197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 562a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch HTMLFrameOwnerElement::UpdateSuspendScope suspendWidgetHierarchyUpdates; 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* prev = child->previousSibling(); 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* next = child->nextSibling(); 566f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) removeBetween(prev, next, *child); 567f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) notifyNodeRemoved(*child); 568c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) childrenChanged(ChildrenChange::forRemoval(*child, prev, next, ChildrenChangeSourceAPI)); 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchSubtreeModifiedEvent(); 571197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return child; 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 574f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node& oldChild) 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 576e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 578f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(oldChild.parentNode() == this); 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!oldChild.needsAttach()) 581f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) oldChild.detach(); 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nextChild) 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nextChild->setPreviousSibling(previousChild); 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (previousChild) 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) previousChild->setNextSibling(nextChild); 587323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_firstChild == &oldChild) 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_firstChild = nextChild; 589323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_lastChild == &oldChild) 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastChild = previousChild; 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 592f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) oldChild.setPreviousSibling(0); 593f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) oldChild.setNextSibling(0); 594f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) oldChild.setParentOrShadowHostNode(0); 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().adoptIfNeeded(oldChild); 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 599f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void ContainerNode::parserRemoveChild(Node& oldChild) 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 601f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(oldChild.parentNode() == this); 602f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(!oldChild.isDocumentFragment()); 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 604f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Node* prev = oldChild.previousSibling(); 605f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Node* next = oldChild.nextSibling(); 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 607f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) oldChild.updateAncestorConnectedSubframeCountForRemoval(); 608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 609f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ChildListMutationScope(*this).willRemoveChild(oldChild); 610f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) oldChild.notifyMutationObserversNodeWillDetach(); 611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) removeBetween(prev, next, oldChild); 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 614f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) notifyNodeRemoved(oldChild); 615c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) childrenChanged(ChildrenChange::forRemoval(oldChild, prev, next, ChildrenChangeSourceParser)); 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// this differs from other remove functions because it forcibly removes all the children, 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// regardless of read-only status or event exceptions, e.g. 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContainerNode::removeChildren() 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_firstChild) 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The container node can be removed from event handlers. 626f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<ContainerNode> protect(this); 6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Do any prep work needed before actually starting to detach 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and remove... e.g. stop loading frames, fire unload events. 63051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) willRemoveChildren(); 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) { 63306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // Removing focus can cause frames to load, either via events (focusout, blur) 63406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // or widget updates (e.g., for <embed>). 63519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) SubframeLoadingDisabler disabler(*this); 63606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 63706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // Exclude this node when looking for removed focusedElement since only 63806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // children will be removed. 63906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // This must be later than willRemoveChildren, which might change focus 64006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // state of a child. 64106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) document().removeFocusedElementOfSubtree(this, true); 642f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 643f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) // Removing a node from a selection can cause widget updates. 644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) document().nodeChildrenWillBeRemoved(*this); 64506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) } 646591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 647c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // FIXME: Remove this NodeVector. Right now WebPluginContainerImpl::m_element is a 648c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // raw ptr which means the code below can drop the last ref to a plugin element and 649c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // then the code in UpdateSuspendScope::performDeferredWidgetTreeOperations will 650c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // try to destroy the plugin which will be a use-after-free. We should use a RefPtr 651c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // in the WebPluginContainerImpl instead. 65253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) NodeVector removedChildren; 6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 654a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch HTMLFrameOwnerElement::UpdateSuspendScope suspendWidgetHierarchyUpdates; 655c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 657e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 658c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptForbiddenScope forbidScript; 659c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 660d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) removedChildren.reserveInitialCapacity(countChildren()); 661c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 662c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) while (RefPtrWillBeRawPtr<Node> child = m_firstChild) { 663c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) removeBetween(0, child->nextSibling(), *child); 664c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) removedChildren.append(child.get()); 665c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) notifyNodeRemoved(*child); 666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 669197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ChildrenChange change = {AllChildrenRemoved, nullptr, nullptr, ChildrenChangeSourceAPI}; 670197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch childrenChanged(change); 6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6739e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) // We don't fire the DOMSubtreeModified event for Attr Nodes. This matches the behavior 6749e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) // of IE and Firefox. This event is fired synchronously and is a source of trouble for 6759e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) // attributes as the JS callback could alter the attributes and leave us in a bad state. 6769e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (!isAttributeNode()) 6779e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) dispatchSubtreeModifiedEvent(); 6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 680197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtrWillBeRawPtr<Node> ContainerNode::appendChild(PassRefPtrWillBeRawPtr<Node> newChild, ExceptionState& exceptionState) 6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 682f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<ContainerNode> protect(this); 6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 684323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check that this node is not "floating". 6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If it is, it can be deleted as a side effect of sending mutation events. 687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(refCount() || parentOrShadowHostNode()); 688323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make sure adding the new child is ok 691197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!checkAcceptChild(newChild.get(), 0, exceptionState)) { 692197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (exceptionState.hadException()) 693197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 694197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 695197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 69619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT(newChild); 6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (newChild == m_lastChild) // nothing to do 699197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeVector targets; 70251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState); 70351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.hadException()) 704197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (targets.isEmpty()) 707197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // We need this extra check because collectChildrenAndRemoveFromOldParent() can fire mutation events. 710197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!checkAcceptChildGuaranteedNodeTypes(*newChild, exceptionState)) { 711197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (exceptionState.hadException()) 712197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 713197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 714197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 716bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) InspectorInstrumentation::willInsertDOMNode(this); 7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Now actually add the child(ren) 719f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ChildListMutationScope mutation(*this); 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) { 721f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(*it); 722f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Node& child = **it; 7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the child has a parent again, just stop what we're doing, because 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that means someone is doing something with DOM mutation -- can't re-parent 7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a child that already has a parent. 727f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (child.parentNode()) 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 731e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 732f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ScriptForbiddenScope forbidScript; 733f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 734f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) treeScope().adoptIfNeeded(child); 7355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) appendChildCommon(child); 7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) updateTreeAfterInsertion(child); 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchSubtreeModifiedEvent(); 742197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return newChild; 7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void ContainerNode::parserAppendChild(PassRefPtrWillBeRawPtr<Node> newChild) 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(newChild); 7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!newChild->parentNode()); // Use appendChild if you need to handle reparenting (and want DOM mutation events). 749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!newChild->isDocumentFragment()); 750d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(!isHTMLTemplateElement(this)); 751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 752c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtrWillBeRawPtr<Node> protect(this); 753c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 7541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (document() != newChild->document()) 7558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 758e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 759f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ScriptForbiddenScope forbidScript; 760f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 761f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) treeScope().adoptIfNeeded(*newChild); 7625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) appendChildCommon(*newChild); 763f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) newChild->updateAncestorConnectedSubframeCountForInsertion(); 764f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ChildListMutationScope(*this).childAdded(*newChild); 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 767c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) notifyNodeInserted(*newChild, ChildrenChangeSourceParser); 768f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 770c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void ContainerNode::notifyNodeInserted(Node& root, ChildrenChangeSource source) 771f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 772e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ASSERT(!EventDispatchForbiddenScope::isEventDispatchForbidden()); 773c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(!root.isShadowRoot()); 774926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 775f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) InspectorInstrumentation::didInsertDOMNode(&root); 776f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 777f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> protect(this); 778f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> protectNode(root); 779f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 780f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) NodeVector postInsertionNotificationTargets; 781f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) notifyNodeInsertedInternal(root, postInsertionNotificationTargets); 782f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 783c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) childrenChanged(ChildrenChange::forInsertion(root, source)); 784c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 785f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (size_t i = 0; i < postInsertionNotificationTargets.size(); ++i) { 786f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Node* targetNode = postInsertionNotificationTargets[i].get(); 787f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (targetNode->inDocument()) 788f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) targetNode->didNotifySubtreeInsertionsToDocument(); 789f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 790f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 791f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 792f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void ContainerNode::notifyNodeInsertedInternal(Node& root, NodeVector& postInsertionNotificationTargets) 793f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 794e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 795f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ScriptForbiddenScope forbidScript; 796f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 797f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (Node* node = &root; node; node = NodeTraversal::next(*node, &root)) { 798f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // As an optimization we don't notify leaf nodes when when inserting 799f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // into detached subtrees. 800f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!inDocument() && !node->isContainerNode()) 801f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) continue; 802f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (Node::InsertionShouldCallDidNotifySubtreeInsertions == node->insertedInto(this)) 803f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) postInsertionNotificationTargets.append(node); 804f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (ShadowRoot* shadowRoot = node->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) 805f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) notifyNodeInsertedInternal(*shadowRoot, postInsertionNotificationTargets); 806f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 807f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 808f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 809f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void ContainerNode::notifyNodeRemoved(Node& root) 810f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 811f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ScriptForbiddenScope forbidScript; 812e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EventDispatchForbiddenScope assertNoEventDispatch; 813f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 814f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Document& document = root.document(); 815f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (Node* node = &root; node; node = NodeTraversal::next(*node, &root)) { 816f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // As an optimization we skip notifying Text nodes and other leaf nodes 817f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // of removal when they're not in the Document tree since the virtual 818f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // call to removedFrom is not needed. 819f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!node->inDocument() && !node->isContainerNode()) 820f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) continue; 821f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (document.cssTarget() == node) 822f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) document.setCSSTarget(nullptr); 823f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) node->removedFrom(this); 824f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (ShadowRoot* shadowRoot = node->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) 825f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) notifyNodeRemoved(*shadowRoot); 826f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 829521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void ContainerNode::attach(const AttachContext& context) 8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 831591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch attachChildren(context); 8323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch clearChildNeedsStyleRecalc(); 833521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Node::attach(context); 8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 836521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void ContainerNode::detach(const AttachContext& context) 8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 838591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch detachChildren(context); 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearChildNeedsStyleRecalc(); 840521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Node::detach(context); 8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 843197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ContainerNode::childrenChanged(const ChildrenChange& change) 8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().incDOMTreeVersion(); 846197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!change.byParser && change.type != TextChanged) 8478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().updateRangesAfterChildrenChanged(this); 8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) invalidateNodeListCachesInAncestors(); 849c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (change.isChildInsertion() && !childNeedsStyleRecalc()) { 85051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) setChildNeedsStyleRecalc(); 85151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) markAncestorsWithChildNeedsStyleRecalc(); 85251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContainerNode::cloneChildNodes(ContainerNode *clone) 8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 85751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 85851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (Node* n = firstChild(); n && !exceptionState.hadException(); n = n->nextSibling()) 85951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) clone->appendChild(n->cloneNode(true), exceptionState); 8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 863521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)bool ContainerNode::getUpperLeftCorner(FloatPoint& point) const 864521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 865521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!renderer()) 866521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return false; 867521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // What is this code really trying to do? 868521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderObject* o = renderer(); 869521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 870521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!o->isInline() || o->isReplaced()) { 871521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point = o->localToAbsolute(FloatPoint(), UseTransforms); 872521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return true; 873521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 874521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 875521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // find the next text/image child, to get a position 876521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (o) { 87709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RenderObject* p = o; 878d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (RenderObject* oFirstChild = o->slowFirstChild()) { 879d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) o = oFirstChild; 880521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else if (o->nextSibling()) { 881521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) o = o->nextSibling(); 882521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 883521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderObject* next = 0; 884521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (!next && o->parent()) { 885521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) o = o->parent(); 886521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) next = o->nextSibling(); 887521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 888521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) o = next; 889521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 890521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!o) 891521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 892521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 893521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) ASSERT(o); 894521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 895521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!o->isInline() || o->isReplaced()) { 896521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point = o->localToAbsolute(FloatPoint(), UseTransforms); 897521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return true; 898521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 899521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 900521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (p->node() && p->node() == this && o->isText() && !o->isBR() && !toRenderText(o)->firstTextBox()) { 901521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // do nothing - skip unrendered whitespace that is a child or next sibling of the anchor 902521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else if ((o->isText() && !o->isBR()) || o->isReplaced()) { 903521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point = FloatPoint(); 904521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (o->isText() && toRenderText(o)->firstTextBox()) { 905d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) point.move(toRenderText(o)->linesBoundingBox().x(), toRenderText(o)->firstTextBox()->root().lineTop().toFloat()); 906521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else if (o->isBox()) { 907521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderBox* box = toRenderBox(o); 908521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point.moveBy(box->location()); 909521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 910521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point = o->container()->localToAbsolute(point, UseTransforms); 911521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return true; 912521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 913521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 914521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 915521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // If the target doesn't have any children or siblings that could be used to calculate the scroll position, we must be 916521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // at the end of the document. Scroll to the bottom. FIXME: who said anything about scrolling? 9178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (!o && document().view()) { 9188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) point = FloatPoint(0, document().view()->contentsHeight()); 919521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return true; 920521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 921521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return false; 922521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 923521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 924521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)bool ContainerNode::getLowerRightCorner(FloatPoint& point) const 925521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 926521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!renderer()) 927521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return false; 928521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 929521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderObject* o = renderer(); 930521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!o->isInline() || o->isReplaced()) { 931521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderBox* box = toRenderBox(o); 932521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point = o->localToAbsolute(LayoutPoint(box->size()), UseTransforms); 933521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return true; 934521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 935521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 936521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // find the last text/image child, to get a position 937521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (o) { 938d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (RenderObject* oLastChild = o->slowLastChild()) { 939d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) o = oLastChild; 940521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else if (o->previousSibling()) { 941521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) o = o->previousSibling(); 942521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 943521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderObject* prev = 0; 944521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (!prev) { 945521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) o = o->parent(); 946521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!o) 947521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return false; 948521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) prev = o->previousSibling(); 949521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 950521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) o = prev; 951521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 952521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) ASSERT(o); 953521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (o->isText() || o->isReplaced()) { 954521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point = FloatPoint(); 955521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (o->isText()) { 956521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderText* text = toRenderText(o); 957521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) IntRect linesBox = text->linesBoundingBox(); 958521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!linesBox.maxX() && !linesBox.maxY()) 959521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) continue; 960521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point.moveBy(linesBox.maxXMaxYCorner()); 961521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 962521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RenderBox* box = toRenderBox(o); 963521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point.moveBy(box->frameRect().maxXMaxYCorner()); 964521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 965521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) point = o->container()->localToAbsolute(point, UseTransforms); 966521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return true; 967521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 968521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 969521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return true; 970521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 971521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 972521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)// FIXME: This override is only needed for inline anchors without an 973521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)// InlineBox and it does not belong in ContainerNode as it reaches into 974521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)// the render and line box trees. 975521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)// https://code.google.com/p/chromium/issues/detail?id=248354 976521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)LayoutRect ContainerNode::boundingBox() const 977521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 978521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) FloatPoint upperLeft, lowerRight; 979521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool foundUpperLeft = getUpperLeftCorner(upperLeft); 980521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool foundLowerRight = getLowerRightCorner(lowerRight); 981521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 982521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // If we've found one corner, but not the other, 983521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // then we should just return a point at the corner that we did find. 984521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (foundUpperLeft != foundLowerRight) { 985521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (foundUpperLeft) 986521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) lowerRight = upperLeft; 987521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else 988521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) upperLeft = lowerRight; 989521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 990521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 991521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return enclosingLayoutRect(FloatRect(upperLeft, lowerRight.expandedTo(upperLeft) - upperLeft)); 992521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 993521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 99451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// This is used by FrameSelection to denote when the active-state of the page has changed 99551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)// independent of the focused element changing. 99651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ContainerNode::focusStateChanged() 99751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 99851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // If we're just changing the window's active state and the focused node has no 99951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // renderer we can just ignore the state change. 100051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!renderer()) 100151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 1002d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 1003323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (styleChangeType() < SubtreeStyleChange) { 1004323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (renderStyle()->affectedByFocus() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) 1005323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 1006f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) else if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByFocus()) 1007323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); 1008323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) else if (renderStyle()->affectedByFocus()) 1009323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) setNeedsStyleRecalc(LocalStyleChange); 1010323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 1011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 101251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (renderer() && renderer()->style()->hasAppearance()) 1013d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RenderTheme::theme().stateChanged(renderer(), FocusControlState); 101451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 101551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContainerNode::setFocus(bool received) 10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (focused() == received) 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node::setFocus(received); 10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) focusStateChanged(); 1024d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 1025d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (renderer() || received) 1026d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 1027d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 102851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // If :focus sets display: none, we lose focus but still need to recalc our style. 1029f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByFocus() && styleChangeType() < SubtreeStyleChange) 1030f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); 1031d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) else 1032d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) setNeedsStyleRecalc(LocalStyleChange); 10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ContainerNode::setActive(bool down) 10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 103751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (down == active()) 103851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node::setActive(down); 10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // FIXME: Why does this not need to handle the display: none transition like :hover does? 10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer()) { 1044323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (styleChangeType() < SubtreeStyleChange) { 1045323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (renderStyle()->affectedByActive() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) 1046323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 1047f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) else if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByActive()) 1048323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoActive, *toElement(this)); 1049323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) else if (renderStyle()->affectedByActive()) 1050323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) setNeedsStyleRecalc(LocalStyleChange); 1051323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 105209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 105353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (renderStyle()->hasAppearance()) 1054d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RenderTheme::theme().stateChanged(renderer(), PressedControlState); 10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContainerNode::setHovered(bool over) 10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 106051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (over == hovered()) 106151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node::setHovered(over); 10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 106551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // If :hover sets display: none we lose our hover but still need to recalc our style. 1066521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!renderer()) { 106709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (over) 106809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 1069f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByHover() && styleChangeType() < SubtreeStyleChange) 1070f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); 107109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else 107209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setNeedsStyleRecalc(LocalStyleChange); 1073521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 1074521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1075521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1076323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (styleChangeType() < SubtreeStyleChange) { 1077323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (renderStyle()->affectedByHover() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) 1078323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 1079f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) else if (isElementNode() && toElement(this)->childrenOrSiblingsAffectedByHover()) 1080323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); 1081323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) else if (renderStyle()->affectedByHover()) 1082323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) setNeedsStyleRecalc(LocalStyleChange); 1083323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 1084e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) 108509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (renderer()->style()->hasAppearance()) 1086d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RenderTheme::theme().stateChanged(renderer(), HoverControlState); 1087e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)} 1088e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) 1089d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLCollection> ContainerNode::children() 1090e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){ 1091c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureCachedCollection<HTMLCollection>(NodeChildren); 1092e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)} 1093e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) 1094d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)unsigned ContainerNode::countChildren() const 10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned count = 0; 10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node *n; 10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (n = firstChild(); n; n = n->nextSibling()) 10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) count++; 11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return count; 11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<Element> ContainerNode::querySelector(const AtomicString& selectors, ExceptionState& exceptionState) 110409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 110509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (selectors.isEmpty()) { 110609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(SyntaxError, "The provided selector is empty."); 1107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 110809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 110909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 111009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors, document(), exceptionState); 111109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!selectorQuery) 1112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 111309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return selectorQuery->queryFirst(*this); 111409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 111509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1116e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)PassRefPtrWillBeRawPtr<StaticElementList> ContainerNode::querySelectorAll(const AtomicString& selectors, ExceptionState& exceptionState) 111709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 111809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (selectors.isEmpty()) { 111909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(SyntaxError, "The provided selector is empty."); 1120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 112109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 112209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 112309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors, document(), exceptionState); 112409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!selectorQuery) 1125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 112709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return selectorQuery->queryAll(*this); 112809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 112909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1130f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static void dispatchChildInsertionEvents(Node& child) 11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1132f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (child.isInShadowTree()) 11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1135e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ASSERT(!EventDispatchForbiddenScope::isEventDispatchForbidden()); 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1137f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> c(child); 1138f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Document> document(child.document()); 11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (c->parentNode() && document->hasListenerType(Document::DOMNODEINSERTED_LISTENER)) 11411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeInserted, true, c->parentNode())); 11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatch the DOMNodeInsertedIntoDocument event to all descendants 11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (c->inDocument() && document->hasListenerType(Document::DOMNODEINSERTEDINTODOCUMENT_LISTENER)) { 114551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (; c; c = NodeTraversal::next(*c, &child)) 11461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeInsertedIntoDocument, false)); 11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1150f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static void dispatchChildRemovalEvents(Node& child) 11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (child.isInShadowTree()) { 11536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch InspectorInstrumentation::willRemoveDOMNode(&child); 1154a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 11556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1157e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ASSERT(!EventDispatchForbiddenScope::isEventDispatchForbidden()); 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch InspectorInstrumentation::willRemoveDOMNode(&child); 11606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1161f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Node> c(child); 1162f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Document> document(child.document()); 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatch pre-removal mutation events 11651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (c->parentNode() && document->hasListenerType(Document::DOMNODEREMOVED_LISTENER)) { 116619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) NodeChildRemovalTracker scope(child); 11671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeRemoved, true, c->parentNode())); 11681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // dispatch the DOMNodeRemovedFromDocument event to all descendants 11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (c->inDocument() && document->hasListenerType(Document::DOMNODEREMOVEDFROMDOCUMENT_LISTENER)) { 117219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) NodeChildRemovalTracker scope(child); 117351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (; c; c = NodeTraversal::next(*c, &child)) 11741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeRemovedFromDocument, false)); 11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 117851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ContainerNode::updateTreeAfterInsertion(Node& child) 11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1180323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 118151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(refCount()); 1182f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT(child.refCount()); 1183323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 118551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ChildListMutationScope(*this).childAdded(child); 11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1187f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) notifyNodeInserted(child); 11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchChildInsertionEvents(child); 11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 119207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochbool ContainerNode::hasRestyleFlagInternal(DynamicRestyleFlags mask) const 119307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 119407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return rareData()->hasRestyleFlag(mask); 119507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 119607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 119707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochbool ContainerNode::hasRestyleFlagsInternal() const 119807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 119907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return rareData()->hasRestyleFlags(); 120007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 120107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 120207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid ContainerNode::setRestyleFlag(DynamicRestyleFlags mask) 120307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 120407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ASSERT(isElementNode() || isShadowRoot()); 120507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ensureRareData().setRestyleFlag(mask); 120607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 120707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 12087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ContainerNode::recalcChildStyle(StyleRecalcChange change) 12097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 12107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(document().inStyleRecalc()); 12117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(change >= UpdatePseudoElements || childNeedsStyleRecalc()); 12127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!needsStyleRecalc()); 12137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 12147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (change < Force && hasRareData() && childNeedsStyleRecalc()) 12157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci checkForChildrenAdjacentRuleChanges(); 12167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 12177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // This loop is deliberately backwards because we use insertBefore in the rendering tree, and want to avoid 12187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // a potentially n^2 loop to find the insertion point while resolving style. Having us start from the last 12197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // child and work our way back means in the common case, we'll find the insertion point in O(1) time. 12207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // See crbug.com/288225 12217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci StyleResolver& styleResolver = document().ensureStyleResolver(); 12227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Text* lastTextNode = 0; 12237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (Node* child = lastChild(); child; child = child->previousSibling()) { 12247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child->isTextNode()) { 12257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci toText(child)->recalcTextStyle(change, lastTextNode); 12267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci lastTextNode = toText(child); 12277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (child->isElementNode()) { 12287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Element* element = toElement(child); 12297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (element->shouldCallRecalcStyle(change)) 12307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci element->recalcStyle(change, lastTextNode); 12317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci else if (element->supportsStyleSharing()) 12327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci styleResolver.addToStyleSharingList(*element); 12337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (element->renderer()) 12347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci lastTextNode = 0; 12357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 12367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 12377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 12387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 123907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid ContainerNode::checkForChildrenAdjacentRuleChanges() 124007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 124107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool hasDirectAdjacentRules = childrenAffectedByDirectAdjacentRules(); 124207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool hasIndirectAdjacentRules = childrenAffectedByIndirectAdjacentRules(); 124307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 124407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!hasDirectAdjacentRules && !hasIndirectAdjacentRules) 124507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return; 124607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 124707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch unsigned forceCheckOfNextElementCount = 0; 124807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch bool forceCheckOfAnyElementSibling = false; 124907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Document& document = this->document(); 125007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 12515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (Element* child = ElementTraversal::firstChild(*this); child; child = ElementTraversal::nextSibling(*child)) { 12525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) bool childRulesChanged = child->needsStyleRecalc() && child->styleChangeType() >= SubtreeStyleChange; 125307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 125407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (forceCheckOfNextElementCount || forceCheckOfAnyElementSibling) 12555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) child->setNeedsStyleRecalc(SubtreeStyleChange); 125607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 125707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (childRulesChanged && hasDirectAdjacentRules) 125807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch forceCheckOfNextElementCount = document.styleEngine()->maxDirectAdjacentSelectors(); 12595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) else if (forceCheckOfNextElementCount) 12605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) --forceCheckOfNextElementCount; 126107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 126207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch forceCheckOfAnyElementSibling = forceCheckOfAnyElementSibling || (childRulesChanged && hasIndirectAdjacentRules); 126307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 126407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 126507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1266197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ContainerNode::checkForSiblingStyleChanges(SiblingCheckType changeType, Node* nodeBeforeChange, Node* nodeAfterChange) 126710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 126810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!inActiveDocument() || document().hasPendingForcedStyleRecalc() || styleChangeType() >= SubtreeStyleChange) 126910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 127010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 127110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (needsStyleRecalc() && childrenAffectedByPositionalRules()) 127210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 127310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 127410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // Forward positional selectors include nth-child, nth-of-type, first-of-type and only-of-type. 127510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // The indirect adjacent selector is the ~ selector. 127610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // Backward positional selectors include nth-last-child, nth-last-of-type, last-of-type and only-of-type. 127710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // We have to invalidate everything following the insertion point in the forward and indirect adjacent case, 127810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // and everything before the insertion point in the backward case. 127910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // |afterChange| is 0 in the parser callback case, so we won't do any work for the forward case if we don't have to. 128010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // For performance reasons we just mark the parent node as changed, since we don't want to make childrenChanged O(n^2) by crawling all our kids 128110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // here. recalcStyle will then force a walk of the children when it sees that this has happened. 1282197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (((childrenAffectedByForwardPositionalRules() || childrenAffectedByIndirectAdjacentRules()) && nodeAfterChange) 1283197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch || (childrenAffectedByBackwardPositionalRules() && nodeBeforeChange)) { 128410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch setNeedsStyleRecalc(SubtreeStyleChange); 128510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return; 128610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 128710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 128810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // :first-child. In the parser callback case, we don't have to check anything, since we were right the first time. 128910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // In the DOM case, we only need to do something if |afterChange| is not 0. 129010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // |afterChange| is 0 in the parser case, so it works out that we'll skip this block. 1291197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (childrenAffectedByFirstChildRules() && nodeAfterChange) { 1292197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(changeType != FinishedParsingChildren); 1293197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Find our new first child element. 1294197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Element* firstChildElement = ElementTraversal::firstChild(*this); 1295197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RenderStyle* firstChildElementStyle = firstChildElement ? firstChildElement->renderStyle() : 0; 1296197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1297197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Find the first element after the change. 1298197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Element* elementAfterChange = nodeAfterChange->isElementNode() ? toElement(nodeAfterChange) : ElementTraversal::nextSibling(*nodeAfterChange); 1299197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RenderStyle* elementAfterChangeStyle = elementAfterChange ? elementAfterChange->renderStyle() : 0; 1300197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1301197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // This is the element insertion as first child element case. 1302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (firstChildElement != elementAfterChange && elementAfterChangeStyle && elementAfterChangeStyle->firstChildState()) { 1303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(changeType == SiblingElementInserted); 1304197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch elementAfterChange->setNeedsStyleRecalc(SubtreeStyleChange); 1305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 1306197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1307197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // This is the first child element removal case. 1308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (changeType == SiblingElementRemoved && firstChildElement == elementAfterChange && firstChildElement && (!firstChildElementStyle || !firstChildElementStyle->firstChildState())) 1309197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch firstChildElement->setNeedsStyleRecalc(SubtreeStyleChange); 131010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 131110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 131210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // :last-child. In the parser callback case, we don't have to check anything, since we were right the first time. 131310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // In the DOM case, we only need to do something if |afterChange| is not 0. 1314197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (childrenAffectedByLastChildRules() && nodeBeforeChange) { 1315197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Find our new last child element. 1316197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Element* lastChildElement = ElementTraversal::lastChild(*this); 1317197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RenderStyle* lastChildElementStyle = lastChildElement ? lastChildElement->renderStyle() : 0; 131810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 1319197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Find the last element before the change. 1320197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Element* elementBeforeChange = nodeBeforeChange->isElementNode() ? toElement(nodeBeforeChange) : ElementTraversal::previousSibling(*nodeBeforeChange); 1321197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RenderStyle* elementBeforeChangeStyle = elementBeforeChange ? elementBeforeChange->renderStyle() : 0; 132210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 1323197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // This is the element insertion as last child element case. 1324c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (lastChildElement != elementBeforeChange && elementBeforeChangeStyle && elementBeforeChangeStyle->lastChildState()) { 1325c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(SiblingElementInserted); 1326197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch elementBeforeChange->setNeedsStyleRecalc(SubtreeStyleChange); 1327c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 132810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 1329197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // This is the last child element removal case. The parser callback case is similar to node removal as well in that we need to change the last child 133010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // to match now. 1331c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if ((changeType == SiblingElementRemoved || changeType == FinishedParsingChildren) && lastChildElement == elementBeforeChange && lastChildElement && (!lastChildElementStyle || !lastChildElementStyle->lastChildState())) 1332197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch lastChildElement->setNeedsStyleRecalc(SubtreeStyleChange); 133310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 133410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 1335197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // The + selector. We need to invalidate the first element following the change. It is the only possible element 133610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch // that could be affected by this DOM change. 1337197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (childrenAffectedByDirectAdjacentRules() && nodeAfterChange) { 1338197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (Element* elementAfterChange = nodeAfterChange->isElementNode() ? toElement(nodeAfterChange) : ElementTraversal::nextSibling(*nodeAfterChange)) 1339197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch elementAfterChange->setNeedsStyleRecalc(SubtreeStyleChange); 134010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 134110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 134210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 1343c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void ContainerNode::invalidateNodeListCachesInAncestors(const QualifiedName* attrName, Element* attributeOwnerElement) 1344c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 1345c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (hasRareData() && (!attrName || isAttributeNode())) { 1346c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (NodeListsNodeData* lists = rareData()->nodeLists()) { 1347c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (ChildNodeList* childNodeList = lists->childNodeList(*this)) 1348c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) childNodeList->invalidateCache(); 1349c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 1350c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 1351c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1352c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // Modifications to attributes that are not associated with an Element can't invalidate NodeList caches. 1353c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (attrName && !attributeOwnerElement) 1354c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return; 1355c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!document().shouldInvalidateNodeListCaches(attrName)) 1357c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return; 1358c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1359c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) document().invalidateNodeListCaches(attrName); 1360c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1361c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) for (ContainerNode* node = this; node; node = node->parentNode()) { 1362c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (NodeListsNodeData* lists = node->nodeLists()) 1363c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) lists->invalidateCaches(attrName); 1364c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 1365c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 1366c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 136776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)PassRefPtrWillBeRawPtr<TagCollection> ContainerNode::getElementsByTagName(const AtomicString& localName) 136809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 136909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (localName.isNull()) 1370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 137109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 137209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (document().isHTMLDocument()) 1373c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureCachedCollection<HTMLTagCollection>(HTMLTagCollectionType, localName); 1374c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureCachedCollection<TagCollection>(TagCollectionType, localName); 137509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 137609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 137776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)PassRefPtrWillBeRawPtr<TagCollection> ContainerNode::getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName) 137809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 137909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (localName.isNull()) 1380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 138109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 138209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (namespaceURI == starAtom) 138309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return getElementsByTagName(localName); 138409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1385c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureCachedCollection<TagCollection>(TagCollectionType, namespaceURI.isEmpty() ? nullAtom : namespaceURI, localName); 138609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 138709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 138809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Takes an AtomicString in argument because it is common for elements to share the same name attribute. 138909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Therefore, the NameNodeList factory function expects an AtomicString type. 139076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)PassRefPtrWillBeRawPtr<NameNodeList> ContainerNode::getElementsByName(const AtomicString& elementName) 139109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 1392c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureCachedCollection<NameNodeList>(NameNodeListType, elementName); 139309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 139409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 139509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Takes an AtomicString in argument because it is common for elements to share the same set of class names. 139609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Therefore, the ClassNodeList factory function expects an AtomicString type. 139776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)PassRefPtrWillBeRawPtr<ClassCollection> ContainerNode::getElementsByClassName(const AtomicString& classNames) 139809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 1399c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureCachedCollection<ClassCollection>(ClassCollectionType, classNames); 140009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 140109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1402d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<RadioNodeList> ContainerNode::radioNodeList(const AtomicString& name, bool onlyMatchImgElements) 140309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 1404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(isHTMLFormElement(this) || isHTMLFieldSetElement(this)); 140509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) CollectionType type = onlyMatchImgElements ? RadioImgNodeListType : RadioNodeListType; 1406c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureCachedCollection<RadioNodeList>(type, name); 140709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 140809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1409f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuElement* ContainerNode::getElementById(const AtomicString& id) const 1410f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{ 1411f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu if (isInTreeScope()) { 1412f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Fast path if we are in a tree scope: call getElementById() on tree scope 1413f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // and check if the matching element is in our subtree. 1414f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu Element* element = treeScope().getElementById(id); 1415f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu if (!element) 1416f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return 0; 1417f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu if (element->isDescendantOf(this)) 1418f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return element; 1419f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu } 1420f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 1421f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu // Fall back to traversing our subtree. In case of duplicate ids, the first element found will be returned. 1422f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu for (Element* element = ElementTraversal::firstWithin(*this); element; element = ElementTraversal::next(*element, this)) { 1423f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu if (element->getIdAttribute() == id) 1424f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return element; 1425f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu } 1426f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return 0; 1427f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 1428f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 1429c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)NodeListsNodeData& ContainerNode::ensureNodeLists() 1430c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 1431c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return ensureRareData().ensureNodeLists(); 1432c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 1433c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1434197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool childAttachedAllowedWhenAttachingChildren(ContainerNode* node) 14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isShadowRoot()) 14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (node->isInsertionPoint()) 14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node->isElementNode() && toElement(node)->shadow()) 14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1450c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1451