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