1 /* 2 * Copyright (C) 2006 Apple Computer, 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 COMPUTER, 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 COMPUTER, 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 #import "WebCache.h" 27 28 #import "WebNSObjectExtras.h" 29 #import "WebPreferences.h" 30 #import "WebSystemInterface.h" 31 #import "WebView.h" 32 #import "WebViewInternal.h" 33 #import <WebCore/ApplicationCacheStorage.h> 34 #import <WebCore/MemoryCache.h> 35 #import <WebCore/CrossOriginPreflightResultCache.h> 36 37 @implementation WebCache 38 39 + (void)initialize 40 { 41 InitWebCoreSystemInterface(); 42 } 43 44 + (NSArray *)statistics 45 { 46 WebCore::MemoryCache::Statistics s = WebCore::memoryCache()->getStatistics(); 47 48 return [NSArray arrayWithObjects: 49 [NSDictionary dictionaryWithObjectsAndKeys: 50 [NSNumber numberWithInt:s.images.count], @"Images", 51 [NSNumber numberWithInt:s.cssStyleSheets.count], @"CSS", 52 #if ENABLE(XSLT) 53 [NSNumber numberWithInt:s.xslStyleSheets.count], @"XSL", 54 #else 55 [NSNumber numberWithInt:0], @"XSL", 56 #endif 57 [NSNumber numberWithInt:s.scripts.count], @"JavaScript", 58 nil], 59 [NSDictionary dictionaryWithObjectsAndKeys: 60 [NSNumber numberWithInt:s.images.size], @"Images", 61 [NSNumber numberWithInt:s.cssStyleSheets.size] ,@"CSS", 62 #if ENABLE(XSLT) 63 [NSNumber numberWithInt:s.xslStyleSheets.size], @"XSL", 64 #else 65 [NSNumber numberWithInt:0], @"XSL", 66 #endif 67 [NSNumber numberWithInt:s.scripts.size], @"JavaScript", 68 nil], 69 [NSDictionary dictionaryWithObjectsAndKeys: 70 [NSNumber numberWithInt:s.images.liveSize], @"Images", 71 [NSNumber numberWithInt:s.cssStyleSheets.liveSize] ,@"CSS", 72 #if ENABLE(XSLT) 73 [NSNumber numberWithInt:s.xslStyleSheets.liveSize], @"XSL", 74 #else 75 [NSNumber numberWithInt:0], @"XSL", 76 #endif 77 [NSNumber numberWithInt:s.scripts.liveSize], @"JavaScript", 78 nil], 79 [NSDictionary dictionaryWithObjectsAndKeys: 80 [NSNumber numberWithInt:s.images.decodedSize], @"Images", 81 [NSNumber numberWithInt:s.cssStyleSheets.decodedSize] ,@"CSS", 82 #if ENABLE(XSLT) 83 [NSNumber numberWithInt:s.xslStyleSheets.decodedSize], @"XSL", 84 #else 85 [NSNumber numberWithInt:0], @"XSL", 86 #endif 87 [NSNumber numberWithInt:s.scripts.decodedSize], @"JavaScript", 88 nil], 89 [NSDictionary dictionaryWithObjectsAndKeys: 90 [NSNumber numberWithInt:s.images.purgeableSize], @"Images", 91 [NSNumber numberWithInt:s.cssStyleSheets.purgeableSize] ,@"CSS", 92 #if ENABLE(XSLT) 93 [NSNumber numberWithInt:s.xslStyleSheets.purgeableSize], @"XSL", 94 #else 95 [NSNumber numberWithInt:0], @"XSL", 96 #endif 97 [NSNumber numberWithInt:s.scripts.purgeableSize], @"JavaScript", 98 nil], 99 [NSDictionary dictionaryWithObjectsAndKeys: 100 [NSNumber numberWithInt:s.images.purgedSize], @"Images", 101 [NSNumber numberWithInt:s.cssStyleSheets.purgedSize] ,@"CSS", 102 #if ENABLE(XSLT) 103 [NSNumber numberWithInt:s.xslStyleSheets.purgedSize], @"XSL", 104 #else 105 [NSNumber numberWithInt:0], @"XSL", 106 #endif 107 [NSNumber numberWithInt:s.scripts.purgedSize], @"JavaScript", 108 nil], 109 nil]; 110 } 111 112 + (void)empty 113 { 114 // Toggling the cache model like this forces the cache to evict all its in-memory resources. 115 WebCacheModel cacheModel = [WebView _cacheModel]; 116 [WebView _setCacheModel:WebCacheModelDocumentViewer]; 117 [WebView _setCacheModel:cacheModel]; 118 119 #if ENABLE(OFFLINE_WEB_APPLICATIONS) 120 // Empty the application cache. 121 WebCore::cacheStorage().empty(); 122 #endif 123 124 // Empty the Cross-Origin Preflight cache 125 WebCore::CrossOriginPreflightResultCache::shared().empty(); 126 } 127 128 + (void)setDisabled:(BOOL)disabled 129 { 130 if (!pthread_main_np()) 131 return [[self _webkit_invokeOnMainThread] setDisabled:disabled]; 132 133 WebCore::memoryCache()->setDisabled(disabled); 134 } 135 136 + (BOOL)isDisabled 137 { 138 return WebCore::memoryCache()->disabled(); 139 } 140 141 @end 142