Modified: trunk/Source/WebCore/ChangeLog (99304 => 99305)
--- trunk/Source/WebCore/ChangeLog 2011-11-04 18:28:31 UTC (rev 99304)
+++ trunk/Source/WebCore/ChangeLog 2011-11-04 18:34:00 UTC (rev 99305)
@@ -1,3 +1,28 @@
+2011-11-04 Adam Klein <[email protected]>
+
+ Reduce refcount churn in ChildListMutationScope
+ https://bugs.webkit.org/show_bug.cgi?id=71527
+
+ Reviewed by Ryosuke Niwa.
+
+ Only the ChildListMutationAccumulator needs to hold a reference to the
+ target node, and the added/removed children only need be ref'd if a
+ ChildListMutationAccumulator exists (i.e., if there are interested
+ observers).
+
+ * dom/ChildListMutationScope.cpp:
+ (WebCore::MutationAccumulationRouter::ChildListMutationAccumulator::enqueueMutationRecord):
+ (WebCore::MutationAccumulationRouter::MutationAccumulationRouter::childAdded):
+ (WebCore::MutationAccumulationRouter::MutationAccumulationRouter::willRemoveChild):
+ (WebCore::ChildListMutationScope::ChildListMutationScope):
+ (WebCore::ChildListMutationScope::~ChildListMutationScope):
+ (WebCore::ChildListMutationScope::childAdded):
+ (WebCore::ChildListMutationScope::willRemoveChild):
+ * dom/ChildListMutationScope.h:
+ * dom/ContainerNode.cpp:
+ (WebCore::dispatchChildInsertionEvents):
+ (WebCore::dispatchChildRemovalEvents):
+
2011-11-04 Levi Weintraub <[email protected]>
Correct usage of LayoutUnits in RenderImage and SVGImage
Modified: trunk/Source/WebCore/dom/ChildListMutationScope.cpp (99304 => 99305)
--- trunk/Source/WebCore/dom/ChildListMutationScope.cpp 2011-11-04 18:28:31 UTC (rev 99304)
+++ trunk/Source/WebCore/dom/ChildListMutationScope.cpp 2011-11-04 18:34:00 UTC (rev 99305)
@@ -86,8 +86,8 @@
void incrementScopingLevel(Node*);
void decrementScopingLevel(Node*);
- void childAdded(Node*, PassRefPtr<Node>);
- void willRemoveChild(Node*, PassRefPtr<Node>);
+ void childAdded(Node* target, Node* child);
+ void willRemoveChild(Node* target, Node* child);
private:
MutationAccumulationRouter();
@@ -167,7 +167,7 @@
}
RefPtr<MutationRecord> mutation = MutationRecord::createChildList(
- m_target, StaticNodeList::adopt(m_addedNodes), StaticNodeList::adopt(m_removedNodes), m_previousSibling, m_nextSibling);
+ m_target, StaticNodeList::adopt(m_addedNodes), StaticNodeList::adopt(m_removedNodes), m_previousSibling.release(), m_nextSibling.release());
for (HashMap<WebKitMutationObserver*, MutationObserverOptions>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter)
iter->first->enqueueMutationRecord(mutation);
@@ -218,7 +218,7 @@
return s_instance;
}
-void MutationAccumulationRouter::childAdded(Node* target, PassRefPtr<Node> child)
+void MutationAccumulationRouter::childAdded(Node* target, Node* child)
{
HashMap<Node*, RefPtr<ChildListMutationAccumulator> >::iterator iter = m_accumulations.find(target);
ASSERT(iter != m_accumulations.end());
@@ -227,7 +227,7 @@
iter->second->childAdded(child);
}
-void MutationAccumulationRouter::willRemoveChild(Node* target, PassRefPtr<Node> child)
+void MutationAccumulationRouter::willRemoveChild(Node* target, Node* child)
{
HashMap<Node*, RefPtr<ChildListMutationAccumulator> >::iterator iter = m_accumulations.find(target);
ASSERT(iter != m_accumulations.end());
@@ -270,25 +270,25 @@
} // namespace
-ChildListMutationScope::ChildListMutationScope(PassRefPtr<Node> target)
+ChildListMutationScope::ChildListMutationScope(Node* target)
: m_target(target)
{
- MutationAccumulationRouter::instance()->incrementScopingLevel(m_target.get());
+ MutationAccumulationRouter::instance()->incrementScopingLevel(m_target);
}
ChildListMutationScope::~ChildListMutationScope()
{
- MutationAccumulationRouter::instance()->decrementScopingLevel(m_target.get());
+ MutationAccumulationRouter::instance()->decrementScopingLevel(m_target);
}
-void ChildListMutationScope::childAdded(PassRefPtr<Node> child)
+void ChildListMutationScope::childAdded(Node* child)
{
- MutationAccumulationRouter::instance()->childAdded(m_target.get(), child);
+ MutationAccumulationRouter::instance()->childAdded(m_target, child);
}
-void ChildListMutationScope::willRemoveChild(PassRefPtr<Node> child)
+void ChildListMutationScope::willRemoveChild(Node* child)
{
- MutationAccumulationRouter::instance()->willRemoveChild(m_target.get(), child);
+ MutationAccumulationRouter::instance()->willRemoveChild(m_target, child);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/dom/ChildListMutationScope.h (99304 => 99305)
--- trunk/Source/WebCore/dom/ChildListMutationScope.h 2011-11-04 18:28:31 UTC (rev 99304)
+++ trunk/Source/WebCore/dom/ChildListMutationScope.h 2011-11-04 18:34:00 UTC (rev 99305)
@@ -34,8 +34,6 @@
#if ENABLE(MUTATION_OBSERVERS)
#include <wtf/Noncopyable.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/RefPtr.h>
namespace WebCore {
@@ -44,14 +42,14 @@
class ChildListMutationScope {
WTF_MAKE_NONCOPYABLE(ChildListMutationScope);
public:
- ChildListMutationScope(PassRefPtr<Node> target);
+ ChildListMutationScope(Node* target);
~ChildListMutationScope();
- void childAdded(PassRefPtr<Node>);
- void willRemoveChild(PassRefPtr<Node>);
+ void childAdded(Node*);
+ void willRemoveChild(Node*);
private:
- RefPtr<Node> m_target;
+ Node* m_target;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/dom/ContainerNode.cpp (99304 => 99305)
--- trunk/Source/WebCore/dom/ContainerNode.cpp 2011-11-04 18:28:31 UTC (rev 99304)
+++ trunk/Source/WebCore/dom/ContainerNode.cpp 2011-11-04 18:34:00 UTC (rev 99305)
@@ -1115,7 +1115,7 @@
#if ENABLE(MUTATION_OBSERVERS)
if (c->parentNode()) {
ChildListMutationScope mutation(c->parentNode());
- mutation.childAdded(c);
+ mutation.childAdded(c.get());
}
#endif
@@ -1143,7 +1143,7 @@
#if ENABLE(MUTATION_OBSERVERS)
if (c->parentNode()) {
ChildListMutationScope mutation(c->parentNode());
- mutation.willRemoveChild(c);
+ mutation.willRemoveChild(c.get());
c->notifyMutationObserversNodeWillDetach();
}
#endif