Fixed: <rdar://problem/3890944> disable icon database for Dashboard
authorcblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Nov 2004 18:50:15 +0000 (18:50 +0000)
committercblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Nov 2004 18:50:15 +0000 (18:50 +0000)
        Reviewed by kevin.

        * Misc.subproj/WebIconDatabase.h:
        * Misc.subproj/WebIconDatabase.m:
        (-[WebIconDatabase init]): don't create dictionaries if disabled
        (-[WebIconDatabase iconForURL:withSize:cache:]): return default icon if disabled
        (-[WebIconDatabase iconURLForURL:]): return nil if disabled
        (-[WebIconDatabase retainIconForURL:]): return if disabled
        (-[WebIconDatabase releaseIconForURL:]): ditto
        (-[WebIconDatabase delayDatabaseCleanup]): ditto
        (-[WebIconDatabase allowDatabaseCleanup]): ditto
        (-[WebIconDatabase _isEnabled]): new
        (-[WebIconDatabase _setIcon:forIconURL:]): assert if called when disabled, moved to own category implementation
        (-[WebIconDatabase _setHaveNoIconForIconURL:]): ditto
        (-[WebIconDatabase _setIconURL:forURL:]): ditto
        (-[WebIconDatabase _createFileDatabase]): tweak
        (-[WebIconDatabase _applicationWillTerminate:]): moved out of public code
        * Misc.subproj/WebIconDatabasePrivate.h:
        * Misc.subproj/WebIconLoader.m:
        * WebView.subproj/WebDataSource.m:
        (-[WebDataSource _updateIconDatabaseWithURL:]): assert if called when icon DB is disabled
        (-[WebDataSource _loadIcon]): don't load icon if icon DB is disabled

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8077 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/Misc.subproj/WebIconDatabase.h
WebKit/Misc.subproj/WebIconDatabase.m
WebKit/Misc.subproj/WebIconDatabasePrivate.h
WebKit/Misc.subproj/WebIconLoader.m
WebKit/WebView.subproj/WebDataSource.m

index d86b343..5acbd4f 100644 (file)
@@ -1,3 +1,30 @@
+2004-11-23  Chris Blumenberg  <cblu@apple.com>
+
+       Fixed: <rdar://problem/3890944> disable icon database for Dashboard
+
+        Reviewed by kevin.
+
+        * Misc.subproj/WebIconDatabase.h:
+        * Misc.subproj/WebIconDatabase.m:
+        (-[WebIconDatabase init]): don't create dictionaries if disabled
+        (-[WebIconDatabase iconForURL:withSize:cache:]): return default icon if disabled
+        (-[WebIconDatabase iconURLForURL:]): return nil if disabled
+        (-[WebIconDatabase retainIconForURL:]): return if disabled
+        (-[WebIconDatabase releaseIconForURL:]): ditto
+        (-[WebIconDatabase delayDatabaseCleanup]): ditto
+        (-[WebIconDatabase allowDatabaseCleanup]): ditto
+        (-[WebIconDatabase _isEnabled]): new
+        (-[WebIconDatabase _setIcon:forIconURL:]): assert if called when disabled, moved to own category implementation
+        (-[WebIconDatabase _setHaveNoIconForIconURL:]): ditto
+        (-[WebIconDatabase _setIconURL:forURL:]): ditto
+        (-[WebIconDatabase _createFileDatabase]): tweak
+        (-[WebIconDatabase _applicationWillTerminate:]): moved out of public code
+        * Misc.subproj/WebIconDatabasePrivate.h:
+        * Misc.subproj/WebIconLoader.m:
+        * WebView.subproj/WebDataSource.m:
+        (-[WebDataSource _updateIconDatabaseWithURL:]): assert if called when icon DB is disabled
+        (-[WebDataSource _loadIcon]): don't load icon if icon DB is disabled
+
 2004-11-22  David Hyatt  <hyatt@apple.com>
 
        Make sure the WebCore cache grows at 512mb and at 1024mb exactly.
index db3d92f..d550220 100644 (file)
@@ -13,6 +13,7 @@ extern NSString *WebIconDatabaseDidAddIconNotification;
 extern NSString *WebIconNotificationUserInfoURLKey;
 
 extern NSString *WebIconDatabaseDirectoryDefaultsKey;
