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: