Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: Source/core/dom/ContainerNode.cpp

Issue 1237623006: Post-Mutation Event checks must re-check document constraints. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Include future from patch for Issue 509912. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights reserved. 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All rights reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 return true; 138 return true;
139 } 139 }
140 140
141 // This should never happen, but also protect release builds from tree corru ption. 141 // This should never happen, but also protect release builds from tree corru ption.
142 ASSERT(!newChild->isPseudoElement()); 142 ASSERT(!newChild->isPseudoElement());
143 if (newChild->isPseudoElement()) { 143 if (newChild->isPseudoElement()) {
144 exceptionState.throwDOMException(HierarchyRequestError, "The new child e lement is a pseudo-element."); 144 exceptionState.throwDOMException(HierarchyRequestError, "The new child e lement is a pseudo-element.");
145 return false; 145 return false;
146 } 146 }
147 147
148 if (containsConsideringHostElements(*newChild)) { 148 return checkAcceptChildGuaranteedNodeTypes(*newChild, oldChild, exceptionSta te);
149 }
150
151 bool ContainerNode::checkAcceptChildGuaranteedNodeTypes(const Node& newChild, co nst Node* oldChild, ExceptionState& exceptionState) const
152 {
153 if (isDocumentNode())
154 return toDocument(this)->canAcceptChild(newChild, oldChild, exceptionSta te);
155 if (!isChildTypeAllowed(newChild)) {
156 exceptionState.throwDOMException(HierarchyRequestError, "Nodes of type ' " + newChild.nodeName() + "' may not be inserted inside nodes of type '" + nodeN ame() + "'.");
157 return false;
158 }
159 if (newChild.containsIncludingHostElements(*this)) {
149 exceptionState.throwDOMException(HierarchyRequestError, "The new child e lement contains the parent."); 160 exceptionState.throwDOMException(HierarchyRequestError, "The new child e lement contains the parent.");
150 return false; 161 return false;
151 } 162 }
152
153 if (isDocumentNode())
154 return toDocument(this)->canAcceptChild(*newChild, oldChild, exceptionSt ate);
155
156 if (!isChildTypeAllowed(*newChild)) {
157 exceptionState.throwDOMException(HierarchyRequestError, "Nodes of type ' " + newChild->nodeName() + "' may not be inserted inside nodes of type '" + node Name() + "'.");
158 return false;
159 }
160
161 return true;
162 }
163
164 bool ContainerNode::checkAcceptChildGuaranteedNodeTypes(const Node& newChild, Ex ceptionState& exceptionState) const
165 {
166 ASSERT(isChildTypeAllowed(newChild));
167 if (newChild.contains(this)) {
168 exceptionState.throwDOMException(HierarchyRequestError, "The new child e lement contains the parent.");
169 return false;
170 }
171 return true; 163 return true;
172 } 164 }
173 165
174 PassRefPtrWillBeRawPtr<Node> ContainerNode::insertBefore(PassRefPtrWillBeRawPtr< Node> newChild, Node* refChild, ExceptionState& exceptionState) 166 PassRefPtrWillBeRawPtr<Node> ContainerNode::insertBefore(PassRefPtrWillBeRawPtr< Node> newChild, Node* refChild, ExceptionState& exceptionState)
175 { 167 {
176 #if !ENABLE(OILPAN) 168 #if !ENABLE(OILPAN)
177 // Check that this node is not "floating". 169 // Check that this node is not "floating".
178 // If it is, it can be deleted as a side effect of sending mutation events. 170 // If it is, it can be deleted as a side effect of sending mutation events.
179 ASSERT(refCount() || parentOrShadowHostNode()); 171 ASSERT(refCount() || parentOrShadowHostNode());
180 #endif 172 #endif
(...skipping 26 matching lines...) Expand all
207 RefPtrWillBeRawPtr<Node> next = refChild; 199 RefPtrWillBeRawPtr<Node> next = refChild;
208 200
209 NodeVector targets; 201 NodeVector targets;
210 collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState); 202 collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState);
211 if (exceptionState.hadException()) 203 if (exceptionState.hadException())
212 return nullptr; 204 return nullptr;
213 if (targets.isEmpty()) 205 if (targets.isEmpty())
214 return newChild; 206 return newChild;
215 207
216 // We need this extra check because collectChildrenAndRemoveFromOldParent() can fire mutation events. 208 // We need this extra check because collectChildrenAndRemoveFromOldParent() can fire mutation events.
217 if (!checkAcceptChildGuaranteedNodeTypes(*newChild, exceptionState)) { 209 if (!checkAcceptChildGuaranteedNodeTypes(*newChild, nullptr, exceptionState) ) {
218 if (exceptionState.hadException()) 210 if (exceptionState.hadException())
219 return nullptr; 211 return nullptr;
220 return newChild; 212 return newChild;
221 } 213 }
222 214
223 InspectorInstrumentation::willInsertDOMNode(this); 215 InspectorInstrumentation::willInsertDOMNode(this);
224 216
225 ChildListMutationScope mutation(*this); 217 ChildListMutationScope mutation(*this);
226 for (const auto& targetNode : targets) { 218 for (const auto& targetNode : targets) {
227 ASSERT(targetNode); 219 ASSERT(targetNode);
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 722
731 NodeVector targets; 723 NodeVector targets;
732 collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState); 724 collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState);
733 if (exceptionState.hadException()) 725 if (exceptionState.hadException())
734 return nullptr; 726 return nullptr;
735 727
736 if (targets.isEmpty()) 728 if (targets.isEmpty())
737 return newChild; 729 return newChild;
738 730
739 // We need this extra check because collectChildrenAndRemoveFromOldParent() can fire mutation events. 731 // We need this extra check because collectChildrenAndRemoveFromOldParent() can fire mutation events.
740 if (!checkAcceptChildGuaranteedNodeTypes(*newChild, exceptionState)) { 732 if (!checkAcceptChildGuaranteedNodeTypes(*newChild, nullptr, exceptionState) ) {
741 if (exceptionState.hadException()) 733 if (exceptionState.hadException())
742 return nullptr; 734 return nullptr;
743 return newChild; 735 return newChild;
744 } 736 }
745 737
746 InspectorInstrumentation::willInsertDOMNode(this); 738 InspectorInstrumentation::willInsertDOMNode(this);
747 739
748 // Now actually add the child(ren). 740 // Now actually add the child(ren).
749 ChildListMutationScope mutation(*this); 741 ChildListMutationScope mutation(*this);
750 for (const auto& targetNode : targets) { 742 for (const auto& targetNode : targets) {
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after
1522 return true; 1514 return true;
1523 1515
1524 if (node->isElementNode() && toElement(node)->shadow()) 1516 if (node->isElementNode() && toElement(node)->shadow())
1525 return true; 1517 return true;
1526 1518
1527 return false; 1519 return false;
1528 } 1520 }
1529 #endif 1521 #endif
1530 1522
1531 } // namespace blink 1523 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698