Title: [140949] trunk/Source/WebCore
Revision
140949
Author
[email protected]
Date
2013-01-28 00:05:35 -0800 (Mon, 28 Jan 2013)

Log Message

Web Inspector: each node in a detached DOM tree is shown in its own "detached DOM tree" entry in heap profiler
https://bugs.webkit.org/show_bug.cgi?id=107819

Reviewed by Adam Barth.

Provide single RetainedDOMInfo for each group of DOM Node wrappers reported to GC.
Otherwise we have unequal RetainedDOMInfo groups for each wrapped node.

* bindings/v8/V8GCController.cpp:
(WebCore::ImplicitConnection::ImplicitConnection):
(WebCore::ImplicitConnection::retainedObjectInfo):
(ImplicitConnection):
(WebCore::WrapperGrouper::addObjectToGroup):
(WrapperGrouper):
(WebCore::WrapperGrouper::addNodeToGroup):
(WebCore::WrapperGrouper::apply):
(WebCore::V8GCController::opaqueRootForGC):
* bindings/v8/V8GCController.h:
(V8GCController):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (140948 => 140949)


--- trunk/Source/WebCore/ChangeLog	2013-01-28 07:24:54 UTC (rev 140948)
+++ trunk/Source/WebCore/ChangeLog	2013-01-28 08:05:35 UTC (rev 140949)
@@ -1,3 +1,25 @@
+2013-01-24  Yury Semikhatsky  <[email protected]>
+
+        Web Inspector: each node in a detached DOM tree is shown in its own "detached DOM tree" entry in heap profiler
+        https://bugs.webkit.org/show_bug.cgi?id=107819
+
+        Reviewed by Adam Barth.
+
+        Provide single RetainedDOMInfo for each group of DOM Node wrappers reported to GC.
+        Otherwise we have unequal RetainedDOMInfo groups for each wrapped node.
+
+        * bindings/v8/V8GCController.cpp:
+        (WebCore::ImplicitConnection::ImplicitConnection):
+        (WebCore::ImplicitConnection::retainedObjectInfo):
+        (ImplicitConnection):
+        (WebCore::WrapperGrouper::addObjectToGroup):
+        (WrapperGrouper):
+        (WebCore::WrapperGrouper::addNodeToGroup):
+        (WebCore::WrapperGrouper::apply):
+        (WebCore::V8GCController::opaqueRootForGC):
+        * bindings/v8/V8GCController.h:
+        (V8GCController):
+
 2013-01-27  Mihnea Ovidenie  <[email protected]>
 
         [CSSRegions] RenderFlowThread should keep a count of auto height regions

Modified: trunk/Source/WebCore/bindings/v8/V8GCController.cpp (140948 => 140949)


--- trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2013-01-28 07:24:54 UTC (rev 140948)
+++ trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2013-01-28 08:05:35 UTC (rev 140949)
@@ -34,6 +34,7 @@
 #include "Attr.h"
 #include "HTMLImageElement.h"
 #include "MemoryUsageSupport.h"
+#include "RetainedDOMInfo.h"
 #include "TraceEvent.h"
 #include "V8AbstractEventListener.h"
 #include "V8Binding.h"
@@ -51,15 +52,30 @@
     ImplicitConnection(void* root, v8::Persistent<v8::Value> wrapper)
         : m_root(root)
         , m_wrapper(wrapper)
+        , m_rootNode(0)
     {
     }
+    ImplicitConnection(Node* root, v8::Persistent<v8::Value> wrapper)
+        : m_root(root)
+        , m_wrapper(wrapper)
+        , m_rootNode(root)
+    {
+    }
 
     void* root() const { return m_root; }
     v8::Persistent<v8::Value> wrapper() const { return m_wrapper; }
 
+    PassOwnPtr<RetainedObjectInfo> retainedObjectInfo()
+    {
+        if (!m_rootNode)
+            return nullptr;
+        return adoptPtr(new RetainedDOMInfo(m_rootNode));
+    }
+
 private:
     void* m_root;
     v8::Persistent<v8::Value> m_wrapper;
