Source/WebCore/ChangeLog

 12012-07-06 Yury Semikhatsky <yurys@chromium.org>
 2
 3 Web Inspector: add memory reporting routine to Document
 4 https://bugs.webkit.org/show_bug.cgi?id=90668
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Added methods for reporting HashSet, ListHashSet and Vector memory
 9 footprint. Made Document report its size along with its internal
 10 collections sizes.
 11
 12 * dom/Document.cpp:
 13 (WebCore::Document::reportMemoryUsage):
 14 (WebCore):
 15 * dom/Document.h:
 16 (Document):
 17 * dom/MemoryInstrumentation.h:
 18 (MemoryInstrumentation):
 19 (MemoryObjectInfo):
 20 (WebCore::MemoryObjectInfo::reportHashMap):
 21 (WebCore::MemoryObjectInfo::reportHashSet):
 22 (WebCore::MemoryObjectInfo::reportListHashSet):
 23 (WebCore::MemoryObjectInfo::reportVector):
 24 (WebCore::MemoryObjectInfo::memoryInstrumentation):
 25 (WebCore::MemoryInstrumentation::reportHashMap):
 26 (WebCore):
 27 (WebCore::MemoryInstrumentation::reportHashSet):
 28 (WebCore::MemoryInstrumentation::reportListHashSet):
 29 (WebCore::MemoryInstrumentation::reportVector):
 30 * inspector/InspectorMemoryAgent.cpp:
 31 (WebCore):
 32
1332012-07-05 Arnaud Renevier <arno@renevier.net>
234
335 [GTK] Showing the context menu in the Web Inspector can crash the browser

Source/WebCore/dom/Document.cpp

109109#include "Logging.h"
110110#include "MediaQueryList.h"
111111#include "MediaQueryMatcher.h"
 112#include "MemoryInstrumentation.h"
112113#include "MouseEventWithHitTestResults.h"
113114#include "NameNodeList.h"
114115#include "NestingLevelIncrementer.h"

@@void Document::setContextFeatures(PassRefPtr<ContextFeatures> features)
59945995 m_contextFeatures = features;
59955996}
59965997
 5998void Document::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
 5999{
 6000 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM);
 6001 ContainerNode::reportMemoryUsage(memoryObjectInfo);
 6002 memoryObjectInfo->reportVector(m_customFonts);
 6003 memoryObjectInfo->reportString(m_documentURI);
 6004 memoryObjectInfo->reportString(m_baseTarget);
 6005 if (m_pageGroupUserSheets)
 6006 memoryObjectInfo->reportVector(*m_pageGroupUserSheets.get());
 6007 if (m_userSheets)
 6008 memoryObjectInfo->reportVector(*m_userSheets.get());
 6009 memoryObjectInfo->reportHashSet(m_nodeIterators);
 6010 memoryObjectInfo->reportHashSet(m_ranges);
 6011 memoryObjectInfo->reportListHashSet(m_styleSheetCandidateNodes);
 6012 memoryObjectInfo->reportString(m_preferredStylesheetSet);
 6013 memoryObjectInfo->reportString(m_selectedStylesheetSet);
 6014 memoryObjectInfo->reportString(m_title.string());
 6015 memoryObjectInfo->reportString(m_rawTitle.string());
 6016 memoryObjectInfo->reportString(m_xmlEncoding);
 6017 memoryObjectInfo->reportString(m_xmlVersion);
 6018 memoryObjectInfo->reportString(m_contentLanguage);
 6019 memoryObjectInfo->reportHashMap(m_documentNamedItemCollections);
 6020 memoryObjectInfo->reportHashMap(m_windowNamedItemCollections);
 6021#if ENABLE(DASHBOARD_SUPPORT)
 6022 memoryObjectInfo->reportVector(m_dashboardRegions);
 6023#endif
 6024 memoryObjectInfo->reportHashMap(m_cssCanvasElements);
 6025 memoryObjectInfo->reportVector(m_iconURLs);
 6026 memoryObjectInfo->reportHashSet(m_documentSuspensionCallbackElements);
 6027 memoryObjectInfo->reportHashSet(m_mediaVolumeCallbackElements);
 6028 memoryObjectInfo->reportHashSet(m_privateBrowsingStateChangedElements);
 6029 memoryObjectInfo->reportHashMap(m_elementsByAccessKey);
 6030 memoryObjectInfo->reportHashSet(m_mediaCanStartListeners);
 6031 memoryObjectInfo->reportVector(m_pendingTasks);
 6032}
 6033
