From 6213a83ff943812c41a49d963aa0f9ab68a36515 Mon Sep 17 00:00:00 2001 From: "yurys@chromium.org" Date: Fri, 30 Dec 2011 10:30:58 +0000 Subject: [PATCH] Web Inspector: use typed front-end API in the memory agent https://bugs.webkit.org/show_bug.cgi?id=75382 Memory agent now uses generate C++ API for communicating to the front-end. Reviewed by Pavel Feldman. * inspector/InspectorMemoryAgent.cpp: (WebCore::DOMTreeStatistics::CounterVisitor::CounterVisitor): (WebCore::DOMTreeStatistics::CounterVisitor::counters): (WebCore::DOMTreeStatistics::CounterVisitor::visitNode): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@103841 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Source/WebCore/ChangeLog | 14 ++ Source/WebCore/inspector/InspectorMemoryAgent.cpp | 149 ++++++++++++++-------- 2 files changed, 109 insertions(+), 54 deletions(-) diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 2b00c78..3b62923 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,17 @@ +2011-12-30 Yury Semikhatsky + + Web Inspector: use typed front-end API in the memory agent + https://bugs.webkit.org/show_bug.cgi?id=75382 + + Memory agent now uses generate C++ API for communicating to the front-end. + + Reviewed by Pavel Feldman. + + * inspector/InspectorMemoryAgent.cpp: + (WebCore::DOMTreeStatistics::CounterVisitor::CounterVisitor): + (WebCore::DOMTreeStatistics::CounterVisitor::counters): + (WebCore::DOMTreeStatistics::CounterVisitor::visitNode): + 2011-12-30 Pavel Feldman Web Inspector: migrate from "attached" to "compact" styles. diff --git a/Source/WebCore/inspector/InspectorMemoryAgent.cpp b/Source/WebCore/inspector/InspectorMemoryAgent.cpp index 759ae11..a395756 100644 --- a/Source/WebCore/inspector/InspectorMemoryAgent.cpp +++ b/Source/WebCore/inspector/InspectorMemoryAgent.cpp @@ -37,6 +37,7 @@ #include "Document.h" #include "EventListenerMap.h" #include "Frame.h" +#include "InspectorFrontend.h" #include "InspectorState.h" #include "InspectorValues.h" #include "InstrumentingAgents.h" @@ -47,75 +48,83 @@ #include #include +using WebCore::TypeBuilder::Memory::DOMGroup; +using WebCore::TypeBuilder::Memory::ListenerCount; +using WebCore::TypeBuilder::Memory::NodeCount; + namespace WebCore { namespace { -class CounterVisitor : public DOMWrapperVisitor { -public: - CounterVisitor(Page* page) : m_page(page), m_counters(InspectorArray::create()) { } +String nodeName(Node* node) +{ + if (node->document()->isXHTMLDocument()) + return node->nodeName(); + return node->nodeName().lower(); +} - InspectorArray* counters() { return m_counters.get(); } +typedef HashSet > StringImplIdentitySet; - virtual void visitNode(Node* node) +class DOMTreeStatistics { +public: + DOMTreeStatistics(Node* rootNode) : m_totalNodeCount(0) { - if (node->document()->frame() && m_page != node->document()->frame()->page()) - return; + collectTreeStatistics(rootNode); + } - Node* rootNode = node; - while (rootNode->parentNode()) - rootNode = rootNode->parentNode(); + int totalNodeCount() { return m_totalNodeCount; } - if (m_roots.contains(rootNode)) - return; - m_roots.add(rootNode); + PassRefPtr nodeCount() + { + RefPtr childrenStats = InspectorArray::create(); + for (HashMap::iterator it = m_nodeNameToCount.begin(); it != m_nodeNameToCount.end(); ++it) { + RefPtr nodeCount = NodeCount::create().setNodeName(it->first) + .setCount(it->second); + childrenStats->pushObject(nodeCount); + } + return childrenStats.release(); + } - RefPtr entry = InspectorObject::create(); - entry->setString("title", rootNode->nodeType() == Node::ELEMENT_NODE ? elementTitle(static_cast(rootNode)) : rootNode->nodeName()); - if (rootNode->nodeType() == Node::DOCUMENT_NODE) - entry->setString("documentURI", static_cast(rootNode)->documentURI()); - collectTreeStatistics(rootNode, entry.get()); - m_counters->pushObject(entry); + PassRefPtr listenerCount() + { + RefPtr listenerStats = InspectorArray::create(); + for (HashMap::iterator it = m_eventTypeToCount.begin(); it != m_eventTypeToCount.end(); ++it) { + RefPtr listenerCount = ListenerCount::create().setType(it->first) + .setCount(it->second); + listenerStats->pushObject(listenerCount); + } + return listenerStats.release(); } private: - static void collectTreeStatistics(Node* rootNode, InspectorObject* result) + void collectTreeStatistics(Node* rootNode) { - unsigned count = 0; - HashMap eventTypeToCount; - HashMap nameToCount; Node* currentNode = rootNode; - collectListenersInfo(rootNode, eventTypeToCount); + collectListenersInfo(rootNode); while ((currentNode = currentNode->traverseNextNode(rootNode))) { - ++count; - String name = nodeName(currentNode); - int currentCount = nameToCount.get(name); - nameToCount.set(name, currentCount + 1); - collectListenersInfo(currentNode, eventTypeToCount); - } - - RefPtr childrenStats = InspectorArray::create(); - for (HashMap::iterator it = nameToCount.begin(); it != nameToCount.end(); ++it) { - RefPtr nodeCount = InspectorObject::create(); - nodeCount->setString("nodeName", it->first); - nodeCount->setNumber("count", it->second); - childrenStats->pushObject(nodeCount); - } - - RefPtr listenerStats = InspectorArray::create(); - for (HashMap::iterator it = eventTypeToCount.begin(); it != eventTypeToCount.end(); ++it) { - RefPtr eventCount = InspectorObject::create(); - eventCount->setString("type", it->first); - eventCount->setNumber("count", it->second); - listenerStats->pushObject(eventCount); + ++m_totalNodeCount; + collectNodeStatistics(currentNode); } + } + void collectNodeStatistics(Node* node) + { + collectCharacterData(node); + collectNodeNameInfo(node); + collectListenersInfo(node); + } + + void collectCharacterData(Node* node) + { + } - result->setNumber("size", count); - result->setArray("nodeCount", childrenStats); - result->setArray("listenerCount", listenerStats); + void collectNodeNameInfo(Node* node) + { + String name = nodeName(node); + int currentCount = m_nodeNameToCount.get(name); + m_nodeNameToCount.set(name, currentCount + 1); } - static void collectListenersInfo(Node* node, HashMap& result) + void collectListenersInfo(Node* node) { EventTargetData* d = node->eventTargetData(); if (!d) @@ -133,17 +142,49 @@ private: ++count; } if (count) - result.set(name, result.get(name) + count); + m_eventTypeToCount.set(name, m_eventTypeToCount.get(name) + count); } } - static String nodeName(Node* node) + int m_totalNodeCount; + HashMap m_eventTypeToCount; + HashMap m_nodeNameToCount; + StringImplIdentitySet m_domStringImplSet; +}; + +class CounterVisitor : public DOMWrapperVisitor { +public: + CounterVisitor(Page* page) : m_page(page), m_counters(InspectorArray::create()) { } + + InspectorArray* counters() { return m_counters.get(); } + + virtual void visitNode(Node* node) { - if (node->document()->isXHTMLDocument()) - return node->nodeName(); - return node->nodeName().lower(); + if (node->document()->frame() && m_page != node->document()->frame()->page()) + return; + + Node* rootNode = node; + while (rootNode->parentNode()) + rootNode = rootNode->parentNode(); + + if (m_roots.contains(rootNode)) + return; + m_roots.add(rootNode); + + DOMTreeStatistics domTreeStats(rootNode); + + RefPtr domGroup = DOMGroup::create() + .setSize(domTreeStats.totalNodeCount()) + .setTitle(rootNode->nodeType() == Node::ELEMENT_NODE ? elementTitle(static_cast(rootNode)) : rootNode->nodeName()) + .setNodeCount(domTreeStats.nodeCount()) + .setListenerCount(domTreeStats.listenerCount()); + if (rootNode->nodeType() == Node::DOCUMENT_NODE) + domGroup->setDocumentURI(static_cast(rootNode)->documentURI()); + + m_counters->pushObject(domGroup); } +private: String elementTitle(Element* element) { StringBuilder result; -- 2.7.4