+    Node* m_rootNode;
 };
 
 bool operator<(const ImplicitConnection& left, const ImplicitConnection& right)
@@ -74,11 +90,16 @@
         m_liveObjects.append(V8PerIsolateData::current()->ensureLiveRoot());
     }
 
-    void addToGroup(void* root, v8::Persistent<v8::Value> wrapper)
+    void addObjectToGroup(void* root, v8::Persistent<v8::Value> wrapper)
     {
         m_connections.append(ImplicitConnection(root, wrapper));
     }
 
+    void addNodeToGroup(Node* root, v8::Persistent<v8::Value> wrapper)
+    {
+        m_connections.append(ImplicitConnection(root, wrapper));
+    }
+
     void keepAlive(v8::Persistent<v8::Value> wrapper)
     {
         m_liveObjects.append(wrapper);
@@ -94,13 +115,14 @@
         size_t i = 0;
         while (i < m_connections.size()) {
             void* root = m_connections[i].root();
+            OwnPtr<RetainedObjectInfo> retainedObjectInfo = m_connections[i].retainedObjectInfo();
 
             do {
                 group.append(m_connections[i++].wrapper());
             } while (i < m_connections.size() && root == m_connections[i].root());
 
             if (group.size() > 1)
-                v8::V8::AddObjectGroup(group.data(), group.size(), 0);
+                v8::V8::AddObjectGroup(group.data(), group.size(), retainedObjectInfo.leakPtr());
 
             group.shrink(0);
         }
@@ -134,7 +156,7 @@
     v8::V8::AddImplicitReferences(wrapper, listeners.data(), listeners.size());
 }
 
-void* V8GCController::opaqueRootForGC(Node* node)
+Node* V8GCController::opaqueRootForGC(Node* node)
 {
     // FIXME: Remove the special handling for image elements.
     // The same special handling is in V8GCController::gcTree().
@@ -186,7 +208,7 @@
             MutationObserver* observer = static_cast<MutationObserver*>(object);
             HashSet<Node*> observedNodes = observer->getObservedNodes();
             for (HashSet<Node*>::iterator it = observedNodes.begin(); it != observedNodes.end(); ++it)
-                m_grouper.addToGroup(V8GCController::opaqueRootForGC(*it), wrapper);
+                m_grouper.addNodeToGroup(V8GCController::opaqueRootForGC(*it), wrapper);
         } else {
             ActiveDOMObject* activeDOMObject = type->toActiveDOMObject(wrapper);
             if (activeDOMObject && activeDOMObject->hasPendingActivity())
@@ -202,9 +224,9 @@
             if (node->hasEventListeners())
                 addImplicitReferencesForNodeWithEventListeners(node, wrapper);
 
-            m_grouper.addToGroup(V8GCController::opaqueRootForGC(node), wrapper);
+            m_grouper.addNodeToGroup(V8GCController::opaqueRootForGC(node), wrapper);
         } else if (classId == v8DOMObjectClassId) {
-            m_grouper.addToGroup(type->opaqueRootForGC(object, wrapper), wrapper);
+            m_grouper.addObjectToGroup(type->opaqueRootForGC(object, wrapper), wrapper);
         } else {
             ASSERT_NOT_REACHED();
         }

Modified: trunk/Source/WebCore/bindings/v8/V8GCController.h (140948 => 140949)


--- trunk/Source/WebCore/bindings/v8/V8GCController.h	2013-01-28 07:24:54 UTC (rev 140948)
+++ trunk/Source/WebCore/bindings/v8/V8GCController.h	2013-01-28 08:05:35 UTC (rev 140949)
@@ -51,7 +51,7 @@
     static void hintForCollectGarbage();
     static void collectGarbage();
 
-    static void* opaqueRootForGC(Node*);
+    static Node* opaqueRootForGC(Node*);
     static void didCreateWrapperForNode(Node*);
 
 private:
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to