59976034#if ENABLE(UNDO_MANAGER)
59986035PassRefPtr<UndoManager> Document::undoManager()
59996036{

Source/WebCore/dom/Document.h

@@public:
11431143 void setContextFeatures(PassRefPtr<ContextFeatures>);
11441144 ContextFeatures* contextFeatures() { return m_contextFeatures.get(); }
11451145
 1146 virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE;
 1147
11461148protected:
11471149 Document(Frame*, const KURL&, bool isXHTML, bool isHTML);
11481150

Source/WebCore/dom/MemoryInstrumentation.h

@@public:
6161 return;
6262 countObjectSize(objectType, sizeof(T));
6363 }
64  template <typename HashMapType> void reportHashMap(const HashMapType&, ObjectType);
 64 template <typename HashMapType> void reportHashMap(const HashMapType&, ObjectType, bool contentOnly = false);
 65 template <typename HashSetType> void reportHashSet(const HashSetType&, ObjectType, bool contentOnly = false);
 66 template <typename ListHashSetType> void reportListHashSet(const ListHashSetType&, ObjectType, bool contentOnly = false);
 67 template <typename VectorType> void reportVector(const VectorType&, ObjectType, bool contentOnly = false);
6568
6669protected:
6770 class InstrumentedPointerBase {

@@public:
129132 m_objectSize = sizeof(T);
130133 }
131134
 135 template <typename HashMapType>
 136 void reportHashMap(const HashMapType& map)
 137 {
 138 m_memoryInstrumentation->reportHashMap(map, objectType(), true);
 139 }
 140
 141 template <typename HashSetType>
 142 void reportHashSet(const HashSetType& set)
 143 {
 144 m_memoryInstrumentation->reportHashSet(set, objectType(), true);
 145 }
 146
 147 template <typename ListHashSetType>
 148 void reportListHashSet(const ListHashSetType& set)
 149 {
 150 m_memoryInstrumentation->reportListHashSet(set, objectType(), true);
 151 }
 152
 153 template <typename VectorType>
 154 void reportVector(const VectorType& vector)
 155 {
 156 m_memoryInstrumentation->reportVector(vector, objectType(), true);
 157 }
 158
132159 void reportString(const String& string)
133160 {
134161 m_memoryInstrumentation->reportString(objectType(), string);

@@public:
137164 MemoryInstrumentation::ObjectType objectType() const { return m_objectType; }
138165 size_t objectSize() const { return m_objectSize; }
139166
 167 MemoryInstrumentation* memoryInstrumentation() { return m_memoryInstrumentation; }
 168
140169 private:
141170 MemoryInstrumentation* m_memoryInstrumentation;
142171 MemoryInstrumentation::ObjectType m_objectType;

@@void MemoryInstrumentation::reportInstrumentedObject(const T& object)
161190}
162191
163192template<typename HashMapType>
164 void MemoryInstrumentation::reportHashMap(const HashMapType& hashMap, ObjectType objectType)
 193void MemoryInstrumentation::reportHashMap(const HashMapType& hashMap, ObjectType objectType, bool contentOnly)
 194{
 195 size_t size = (contentOnly ? 0 : sizeof(HashMapType)) + hashMap.capacity() * sizeof(typename HashMapType::ValueType);
 196 countObjectSize(objectType, size);
 197}
 198
 199template<typename HashSetType>
 200void MemoryInstrumentation::reportHashSet(const HashSetType& hashSet, ObjectType objectType, bool contentOnly)
 201{
 202 if (visited(&hashSet))
 203 return;
 204 size_t size = (contentOnly ? 0 : sizeof(HashSetType)) + hashSet.capacity() * sizeof(typename HashSetType::ValueType);
 205 countObjectSize(objectType, size);
 206}
 207
 208template<typename ListHashSetType>
 209void MemoryInstrumentation::reportListHashSet(const ListHashSetType& hashSet, ObjectType objectType, bool contentOnly)
165210{
166  size_t size = sizeof(HashMapType) + hashMap.capacity() * sizeof(typename HashMapType::ValueType);
 211 if (visited(&hashSet))
 212 return;
 213 size_t size = (contentOnly ? 0 : sizeof(ListHashSetType)) + hashSet.capacity() * sizeof(void*) + hashSet.size() * (sizeof(typename ListHashSetType::ValueType) + 2 * sizeof(void*));
 214 countObjectSize(objectType, size);
 215}
 216
 217template <typename VectorType>
 218void MemoryInstrumentation::reportVector(const VectorType& vector, ObjectType objectType, bool contentOnly)
 219{
 220 if (visited(vector.data()))
 221 return;
 222 size_t size = (contentOnly ? 0 : sizeof(VectorType)) + vector.capacity() * sizeof(typename VectorType::ValueType);
167223 countObjectSize(objectType, size);
168224}
169225

Source/WebCore/inspector/InspectorMemoryAgent.cpp

@@public:
471471private:
472472 virtual void reportString(ObjectType objectType, const String& string)
473473 {
474  if (visited(string.impl()))
 474 if (string.isNull() || visited(string.impl()))
475475 return;
476476 countObjectSize(objectType, stringSize(string.impl()));
477477 }