| OLD | NEW |
| 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 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 | 305 |
| 306 if (document() != newChild->document()) | 306 if (document() != newChild->document()) |
| 307 document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); | 307 document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); |
| 308 | 308 |
| 309 insertBeforeCommon(nextChild, *newChild); | 309 insertBeforeCommon(nextChild, *newChild); |
| 310 | 310 |
| 311 newChild->updateAncestorConnectedSubframeCountForInsertion(); | 311 newChild->updateAncestorConnectedSubframeCountForInsertion(); |
| 312 | 312 |
| 313 ChildListMutationScope(*this).childAdded(*newChild); | 313 ChildListMutationScope(*this).childAdded(*newChild); |
| 314 | 314 |
| 315 ChildrenChange change = {ChildInserted, newChild->previousSibling(), &nextCh
ild, ChildrenChangeSourceParser}; | 315 childrenChanged(ChildrenChange::forInsertion(*newChild, ChildrenChangeSource
Parser)); |
| 316 childrenChanged(change); | |
| 317 | 316 |
| 318 notifyNodeInserted(*newChild); | 317 notifyNodeInserted(*newChild); |
| 319 } | 318 } |
| 320 | 319 |
| 321 PassRefPtrWillBeRawPtr<Node> ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<
Node> newChild, PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& exception
State) | 320 PassRefPtrWillBeRawPtr<Node> ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<
Node> newChild, PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& exception
State) |
| 322 { | 321 { |
| 323 #if !ENABLE(OILPAN) | 322 #if !ENABLE(OILPAN) |
| 324 // Check that this node is not "floating". | 323 // Check that this node is not "floating". |
| 325 // If it is, it can be deleted as a side effect of sending mutation events. | 324 // If it is, it can be deleted as a side effect of sending mutation events. |
| 326 ASSERT(refCount() || parentOrShadowHostNode()); | 325 ASSERT(refCount() || parentOrShadowHostNode()); |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 exceptionState.throwDOMException(NotFoundError, "The node to be removed
is no longer a child of this node. Perhaps it was moved in response to a mutatio
n?"); | 560 exceptionState.throwDOMException(NotFoundError, "The node to be removed
is no longer a child of this node. Perhaps it was moved in response to a mutatio
n?"); |
| 562 return nullptr; | 561 return nullptr; |
| 563 } | 562 } |
| 564 | 563 |
| 565 { | 564 { |
| 566 HTMLFrameOwnerElement::UpdateSuspendScope suspendWidgetHierarchyUpdates; | 565 HTMLFrameOwnerElement::UpdateSuspendScope suspendWidgetHierarchyUpdates; |
| 567 | 566 |
| 568 Node* prev = child->previousSibling(); | 567 Node* prev = child->previousSibling(); |
| 569 Node* next = child->nextSibling(); | 568 Node* next = child->nextSibling(); |
| 570 removeBetween(prev, next, *child); | 569 removeBetween(prev, next, *child); |
| 571 ChildrenChange change = {ChildRemoved, prev, next, ChildrenChangeSourceA
PI}; | 570 childrenChanged(ChildrenChange::forRemoval(*child, prev, next, ChildrenC
hangeSourceAPI)); |
| 572 childrenChanged(change); | |
| 573 notifyNodeRemoved(*child); | 571 notifyNodeRemoved(*child); |
| 574 } | 572 } |
| 575 dispatchSubtreeModifiedEvent(); | 573 dispatchSubtreeModifiedEvent(); |
| 576 return child; | 574 return child; |
| 577 } | 575 } |
| 578 | 576 |
| 579 void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node& ol
dChild) | 577 void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node& ol
dChild) |
| 580 { | 578 { |
| 581 NoEventDispatchAssertion assertNoEventDispatch; | 579 NoEventDispatchAssertion assertNoEventDispatch; |
| 582 | 580 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 609 Node* prev = oldChild.previousSibling(); | 607 Node* prev = oldChild.previousSibling(); |
| 610 Node* next = oldChild.nextSibling(); | 608 Node* next = oldChild.nextSibling(); |
| 611 | 609 |
| 612 oldChild.updateAncestorConnectedSubframeCountForRemoval(); | 610 oldChild.updateAncestorConnectedSubframeCountForRemoval(); |
| 613 | 611 |
| 614 ChildListMutationScope(*this).willRemoveChild(oldChild); | 612 ChildListMutationScope(*this).willRemoveChild(oldChild); |
| 615 oldChild.notifyMutationObserversNodeWillDetach(); | 613 oldChild.notifyMutationObserversNodeWillDetach(); |
| 616 | 614 |
| 617 removeBetween(prev, next, oldChild); | 615 removeBetween(prev, next, oldChild); |
| 618 | 616 |
| 619 ChildrenChange change = {ChildRemoved, prev, next, ChildrenChangeSourceParse
r}; | 617 childrenChanged(ChildrenChange::forRemoval(oldChild, prev, next, ChildrenCha
ngeSourceParser)); |
| 620 childrenChanged(change); | |
| 621 notifyNodeRemoved(oldChild); | 618 notifyNodeRemoved(oldChild); |
| 622 } | 619 } |
| 623 | 620 |
| 624 // this differs from other remove functions because it forcibly removes all the
children, | 621 // this differs from other remove functions because it forcibly removes all the
children, |
| 625 // regardless of read-only status or event exceptions, e.g. | 622 // regardless of read-only status or event exceptions, e.g. |
| 626 void ContainerNode::removeChildren() | 623 void ContainerNode::removeChildren() |
| 627 { | 624 { |
| 628 if (!m_firstChild) | 625 if (!m_firstChild) |
| 629 return; | 626 return; |
| 630 | 627 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 void ContainerNode::parserAppendChild(PassRefPtrWillBeRawPtr<Node> newChild) | 741 void ContainerNode::parserAppendChild(PassRefPtrWillBeRawPtr<Node> newChild) |
| 745 { | 742 { |
| 746 ASSERT(newChild); | 743 ASSERT(newChild); |
| 747 ASSERT(!newChild->parentNode()); // Use appendChild if you need to handle re
parenting (and want DOM mutation events). | 744 ASSERT(!newChild->parentNode()); // Use appendChild if you need to handle re
parenting (and want DOM mutation events). |
| 748 ASSERT(!newChild->isDocumentFragment()); | 745 ASSERT(!newChild->isDocumentFragment()); |
| 749 ASSERT(!isHTMLTemplateElement(this)); | 746 ASSERT(!isHTMLTemplateElement(this)); |
| 750 | 747 |
| 751 if (document() != newChild->document()) | 748 if (document() != newChild->document()) |
| 752 document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); | 749 document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); |
| 753 | 750 |
| 754 Node* last = m_lastChild; | |
| 755 | |
| 756 { | 751 { |
| 757 NoEventDispatchAssertion assertNoEventDispatch; | 752 NoEventDispatchAssertion assertNoEventDispatch; |
| 758 ScriptForbiddenScope forbidScript; | 753 ScriptForbiddenScope forbidScript; |
| 759 | 754 |
| 760 treeScope().adoptIfNeeded(*newChild); | 755 treeScope().adoptIfNeeded(*newChild); |
| 761 appendChildCommon(*newChild); | 756 appendChildCommon(*newChild); |
| 762 newChild->updateAncestorConnectedSubframeCountForInsertion(); | 757 newChild->updateAncestorConnectedSubframeCountForInsertion(); |
| 763 ChildListMutationScope(*this).childAdded(*newChild); | 758 ChildListMutationScope(*this).childAdded(*newChild); |
| 764 } | 759 } |
| 765 | 760 |
| 766 ChildrenChange change = {ChildInserted, last, nullptr, ChildrenChangeSourceP
arser}; | 761 childrenChanged(ChildrenChange::forInsertion(*newChild, ChildrenChangeSource
Parser)); |
| 767 childrenChanged(change); | |
| 768 notifyNodeInserted(*newChild); | 762 notifyNodeInserted(*newChild); |
| 769 } | 763 } |
| 770 | 764 |
| 771 void ContainerNode::notifyNodeInserted(Node& root) | 765 void ContainerNode::notifyNodeInserted(Node& root) |
| 772 { | 766 { |
| 773 ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden()); | 767 ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden()); |
| 774 | 768 |
| 775 InspectorInstrumentation::didInsertDOMNode(&root); | 769 InspectorInstrumentation::didInsertDOMNode(&root); |
| 776 | 770 |
| 777 RefPtrWillBeRawPtr<Node> protect(this); | 771 RefPtrWillBeRawPtr<Node> protect(this); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 clearChildNeedsStyleRecalc(); | 831 clearChildNeedsStyleRecalc(); |
| 838 Node::detach(context); | 832 Node::detach(context); |
| 839 } | 833 } |
| 840 | 834 |
| 841 void ContainerNode::childrenChanged(const ChildrenChange& change) | 835 void ContainerNode::childrenChanged(const ChildrenChange& change) |
| 842 { | 836 { |
| 843 document().incDOMTreeVersion(); | 837 document().incDOMTreeVersion(); |
| 844 if (!change.byParser && change.type != TextChanged) | 838 if (!change.byParser && change.type != TextChanged) |
| 845 document().updateRangesAfterChildrenChanged(this); | 839 document().updateRangesAfterChildrenChanged(this); |
| 846 invalidateNodeListCachesInAncestors(); | 840 invalidateNodeListCachesInAncestors(); |
| 847 if (change.type == ChildInserted && !childNeedsStyleRecalc()) { | 841 if (change.isChildInsertion() && !childNeedsStyleRecalc()) { |
| 848 setChildNeedsStyleRecalc(); | 842 setChildNeedsStyleRecalc(); |
| 849 markAncestorsWithChildNeedsStyleRecalc(); | 843 markAncestorsWithChildNeedsStyleRecalc(); |
| 850 } | 844 } |
| 851 } | 845 } |
| 852 | 846 |
| 853 void ContainerNode::cloneChildNodes(ContainerNode *clone) | 847 void ContainerNode::cloneChildNodes(ContainerNode *clone) |
| 854 { | 848 { |
| 855 TrackExceptionState exceptionState; | 849 TrackExceptionState exceptionState; |
| 856 for (Node* n = firstChild(); n && !exceptionState.hadException(); n = n->nex
tSibling()) | 850 for (Node* n = firstChild(); n && !exceptionState.hadException(); n = n->nex
tSibling()) |
| 857 clone->appendChild(n->cloneNode(true), exceptionState); | 851 clone->appendChild(n->cloneNode(true), exceptionState); |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1184 | 1178 |
| 1185 void ContainerNode::updateTreeAfterInsertion(Node& child) | 1179 void ContainerNode::updateTreeAfterInsertion(Node& child) |
| 1186 { | 1180 { |
| 1187 #if !ENABLE(OILPAN) | 1181 #if !ENABLE(OILPAN) |
| 1188 ASSERT(refCount()); | 1182 ASSERT(refCount()); |
| 1189 ASSERT(child.refCount()); | 1183 ASSERT(child.refCount()); |
| 1190 #endif | 1184 #endif |
| 1191 | 1185 |
| 1192 ChildListMutationScope(*this).childAdded(child); | 1186 ChildListMutationScope(*this).childAdded(child); |
| 1193 | 1187 |
| 1194 ChildrenChange change = {ChildInserted, child.previousSibling(), child.nextS
ibling(), ChildrenChangeSourceAPI}; | 1188 childrenChanged(ChildrenChange::forInsertion(child, ChildrenChangeSourceAPI)
); |
| 1195 childrenChanged(change); | |
| 1196 | 1189 |
| 1197 notifyNodeInserted(child); | 1190 notifyNodeInserted(child); |
| 1198 | 1191 |
| 1199 dispatchChildInsertionEvents(child); | 1192 dispatchChildInsertionEvents(child); |
| 1200 } | 1193 } |
| 1201 | 1194 |
| 1202 bool ContainerNode::hasRestyleFlagInternal(DynamicRestyleFlags mask) const | 1195 bool ContainerNode::hasRestyleFlagInternal(DynamicRestyleFlags mask) const |
| 1203 { | 1196 { |
| 1204 return rareData()->hasRestyleFlag(mask); | 1197 return rareData()->hasRestyleFlag(mask); |
| 1205 } | 1198 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1271 ASSERT(changeType != FinishedParsingChildren); | 1264 ASSERT(changeType != FinishedParsingChildren); |
| 1272 // Find our new first child element. | 1265 // Find our new first child element. |
| 1273 Element* firstChildElement = ElementTraversal::firstChild(*this); | 1266 Element* firstChildElement = ElementTraversal::firstChild(*this); |
| 1274 RenderStyle* firstChildElementStyle = firstChildElement ? firstChildElem
ent->renderStyle() : 0; | 1267 RenderStyle* firstChildElementStyle = firstChildElement ? firstChildElem
ent->renderStyle() : 0; |
| 1275 | 1268 |
| 1276 // Find the first element after the change. | 1269 // Find the first element after the change. |
| 1277 Element* elementAfterChange = nodeAfterChange->isElementNode() ? toEleme
nt(nodeAfterChange) : ElementTraversal::nextSibling(*nodeAfterChange); | 1270 Element* elementAfterChange = nodeAfterChange->isElementNode() ? toEleme
nt(nodeAfterChange) : ElementTraversal::nextSibling(*nodeAfterChange); |
| 1278 RenderStyle* elementAfterChangeStyle = elementAfterChange ? elementAfter
Change->renderStyle() : 0; | 1271 RenderStyle* elementAfterChangeStyle = elementAfterChange ? elementAfter
Change->renderStyle() : 0; |
| 1279 | 1272 |
| 1280 // This is the element insertion as first child element case. | 1273 // This is the element insertion as first child element case. |
| 1281 if (firstChildElement != elementAfterChange && elementAfterChangeStyle &
& elementAfterChangeStyle->firstChildState()) | 1274 if (firstChildElement != elementAfterChange && elementAfterChangeStyle &
& elementAfterChangeStyle->firstChildState()) { |
| 1275 ASSERT(changeType == SiblingElementInserted); |
| 1282 elementAfterChange->setNeedsStyleRecalc(SubtreeStyleChange); | 1276 elementAfterChange->setNeedsStyleRecalc(SubtreeStyleChange); |
| 1277 } |
| 1283 | 1278 |
| 1284 // This is the first child element removal case. | 1279 // This is the first child element removal case. |
| 1285 if (changeType == SiblingRemoved && firstChildElement == elementAfterCha
nge && firstChildElement && (!firstChildElementStyle || !firstChildElementStyle-
>firstChildState())) | 1280 if (changeType == SiblingElementRemoved && firstChildElement == elementA
fterChange && firstChildElement && (!firstChildElementStyle || !firstChildElemen
tStyle->firstChildState())) |
| 1286 firstChildElement->setNeedsStyleRecalc(SubtreeStyleChange); | 1281 firstChildElement->setNeedsStyleRecalc(SubtreeStyleChange); |
| 1287 } | 1282 } |
| 1288 | 1283 |
| 1289 // :last-child. In the parser callback case, we don't have to check anything
, since we were right the first time. | 1284 // :last-child. In the parser callback case, we don't have to check anything
, since we were right the first time. |
| 1290 // In the DOM case, we only need to do something if |afterChange| is not 0. | 1285 // In the DOM case, we only need to do something if |afterChange| is not 0. |
| 1291 if (childrenAffectedByLastChildRules() && nodeBeforeChange) { | 1286 if (childrenAffectedByLastChildRules() && nodeBeforeChange) { |
| 1292 // Find our new last child element. | 1287 // Find our new last child element. |
| 1293 Element* lastChildElement = ElementTraversal::lastChild(*this); | 1288 Element* lastChildElement = ElementTraversal::lastChild(*this); |
| 1294 RenderStyle* lastChildElementStyle = lastChildElement ? lastChildElement
->renderStyle() : 0; | 1289 RenderStyle* lastChildElementStyle = lastChildElement ? lastChildElement
->renderStyle() : 0; |
| 1295 | 1290 |
| 1296 // Find the last element before the change. | 1291 // Find the last element before the change. |
| 1297 Element* elementBeforeChange = nodeBeforeChange->isElementNode() ? toEle
ment(nodeBeforeChange) : ElementTraversal::previousSibling(*nodeBeforeChange); | 1292 Element* elementBeforeChange = nodeBeforeChange->isElementNode() ? toEle
ment(nodeBeforeChange) : ElementTraversal::previousSibling(*nodeBeforeChange); |
| 1298 RenderStyle* elementBeforeChangeStyle = elementBeforeChange ? elementBef
oreChange->renderStyle() : 0; | 1293 RenderStyle* elementBeforeChangeStyle = elementBeforeChange ? elementBef
oreChange->renderStyle() : 0; |
| 1299 | 1294 |
| 1300 // This is the element insertion as last child element case. | 1295 // This is the element insertion as last child element case. |
| 1301 if (lastChildElement != elementBeforeChange && elementBeforeChangeStyle
&& elementBeforeChangeStyle->lastChildState()) | 1296 if (lastChildElement != elementBeforeChange && elementBeforeChangeStyle
&& elementBeforeChangeStyle->lastChildState()) { |
| 1297 ASSERT(SiblingElementInserted); |
| 1302 elementBeforeChange->setNeedsStyleRecalc(SubtreeStyleChange); | 1298 elementBeforeChange->setNeedsStyleRecalc(SubtreeStyleChange); |
| 1299 } |
| 1303 | 1300 |
| 1304 // 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 | 1301 // 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 |
| 1305 // to match now. | 1302 // to match now. |
| 1306 if ((changeType == SiblingRemoved || changeType == FinishedParsingChildr
en) && lastChildElement == elementBeforeChange && lastChildElement && (!lastChil
dElementStyle || !lastChildElementStyle->lastChildState())) | 1303 if ((changeType == SiblingElementRemoved || changeType == FinishedParsin
gChildren) && lastChildElement == elementBeforeChange && lastChildElement && (!l
astChildElementStyle || !lastChildElementStyle->lastChildState())) |
| 1307 lastChildElement->setNeedsStyleRecalc(SubtreeStyleChange); | 1304 lastChildElement->setNeedsStyleRecalc(SubtreeStyleChange); |
| 1308 } | 1305 } |
| 1309 | 1306 |
| 1310 // The + selector. We need to invalidate the first element following the cha
nge. It is the only possible element | 1307 // The + selector. We need to invalidate the first element following the cha
nge. It is the only possible element |
| 1311 // that could be affected by this DOM change. | 1308 // that could be affected by this DOM change. |
| 1312 if (childrenAffectedByDirectAdjacentRules() && nodeAfterChange) { | 1309 if (childrenAffectedByDirectAdjacentRules() && nodeAfterChange) { |
| 1313 if (Element* elementAfterChange = nodeAfterChange->isElementNode() ? toE
lement(nodeAfterChange) : ElementTraversal::nextSibling(*nodeAfterChange)) | 1310 if (Element* elementAfterChange = nodeAfterChange->isElementNode() ? toE
lement(nodeAfterChange) : ElementTraversal::nextSibling(*nodeAfterChange)) |
| 1314 elementAfterChange->setNeedsStyleRecalc(SubtreeStyleChange); | 1311 elementAfterChange->setNeedsStyleRecalc(SubtreeStyleChange); |
| 1315 } | 1312 } |
| 1316 } | 1313 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 return true; | 1384 return true; |
| 1388 | 1385 |
| 1389 if (node->isElementNode() && toElement(node)->shadow()) | 1386 if (node->isElementNode() && toElement(node)->shadow()) |
| 1390 return true; | 1387 return true; |
| 1391 | 1388 |
| 1392 return false; | 1389 return false; |
| 1393 } | 1390 } |
| 1394 #endif | 1391 #endif |
| 1395 | 1392 |
| 1396 } // namespace WebCore | 1393 } // namespace WebCore |
| OLD | NEW |