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

Unified Diff: Source/core/dom/ContainerNode.cpp

Issue 385073015: Node.replaceChild and Node.removeChild do not use custom binding anymore (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Take review comment into consideration Created 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/dom/ContainerNode.h ('k') | Source/core/dom/Node.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/dom/ContainerNode.cpp
diff --git a/Source/core/dom/ContainerNode.cpp b/Source/core/dom/ContainerNode.cpp
index e63d24bce2a7313cd74805c487e2f025c1c4575c..2c8e147eea43d19bcc3a89e9e9280c67437272f4 100644
--- a/Source/core/dom/ContainerNode.cpp
+++ b/Source/core/dom/ContainerNode.cpp
@@ -318,7 +318,7 @@ void ContainerNode::parserInsertBefore(PassRefPtrWillBeRawPtr<Node> newChild, No
notifyNodeInserted(*newChild);
}
-void ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, Node* oldChild, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<Node> ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& exceptionState)
{
#if !ENABLE(OILPAN)
// Check that this node is not "floating".
@@ -329,49 +329,58 @@ void ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, Node* ol
RefPtrWillBeRawPtr<Node> protect(this);
if (oldChild == newChild) // nothing to do
- return;
+ return oldChild;
if (!oldChild) {
exceptionState.throwDOMException(NotFoundError, "The node to be replaced is null.");
- return;
+ return nullptr;
}
+ RefPtrWillBeRawPtr<Node> child = oldChild;
+
// Make sure replacing the old child with the new is ok
- if (!checkAcceptChild(newChild.get(), oldChild, exceptionState))
- return;
+ if (!checkAcceptChild(newChild.get(), child.get(), exceptionState)) {
+ if (exceptionState.hadException())
+ return nullptr;
+ return child;
+ }
// NotFoundError: Raised if oldChild is not a child of this node.
- if (oldChild->parentNode() != this) {
+ if (child->parentNode() != this) {
exceptionState.throwDOMException(NotFoundError, "The node to be replaced is not a child of this node.");
- return;
+ return nullptr;
}
ChildListMutationScope mutation(*this);
- RefPtrWillBeRawPtr<Node> next = oldChild->nextSibling();
+ RefPtrWillBeRawPtr<Node> next = child->nextSibling();
// Remove the node we're replacing
- RefPtrWillBeRawPtr<Node> protectRemovedChild = oldChild;
- ASSERT_UNUSED(protectRemovedChild, protectRemovedChild);
- removeChild(oldChild, exceptionState);
+ removeChild(child, exceptionState);
if (exceptionState.hadException())
- return;
+ return nullptr;
if (next && (next->previousSibling() == newChild || next == newChild)) // nothing to do
- return;
+ return child;
// Does this one more time because removeChild() fires a MutationEvent.
- if (!checkAcceptChild(newChild.get(), oldChild, exceptionState))
- return;
+ if (!checkAcceptChild(newChild.get(), child.get(), exceptionState)) {
+ if (exceptionState.hadException())
+ return nullptr;
+ return child;
+ }
NodeVector targets;
collectChildrenAndRemoveFromOldParent(*newChild, targets, exceptionState);
if (exceptionState.hadException())
- return;
+ return nullptr;
// Does this yet another check because collectChildrenAndRemoveFromOldParent() fires a MutationEvent.
- if (!checkAcceptChild(newChild.get(), oldChild, exceptionState))
- return;
+ if (!checkAcceptChild(newChild.get(), child.get(), exceptionState)) {
+ if (exceptionState.hadException())
+ return nullptr;
+ return child;
+ }
InspectorInstrumentation::willInsertDOMNode(this);
@@ -404,6 +413,7 @@ void ContainerNode::replaceChild(PassRefPtrWillBeRawPtr<Node> newChild, Node* ol
}
dispatchSubtreeModifiedEvent();
+ return child;
}
void ContainerNode::willRemoveChild(Node& child)
@@ -511,7 +521,7 @@ void ContainerNode::trace(Visitor* visitor)
Node::trace(visitor);
}
-void ContainerNode::removeChild(Node* oldChild, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<Node> ContainerNode::removeChild(PassRefPtrWillBeRawPtr<Node> oldChild, ExceptionState& exceptionState)
{
#if !ENABLE(OILPAN)
// Check that this node is not "floating".
@@ -527,7 +537,7 @@ void ContainerNode::removeChild(Node* oldChild, ExceptionState& exceptionState)
// ASSERT(!oldChild->isPseudoElement())
if (!oldChild || oldChild->parentNode() != this || oldChild->isPseudoElement()) {
exceptionState.throwDOMException(NotFoundError, "The node to be removed is not a child of this node.");
- return;
+ return nullptr;
}
RefPtrWillBeRawPtr<Node> child = oldChild;
@@ -541,7 +551,7 @@ void ContainerNode::removeChild(Node* oldChild, ExceptionState& exceptionState)
// child into a different parent.
if (child->parentNode() != this) {
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?");
- return;
+ return nullptr;
}
willRemoveChild(*child);
@@ -549,7 +559,7 @@ void ContainerNode::removeChild(Node* oldChild, ExceptionState& exceptionState)
// Mutation events might have moved this child into a different parent.
if (child->parentNode() != this) {
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?");
- return;
+ return nullptr;
}
{
@@ -563,6 +573,7 @@ void ContainerNode::removeChild(Node* oldChild, ExceptionState& exceptionState)
notifyNodeRemoved(*child);
}
dispatchSubtreeModifiedEvent();
+ return child;
}
void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node& oldChild)
« no previous file with comments | « Source/core/dom/ContainerNode.h ('k') | Source/core/dom/Node.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698