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

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

Issue 51273002: Have ChildFrameDisconnector / ChildListMutationScope deal with references (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/ChildListMutationScope.cpp ('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 797d326bbd1f5c88d70bbfe9033e401866876409..45c458946b1d84a9607f130c117afc835f66233e 100644
--- a/Source/core/dom/ContainerNode.cpp
+++ b/Source/core/dom/ContainerNode.cpp
@@ -49,8 +49,8 @@ using namespace std;
namespace WebCore {
-static void dispatchChildInsertionEvents(Node*);
-static void dispatchChildRemovalEvents(Node*);
+static void dispatchChildInsertionEvents(Node&);
+static void dispatchChildRemovalEvents(Node&);
static void updateTreeAfterInsertion(ContainerNode&, Node&);
ChildNodesLazySnapshot* ChildNodesLazySnapshot::latestSnapshot = 0;
@@ -234,7 +234,7 @@ void ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, Exce
InspectorInstrumentation::willInsertDOMNode(this);
- ChildListMutationScope mutation(this);
+ ChildListMutationScope mutation(*this);
for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) {
ASSERT(*it);
Node& child = **it;
@@ -301,7 +301,7 @@ void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChil
newChild->updateAncestorConnectedSubframeCountForInsertion();
- ChildListMutationScope(this).childAdded(newChild.get());
+ ChildListMutationScope(*this).childAdded(*newChild);
childrenChanged(true, newChild->previousSibling(), nextChild, 1);
@@ -334,7 +334,7 @@ void ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, Exce
return;
}
- ChildListMutationScope mutation(this);
+ ChildListMutationScope mutation(*this);
RefPtr<Node> next = oldChild->nextSibling();
@@ -393,26 +393,27 @@ void ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, Exce
dispatchSubtreeModifiedEvent();
}
-static void willRemoveChild(Node* child)
+static void willRemoveChild(Node& child)
{
- ASSERT(child->parentNode());
- ChildListMutationScope(child->parentNode()).willRemoveChild(child);
- child->notifyMutationObserversNodeWillDetach();
+ ASSERT(child.parentNode());
+ ChildListMutationScope(*child.parentNode()).willRemoveChild(child);
+ child.notifyMutationObserversNodeWillDetach();
dispatchChildRemovalEvents(child);
- child->document().nodeWillBeRemoved(child); // e.g. mutation event listener can create a new range.
+ child.document().nodeWillBeRemoved(&child); // e.g. mutation event listener can create a new range.
ChildFrameDisconnector(child).disconnect();
}
-static void willRemoveChildren(ContainerNode* container)
+static void willRemoveChildren(ContainerNode& container)
{
NodeVector children;
- getChildNodes(container, children);
+ getChildNodes(&container, children);
ChildListMutationScope mutation(container);
for (NodeVector::const_iterator it = children.begin(); it != children.end(); it++) {
- Node* child = it->get();
+ ASSERT(*it);
+ Node& child = **it;
mutation.willRemoveChild(child);
- child->notifyMutationObserversNodeWillDetach();
+ child.notifyMutationObserversNodeWillDetach();
// fire removed from document mutation events.
dispatchChildRemovalEvents(child);
@@ -423,7 +424,7 @@ static void willRemoveChildren(ContainerNode* container)
void ContainerNode::disconnectDescendantFrames()
{
- ChildFrameDisconnector(this).disconnect();
+ ChildFrameDisconnector(*this).disconnect();
}
void ContainerNode::removeChild(Node* oldChild, ExceptionState& es)
@@ -454,7 +455,7 @@ void ContainerNode::removeChild(Node* oldChild, ExceptionState& es)
return;
}
- willRemoveChild(child.get());
+ willRemoveChild(*child);
// Mutation events might have moved this child into a different parent.
if (child->parentNode() != this) {
@@ -510,7 +511,7 @@ void ContainerNode::parserRemoveChild(Node& oldChild)
oldChild.updateAncestorConnectedSubframeCountForRemoval();
- ChildListMutationScope(this).willRemoveChild(&oldChild);
+ ChildListMutationScope(*this).willRemoveChild(oldChild);
oldChild.notifyMutationObserversNodeWillDetach();
removeBetween(prev, next, oldChild);
@@ -534,7 +535,7 @@ void ContainerNode::removeChildren()
// Do any prep work needed before actually starting to detach
// and remove... e.g. stop loading frames, fire unload events.
- willRemoveChildren(protect.get());
+ willRemoveChildren(*this);
{
// Removing focus can cause frames to load, either via events (focusout, blur)
@@ -601,7 +602,7 @@ void ContainerNode::appendChild(PassRefPtr<Node> newChild, ExceptionState& es)
InspectorInstrumentation::willInsertDOMNode(this);
// Now actually add the child(ren)
- ChildListMutationScope mutation(this);
+ ChildListMutationScope mutation(*this);
for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) {
ASSERT(*it);
Node& child = **it;
@@ -646,7 +647,7 @@ void ContainerNode::parserAppendChild(PassRefPtr<Node> newChild)
newChild->updateAncestorConnectedSubframeCountForInsertion();
- ChildListMutationScope(this).childAdded(newChild.get());
+ ChildListMutationScope(*this).childAdded(*newChild);
childrenChanged(true, last, 0, 1);
ChildNodeInsertionNotifier(*this).notify(*newChild);
@@ -916,50 +917,50 @@ Node *ContainerNode::childNode(unsigned index) const
return n;
}
-static void dispatchChildInsertionEvents(Node* child)
+static void dispatchChildInsertionEvents(Node& child)
{
- if (child->isInShadowTree())
+ if (child.isInShadowTree())
return;
ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
- RefPtr<Node> c = child;
- RefPtr<Document> document(child->document());
+ RefPtr<Node> c(child);
+ RefPtr<Document> document(child.document());
if (c->parentNode() && document->hasListenerType(Document::DOMNODEINSERTED_LISTENER))
c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeInserted, true, c->parentNode()));
// dispatch the DOMNodeInsertedIntoDocument event to all descendants
if (c->inDocument() && document->hasListenerType(Document::DOMNODEINSERTEDINTODOCUMENT_LISTENER)) {
- for (; c; c = NodeTraversal::next(c.get(), child))
+ for (; c; c = NodeTraversal::next(c.get(), &child))
c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeInsertedIntoDocument, false));
}
}
-static void dispatchChildRemovalEvents(Node* child)
+static void dispatchChildRemovalEvents(Node& child)
{
- if (child->isInShadowTree()) {
- InspectorInstrumentation::willRemoveDOMNode(child);
+ if (child.isInShadowTree()) {
+ InspectorInstrumentation::willRemoveDOMNode(&child);
return;
}
ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
- InspectorInstrumentation::willRemoveDOMNode(child);
+ InspectorInstrumentation::willRemoveDOMNode(&child);
- RefPtr<Node> c = child;
- RefPtr<Document> document(child->document());
+ RefPtr<Node> c(child);
+ RefPtr<Document> document(child.document());
// dispatch pre-removal mutation events
if (c->parentNode() && document->hasListenerType(Document::DOMNODEREMOVED_LISTENER)) {
- NodeChildRemovalTracker scope(child);
+ NodeChildRemovalTracker scope(&child);
c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeRemoved, true, c->parentNode()));
}
// dispatch the DOMNodeRemovedFromDocument event to all descendants
if (c->inDocument() && document->hasListenerType(Document::DOMNODEREMOVEDFROMDOCUMENT_LISTENER)) {
- NodeChildRemovalTracker scope(child);
- for (; c; c = NodeTraversal::next(c.get(), child))
+ NodeChildRemovalTracker scope(&child);
+ for (; c; c = NodeTraversal::next(c.get(), &child))
c->dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMNodeRemovedFromDocument, false));
}
}
@@ -969,13 +970,13 @@ static void updateTreeAfterInsertion(ContainerNode& parent, Node& child)
ASSERT(parent.refCount());
ASSERT(child.refCount());
- ChildListMutationScope(&parent).childAdded(&child);
+ ChildListMutationScope(parent).childAdded(child);
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/ChildListMutationScope.cpp ('k') | Source/core/dom/ContainerNodeAlgorithms.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698