1 /* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "WebKitDLL.h" 28 #include "WebCoreStatistics.h" 29 30 #include "COMPropertyBag.h" 31 #include <JavaScriptCore/JSLock.h> 32 #include <WebCore/FontCache.h> 33 #include <WebCore/GlyphPageTreeNode.h> 34 #include <WebCore/IconDatabase.h> 35 #include <WebCore/JSDOMWindow.h> 36 37 using namespace JSC; 38 using namespace WebCore; 39 40 // WebCoreStatistics --------------------------------------------------------------------------- 41 42 WebCoreStatistics::WebCoreStatistics() 43 : m_refCount(0) 44 { 45 gClassCount++; 46 gClassNameCount.add("WebCoreStatistics"); 47 } 48 49 WebCoreStatistics::~WebCoreStatistics() 50 { 51 gClassCount--; 52 gClassNameCount.remove("WebCoreStatistics"); 53 } 54 55 WebCoreStatistics* WebCoreStatistics::createInstance() 56 { 57 WebCoreStatistics* instance = new WebCoreStatistics(); 58 instance->AddRef(); 59 return instance; 60 } 61 62 // IUnknown ------------------------------------------------------------------- 63 64 HRESULT STDMETHODCALLTYPE WebCoreStatistics::QueryInterface(REFIID riid, void** ppvObject) 65 { 66 *ppvObject = 0; 67 if (IsEqualGUID(riid, IID_IUnknown)) 68 *ppvObject = static_cast<WebCoreStatistics*>(this); 69 else if (IsEqualGUID(riid, IID_IWebCoreStatistics)) 70 *ppvObject = static_cast<WebCoreStatistics*>(this); 71 else 72 return E_NOINTERFACE; 73 74 AddRef(); 75 return S_OK; 76 } 77 78 ULONG STDMETHODCALLTYPE WebCoreStatistics::AddRef(void) 79 { 80 return ++m_refCount; 81 } 82 83 ULONG STDMETHODCALLTYPE WebCoreStatistics::Release(void) 84 { 85 ULONG newRef = --m_refCount; 86 if (!newRef) 87 delete(this); 88 89 return newRef; 90 } 91 92 // IWebCoreStatistics ------------------------------------------------------------------------------ 93 94 HRESULT STDMETHODCALLTYPE WebCoreStatistics::javaScriptObjectsCount( 95 /* [retval][out] */ UINT* count) 96 { 97 if (!count) 98 return E_POINTER; 99 100 JSLock lock(SilenceAssertionsOnly); 101 *count = (UINT)JSDOMWindow::commonJSGlobalData()->heap.objectCount(); 102 return S_OK; 103 } 104 105 HRESULT STDMETHODCALLTYPE WebCoreStatistics::javaScriptGlobalObjectsCount( 106 /* [retval][out] */ UINT* count) 107 { 108 if (!count) 109 return E_POINTER; 110 111 JSLock lock(SilenceAssertionsOnly); 112 *count = (UINT)JSDOMWindow::commonJSGlobalData()->heap.globalObjectCount(); 113 return S_OK; 114 } 115 116 HRESULT STDMETHODCALLTYPE WebCoreStatistics::javaScriptProtectedObjectsCount( 117 /* [retval][out] */ UINT* count) 118 { 119 if (!count) 120 return E_POINTER; 121 122 JSLock lock(SilenceAssertionsOnly); 123 *count = (UINT)JSDOMWindow::commonJSGlobalData()->heap.protectedObjectCount(); 124 return S_OK; 125 } 126 127 HRESULT STDMETHODCALLTYPE WebCoreStatistics::javaScriptProtectedGlobalObjectsCount( 128 /* [retval][out] */ UINT* count) 129 { 130 if (!count) 131 return E_POINTER; 132 133 JSLock lock(SilenceAssertionsOnly); 134 *count = (UINT)JSDOMWindow::commonJSGlobalData()->heap.protectedGlobalObjectCount(); 135 return S_OK; 136 } 137 138 HRESULT STDMETHODCALLTYPE WebCoreStatistics::javaScriptProtectedObjectTypeCounts( 139 /* [retval][out] */ IPropertyBag2** typeNamesAndCounts) 140 { 141 JSLock lock(SilenceAssertionsOnly); 142 OwnPtr<HashCountedSet<const char*> > jsObjectTypeNames(JSDOMWindow::commonJSGlobalData()->heap.protectedObjectTypeCounts()); 143 typedef HashCountedSet<const char*>::const_iterator Iterator; 144 Iterator end = jsObjectTypeNames->end(); 145 HashMap<String, int> typeCountMap; 146 for (Iterator current = jsObjectTypeNames->begin(); current != end; ++current) 147 typeCountMap.set(current->first, current->second); 148 149 COMPtr<IPropertyBag2> results(AdoptCOM, COMPropertyBag<int>::createInstance(typeCountMap)); 150 results.copyRefTo(typeNamesAndCounts); 151 return S_OK; 152 } 153 154 HRESULT STDMETHODCALLTYPE WebCoreStatistics::iconPageURLMappingCount( 155 /* [retval][out] */ UINT* count) 156 { 157 if (!count) 158 return E_POINTER; 159 *count = (UINT) iconDatabase()->pageURLMappingCount(); 160 return S_OK; 161 } 162 163 HRESULT STDMETHODCALLTYPE WebCoreStatistics::iconRetainedPageURLCount( 164 /* [retval][out] */ UINT *count) 165 { 166 if (!count) 167 return E_POINTER; 168 *count = (UINT) iconDatabase()->retainedPageURLCount(); 169 return S_OK; 170 } 171 172 HRESULT STDMETHODCALLTYPE WebCoreStatistics::iconRecordCount( 173 /* [retval][out] */ UINT *count) 174 { 175 if (!count) 176 return E_POINTER; 177 *count = (UINT) iconDatabase()->iconRecordCount(); 178 return S_OK; 179 } 180 181 HRESULT STDMETHODCALLTYPE WebCoreStatistics::iconsWithDataCount( 182 /* [retval][out] */ UINT *count) 183 { 184 if (!count) 185 return E_POINTER; 186 *count = (UINT) iconDatabase()->iconRecordCountWithData(); 187 return S_OK; 188 } 189 190 HRESULT STDMETHODCALLTYPE WebCoreStatistics::cachedFontDataCount( 191 /* [retval][out] */ UINT *count) 192 { 193 if (!count) 194 return E_POINTER; 195 *count = (UINT) fontCache()->fontDataCount(); 196 return S_OK; 197 } 198 199 HRESULT STDMETHODCALLTYPE WebCoreStatistics::cachedFontDataInactiveCount( 200 /* [retval][out] */ UINT *count) 201 { 202 if (!count) 203 return E_POINTER; 204 *count = (UINT) fontCache()->inactiveFontDataCount(); 205 return S_OK; 206 } 207 208 HRESULT STDMETHODCALLTYPE WebCoreStatistics::purgeInactiveFontData(void) 209 { 210 fontCache()->purgeInactiveFontData(); 211 return S_OK; 212 } 213 214 HRESULT STDMETHODCALLTYPE WebCoreStatistics::glyphPageCount( 215 /* [retval][out] */ UINT *count) 216 { 217 if (!count) 218 return E_POINTER; 219 *count = (UINT) GlyphPageTreeNode::treeGlyphPageCount(); 220 return S_OK; 221 } 222