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

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

Issue 2343513002: Various cleanup of ContainerNode.cpp (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « third_party/WebKit/Source/core/dom/ContainerNode.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 56
57 namespace blink { 57 namespace blink {
58 58
59 using namespace HTMLNames; 59 using namespace HTMLNames;
60 60
61 static void dispatchChildInsertionEvents(Node&); 61 static void dispatchChildInsertionEvents(Node&);
62 static void dispatchChildRemovalEvents(Node&); 62 static void dispatchChildRemovalEvents(Node&);
63 63
64 // This dispatches various events; DOM mutation events, blur events, IFRAME 64 // This dispatches various events; DOM mutation events, blur events, IFRAME
65 // unload events, etc. 65 // unload events, etc.
66 static void collectChildrenAndRemoveFromOldParent(Node& node, NodeVector& nodes, ExceptionState& exceptionState) 66 static inline void collectChildrenAndRemoveFromOldParent(Node& node, NodeVector& nodes, ExceptionState& exceptionState)
67 { 67 {
68 if (node.isDocumentFragment()) { 68 if (node.isDocumentFragment()) {
69 DocumentFragment& fragment = toDocumentFragment(node); 69 DocumentFragment& fragment = toDocumentFragment(node);
70 getChildNodes(fragment, nodes); 70 getChildNodes(fragment, nodes);
71 fragment.removeChildren(); 71 fragment.removeChildren();
72 return; 72 return;
73 } 73 }
74 nodes.append(&node); 74 nodes.append(&node);
75 if (ContainerNode* oldParent = node.parentNode()) 75 if (ContainerNode* oldParent = node.parentNode())
76 oldParent->removeChild(&node, exceptionState); 76 oldParent->removeChild(&node, exceptionState);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 exceptionState.throwDOMException(HierarchyRequestError, "The new child e lement contains the parent."); 151 exceptionState.throwDOMException(HierarchyRequestError, "The new child e lement contains the parent.");
152 return false; 152 return false;
153 } 153 }
154 if (!isChildTypeAllowed(newChild)) { 154 if (!isChildTypeAllowed(newChild)) {
155 exceptionState.throwDOMException(HierarchyRequestError, "Nodes of type ' " + newChild.nodeName() + "' may not be inserted inside nodes of type '" + nodeN ame() + "'."); 155 exceptionState.throwDOMException(HierarchyRequestError, "Nodes of type ' " + newChild.nodeName() + "' may not be inserted inside nodes of type '" + nodeN ame() + "'.");
156 return false; 156 return false;
157 } 157 }
158 return true; 158 return true;
159 } 159 }
160 160
161 void ContainerNode::collectChildrenAndRemoveFromOldParentWithCheck(const Node* n ext, const Node* oldChild, Node& newChild, NodeVector& newChildren, ExceptionSta te& exceptionState) const 161 bool ContainerNode::collectChildrenAndRemoveFromOldParentWithCheck(const Node* n ext, const Node* oldChild, Node& newChild, NodeVector& newChildren, ExceptionSta te& exceptionState) const
162 { 162 {
163 collectChildrenAndRemoveFromOldParent(newChild, newChildren, exceptionState) ; 163 collectChildrenAndRemoveFromOldParent(newChild, newChildren, exceptionState) ;
164 if (exceptionState.hadException()) 164 if (exceptionState.hadException() || newChildren.isEmpty())
165 return; 165 return false;
166 if (newChildren.isEmpty())
167 return;
168 166
169 // We need this extra check because collectChildrenAndRemoveFromOldParent() 167 // We need this extra check because collectChildrenAndRemoveFromOldParent()
170 // can fire various events. 168 // can fire various events.
171 for (const auto& child : newChildren) { 169 for (const auto& child : newChildren) {
172 if (child->parentNode()) { 170 if (child->parentNode()) {
173 // A new child was added to another parent before adding to this 171 // A new child was added to another parent before adding to this
174 // node. Firefox and Edge don't throw in this case. 172 // node. Firefox and Edge don't throw in this case.
175 newChildren.clear(); 173 return false;
176 return;
177 } 174 }
178 if (!checkAcceptChildGuaranteedNodeTypes(*child, oldChild, exceptionStat e)) 175 if (!checkAcceptChildGuaranteedNodeTypes(*child, oldChild, exceptionStat e))
179 return; 176 return false;
180 } 177 }
181 if (next && next->parentNode() != this) { 178 if (next && next->parentNode() != this) {
182 exceptionState.throwDOMException(NotFoundError, "The node before which t he new node is to be inserted is not a child of this node."); 179 exceptionState.throwDOMException(NotFoundError, "The node before which t he new node is to be inserted is not a child of this node.");
183 return; 180 return false;
184 } 181 }
182 return true;
185 } 183 }
186 184
187 template <typename Functor> 185 template <typename Functor>
188 void ContainerNode::insertNodeVector(const NodeVector& targets, Node* next, cons t Functor& mutator) 186 void ContainerNode::insertNodeVector(const NodeVector& targets, Node* next, cons t Functor& mutator)
189 { 187 {
190 InspectorInstrumentation::willInsertDOMNode(this); 188 InspectorInstrumentation::willInsertDOMNode(this);
191 NodeVector postInsertionNotificationTargets; 189 NodeVector postInsertionNotificationTargets;
192 { 190 {
193 EventDispatchForbiddenScope assertNoEventDispatch; 191 EventDispatchForbiddenScope assertNoEventDispatch;
194 ScriptForbiddenScope forbidScript; 192 ScriptForbiddenScope forbidScript;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 inline void operator()(ContainerNode& container, Node& child, Node*) const 231 inline void operator()(ContainerNode& container, Node& child, Node*) const
234 { 232 {
235 container.treeScope().adoptIfNeeded(child); 233 container.treeScope().adoptIfNeeded(child);
236 container.appendChildCommon(child); 234 container.appendChildCommon(child);
237 } 235 }
238 }; 236 };
239 237
240 Node* ContainerNode::insertBefore(Node* newChild, Node* refChild, ExceptionState & exceptionState) 238 Node* ContainerNode::insertBefore(Node* newChild, Node* refChild, ExceptionState & exceptionState)
241 { 239 {
242 // insertBefore(node, 0) is equivalent to appendChild(node) 240 // insertBefore(node, 0) is equivalent to appendChild(node)
243 if (!refChild) { 241 if (!refChild)
244 return appendChild(newChild, exceptionState); 242 return appendChild(newChild, exceptionState);
245 }
246 243
247 // Make sure adding the new child is OK. 244 // Make sure adding the new child is OK.
248 if (!checkAcceptChild(newChild, 0, exceptionState)) { 245 if (!checkAcceptChild(newChild, 0, exceptionState))
249 if (exceptionState.hadException())
250 return nullptr;
251 return newChild; 246 return newChild;
252 }
253 DCHECK(newChild); 247 DCHECK(newChild);
254 248
255 // NotFoundError: Raised if refChild is not a child of this node 249 // NotFoundError: Raised if refChild is not a child of this node
256 if (refChild->parentNode() != this) { 250 if (refChild->parentNode() != this) {
257 exceptionState.throwDOMException(NotFoundError, "The node before which t he new node is to be inserted is not a child of this node."); 251 exceptionState.throwDOMException(NotFoundError, "The node before which t he new node is to be inserted is not a child of this node.");
258 return nullptr; 252 return nullptr;
259 } 253 }
260 254
261 // Nothing to do. 255 // Nothing to do.
262 if (refChild->previousSibling() == newChild || refChild == newChild) 256 if (refChild->previousSibling() == newChild || refChild == newChild)
263 return newChild; 257 return newChild;
264 258
265 Node* next = refChild;
266
267 NodeVector targets; 259 NodeVector targets;
268 collectChildrenAndRemoveFromOldParentWithCheck(next, nullptr, *newChild, tar gets, exceptionState); 260 if (!collectChildrenAndRemoveFromOldParentWithCheck(refChild, nullptr, *newC hild, targets, exceptionState))
269 if (exceptionState.hadException())
270 return nullptr;
271 if (targets.isEmpty())
272 return newChild; 261 return newChild;
273 262
274 ChildListMutationScope mutation(*this); 263 ChildListMutationScope mutation(*this);
275 insertNodeVector(targets, next, AdoptAndInsertBefore()); 264 insertNodeVector(targets, refChild, AdoptAndInsertBefore());
276 return newChild; 265 return newChild;
277 } 266 }
278 267
279 void ContainerNode::insertBeforeCommon(Node& nextChild, Node& newChild) 268 void ContainerNode::insertBeforeCommon(Node& nextChild, Node& newChild)
280 { 269 {
281 EventDispatchForbiddenScope assertNoEventDispatch; 270 #if DCHECK_IS_ON()
282 ScriptForbiddenScope forbidScript; 271 DCHECK(EventDispatchForbiddenScope::isEventDispatchForbidden());
283 272 #endif
273 DCHECK(ScriptForbiddenScope::isScriptForbidden());
284 DCHECK(!newChild.parentNode()); // Use insertBefore if you need to handle re parenting (and want DOM mutation events). 274 DCHECK(!newChild.parentNode()); // Use insertBefore if you need to handle re parenting (and want DOM mutation events).
285 DCHECK(!newChild.nextSibling()); 275 DCHECK(!newChild.nextSibling());
286 DCHECK(!newChild.previousSibling()); 276 DCHECK(!newChild.previousSibling());
287 DCHECK(!newChild.isShadowRoot()); 277 DCHECK(!newChild.isShadowRoot());
288 278
289 Node* prev = nextChild.previousSibling(); 279 Node* prev = nextChild.previousSibling();
290 DCHECK_NE(m_lastChild, prev); 280 DCHECK_NE(m_lastChild, prev);
291 nextChild.setPreviousSibling(&newChild); 281 nextChild.setPreviousSibling(&newChild);
292 if (prev) { 282 if (prev) {
293 DCHECK_NE(firstChild(), nextChild); 283 DCHECK_NE(firstChild(), nextChild);
294 DCHECK_EQ(prev->nextSibling(), nextChild); 284 DCHECK_EQ(prev->nextSibling(), nextChild);
295 prev->setNextSibling(&newChild); 285 prev->setNextSibling(&newChild);
296 } else { 286 } else {
297 DCHECK(firstChild() == nextChild); 287 DCHECK(firstChild() == nextChild);
298 m_firstChild = &newChild; 288 m_firstChild = &newChild;
299 } 289 }
300 newChild.setParentOrShadowHostNode(this); 290 newChild.setParentOrShadowHostNode(this);
301 newChild.setPreviousSibling(prev); 291 newChild.setPreviousSibling(prev);
302 newChild.setNextSibling(&nextChild); 292 newChild.setNextSibling(&nextChild);
303 } 293 }
304 294
305 void ContainerNode::appendChildCommon(Node& child) 295 void ContainerNode::appendChildCommon(Node& child)
306 { 296 {
297 #if DCHECK_IS_ON()
298 DCHECK(EventDispatchForbiddenScope::isEventDispatchForbidden());
299 #endif
300 DCHECK(ScriptForbiddenScope::isScriptForbidden());
301
307 child.setParentOrShadowHostNode(this); 302 child.setParentOrShadowHostNode(this);
308
309 if (m_lastChild) { 303 if (m_lastChild) {
310 child.setPreviousSibling(m_lastChild); 304 child.setPreviousSibling(m_lastChild);
311 m_lastChild->setNextSibling(&child); 305 m_lastChild->setNextSibling(&child);
312 } else { 306 } else {
313 setFirstChild(&child); 307 setFirstChild(&child);
314 } 308 }
315
316 setLastChild(&child); 309 setLastChild(&child);
317 } 310 }
318 311
319 bool ContainerNode::checkParserAcceptChild(const Node& newChild) const 312 bool ContainerNode::checkParserAcceptChild(const Node& newChild) const
320 { 313 {
321 if (!isDocumentNode()) 314 if (!isDocumentNode())
322 return true; 315 return true;
323 // TODO(esprehn): Are there other conditions where the parser can create 316 // TODO(esprehn): Are there other conditions where the parser can create
324 // invalid trees? 317 // invalid trees?
325 return toDocument(*this).canAcceptChild(newChild, nullptr, IGNORE_EXCEPTION) ; 318 return toDocument(*this).canAcceptChild(newChild, nullptr, IGNORE_EXCEPTION) ;
(...skipping 21 matching lines...) Expand all
347 if (nextChild.parentNode() != this) 340 if (nextChild.parentNode() != this)
348 return; 341 return;
349 342
350 if (document() != newChild->document()) 343 if (document() != newChild->document())
351 document().adoptNode(newChild, ASSERT_NO_EXCEPTION); 344 document().adoptNode(newChild, ASSERT_NO_EXCEPTION);
352 345
353 { 346 {
354 EventDispatchForbiddenScope assertNoEventDispatch; 347 EventDispatchForbiddenScope assertNoEventDispatch;
355 ScriptForbiddenScope forbidScript; 348 ScriptForbiddenScope forbidScript;
356 349
357 treeScope().adoptIfNeeded(*newChild); 350 AdoptAndInsertBefore()(*this, *newChild, &nextChild);
358 insertBeforeCommon(nextChild, *newChild);
359 DCHECK_EQ(newChild->connectedSubframeCount(), 0u); 351 DCHECK_EQ(newChild->connectedSubframeCount(), 0u);
360 ChildListMutationScope(*this).childAdded(*newChild); 352 ChildListMutationScope(*this).childAdded(*newChild);
361 } 353 }
362 354
363 notifyNodeInserted(*newChild, ChildrenChangeSourceParser); 355 notifyNodeInserted(*newChild, ChildrenChangeSourceParser);
364 } 356 }
365 357
366 Node* ContainerNode::replaceChild(Node* newChild, Node* oldChild, ExceptionState & exceptionState) 358 Node* ContainerNode::replaceChild(Node* newChild, Node* oldChild, ExceptionState & exceptionState)
367 { 359 {
368 if (oldChild == newChild) // Nothing to do. 360 if (oldChild == newChild) // Nothing to do.
369 return oldChild; 361 return oldChild;
370 362
371 if (!oldChild) { 363 if (!oldChild) {
372 exceptionState.throwDOMException(NotFoundError, "The node to be replaced is null."); 364 exceptionState.throwDOMException(NotFoundError, "The node to be replaced is null.");
373 return nullptr; 365 return nullptr;
374 } 366 }
375 367
376 Node* child = oldChild;
377
378 // Make sure replacing the old child with the new is OK. 368 // Make sure replacing the old child with the new is OK.
379 if (!checkAcceptChild(newChild, child, exceptionState)) { 369 if (!checkAcceptChild(newChild, oldChild, exceptionState))
380 if (exceptionState.hadException()) 370 return oldChild;
381 return nullptr;
382 return child;
383 }
384 371
385 // NotFoundError: Raised if oldChild is not a child of this node. 372 // NotFoundError: Raised if oldChild is not a child of this node.
386 if (child->parentNode() != this) { 373 if (oldChild->parentNode() != this) {
387 exceptionState.throwDOMException(NotFoundError, "The node to be replaced is not a child of this node."); 374 exceptionState.throwDOMException(NotFoundError, "The node to be replaced is not a child of this node.");
388 return nullptr; 375 return nullptr;
389 } 376 }
390 377
391 ChildListMutationScope mutation(*this); 378 ChildListMutationScope mutation(*this);
392 379 Node* next = oldChild->nextSibling();
393 Node* next = child->nextSibling();
394 380
395 // Remove the node we're replacing. 381 // Remove the node we're replacing.
396 removeChild(child, exceptionState); 382 removeChild(oldChild, exceptionState);
397 if (exceptionState.hadException()) 383 if (exceptionState.hadException())
398 return nullptr; 384 return nullptr;
399 385
400 if (next && (next->previousSibling() == newChild || next == newChild)) // no thing to do 386 if (next && (next->previousSibling() == newChild || next == newChild)) // no thing to do
401 return child; 387 return oldChild;
402 388
403 // Does this one more time because removeChild() fires a MutationEvent. 389 // Does this one more time because removeChild() fires a MutationEvent.
404 if (!checkAcceptChild(newChild, child, exceptionState)) { 390 if (!checkAcceptChild(newChild, oldChild, exceptionState))
405 if (exceptionState.hadException()) 391 return oldChild;
406 return nullptr;
407 return child;
408 }
409 392
410 NodeVector targets; 393 NodeVector targets;
411 collectChildrenAndRemoveFromOldParentWithCheck(next, child, *newChild, targe ts, exceptionState); 394 if (!collectChildrenAndRemoveFromOldParentWithCheck(next, oldChild, *newChil d, targets, exceptionState))
412 if (exceptionState.hadException()) 395 return oldChild;
413 return nullptr;
414 if (targets.isEmpty())
415 return child;
416 396
417 if (next) 397 if (next)
418 insertNodeVector(targets, next, AdoptAndInsertBefore()); 398 insertNodeVector(targets, next, AdoptAndInsertBefore());
419 else 399 else
420 insertNodeVector(targets, nullptr, AdoptAndAppendChild()); 400 insertNodeVector(targets, nullptr, AdoptAndAppendChild());
421 return child; 401 return oldChild;
422 } 402 }
423 403
424 void ContainerNode::willRemoveChild(Node& child) 404 void ContainerNode::willRemoveChild(Node& child)
425 { 405 {
426 DCHECK_EQ(child.parentNode(), this); 406 DCHECK_EQ(child.parentNode(), this);
427 ChildListMutationScope(*this).willRemoveChild(child); 407 ChildListMutationScope(*this).willRemoveChild(child);
428 child.notifyMutationObserversNodeWillDetach(); 408 child.notifyMutationObserversNodeWillDetach();
429 dispatchChildRemovalEvents(child); 409 dispatchChildRemovalEvents(child);
430 ChildFrameDisconnector(child).disconnect(); 410 ChildFrameDisconnector(child).disconnect();
431 if (document() != child.document()) { 411 if (document() != child.document()) {
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 ChildrenChange change = {AllChildrenRemoved, nullptr, nullptr, nullptr, ChildrenChangeSourceAPI}; 592 ChildrenChange change = {AllChildrenRemoved, nullptr, nullptr, nullptr, ChildrenChangeSourceAPI};
613 childrenChanged(change); 593 childrenChanged(change);
614 } 594 }
615 595
616 if (action == DispatchSubtreeModifiedEvent) 596 if (action == DispatchSubtreeModifiedEvent)
617 dispatchSubtreeModifiedEvent(); 597 dispatchSubtreeModifiedEvent();
618 } 598 }
619 599
620 Node* ContainerNode::appendChild(Node* newChild, ExceptionState& exceptionState) 600 Node* ContainerNode::appendChild(Node* newChild, ExceptionState& exceptionState)
621 { 601 {
622
623 // Make sure adding the new child is ok 602 // Make sure adding the new child is ok
624 if (!checkAcceptChild(newChild, 0, exceptionState)) { 603 if (!checkAcceptChild(newChild, 0, exceptionState))
625 if (exceptionState.hadException())
626 return nullptr;
627 return newChild; 604 return newChild;
628 }
629 DCHECK(newChild); 605 DCHECK(newChild);
630 606
631 if (newChild == m_lastChild) // nothing to do 607 if (newChild == m_lastChild) // nothing to do
632 return newChild; 608 return newChild;
633 609
634 NodeVector targets; 610 NodeVector targets;
635 collectChildrenAndRemoveFromOldParentWithCheck(nullptr, nullptr, *newChild, targets, exceptionState); 611 if (!collectChildrenAndRemoveFromOldParentWithCheck(nullptr, nullptr, *newCh ild, targets, exceptionState))
636 if (exceptionState.hadException())
637 return nullptr;
638 if (targets.isEmpty())
639 return newChild; 612 return newChild;
640 613
641 ChildListMutationScope mutation(*this); 614 ChildListMutationScope mutation(*this);
642 insertNodeVector(targets, nullptr, AdoptAndAppendChild()); 615 insertNodeVector(targets, nullptr, AdoptAndAppendChild());
643 return newChild; 616 return newChild;
644 } 617 }
645 618
646 void ContainerNode::parserAppendChild(Node* newChild) 619 void ContainerNode::parserAppendChild(Node* newChild)
647 { 620 {
648 DCHECK(newChild); 621 DCHECK(newChild);
649 DCHECK(!newChild->isDocumentFragment()); 622 DCHECK(!newChild->isDocumentFragment());
650 DCHECK(!isHTMLTemplateElement(this)); 623 DCHECK(!isHTMLTemplateElement(this));
651 624
652 if (!checkParserAcceptChild(*newChild)) 625 if (!checkParserAcceptChild(*newChild))
653 return; 626 return;
654 627
655 // FIXME: parserRemoveChild can run script which could then insert the 628 // FIXME: parserRemoveChild can run script which could then insert the
656 // newChild back into the page. Loop until the child is actually removed. 629 // newChild back into the page. Loop until the child is actually removed.
657 // See: fast/parser/execute-script-during-adoption-agency-removal.html 630 // See: fast/parser/execute-script-during-adoption-agency-removal.html
658 while (ContainerNode* parent = newChild->parentNode()) 631 while (ContainerNode* parent = newChild->parentNode())
659 parent->parserRemoveChild(*newChild); 632 parent->parserRemoveChild(*newChild);
660 633
661 if (document() != newChild->document()) 634 if (document() != newChild->document())
662 document().adoptNode(newChild, ASSERT_NO_EXCEPTION); 635 document().adoptNode(newChild, ASSERT_NO_EXCEPTION);
663 636
664 { 637 {
665 EventDispatchForbiddenScope assertNoEventDispatch; 638 EventDispatchForbiddenScope assertNoEventDispatch;
666 ScriptForbiddenScope forbidScript; 639 ScriptForbiddenScope forbidScript;
667 640
668 treeScope().adoptIfNeeded(*newChild); 641 AdoptAndAppendChild()(*this, *newChild, nullptr);
669 appendChildCommon(*newChild);
670 DCHECK_EQ(newChild->connectedSubframeCount(), 0u); 642 DCHECK_EQ(newChild->connectedSubframeCount(), 0u);
671 ChildListMutationScope(*this).childAdded(*newChild); 643 ChildListMutationScope(*this).childAdded(*newChild);
672 } 644 }
673 645
674 notifyNodeInserted(*newChild, ChildrenChangeSourceParser); 646 notifyNodeInserted(*newChild, ChildrenChangeSourceParser);
675 } 647 }
676 648
677 DISABLE_CFI_PERF 649 DISABLE_CFI_PERF
678 void ContainerNode::notifyNodeInserted(Node& root, ChildrenChangeSource source) 650 void ContainerNode::notifyNodeInserted(Node& root, ChildrenChangeSource source)
679 { 651 {
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 } 1064 }
1093 1065
1094 HTMLCollection* ContainerNode::children() 1066 HTMLCollection* ContainerNode::children()
1095 { 1067 {
1096 return ensureCachedCollection<HTMLCollection>(NodeChildren); 1068 return ensureCachedCollection<HTMLCollection>(NodeChildren);
1097 } 1069 }
1098 1070
1099 unsigned ContainerNode::countChildren() const 1071 unsigned ContainerNode::countChildren() const
1100 { 1072 {
1101 unsigned count = 0; 1073 unsigned count = 0;
1102 Node* n; 1074 for (Node* node = firstChild(); node; node = node->nextSibling())
1103 for (n = firstChild(); n; n = n->nextSibling())
1104 count++; 1075 count++;
1105 return count; 1076 return count;
1106 } 1077 }
1107 1078
1108 Element* ContainerNode::querySelector(const AtomicString& selectors, ExceptionSt ate& exceptionState) 1079 Element* ContainerNode::querySelector(const AtomicString& selectors, ExceptionSt ate& exceptionState)
1109 { 1080 {
1110 if (selectors.isEmpty()) { 1081 if (selectors.isEmpty()) {
1111 exceptionState.throwDOMException(SyntaxError, "The provided selector is empty."); 1082 exceptionState.throwDOMException(SyntaxError, "The provided selector is empty.");
1112 return nullptr; 1083 return nullptr;
1113 } 1084 }
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1381 return true; 1352 return true;
1382 1353
1383 if (node->isElementNode() && toElement(node)->shadow()) 1354 if (node->isElementNode() && toElement(node)->shadow())
1384 return true; 1355 return true;
1385 1356
1386 return false; 1357 return false;
1387 } 1358 }
1388 #endif 1359 #endif
1389 1360
1390 } // namespace blink 1361 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/ContainerNode.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698