initial import
[vuplus_webkit] / Source / WebKit / mac / Misc / WebCoreStatistics.mm
1 /*
2  * Copyright (C) 2005, 2006, 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import "WebCoreStatistics.h"
30
31 #import "DOMElementInternal.h"
32 #import "WebCache.h"
33 #import "WebFrameInternal.h"
34 #import <JavaScriptCore/JSLock.h>
35 #import <JavaScriptCore/MemoryStatistics.h>
36 #import <WebCore/Console.h>
37 #import <WebCore/FontCache.h>
38 #import <WebCore/Frame.h>
39 #import <WebCore/GCController.h>
40 #import <WebCore/GlyphPageTreeNode.h>
41 #import <WebCore/GraphicsContext.h>
42 #import <WebCore/IconDatabase.h>
43 #import <WebCore/JSDOMWindow.h>
44 #import <WebCore/PageCache.h>
45 #import <WebCore/PrintContext.h>
46 #import <WebCore/RenderTreeAsText.h>
47 #import <WebCore/RenderView.h>
48
49 using namespace JSC;
50 using namespace WebCore;
51
52 @implementation WebCoreStatistics
53
54 + (NSArray *)statistics
55 {
56     return [WebCache statistics];
57 }
58
59 + (size_t)javaScriptObjectsCount
60 {
61     JSLock lock(SilenceAssertionsOnly);
62     return JSDOMWindow::commonJSGlobalData()->heap.objectCount();
63 }
64
65 + (size_t)javaScriptGlobalObjectsCount
66 {
67     JSLock lock(SilenceAssertionsOnly);
68     return JSDOMWindow::commonJSGlobalData()->heap.globalObjectCount();
69 }
70
71 + (size_t)javaScriptProtectedObjectsCount
72 {
73     JSLock lock(SilenceAssertionsOnly);
74     return JSDOMWindow::commonJSGlobalData()->heap.protectedObjectCount();
75 }
76
77 + (size_t)javaScriptProtectedGlobalObjectsCount
78 {
79     JSLock lock(SilenceAssertionsOnly);
80     return JSDOMWindow::commonJSGlobalData()->heap.protectedGlobalObjectCount();
81 }
82
83 + (NSCountedSet *)javaScriptProtectedObjectTypeCounts
84 {
85     JSLock lock(SilenceAssertionsOnly);
86     
87     NSCountedSet *result = [NSCountedSet set];
88
89     OwnPtr<TypeCountSet> counts(JSDOMWindow::commonJSGlobalData()->heap.protectedObjectTypeCounts());
90     HashCountedSet<const char*>::iterator end = counts->end();
91     for (HashCountedSet<const char*>::iterator it = counts->begin(); it != end; ++it)
92         for (unsigned i = 0; i < it->second; ++i)
93             [result addObject:[NSString stringWithUTF8String:it->first]];
94     
95     return result;
96 }
97
98 + (NSCountedSet *)javaScriptObjectTypeCounts
99 {
100     JSLock lock(SilenceAssertionsOnly);
101     
102     NSCountedSet *result = [NSCountedSet set];
103
104     OwnPtr<TypeCountSet> counts(JSDOMWindow::commonJSGlobalData()->heap.objectTypeCounts());
105     HashCountedSet<const char*>::iterator end = counts->end();
106     for (HashCountedSet<const char*>::iterator it = counts->begin(); it != end; ++it)
107         for (unsigned i = 0; i < it->second; ++i)
108             [result addObject:[NSString stringWithUTF8String:it->first]];
109     
110     return result;
111 }
112
113 + (void)garbageCollectJavaScriptObjects
114 {
115     gcController().garbageCollectNow();
116 }
117
118 + (void)garbageCollectJavaScriptObjectsOnAlternateThreadForDebugging:(BOOL)waitUntilDone
119 {
120     gcController().garbageCollectOnAlternateThreadForDebugging(waitUntilDone);
121 }
122
123 + (size_t)iconPageURLMappingCount
124 {
125     return iconDatabase().pageURLMappingCount();
126 }
127
128 + (size_t)iconRetainedPageURLCount
129 {
130     return iconDatabase().retainedPageURLCount();
131 }
132
133 + (size_t)iconRecordCount
134 {
135     return iconDatabase().iconRecordCount();
136 }
137
138 + (size_t)iconsWithDataCount
139 {
140     return iconDatabase().iconRecordCountWithData();
141 }
142
143 + (size_t)cachedFontDataCount
144 {
145     return fontCache()->fontDataCount();
146 }
147
148 + (size_t)cachedFontDataInactiveCount
149 {
150     return fontCache()->inactiveFontDataCount();
151 }
152
153 + (void)purgeInactiveFontData
154 {
155     fontCache()->purgeInactiveFontData();
156 }
157
158 + (size_t)glyphPageCount
159 {
160     return GlyphPageTreeNode::treeGlyphPageCount();
161 }
162
163 + (BOOL)shouldPrintExceptions
164 {
165     JSLock lock(SilenceAssertionsOnly);
166     return Console::shouldPrintExceptions();
167 }
168
169 + (void)setShouldPrintExceptions:(BOOL)print
170 {
171     JSLock lock(SilenceAssertionsOnly);
172     Console::setShouldPrintExceptions(print);
173 }
174
175 + (void)emptyCache
176 {
177     [WebCache empty];
178 }
179
180 + (void)setCacheDisabled:(BOOL)disabled
181 {
182     [WebCache setDisabled:disabled];
183 }
184
185 + (void)startIgnoringWebCoreNodeLeaks
186 {
187     WebCore::Node::startIgnoringLeaks();
188 }
189
190 + (void)stopIgnoringWebCoreNodeLeaks
191 {
192     WebCore::Node::stopIgnoringLeaks();
193 }
194
195 + (NSDictionary *)memoryStatistics
196 {
197     WTF::FastMallocStatistics fastMallocStatistics = WTF::fastMallocStatistics();
198     
199     JSLock lock(SilenceAssertionsOnly);
200     size_t heapSize = JSDOMWindow::commonJSGlobalData()->heap.size();
201     size_t heapFree = JSDOMWindow::commonJSGlobalData()->heap.capacity() - heapSize;
202     GlobalMemoryStatistics globalMemoryStats = globalMemoryStatistics();
203     
204     return [NSDictionary dictionaryWithObjectsAndKeys:
205                 [NSNumber numberWithInt:fastMallocStatistics.reservedVMBytes], @"FastMallocReservedVMBytes",
206                 [NSNumber numberWithInt:fastMallocStatistics.committedVMBytes], @"FastMallocCommittedVMBytes",
207                 [NSNumber numberWithInt:fastMallocStatistics.freeListBytes], @"FastMallocFreeListBytes",
208                 [NSNumber numberWithInt:heapSize], @"JavaScriptHeapSize",
209                 [NSNumber numberWithInt:heapFree], @"JavaScriptFreeSize",
210                 [NSNumber numberWithUnsignedInt:(unsigned int)globalMemoryStats.stackBytes], @"JavaScriptStackSize",
211                 [NSNumber numberWithUnsignedInt:(unsigned int)globalMemoryStats.JITBytes], @"JavaScriptJITSize",
212             nil];
213 }
214
215 + (void)returnFreeMemoryToSystem
216 {
217     WTF::releaseFastMallocFreeMemory();
218 }
219
220 + (int)cachedPageCount
221 {
222     return pageCache()->pageCount();
223 }
224
225 + (int)cachedFrameCount
226 {
227     return pageCache()->frameCount();
228 }
229
230 + (int)autoreleasedPageCount
231 {
232     return pageCache()->autoreleasedPageCount();
233 }
234
235 // Deprecated
236 + (size_t)javaScriptNoGCAllowedObjectsCount
237 {
238     return 0;
239 }
240
241 + (size_t)javaScriptReferencedObjectsCount
242 {
243     JSLock lock(SilenceAssertionsOnly);
244     return JSDOMWindow::commonJSGlobalData()->heap.protectedObjectCount();
245 }
246
247 + (NSSet *)javaScriptRootObjectClasses
248 {
249     return [self javaScriptRootObjectTypeCounts];
250 }
251
252 + (size_t)javaScriptInterpretersCount
253 {
254     return [self javaScriptProtectedGlobalObjectsCount];
255 }
256
257 + (NSCountedSet *)javaScriptRootObjectTypeCounts
258 {
259     return [self javaScriptProtectedObjectTypeCounts];
260 }
261
262 @end
263
264 @implementation WebFrame (WebKitDebug)
265
266 - (NSString *)renderTreeAsExternalRepresentationForPrinting:(BOOL)forPrinting
267 {
268     return externalRepresentation(_private->coreFrame, forPrinting ? RenderAsTextPrintingMode : RenderAsTextBehaviorNormal);
269 }
270
271 - (NSString *)counterValueForElement:(DOMElement*)element
272 {
273     return counterValueForElement(core(element));
274 }
275
276 - (int)pageNumberForElement:(DOMElement*)element:(float)pageWidthInPixels:(float)pageHeightInPixels
277 {
278     return PrintContext::pageNumberForElement(core(element), FloatSize(pageWidthInPixels, pageHeightInPixels));
279 }
280
281 - (int)numberOfPages:(float)pageWidthInPixels:(float)pageHeightInPixels
282 {
283     return PrintContext::numberOfPages(_private->coreFrame, FloatSize(pageWidthInPixels, pageHeightInPixels));
284 }
285
286 - (NSString *)pageProperty:(const char *)propertyName:(int)pageNumber
287 {
288     return PrintContext::pageProperty(_private->coreFrame, propertyName, pageNumber);
289 }
290
291 - (bool)isPageBoxVisible:(int)pageNumber
292 {
293     return PrintContext::isPageBoxVisible(_private->coreFrame, pageNumber);
294 }
295
296 - (NSString *)pageSizeAndMarginsInPixels:(int)pageNumber:(int)width:(int)height:(int)marginTop:(int)marginRight:(int)marginBottom:(int)marginLeft
297 {
298     return PrintContext::pageSizeAndMarginsInPixels(_private->coreFrame, pageNumber, width, height, marginTop, marginRight, marginBottom, marginLeft);
299 }
300
301 - (void)printToCGContext:(CGContextRef)cgContext:(float)pageWidthInPixels:(float)pageHeightInPixels
302 {
303     Frame* coreFrame = _private->coreFrame;
304     if (!coreFrame)
305         return;
306
307     GraphicsContext graphicsContext(cgContext);
308     PrintContext::spoolAllPagesWithBoundaries(coreFrame, graphicsContext, FloatSize(pageWidthInPixels, pageHeightInPixels));
309 }
310
311 @end