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

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

Issue 49153006: Have ContainerNodeAlgorithms deal with references instead of pointers (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 2 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/ContainerNodeAlgorithms.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 4a5d84cac3afb78b40d01db31aafa57fccc6300f..145bcf55199cec0e7ada11ad1a65d3eab55c10af 100644
--- a/Source/core/dom/ContainerNode.cpp
+++ b/Source/core/dom/ContainerNode.cpp
@@ -51,7 +51,7 @@ namespace WebCore {
static void dispatchChildInsertionEvents(Node*);
static void dispatchChildRemovalEvents(Node*);
-static void updateTreeAfterInsertion(ContainerNode*, Node*);
+static void updateTreeAfterInsertion(ContainerNode&, Node&);
ChildNodesLazySnapshot* ChildNodesLazySnapshot::latestSnapshot = 0;
@@ -82,13 +82,13 @@ void ContainerNode::removeDetachedChildren()
child->updateAncestorConnectedSubframeCountForRemoval();
}
// FIXME: We should be able to ASSERT(!confusingAndOftenMisusedAttached()) here: https://bugs.webkit.org/show_bug.cgi?id=107801
- removeDetachedChildrenInContainer<Node, ContainerNode>(this);
+ removeDetachedChildrenInContainer<Node, ContainerNode>(*this);
}
void ContainerNode::parserTakeAllChildrenFrom(ContainerNode* oldParent)
{
while (RefPtr<Node> child = oldParent->firstChild()) {
- oldParent->parserRemoveChild(child.get());
+ oldParent->parserRemoveChild(*child);
treeScope().adoptIfNeeded(child.get());
parserAppendChild(child.get());
}
@@ -236,7 +236,8 @@ void ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, Exce
ChildListMutationScope mutation(this);
for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) {
- Node* child = it->get();
+ ASSERT(*it);
+ Node& child = **it;
// Due to arbitrary code running in response to a DOM mutation event it's
// possible that "next" is no longer a child of "this".
@@ -244,43 +245,42 @@ void ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, Exce
// In either of those cases, we'll just stop.
if (next->parentNode() != this)
break;
- if (child->parentNode())
+ if (child.parentNode())
break;
- treeScope().adoptIfNeeded(child);
+ treeScope().adoptIfNeeded(&child);
- insertBeforeCommon(next.get(), child);
+ insertBeforeCommon(*next, child);
- updateTreeAfterInsertion(this, child);
+ updateTreeAfterInsertion(*this, child);
}
dispatchSubtreeModifiedEvent();
}
-void ContainerNode::insertBeforeCommon(Node* nextChild, Node* newChild)
+void ContainerNode::insertBeforeCommon(Node& nextChild, Node& newChild)
{
NoEventDispatchAssertion assertNoEventDispatch;
- ASSERT(newChild);
- ASSERT(!newChild->parentNode()); // Use insertBefore if you need to handle reparenting (and want DOM mutation events).
- ASSERT(!newChild->nextSibling());
- ASSERT(!newChild->previousSibling());
- ASSERT(!newChild->isShadowRoot());
+ ASSERT(!newChild.parentNode()); // Use insertBefore if you need to handle reparenting (and want DOM mutation events).
+ ASSERT(!newChild.nextSibling());
+ ASSERT(!newChild.previousSibling());
+ ASSERT(!newChild.isShadowRoot());
- Node* prev = nextChild->previousSibling();
+ Node* prev = nextChild.previousSibling();
ASSERT(m_lastChild != prev);
- nextChild->setPreviousSibling(newChild);
+ nextChild.setPreviousSibling(&newChild);
if (prev) {
ASSERT(m_firstChild != nextChild);
ASSERT(prev->nextSibling() == nextChild);
- prev->setNextSibling(newChild);
+ prev->setNextSibling(&newChild);
} else {
ASSERT(m_firstChild == nextChild);
- m_firstChild = newChild;
+ m_firstChild = &newChild;
}
- newChild->setParentOrShadowHostNode(this);
- newChild->setPreviousSibling(prev);
- newChild->setNextSibling(nextChild);
+ newChild.setParentOrShadowHostNode(this);
+ newChild.setPreviousSibling(prev);
+ newChild.setNextSibling(&nextChild);
}
void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChild)
@@ -297,7 +297,7 @@ void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChil
if (document() != newChild->document())
document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION);
- insertBeforeCommon(nextChild, newChild.get());
+ insertBeforeCommon(*nextChild, *newChild);
newChild->updateAncestorConnectedSubframeCountForInsertion();
@@ -305,7 +305,7 @@ void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChil
childrenChanged(true, newChild->previousSibling(), nextChild, 1);
- ChildNodeInsertionNotifier(this).notify(newChild.get());
+ ChildNodeInsertionNotifier(*this).notify(*newChild);
}
void ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionState& es)
@@ -364,7 +364,8 @@ void ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, Exce
// Add the new child(ren)
for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) {
- Node* child = it->get();
+ ASSERT(*it);
+ Node& child = **it;
// Due to arbitrary code running in response to a DOM mutation event it's
// possible that "next" is no longer a child of "this".
@@ -372,21 +373,21 @@ void ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, Exce
// In either of those cases, we'll just stop.
if (next && next->parentNode() != this)
break;
- if (child->parentNode())
+ if (child.parentNode())
break;
- treeScope().adoptIfNeeded(child);
+ treeScope().adoptIfNeeded(&child);
// Add child before "next".
{
NoEventDispatchAssertion assertNoEventDispatch;
if (next)
- insertBeforeCommon(next.get(), child);
+ insertBeforeCommon(*next, child);
else
- appendChildToContainer(child, this);
+ appendChildToContainer(child, *this);
}
- updateTreeAfterInsertion(this, child);
+ updateTreeAfterInsertion(*this, child);
}
dispatchSubtreeModifiedEvent();
@@ -466,23 +467,22 @@ void ContainerNode::removeChild(Node* oldChild, ExceptionState& es)
Node* prev = child->previousSibling();
Node* next = child->nextSibling();
- removeBetween(prev, next, child.get());
+ removeBetween(prev, next, *child);
childrenChanged(false, prev, next, -1);
- ChildNodeRemovalNotifier(this).notify(child.get());
+ ChildNodeRemovalNotifier(*this).notify(*child);
}
dispatchSubtreeModifiedEvent();
}
-void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node* oldChild)
+void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node& oldChild)
{
NoEventDispatchAssertion assertNoEventDispatch;
- ASSERT(oldChild);
- ASSERT(oldChild->parentNode() == this);
+ ASSERT(oldChild.parentNode() == this);
// Remove from rendering tree
- if (oldChild->confusingAndOftenMisusedAttached())
- oldChild->detach();
+ if (oldChild.confusingAndOftenMisusedAttached())
+ oldChild.detach();
if (nextChild)
nextChild->setPreviousSibling(previousChild);
@@ -493,31 +493,30 @@ void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node* ol
if (m_lastChild == oldChild)
m_lastChild = previousChild;
- oldChild->setPreviousSibling(0);
- oldChild->setNextSibling(0);
- oldChild->setParentOrShadowHostNode(0);
+ oldChild.setPreviousSibling(0);
+ oldChild.setNextSibling(0);
+ oldChild.setParentOrShadowHostNode(0);
- document().adoptIfNeeded(oldChild);
+ document().adoptIfNeeded(&oldChild);
}
-void ContainerNode::parserRemoveChild(Node* oldChild)
+void ContainerNode::parserRemoveChild(Node& oldChild)
{
- ASSERT(oldChild);
- ASSERT(oldChild->parentNode() == this);
- ASSERT(!oldChild->isDocumentFragment());
+ ASSERT(oldChild.parentNode() == this);
+ ASSERT(!oldChild.isDocumentFragment());
- Node* prev = oldChild->previousSibling();
- Node* next = oldChild->nextSibling();
+ Node* prev = oldChild.previousSibling();
+ Node* next = oldChild.nextSibling();
- oldChild->updateAncestorConnectedSubframeCountForRemoval();
+ oldChild.updateAncestorConnectedSubframeCountForRemoval();
- ChildListMutationScope(this).willRemoveChild(oldChild);
- oldChild->notifyMutationObserversNodeWillDetach();
+ ChildListMutationScope(this).willRemoveChild(&oldChild);
+ oldChild.notifyMutationObserversNodeWillDetach();
removeBetween(prev, next, oldChild);
childrenChanged(true, prev, next, -1);
- ChildNodeRemovalNotifier(this).notify(oldChild);
+ ChildNodeRemovalNotifier(*this).notify(oldChild);
}
// this differs from other remove functions because it forcibly removes all the children,
@@ -559,14 +558,14 @@ void ContainerNode::removeChildren()
removedChildren.reserveInitialCapacity(childNodeCount());
while (m_firstChild) {
removedChildren.append(m_firstChild);
- removeBetween(0, m_firstChild->nextSibling(), m_firstChild);
+ removeBetween(0, m_firstChild->nextSibling(), *m_firstChild);
}
}
childrenChanged(false, 0, 0, -static_cast<int>(removedChildren.size()));
for (size_t i = 0; i < removedChildren.size(); ++i)
- ChildNodeRemovalNotifier(this).notify(removedChildren[i].get());
+ ChildNodeRemovalNotifier(*this).notify(*removedChildren[i]);
}
dispatchSubtreeModifiedEvent();
@@ -604,23 +603,24 @@ void ContainerNode::appendChild(PassRefPtr<Node> newChild, ExceptionState& es)
// Now actually add the child(ren)
ChildListMutationScope mutation(this);
for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) {
- Node* child = it->get();
+ ASSERT(*it);
adamk 2013/10/28 21:41:12 All these ASSERT(*it) calls make me wonder if we n
+ Node& child = **it;
// If the child has a parent again, just stop what we're doing, because
// that means someone is doing something with DOM mutation -- can't re-parent
// a child that already has a parent.
- if (child->parentNode())
+ if (child.parentNode())
break;
- treeScope().adoptIfNeeded(child);
+ treeScope().adoptIfNeeded(&child);
// Append child to the end of the list
{
NoEventDispatchAssertion assertNoEventDispatch;
- appendChildToContainer(child, this);
+ appendChildToContainer(child, *this);
}
- updateTreeAfterInsertion(this, child);
+ updateTreeAfterInsertion(*this, child);
}
dispatchSubtreeModifiedEvent();
@@ -640,7 +640,7 @@ void ContainerNode::parserAppendChild(PassRefPtr<Node> newChild)
{
NoEventDispatchAssertion assertNoEventDispatch;
// FIXME: This method should take a PassRefPtr.
- appendChildToContainer(newChild.get(), this);
+ appendChildToContainer(*newChild, *this);
treeScope().adoptIfNeeded(newChild.get());
}
@@ -649,7 +649,7 @@ void ContainerNode::parserAppendChild(PassRefPtr<Node> newChild)
ChildListMutationScope(this).childAdded(newChild.get());
childrenChanged(true, last, 0, 1);
- ChildNodeInsertionNotifier(this).notify(newChild.get());
+ ChildNodeInsertionNotifier(*this).notify(*newChild);
}
void ContainerNode::attach(const AttachContext& context)
@@ -964,18 +964,18 @@ static void dispatchChildRemovalEvents(Node* child)
}
}
-static void updateTreeAfterInsertion(ContainerNode* parent, Node* child)
+static void updateTreeAfterInsertion(ContainerNode& parent, Node& child)
{
- ASSERT(parent->refCount());
- ASSERT(child->refCount());
+ ASSERT(parent.refCount());
+ ASSERT(child.refCount());
- ChildListMutationScope(parent).childAdded(child);
+ ChildListMutationScope(&parent).childAdded(&child);
- parent->childrenChanged(false, child->previousSibling(), child->nextSibling(), 1);
+ parent.childrenChanged(false, child.previousSibling(), child.nextSibling(), 1);
ChildNodeInsertionNotifier(parent).notify(child);
- dispatchChildInsertionEvents(child);
+ dispatchChildInsertionEvents(&child);
}
#ifndef NDEBUG
« no previous file with comments | « Source/core/dom/ContainerNode.h ('k') | Source/core/dom/ContainerNodeAlgorithms.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698