+extern NSString *WebIconDatabaseEnabledDefaultsKey;
 
 extern NSSize WebIconSmallSize;  // 16 x 16
 extern NSSize WebIconMediumSize; // 32 x 32
@@ -51,8 +52,6 @@ extern NSSize WebIconLargeSize;  // 128 x 128
 */
 + (WebIconDatabase *)sharedIconDatabase;
 
-- (BOOL)iconsAreSaved;
-
 /*!
     @method iconForURL:withSize:
     @discussion Calls iconForURL:withSize:cache: with YES for cache.
index 6e3d2a2..2d988b1 100644 (file)
@@ -23,10 +23,11 @@ NSString * const ObsoleteIconURLToURLsKey =     @"WebIconURLToSiteURLs";
 
 static const int WebIconDatabaseCurrentVersion = 2;
 
-NSString *WebIconDatabaseDidAddIconNotification = @"WebIconDatabaseDidAddIconNotification";
-NSString *WebIconNotificationUserInfoURLKey =     @"WebIconNotificationUserInfoURLKey";
+NSString *WebIconDatabaseDidAddIconNotification =   @"WebIconDatabaseDidAddIconNotification";
+NSString *WebIconNotificationUserInfoURLKey =       @"WebIconNotificationUserInfoURLKey";
 
-NSString *WebIconDatabaseDirectoryDefaultsKey =   @"WebIconDatabaseDirectoryDefaultsKey";
+NSString *WebIconDatabaseDirectoryDefaultsKey = @"WebIconDatabaseDirectoryDefaultsKey";
+NSString *WebIconDatabaseEnabledDefaultsKey =   @"WebIconDatabaseEnabled";
 
 NSSize WebIconSmallSize = {16, 16};
 NSSize WebIconMediumSize = {32, 32};
@@ -42,7 +43,6 @@ NSSize WebIconLargeSize = {128, 128};
 - (void)_updateFileDatabase;
 - (NSMutableDictionary *)_iconsForIconURLString:(NSString *)iconURL;
 - (NSImage *)_iconForFileURL:(NSString *)fileURL withSize:(NSSize)size;
-- (NSMutableDictionary *)_builtInIconsForHost:(NSString *)host;
 - (void)_retainIconForIconURLString:(NSString *)iconURL;
 - (void)_releaseIconForIconURLString:(NSString *)iconURL;
 - (void)_retainFutureIconForURL:(NSString *)URL;
@@ -82,6 +82,14 @@ NSSize WebIconLargeSize = {128, 128};
     
     _private = [[WebIconDatabasePrivate alloc] init];
 
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+    NSDictionary *initialDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], WebIconDatabaseEnabledDefaultsKey, nil];
+    [defaults registerDefaults:initialDefaults];
+    [initialDefaults release];
+    if (![defaults boolForKey:WebIconDatabaseEnabledDefaultsKey]) {
+        return self;
+    }
+    
     [self _createFileDatabase];
     [self _loadIconDictionaries];
 
@@ -93,7 +101,7 @@ NSSize WebIconLargeSize = {128, 128};
     _private->iconURLsWithNoIcons = [[NSMutableSet alloc] init];
     
     [[NSNotificationCenter defaultCenter] addObserver:self
-                                             selector:@selector(applicationWillTerminate:)
+                                             selector:@selector(_applicationWillTerminate:)
                                                  name:NSApplicationWillTerminateNotification
                                                object:NSApp];
 
@@ -105,17 +113,12 @@ NSSize WebIconLargeSize = {128, 128};
     return self;
 }
 
-- (BOOL)iconsAreSaved
-{
-    return (_private->fileDatabase != nil);
-}
-
 - (NSImage *)iconForURL:(NSString *)URL withSize:(NSSize)size cache:(BOOL)cache
 {
     ASSERT(size.width);
     ASSERT(size.height);
     
-    if (!URL) {
+    if (!URL || ![self _isEnabled]) {
         return [self defaultIconWithSize:size];
     }
 
@@ -147,6 +150,9 @@ NSSize WebIconLargeSize = {128, 128};
 
 - (NSString *)iconURLForURL:(NSString *)URL
 {
+    if (![self _isEnabled]) {
+        return nil;
+    }
     return URL ? [_private->URLToIconURL objectForKey:URL] : nil;
 }
 
@@ -172,6 +178,10 @@ NSSize WebIconLargeSize = {128, 128};
 {
     ASSERT(URL);
     
+    if (![self _isEnabled]) {
+        return;
+    }    
+    
     NSString *iconURLString = [_private->URLToIconURL objectForKey:URL];
     
     if(iconURLString){
@@ -185,6 +195,10 @@ NSSize WebIconLargeSize = {128, 128};
 {
     ASSERT(URL);
     
+    if (![self _isEnabled]) {
+        return;
+    }    
+    
     NSString *iconURLString = [_private->URLToIconURL objectForKey:URL];
     
     if(iconURLString){
@@ -196,6 +210,10 @@ NSSize WebIconLargeSize = {128, 128};
 
 - (void)delayDatabaseCleanup
 {
+    if (![self _isEnabled]) {
+        return;
+    }
+    
     if(_private->didCleanup){
         ERROR("delayDatabaseCleanup cannot be called after cleanup has begun");
         return;
@@ -206,6 +224,10 @@ NSSize WebIconLargeSize = {128, 128};
 
 - (void)allowDatabaseCleanup
 {
+    if (![self _isEnabled]) {
+        return;
+    }
+    
     if(_private->didCleanup){
         ERROR("allowDatabaseCleanup cannot be called after cleanup has begun");
         return;
@@ -218,25 +240,106 @@ NSSize WebIconLargeSize = {128, 128};
     }
 }
 
-- (void)applicationWillTerminate:(NSNotification *)notification
+@end
+
+
+@implementation WebIconDatabase (WebPrivate)
+
+- (BOOL)_isEnabled
 {
-    // Should only cause a write if user quit before 3 seconds after the last _updateFileDatabase
-    [_private->fileDatabase sync];
+    return (_private->fileDatabase != nil);
 }
 
-@end
+- (void)_setIcon:(NSImage *)icon forIconURL:(NSString *)iconURL
+{
+    ASSERT(icon);
+    ASSERT(iconURL);
+    ASSERT([self _isEnabled]);
+    
+    NSMutableDictionary *icons = [self _iconsBySplittingRepresentationsOfIcon:icon];
+    
+    if (!icons) {
+        return;
+    }
+    
+    [_private->iconURLToIcons setObject:icons forKey:iconURL];
+    
+    [self _retainIconForIconURLString:iconURL];
+    
+    // Release the newly created icon much like an autorelease.
+    // This gives the client enough time to retain it.
+    // FIXME: Should use an actual autorelease here using a proxy object instead.
+    [self performSelector:@selector(_releaseIconForIconURLString:) withObject:iconURL afterDelay:0];
+}
 
+- (void)_setHaveNoIconForIconURL:(NSString *)iconURL
+{
+    ASSERT(iconURL);
+    ASSERT([self _isEnabled]);
+
+    [_private->iconURLsWithNoIcons addObject:iconURL];
+    
+    [self _retainIconForIconURLString:iconURL];
+    
+    // Release the newly created icon much like an autorelease.
+    // This gives the client enough time to retain it.
+    // FIXME: Should use an actual autorelease here using a proxy object instead.
+    [self performSelector:@selector(_releaseIconForIconURLString:) withObject:iconURL afterDelay:0];
+}
 
-@implementation WebIconDatabase (WebPrivate)
+
+- (void)_setIconURL:(NSString *)iconURL forURL:(NSString *)URL
+{
+    ASSERT(iconURL);
+    ASSERT(URL);
+    ASSERT([self _isEnabled]);
+    ASSERT([self _hasIconForIconURL:iconURL]);    
+    
+    if ([[_private->URLToIconURL objectForKey:URL] isEqualToString:iconURL] &&
+        [_private->iconsOnDiskWithURLs containsObject:iconURL]) {
+        // Don't do any work if the icon URL is already bound to the site URL
+        return;
+    }
+    
+    [_private->URLToIconURL setObject:iconURL forKey:URL];
+    [_private->iconURLToURLs _web_setObjectUsingSetIfNecessary:URL forKey:iconURL];
+    
+    int futureRetainCount = (int)(void *)CFDictionaryGetValue(_private->futureURLToRetainCount, URL);
+    
+    if (futureRetainCount != 0) {
+        int retainCount = (int)(void *)CFDictionaryGetValue(_private->iconURLToRetainCount, iconURL);
+        int newRetainCount = retainCount + futureRetainCount;
+        CFDictionarySetValue(_private->iconURLToRetainCount, iconURL, (void *)newRetainCount);
+        CFDictionaryRemoveValue(_private->futureURLToRetainCount, URL);
+    }
+    
+    [self _sendNotificationForURL:URL];
+    [self _updateFileDatabase];
+}
+
+- (BOOL)_hasIconForIconURL:(NSString *)iconURL;
+{
+    ASSERT([self _isEnabled]);
+    
+    return (([_private->iconURLToIcons objectForKey:iconURL] ||
+            [_private->iconURLsWithNoIcons containsObject:iconURL] ||
+             [_private->iconsOnDiskWithURLs containsObject:iconURL]) &&
+            CFDictionaryGetValue(_private->iconURLToRetainCount,iconURL));
+}
+
+@end
+
+@implementation WebIconDatabase (WebInternal)
 
 - (void)_createFileDatabase
 {
     // FIXME: Make defaults key public somehow
-    NSString *databaseDirectory = [[NSUserDefaults standardUserDefaults] objectForKey:WebIconDatabaseDirectoryDefaultsKey];
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+    NSString *databaseDirectory = [defaults objectForKey:WebIconDatabaseDirectoryDefaultsKey];
 
     if (!databaseDirectory) {
         databaseDirectory = @"~/Library/Icons";
-        [[NSUserDefaults standardUserDefaults] setObject:databaseDirectory forKey:WebIconDatabaseDirectoryDefaultsKey];
+        [defaults setObject:databaseDirectory forKey:WebIconDatabaseDirectoryDefaultsKey];
     }
     databaseDirectory = [databaseDirectory stringByExpandingTildeInPath];
     
@@ -371,12 +474,10 @@ NSSize WebIconLargeSize = {128, 128};
     [URLToIconURLCopy release];
 }
 
-- (BOOL)_hasIconForIconURL:(NSString *)iconURL;
+- (void)_applicationWillTerminate:(NSNotification *)notification
 {
-    return (([_private->iconURLToIcons objectForKey:iconURL] ||
-            [_private->iconURLsWithNoIcons containsObject:iconURL] ||
-             [_private->iconsOnDiskWithURLs containsObject:iconURL]) &&
-            CFDictionaryGetValue(_private->iconURLToRetainCount,iconURL));
+    // Should only cause a write if user quit before 3 seconds after the last _updateFileDatabase
+    [_private->fileDatabase sync];
 }
 
 - (NSMutableDictionary *)_iconsForIconURLString:(NSString *)iconURLString
@@ -428,7 +529,6 @@ NSSize WebIconLargeSize = {128, 128};
     return icons;
 }
 
-
 - (NSImage *)_iconForFileURL:(NSString *)file withSize:(NSSize)size
 {
     ASSERT(size.width);
@@ -458,70 +558,6 @@ NSSize WebIconLargeSize = {128, 128};
     return icon;
 }
 
-- (void)_setIcon:(NSImage *)icon forIconURL:(NSString *)iconURL
-{
-    ASSERT(icon);
-    ASSERT(iconURL);
-    
-    NSMutableDictionary *icons = [self _iconsBySplittingRepresentationsOfIcon:icon];
-
-    if (!icons) {
-        return;
-    }
-
-    [_private->iconURLToIcons setObject:icons forKey:iconURL];
-
-    [self _retainIconForIconURLString:iconURL];
-    
-    // Release the newly created icon much like an autorelease.
-    // This gives the client enough time to retain it.
-    // FIXME: Should use an actual autorelease here using a proxy object instead.
-    [self performSelector:@selector(_releaseIconForIconURLString:) withObject:iconURL afterDelay:0];
-}
-
-- (void)_setHaveNoIconForIconURL:(NSString *)iconURL
-{
-    ASSERT(iconURL);
-
-    [_private->iconURLsWithNoIcons addObject:iconURL];
-
-    [self _retainIconForIconURLString:iconURL];
-    
-    // Release the newly created icon much like an autorelease.
-    // This gives the client enough time to retain it.
-    // FIXME: Should use an actual autorelease here using a proxy object instead.
-    [self performSelector:@selector(_releaseIconForIconURLString:) withObject:iconURL afterDelay:0];
-}
-
-
-- (void)_setIconURL:(NSString *)iconURL forURL:(NSString *)URL
-{
-    ASSERT(iconURL);
-    ASSERT(URL);
-    ASSERT([self _hasIconForIconURL:iconURL]);
-
-    if ([[_private->URLToIconURL objectForKey:URL] isEqualToString:iconURL] &&
-       [_private->iconsOnDiskWithURLs containsObject:iconURL]) {
-        // Don't do any work if the icon URL is already bound to the site URL
-        return;
-    }
-    
-    [_private->URLToIconURL setObject:iconURL forKey:URL];
-    [_private->iconURLToURLs _web_setObjectUsingSetIfNecessary:URL forKey:iconURL];
-
-    int futureRetainCount = (int)(void *)CFDictionaryGetValue(_private->futureURLToRetainCount, URL);
-
-    if (futureRetainCount != 0) {
-        int retainCount = (int)(void *)CFDictionaryGetValue(_private->iconURLToRetainCount, iconURL);
-        int newRetainCount = retainCount + futureRetainCount;
-        CFDictionarySetValue(_private->iconURLToRetainCount, iconURL, (void *)newRetainCount);
-        CFDictionaryRemoveValue(_private->futureURLToRetainCount, URL);
-    }
-
-    [self _sendNotificationForURL:URL];
-    [self _updateFileDatabase];
-}
-
 - (void)_retainIconForIconURLString:(NSString *)iconURLString
 {
     ASSERT(iconURLString);
index a8e4f1d..7180fd5 100644 (file)
@@ -42,6 +42,8 @@
 
 @interface WebIconDatabase (WebPrivate)
 
+- (BOOL)_isEnabled;
+
 // Called by WebIconLoader after loading an icon.
 - (void)_setIcon:(NSImage *)icon forIconURL:(NSString *)iconURL;
 - (void)_setHaveNoIconForIconURL:(NSString *)iconURL;
index 6d3955b..e560dbc 100644 (file)
@@ -8,12 +8,11 @@
 
 #import <WebKit/WebIconLoader.h>
 
+#import <WebKit/WebAssertions.h>
 #import <WebKit/WebIconDatabase.h>
 #import <WebKit/WebIconDatabasePrivate.h>
 #import <WebKit/WebNSURLExtras.h>
 
-#define WebIconLoaderWeeksWorthOfSeconds (60 * 60 * 24 * 7)
-
 @interface WebIconLoaderPrivate : NSObject
 {
 @public
@@ -37,6 +36,7 @@
 
 - (id)initWithRequest:(NSURLRequest *)initialRequest;
 {
+    ASSERT([[WebIconDatabase sharedIconDatabase] _isEnabled]);
     [super init];
     _private = [[WebIconLoaderPrivate alloc] init];
     _private->initialRequest = [initialRequest copy];
index ae26259..40f2402 100644 (file)
 
 - (void)_updateIconDatabaseWithURL:(NSURL *)iconURL
 {
+    ASSERT([[WebIconDatabase sharedIconDatabase] _isEnabled]);
+    
     WebIconDatabase *iconDB = [WebIconDatabase sharedIconDatabase];
 
     // Bind the URL of the original request and the final URL to the icon URL.
 {
     // Don't load an icon if 1) this is not the main frame 2) we ended in error 3) we already did 4) they aren't save by the DB.
     if ([self webFrame] != [[self _webView] mainFrame] || _private->mainDocumentError || _private->iconLoader ||
-       ![[WebIconDatabase sharedIconDatabase] iconsAreSaved]) {
+       ![[WebIconDatabase sharedIconDatabase] _isEnabled]) {
         return;
     }