[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677
cblu
cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:06:56 UTC 2009
The following commit has been merged in the debian/unstable branch:
commit 07dd4f5a5a8fa1c64affbb26aefc681d565bd5af
Author: cblu <cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Fri Nov 22 23:05:20 2002 +0000
WebKit:
Attempt to fix: 3078737 - Crash in -[WebHistoryItem dealloc] after closing last window
I haven't found anything that would cause the crash. I did some clean-up, added asserts and error messages in hopes that this help me track this down.
* Misc.subproj/WebIconDatabase.h:
* Misc.subproj/WebIconDatabase.m:
(-[WebIconDatabase init]):
(-[WebIconDatabase iconForSiteURL:withSize:cache:]):
(-[WebIconDatabase iconForSiteURL:withSize:]):
(-[WebIconDatabase retainIconForSiteURL:]):
(-[WebIconDatabase releaseIconForSiteURL:]):
(-[WebIconDatabase delayDatabaseCleanup]):
(-[WebIconDatabase allowDatabaseCleanup]):
(-[WebIconDatabase _iconDictionariesAreGood]):
(-[WebIconDatabase _loadIconDictionaries]):
(-[WebIconDatabase _updateFileDatabase]):
(-[WebIconDatabase _hasIconForSiteURL:]):
(-[WebIconDatabase _iconsForIconURLString:]):
(-[WebIconDatabase _iconForFileURL:withSize:]):
(-[WebIconDatabase _setIcon:forIconURL:]):
(-[WebIconDatabase _setIconURL:forSiteURL:]):
(-[WebIconDatabase _retainIconForIconURLString:]):
(-[WebIconDatabase _releaseIconForIconURLString:]):
(-[WebIconDatabase _retainFutureIconForSiteURL:]):
(-[WebIconDatabase _releaseFutureIconForSiteURL:]):
(-[WebIconDatabase _releaseOriginalIconsOnDisk]):
(-[WebIconDatabase _sendNotificationForSiteURL:]):
(-[WebIconDatabase _addObject:toSetForKey:inDictionary:]):
(-[WebIconDatabase _largestIconFromDictionary:]):
(-[WebIconDatabase _iconsBySplittingRepresentationsOfIcon:]):
(-[WebIconDatabase _iconFromDictionary:forSize:cache:]):
(-[WebIconDatabase _scaleIcon:toSize:]):
* Misc.subproj/WebIconDatabasePrivate.h:
* WebKit.exp:
* WebView.subproj/WebDataSourcePrivate.m:
(-[WebDataSource _loadIcon]):
WebBrowser:
- Removed old scripting code.
- Removed code that installed built-in icons.
* AppController.m:
(-[AppController awakeFromNib]):
* Scripting.subproj/Scripting.h: Removed.
* Scripting.subproj/Scripting.m: Removed.
* WebBrowser.pbproj/project.pbxproj:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@2833 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 134d714..cc6d715 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,41 @@
+2002-11-22 Chris Blumenberg <cblu at apple.com>
+
+ Attempt to fix: 3078737 - Crash in -[WebHistoryItem dealloc] after closing last window
+ I haven't found anything that would cause the crash. I did some clean-up, added asserts and error messages in hopes that this help me track this down.
+
+ * Misc.subproj/WebIconDatabase.h:
+ * Misc.subproj/WebIconDatabase.m:
+ (-[WebIconDatabase init]):
+ (-[WebIconDatabase iconForSiteURL:withSize:cache:]):
+ (-[WebIconDatabase iconForSiteURL:withSize:]):
+ (-[WebIconDatabase retainIconForSiteURL:]):
+ (-[WebIconDatabase releaseIconForSiteURL:]):
+ (-[WebIconDatabase delayDatabaseCleanup]):
+ (-[WebIconDatabase allowDatabaseCleanup]):
+ (-[WebIconDatabase _iconDictionariesAreGood]):
+ (-[WebIconDatabase _loadIconDictionaries]):
+ (-[WebIconDatabase _updateFileDatabase]):
+ (-[WebIconDatabase _hasIconForSiteURL:]):
+ (-[WebIconDatabase _iconsForIconURLString:]):
+ (-[WebIconDatabase _iconForFileURL:withSize:]):
+ (-[WebIconDatabase _setIcon:forIconURL:]):
+ (-[WebIconDatabase _setIconURL:forSiteURL:]):
+ (-[WebIconDatabase _retainIconForIconURLString:]):
+ (-[WebIconDatabase _releaseIconForIconURLString:]):
+ (-[WebIconDatabase _retainFutureIconForSiteURL:]):
+ (-[WebIconDatabase _releaseFutureIconForSiteURL:]):
+ (-[WebIconDatabase _releaseOriginalIconsOnDisk]):
+ (-[WebIconDatabase _sendNotificationForSiteURL:]):
+ (-[WebIconDatabase _addObject:toSetForKey:inDictionary:]):
+ (-[WebIconDatabase _largestIconFromDictionary:]):
+ (-[WebIconDatabase _iconsBySplittingRepresentationsOfIcon:]):
+ (-[WebIconDatabase _iconFromDictionary:forSize:cache:]):
+ (-[WebIconDatabase _scaleIcon:toSize:]):
+ * Misc.subproj/WebIconDatabasePrivate.h:
+ * WebKit.exp:
+ * WebView.subproj/WebDataSourcePrivate.m:
+ (-[WebDataSource _loadIcon]):
+
2002-11-22 Richard Williamson <rjw at apple.com>
Fixed rendering issues associated with 3100120.
diff --git a/WebKit/ChangeLog-2002-12-03 b/WebKit/ChangeLog-2002-12-03
index 134d714..cc6d715 100644
--- a/WebKit/ChangeLog-2002-12-03
+++ b/WebKit/ChangeLog-2002-12-03
@@ -1,3 +1,41 @@
+2002-11-22 Chris Blumenberg <cblu at apple.com>
+
+ Attempt to fix: 3078737 - Crash in -[WebHistoryItem dealloc] after closing last window
+ I haven't found anything that would cause the crash. I did some clean-up, added asserts and error messages in hopes that this help me track this down.
+
+ * Misc.subproj/WebIconDatabase.h:
+ * Misc.subproj/WebIconDatabase.m:
+ (-[WebIconDatabase init]):
+ (-[WebIconDatabase iconForSiteURL:withSize:cache:]):
+ (-[WebIconDatabase iconForSiteURL:withSize:]):
+ (-[WebIconDatabase retainIconForSiteURL:]):
+ (-[WebIconDatabase releaseIconForSiteURL:]):
+ (-[WebIconDatabase delayDatabaseCleanup]):
+ (-[WebIconDatabase allowDatabaseCleanup]):
+ (-[WebIconDatabase _iconDictionariesAreGood]):
+ (-[WebIconDatabase _loadIconDictionaries]):
+ (-[WebIconDatabase _updateFileDatabase]):
+ (-[WebIconDatabase _hasIconForSiteURL:]):
+ (-[WebIconDatabase _iconsForIconURLString:]):
+ (-[WebIconDatabase _iconForFileURL:withSize:]):
+ (-[WebIconDatabase _setIcon:forIconURL:]):
+ (-[WebIconDatabase _setIconURL:forSiteURL:]):
+ (-[WebIconDatabase _retainIconForIconURLString:]):
+ (-[WebIconDatabase _releaseIconForIconURLString:]):
+ (-[WebIconDatabase _retainFutureIconForSiteURL:]):
+ (-[WebIconDatabase _releaseFutureIconForSiteURL:]):
+ (-[WebIconDatabase _releaseOriginalIconsOnDisk]):
+ (-[WebIconDatabase _sendNotificationForSiteURL:]):
+ (-[WebIconDatabase _addObject:toSetForKey:inDictionary:]):
+ (-[WebIconDatabase _largestIconFromDictionary:]):
+ (-[WebIconDatabase _iconsBySplittingRepresentationsOfIcon:]):
+ (-[WebIconDatabase _iconFromDictionary:forSize:cache:]):
+ (-[WebIconDatabase _scaleIcon:toSize:]):
+ * Misc.subproj/WebIconDatabasePrivate.h:
+ * WebKit.exp:
+ * WebView.subproj/WebDataSourcePrivate.m:
+ (-[WebDataSource _loadIcon]):
+
2002-11-22 Richard Williamson <rjw at apple.com>
Fixed rendering issues associated with 3100120.
diff --git a/WebKit/Misc.subproj/WebIconDatabase.h b/WebKit/Misc.subproj/WebIconDatabase.h
index 66f79b4..9f08058 100644
--- a/WebKit/Misc.subproj/WebIconDatabase.h
+++ b/WebKit/Misc.subproj/WebIconDatabase.h
@@ -10,7 +10,7 @@
// Sent whenever a site icon has changed. The object of the notification is the icon database.
// The userInfo contains the site URL who's icon has changed.
// It can be accessed with the key WebIconNotificationUserInfoSiteURLKey.
-extern NSString *WebIconDidChangeNotification;
+extern NSString *WebIconDatabaseDidAddIconNotification;
extern NSString *WebIconNotificationUserInfoSiteURLKey;
@@ -26,7 +26,6 @@ extern NSSize WebIconLargeSize; // 128 x 128
- memory cache icons at different sizes
- disk storage
- icon update notification
- - user/client icon customization
Uses:
- WebIconLoader to cache icon images
@@ -78,22 +77,6 @@ extern NSSize WebIconLargeSize; // 128 x 128
- (NSImage *)defaultIconWithSize:(NSSize)size;
/*!
- @method setIcon:forHost:
- @abstract Customize the site icon for all web sites with the given host name.
- @param icon
- @param host
-*/
-- (void)setIcon:(NSImage *)icon forHost:(NSString *)host;
-
-/*!
- @method setIcon:forSiteURL:
- @abstract Customize the site icon for a specific web page.
- @param icon
- @param siteURL
-*/
-- (void)setIcon:(NSImage *)icon forSiteURL:(NSURL *)siteURL;
-
-/*!
@method retainIconForSiteURL:
@abstract Increments the retain count of the icon.
@param siteURL
diff --git a/WebKit/Misc.subproj/WebIconDatabase.m b/WebKit/Misc.subproj/WebIconDatabase.m
index d7f902a..dc0453b 100644
--- a/WebKit/Misc.subproj/WebIconDatabase.m
+++ b/WebKit/Misc.subproj/WebIconDatabase.m
@@ -17,12 +17,12 @@
#define WebIconDatabaseDefaultDirectory ([NSString stringWithFormat:@"%@/%@", NSHomeDirectory(), @"Library/Caches/com.apple.WebKit/Icons"])
-#define WebIconsOnDiskKey @"WebIconsOnDisk"
+#define WebIconsOnDiskKey @"WebIconsOnDisk"
#define WebSiteURLToIconURLKey @"WebSiteURLToIconURLKey"
#define WebIconURLToSiteURLsKey @"WebIconURLToSiteURLs"
-#define WebHostToSiteURLsKey @"WebHostToSiteURLs"
+#define WebHostToSiteURLsKey @"WebHostToSiteURLs"
-NSString *WebIconDidChangeNotification = @"WebIconDidChangeNotification";
+NSString *WebIconDatabaseDidAddIconNotification = @"WebIconDatabaseDidAddIconNotification";
NSString *WebIconNotificationUserInfoSiteURLKey = @"WebIconNotificationUserInfoSiteURLKey";
NSSize WebIconSmallSize = {16, 16};
@@ -40,7 +40,6 @@ NSSize WebIconLargeSize = {128, 128};
- (void)_updateFileDatabase;
- (NSMutableDictionary *)_iconsForIconURLString:(NSString *)iconURL;
- (NSImage *)_iconForFileURL:(NSURL *)fileURL withSize:(NSSize)size;
-- (NSString *)_pathForBuiltInIconForHost:(NSString *)host;
- (NSMutableDictionary *)_builtInIconsForHost:(NSString *)host;
- (void)_retainIconForIconURLString:(NSString *)iconURL;
- (void)_releaseIconForIconURLString:(NSString *)iconURL;
@@ -50,11 +49,10 @@ NSSize WebIconLargeSize = {128, 128};
- (void)_releaseOriginalIconsOnDisk;
- (void)_sendNotificationForSiteURL:(NSURL *)siteURL;
- (void)_addObject:(id)object toSetForKey:(id)key inDictionary:(NSMutableDictionary *)dictionary;
-- (NSURL *)_uniqueIconURL;
- (NSImage *)_largestIconFromDictionary:(NSMutableDictionary *)icons;
- (NSMutableDictionary *)_iconsBySplittingRepresentationsOfIcon:(NSImage *)icon;
- (NSImage *)_iconFromDictionary:(NSMutableDictionary *)icons forSize:(NSSize)size cache:(BOOL)cache;
-- (NSImage *)_iconByScalingIcon:(NSImage *)icon toSize:(NSSize)size;
+- (void)_scaleIcon:(NSImage *)icon toSize:(NSSize)size;
@end
@@ -80,14 +78,12 @@ NSSize WebIconLargeSize = {128, 128};
[self _createFileDatabase];
[self _loadIconDictionaries];
- _private->iconURLToIcons = [[NSMutableDictionary dictionary] retain];
- _private->iconURLToRetainCount = [[NSMutableDictionary dictionary] retain];
- _private->futureSiteURLToRetainCount = [[NSMutableDictionary dictionary] retain];
- _private->pathToBuiltInIcons = [[NSMutableDictionary dictionary] retain];
- _private->hostToBuiltInIconPath = [[NSMutableDictionary dictionary] retain];
+ _private->iconURLToIcons = [[NSMutableDictionary dictionary] retain];
+ _private->iconURLToRetainCount = [[NSMutableDictionary dictionary] retain];
+ _private->futureSiteURLToRetainCount = [[NSMutableDictionary dictionary] retain];
- _private->iconsToEraseWithURLs = [[NSMutableSet set] retain];
- _private->iconsToSaveWithURLs = [[NSMutableSet set] retain];
+ _private->iconsToEraseWithURLs = [[NSMutableSet set] retain];
+ _private->iconsToSaveWithURLs = [[NSMutableSet set] retain];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillTerminate:)
@@ -102,11 +98,6 @@ NSSize WebIconLargeSize = {128, 128};
return self;
}
-- (NSImage *)iconForSiteURL:(NSURL *)siteURL withSize:(NSSize)size
-{
- return [self iconForSiteURL:siteURL withSize:size cache:YES];
-}
-
- (NSImage *)iconForSiteURL:(NSURL *)siteURL withSize:(NSSize)size cache:(BOOL)cache
{
ASSERT(size.width);
@@ -119,26 +110,27 @@ NSSize WebIconLargeSize = {128, 128};
if ([siteURL isFileURL]) {
return [self _iconForFileURL:siteURL withSize:size];
}
-
- NSMutableDictionary *icons = [self _builtInIconsForHost:[siteURL host]];
- if (!icons) {
- NSString *iconURLString = [_private->siteURLToIconURL objectForKey:[siteURL absoluteString]];
- if (!iconURLString) {
- // Don't have it
- return [self defaultIconWithSize:size];
- }
-
- icons = [self _iconsForIconURLString:iconURLString];
- if (!icons) {
- // This should not happen
- return [self defaultIconWithSize:size];
- }
+ NSString *iconURLString = [_private->siteURLToIconURL objectForKey:[siteURL absoluteString]];
+ if (!iconURLString) {
+ // Don't have it
+ return [self defaultIconWithSize:size];
}
+ NSMutableDictionary *icons = [self _iconsForIconURLString:iconURLString];
+ if (!icons) {
+ ERROR("WebIconDatabase said it had %@, but it doesn't.", iconURLString);
+ return [self defaultIconWithSize:size];
+ }
+
return [self _iconFromDictionary:icons forSize:size cache:cache];
}
+- (NSImage *)iconForSiteURL:(NSURL *)siteURL withSize:(NSSize)size
+{
+ return [self iconForSiteURL:siteURL withSize:size cache:YES];
+}
+
- (NSImage *)defaultIconWithSize:(NSSize)size
{
ASSERT(size.width);
@@ -156,62 +148,28 @@ NSSize WebIconLargeSize = {128, 128};
return [self _iconFromDictionary:_private->defaultIcons forSize:size cache:YES];
}
-- (void)setIcon:(NSImage *)icon forSiteURL:(NSURL *)siteURL
-{
- if(!icon || !siteURL){
- return;
- }
-
- NSURL *iconURL = [self _uniqueIconURL];
-
- [self _setIcon:icon forIconURL:iconURL];
- [self _setIconURL:iconURL forSiteURL:siteURL];
-}
-
-- (void)setIcon:(NSImage *)icon forHost:(NSString *)host
-{
- if(!icon || !host){
- return;
- }
-
- NSMutableSet *siteURLs = [_private->hostToSiteURLs objectForKey:host];
- NSURL *iconURL = [self _uniqueIconURL];
- NSEnumerator *enumerator;
- NSURL *siteURL;
-
- [self _setIcon:icon forIconURL:iconURL];
-
- if(siteURLs){
- enumerator = [siteURLs objectEnumerator];
-
- while ((siteURL = [enumerator nextObject]) != nil) {
- [self releaseIconForSiteURL:siteURL];
- [self _setIconURL:iconURL forSiteURL:siteURL];
- [self retainIconForSiteURL:siteURL];
- }
- }
-}
-
- (void)retainIconForSiteURL:(NSURL *)siteURL
{
+ ASSERT(siteURL);
+
NSString *iconURLString = [_private->siteURLToIconURL objectForKey:[siteURL absoluteString]];
if(iconURLString){
[self _retainIconForIconURLString:iconURLString];
}else{
- // Retaining an icon not in the DB. This is OK. Just remember this.
[self _retainFutureIconForSiteURL:siteURL];
}
}
- (void)releaseIconForSiteURL:(NSURL *)siteURL
{
+ ASSERT(siteURL);
+
NSString *iconURLString = [_private->siteURLToIconURL objectForKey:[siteURL absoluteString]];
if(iconURLString){
[self _releaseIconForIconURLString:iconURLString];
}else{
- // Releasing an icon not in the DB. This is OK. Just remember this.
[self _releaseFutureIconForSiteURL:siteURL];
}
}
@@ -219,21 +177,21 @@ NSSize WebIconLargeSize = {128, 128};
- (void)delayDatabaseCleanup
{
if(_private->didCleanup){
- [NSException raise:NSGenericException format:@"delayDatabaseCleanup cannot be called after cleanup has begun"];
+ ERROR("delayDatabaseCleanup cannot be called after cleanup has begun");
+ return;
}
_private->cleanupCount++;
- //NSLog(@"delayDatabaseCleanup %d", _private->cleanupCount);
}
- (void)allowDatabaseCleanup
{
if(_private->didCleanup){
- [NSException raise:NSGenericException format:@"allowDatabaseCleanup cannot be called after cleanup has begun"];
+ ERROR("allowDatabaseCleanup cannot be called after cleanup has begun");
+ return;
}
_private->cleanupCount--;
- //NSLog(@"allowDatabaseCleanup %d", _private->cleanupCount);
if(_private->cleanupCount == 0 && _private->waitingToCleanup){
[self _releaseOriginalIconsOnDisk];
@@ -302,22 +260,6 @@ NSSize WebIconLargeSize = {128, 128};
return NO;
}
}
-
- if (![_private->hostToSiteURLs isKindOfClass:[NSMutableDictionary class]]) {
- return NO;
- }
- if (![[_private->hostToSiteURLs keyEnumerator] _web_isAllStrings]) {
- return NO;
- }
- e = [_private->hostToSiteURLs objectEnumerator];
- while ((o = [e nextObject])) {
- if (![o isKindOfClass:[NSMutableSet class]]) {
- return NO;
- }
- if (![[o objectEnumerator] _web_isAllStrings]) {
- return NO;
- }
- }
return YES;
}
@@ -329,19 +271,16 @@ NSSize WebIconLargeSize = {128, 128};
_private->iconsOnDiskWithURLs = [fileDB objectForKey:WebIconsOnDiskKey];
_private->siteURLToIconURL = [fileDB objectForKey:WebSiteURLToIconURLKey];
_private->iconURLToSiteURLs = [fileDB objectForKey:WebIconURLToSiteURLsKey];
- _private->hostToSiteURLs = [fileDB objectForKey:WebHostToSiteURLsKey];
if (![self _iconDictionariesAreGood]) {
_private->iconsOnDiskWithURLs = [NSMutableSet set];
_private->siteURLToIconURL = [NSMutableDictionary dictionary];
_private->iconURLToSiteURLs = [NSMutableDictionary dictionary];
- _private->hostToSiteURLs = [NSMutableDictionary dictionary];
}
[_private->iconsOnDiskWithURLs retain];
[_private->iconURLToSiteURLs retain];
[_private->siteURLToIconURL retain];
- [_private->hostToSiteURLs retain];
}
// Only called by _setIconURL:forKey:
@@ -351,19 +290,13 @@ NSSize WebIconLargeSize = {128, 128};
return;
}
- //NSLog(@"_updateFileDatabase");
-
WebFileDatabase *fileDB = _private->fileDatabase;
- NSEnumerator *enumerator;
- NSData *iconData;
- NSString *iconURLString;
-
// Erase icons that have been released that are on disk
- enumerator = [_private->iconsToEraseWithURLs objectEnumerator];
-
+ NSEnumerator *enumerator = [_private->iconsToEraseWithURLs objectEnumerator];
+ NSString *iconURLString;
+
while ((iconURLString = [enumerator nextObject]) != nil) {
- //NSLog(@"removing %@", iconURL);
[fileDB removeObjectForKey:iconURLString];
[_private->iconsOnDiskWithURLs removeObject:iconURLString];
}
@@ -372,8 +305,9 @@ NSSize WebIconLargeSize = {128, 128};
enumerator = [_private->iconsToSaveWithURLs objectEnumerator];
while ((iconURLString = [enumerator nextObject]) != nil) {
- //NSLog(@"writing %@", iconURL);
- iconData = [[self _largestIconFromDictionary:[_private->iconURLToIcons objectForKey:iconURLString]] TIFFRepresentation];
+ NSMutableDictionary *icons = [_private->iconURLToIcons objectForKey:iconURLString];
+ NSImage *icon = [self _largestIconFromDictionary:icons];
+ NSData *iconData = [icon TIFFRepresentation];
if(iconData){
[fileDB setObject:iconData forKey:iconURLString];
[_private->iconsOnDiskWithURLs addObject:iconURLString];
@@ -387,13 +321,11 @@ NSSize WebIconLargeSize = {128, 128};
[fileDB setObject:_private->iconsOnDiskWithURLs forKey:WebIconsOnDiskKey];
[fileDB setObject:_private->siteURLToIconURL forKey:WebSiteURLToIconURLKey];
[fileDB setObject:_private->iconURLToSiteURLs forKey:WebIconURLToSiteURLsKey];
- [fileDB setObject:_private->hostToSiteURLs forKey:WebHostToSiteURLsKey];
}
- (BOOL)_hasIconForSiteURL:(NSURL *)siteURL
{
if ([siteURL isFileURL] ||
- [self _pathForBuiltInIconForHost:[siteURL host]] ||
[_private->siteURLToIconURL objectForKey:[siteURL absoluteString]]){
return YES;
}
@@ -403,9 +335,7 @@ NSSize WebIconLargeSize = {128, 128};
- (NSMutableDictionary *)_iconsForIconURLString:(NSString *)iconURLString
{
- if(!iconURLString){
- return nil;
- }
+ ASSERT(iconURLString);
NSMutableDictionary *icons = [_private->iconURLToIcons objectForKey:iconURLString];
double start, duration;
@@ -450,71 +380,24 @@ NSSize WebIconLargeSize = {128, 128};
return [self _iconFromDictionary:_private->htmlIcons forSize:size cache:YES];
}else{
icon = [workspace iconForFile:[fileURL path]];
- return [self _iconByScalingIcon:icon toSize:size];
- }
-}
-
-- (NSString *)_pathForBuiltInIconForHost:(NSString *)host
-{
- NSArray *hostParts = [host componentsSeparatedByString:@"."];
- NSMutableString *truncatedHost = [NSMutableString string];
- NSString *hostPart, *path;
- BOOL firstPart = YES;
-
- NSEnumerator *enumerator = [hostParts reverseObjectEnumerator];
- while ((hostPart = [enumerator nextObject]) != nil) {
- if(firstPart){
- [truncatedHost insertString:hostPart atIndex:0];
- firstPart = NO;
- }else{
- [truncatedHost insertString:[NSString stringWithFormat:@"%@.", hostPart] atIndex:0];
- path = [_private->hostToBuiltInIconPath objectForKey:truncatedHost];
- if(path){
- return path;
- }
- }
+ [self _scaleIcon:icon toSize:size];
+ return icon;
}
-
- return nil;
-}
-
-- (NSMutableDictionary *)_builtInIconsForHost:(NSString *)host
-{
- NSString *path = [self _pathForBuiltInIconForHost:host];
- NSMutableDictionary *icons = nil;
-
- if(path){
- icons = [_private->pathToBuiltInIcons objectForKey:path];
- if(!icons){
- NSImage *icon = [[NSImage alloc] initWithContentsOfFile:path];
- if(icon){
- icons = [self _iconsBySplittingRepresentationsOfIcon:icon];
- [_private->pathToBuiltInIcons setObject:icons forKey:path];
- [icon release];
- }
- }
- }
-
- return icons;
}
- (void)_setIcon:(NSImage *)icon forIconURL:(NSURL *)iconURL
{
- if(!icon || !iconURL){
- return;
- }
+ ASSERT(icon);
+ ASSERT(iconURL);
- NSString *iconURLString = [iconURL absoluteString];
-
- NSMutableDictionary *icons = [_private->iconURLToIcons objectForKey:iconURLString];
- [icons removeAllObjects];
-
- icons = [self _iconsBySplittingRepresentationsOfIcon:icon];
+ NSMutableDictionary *icons = [self _iconsBySplittingRepresentationsOfIcon:icon];
if(!icons){
return;
}
-
+
+ NSString *iconURLString = [iconURL absoluteString];
+ [_private->iconURLToIcons removeObjectForKey:iconURLString];
[_private->iconURLToIcons setObject:icons forKey:iconURLString];
[self _retainIconForIconURLString:iconURLString];
@@ -525,12 +408,10 @@ NSSize WebIconLargeSize = {128, 128};
[self performSelector:@selector(_releaseIconForIconURLString:) withObject:iconURLString afterDelay:0];
}
-// FIXME: fix custom icons
- (void)_setIconURL:(NSURL *)iconURL forSiteURL:(NSURL *)siteURL
{
- if(!iconURL || !siteURL){
- return;
- }
+ ASSERT(iconURL);
+ ASSERT(siteURL);
NSString *siteURLString = [siteURL absoluteString];
NSString *iconURLString = [iconURL absoluteString];
@@ -538,20 +419,14 @@ NSSize WebIconLargeSize = {128, 128};
[_private->siteURLToIconURL setObject:iconURLString forKey:siteURLString];
[self _addObject:siteURLString toSetForKey:iconURLString inDictionary:_private->iconURLToSiteURLs];
-
- [self _addObject:siteURLString toSetForKey:[siteURL host] inDictionary:_private->hostToSiteURLs];
- NSNumber *predeterminedRetainCount = [_private->futureSiteURLToRetainCount objectForKey:siteURLString];
+ NSNumber *futureRetainCount = [_private->futureSiteURLToRetainCount objectForKey:siteURLString];
- if(predeterminedRetainCount){
+ if(futureRetainCount){
NSNumber *retainCount = [_private->iconURLToRetainCount objectForKey:iconURLString];
+ ASSERT(retainCount);
- if(!retainCount){
- //NSLog(@"_setIconURL: forKey: no retainCount for iconURL");
- return;
- }
-
- int newRetainCount = [retainCount intValue] + [predeterminedRetainCount intValue];
+ int newRetainCount = [retainCount intValue] + [futureRetainCount intValue];
[_private->iconURLToRetainCount setObject:[NSNumber numberWithInt:newRetainCount] forKey:iconURLString];
[_private->futureSiteURLToRetainCount removeObjectForKey:siteURLString];
}
@@ -560,32 +435,17 @@ NSSize WebIconLargeSize = {128, 128};
[self _updateFileDatabase];
}
-- (void)_setBuiltInIconAtPath:(NSString *)path forHost:(NSString *)host
-{
- if(!path || !host){
- return;
- }
-
- [_private->hostToBuiltInIconPath setObject:path forKey:host];
-
- NSMutableSet *siteURLStrings = [_private->hostToSiteURLs objectForKey:host];
- NSString *siteURLString;
-
- NSEnumerator *enumerator = [siteURLStrings objectEnumerator];
- while ((siteURLString = [enumerator nextObject]) != nil) {
- [self _sendNotificationForSiteURL:[NSURL _web_URLWithString:siteURLString]];
- }
-}
-
- (void)_retainIconForIconURLString:(NSString *)iconURLString
{
+ ASSERT(iconURLString);
+
NSNumber *retainCount = [_private->iconURLToRetainCount objectForKey:iconURLString];
int newRetainCount;
- if(!retainCount){
- newRetainCount = 1;
- }else{
+ if(retainCount){
newRetainCount = [retainCount intValue] + 1;
+ }else{
+ newRetainCount = 1;
}
[_private->iconURLToRetainCount setObject:[NSNumber numberWithInt:newRetainCount] forKey:iconURLString];
@@ -594,16 +454,16 @@ NSSize WebIconLargeSize = {128, 128};
[_private->iconsToSaveWithURLs addObject:iconURLString];
[_private->iconsToEraseWithURLs removeObject:iconURLString];
}
-
- //NSLog(@"_retainIconForIconURLString: %@ %d", iconURLString, newRetainCount);
}
- (void)_releaseIconForIconURLString:(NSString *)iconURLString
{
+ ASSERT(iconURLString);
+
NSNumber *retainCount = [_private->iconURLToRetainCount objectForKey:iconURLString];
if (!retainCount) {
- ERROR("retain count is zero for %@", iconURLString);
+ ERROR("Tried release a non-retained icon: %@", iconURLString);
return;
}
@@ -611,46 +471,29 @@ NSSize WebIconLargeSize = {128, 128};
[_private->iconURLToRetainCount setObject:[NSNumber numberWithInt:newRetainCount] forKey:iconURLString];
if(newRetainCount == 0){
-
+
if([_private->iconsOnDiskWithURLs containsObject:iconURLString]){
[_private->iconsToEraseWithURLs addObject:iconURLString];
[_private->iconsToSaveWithURLs removeObject:iconURLString];
}
// Remove the icon's images
- NSMutableDictionary *icons = [_private->iconURLToIcons objectForKey:iconURLString];
- [icons removeAllObjects];
[_private->iconURLToIcons removeObjectForKey:iconURLString];
-
+
// Remove the icon's retain count
[_private->iconURLToRetainCount removeObjectForKey:iconURLString];
// Remove the icon's associated site URLs
- NSMutableSet *siteURLStringsForHost, *siteURLStrings;
- NSEnumerator *enumerator;
- NSString *siteURLString;
-
- siteURLStrings = [_private->iconURLToSiteURLs objectForKey:iconURLString];
+ NSSet *siteURLStrings = [_private->iconURLToSiteURLs objectForKey:iconURLString];
[_private->siteURLToIconURL removeObjectsForKeys:[siteURLStrings allObjects]];
-
- enumerator = [siteURLStrings objectEnumerator];
- while ((siteURLString = [enumerator nextObject]) != nil) {
- NSURL *siteURL = [NSURL _web_URLWithString:siteURLString];
- siteURLStringsForHost = [_private->hostToSiteURLs objectForKey:[siteURL host]];
- [siteURLStringsForHost removeObject:siteURLString];
- if([siteURLStringsForHost count] == 0){
- [_private->hostToSiteURLs removeObjectForKey:[siteURL host]];
- }
- }
-
[_private->iconURLToSiteURLs removeObjectForKey:iconURLString];
}
-
- //NSLog(@"_releaseIconForIconURLString: %@ %d", iconURLString, newRetainCount);
}
- (void)_retainFutureIconForSiteURL:(NSURL *)siteURL
{
+ ASSERT(siteURL);
+
NSString *siteURLString = [siteURL absoluteString];
NSNumber *retainCount = [_private->futureSiteURLToRetainCount objectForKey:siteURLString];
@@ -663,12 +506,12 @@ NSSize WebIconLargeSize = {128, 128};
}
[_private->futureSiteURLToRetainCount setObject:[NSNumber numberWithInt:newRetainCount] forKey:siteURLString];
-
- ////NSLog(@"_setFutureIconRetainToDictionary: %@ %d", key, newRetainCount);
}
- (void)_releaseFutureIconForSiteURL:(NSURL *)siteURL
{
+ ASSERT(siteURL);
+
NSString *siteURLString = [siteURL absoluteString];
NSNumber *retainCount = [_private->futureSiteURLToRetainCount objectForKey:siteURLString];
@@ -685,8 +528,6 @@ NSSize WebIconLargeSize = {128, 128};
}else{
[_private->futureSiteURLToRetainCount setObject:[NSNumber numberWithInt:newRetainCount] forKey:siteURLString];
}
-
- ////NSLog(@"_setFutureIconReleaseToDictionary: %@ %d", key, newRetainCount);
}
- (void)_retainOriginalIconsOnDisk
@@ -694,7 +535,6 @@ NSSize WebIconLargeSize = {128, 128};
NSEnumerator *enumerator;
NSString *iconURLString;
- //NSLog(@"_retainOriginalOnDiskIcons");
enumerator = [_private->iconsOnDiskWithURLs objectEnumerator];
while ((iconURLString = [enumerator nextObject]) != nil) {
@@ -708,7 +548,7 @@ NSSize WebIconLargeSize = {128, 128};
_private->waitingToCleanup = YES;
return;
}
- //NSLog(@"_releaseOriginalOnDiskIcons, %@", _private->iconsOnDiskWithURLs);
+
NSEnumerator *enumerator = [_private->iconsOnDiskWithURLs objectEnumerator];
NSString *iconURLString;
@@ -721,14 +561,20 @@ NSSize WebIconLargeSize = {128, 128};
- (void)_sendNotificationForSiteURL:(NSURL *)siteURL
{
+ ASSERT(siteURL);
+
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:siteURL forKey:WebIconNotificationUserInfoSiteURLKey];
- [[NSNotificationCenter defaultCenter] postNotificationName:WebIconDidChangeNotification
+ [[NSNotificationCenter defaultCenter] postNotificationName:WebIconDatabaseDidAddIconNotification
object:self
userInfo:userInfo];
}
- (void)_addObject:(id)object toSetForKey:(id)key inDictionary:(NSMutableDictionary *)dictionary
{
+ ASSERT(key);
+ ASSERT(object);
+ ASSERT(dictionary);
+
NSMutableSet *set = [dictionary objectForKey:key];
if(!set){
@@ -739,28 +585,16 @@ NSSize WebIconLargeSize = {128, 128};
[dictionary setObject:set forKey:key];
}
-- (NSURL *)_uniqueIconURL
-{
- CFUUIDRef uid = CFUUIDCreate(NULL);
- NSString *string = (NSString *)CFUUIDCreateString(NULL, uid);
- NSURL *uniqueURL = [NSURL _web_URLWithString:[NSString stringWithFormat:@"icon:%@", string]];
-
- CFRelease(uid);
- CFRelease(string);
-
- return uniqueURL;
-}
-
- (NSImage *)_largestIconFromDictionary:(NSMutableDictionary *)icons
{
+ ASSERT(icons);
NSEnumerator *enumerator = [icons keyEnumerator];
NSValue *currentSize, *largestSize=nil;
- float currentSizeArea, largestSizeArea=0;
- NSSize currentSizeSize;
+ float largestSizeArea=0;
while ((currentSize = [enumerator nextObject]) != nil) {
- currentSizeSize = [currentSize sizeValue];
- currentSizeArea = currentSizeSize.width * currentSizeSize.height;
+ NSSize currentSizeSize = [currentSize sizeValue];
+ float currentSizeArea = currentSizeSize.width * currentSizeSize.height;
if(!largestSizeArea || (currentSizeArea > largestSizeArea)){
largestSize = currentSize;
largestSizeArea = currentSizeArea;
@@ -772,19 +606,15 @@ NSSize WebIconLargeSize = {128, 128};
- (NSMutableDictionary *)_iconsBySplittingRepresentationsOfIcon:(NSImage *)icon
{
- if(!icon){
- return nil;
- }
+ ASSERT(icon);
NSMutableDictionary *icons = [NSMutableDictionary dictionary];
NSEnumerator *enumerator = [[icon representations] objectEnumerator];
NSImageRep *rep;
- NSImage *subIcon;
- NSSize size;
while ((rep = [enumerator nextObject]) != nil) {
- size = [rep size];
- subIcon = [[NSImage alloc] initWithSize:size];
+ NSSize size = [rep size];
+ NSImage *subIcon = [[NSImage alloc] initWithSize:size];
[subIcon addRepresentation:rep];
[icons setObject:subIcon forKey:[NSValue valueWithSize:size]];
[subIcon release];
@@ -794,6 +624,8 @@ NSSize WebIconLargeSize = {128, 128};
return icons;
}
+ ERROR("icon has no representations");
+
return nil;
}
@@ -806,7 +638,7 @@ NSSize WebIconLargeSize = {128, 128};
if(!icon){
icon = [[[self _largestIconFromDictionary:icons] copy] autorelease];
- icon = [self _iconByScalingIcon:icon toSize:size];
+ [self _scaleIcon:icon toSize:size];
if(cache){
[icons setObject:icon forKey:[NSValue valueWithSize:size]];
@@ -816,41 +648,18 @@ NSSize WebIconLargeSize = {128, 128};
return icon;
}
-- (NSImage *)_iconByScalingIcon:(NSImage *)icon toSize:(NSSize)size
+- (void)_scaleIcon:(NSImage *)icon toSize:(NSSize)size
{
ASSERT(size.width);
ASSERT(size.height);
-
- double start, duration;
- NSImage *scaledIcon;
- start = CFAbsoluteTimeGetCurrent();
+ double start = CFAbsoluteTimeGetCurrent();
- if([[NSUserDefaults standardUserDefaults] boolForKey:@"Experiments"]){
- // Note: This doesn't seem to make a difference for scaling up.
-
- NSSize originalSize = [icon size];
- scaledIcon = [[[NSImage alloc] initWithSize:size] autorelease];
-
- [scaledIcon lockFocus];
- NSGraphicsContext *currentContent = [NSGraphicsContext currentContext];
- [currentContent setImageInterpolation:NSImageInterpolationHigh];
- [icon drawInRect:NSMakeRect(0, 0, size.width, size.height)
- fromRect:NSMakeRect(0, 0, originalSize.width, originalSize.height)
- operation:NSCompositeSourceOver // Renders transparency correctly
- fraction:1.0];
- [scaledIcon unlockFocus];
-
- }else{
- scaledIcon = icon;
- [scaledIcon setScalesWhenResized:YES];
- [scaledIcon setSize:size];
- }
+ [icon setScalesWhenResized:YES];
+ [icon setSize:size];
- duration = CFAbsoluteTimeGetCurrent() - start;
+ double duration = CFAbsoluteTimeGetCurrent() - start;
LOG(Timing, "scaling icon took %f seconds.", duration);
-
- return scaledIcon;
}
@end
diff --git a/WebKit/Misc.subproj/WebIconDatabasePrivate.h b/WebKit/Misc.subproj/WebIconDatabasePrivate.h
index 179953d..87b5d3c 100644
--- a/WebKit/Misc.subproj/WebIconDatabasePrivate.h
+++ b/WebKit/Misc.subproj/WebIconDatabasePrivate.h
@@ -21,9 +21,6 @@
NSMutableDictionary *iconURLToSiteURLs;
NSMutableDictionary *siteURLToIconURL;
NSMutableDictionary *futureSiteURLToRetainCount;
- NSMutableDictionary *hostToSiteURLs;
- NSMutableDictionary *pathToBuiltInIcons;
- NSMutableDictionary *hostToBuiltInIconPath;
NSMutableSet *iconsOnDiskWithURLs;
NSMutableSet *iconsToEraseWithURLs;
@@ -48,8 +45,6 @@
// Called by WebDataSource to bind a web site URL to a icon URL and icon image.
- (void)_setIconURL:(NSURL *)iconURL forSiteURL:(NSURL *)siteURL;
-- (void)_setBuiltInIconAtPath:(NSString *)path forHost:(NSString *)host;
-
- (BOOL)_hasIconForSiteURL:(NSURL *)siteURL;
@end
\ No newline at end of file
diff --git a/WebKit/WebKit.exp b/WebKit/WebKit.exp
index d3765ab..b715fba 100644
--- a/WebKit/WebKit.exp
+++ b/WebKit/WebKit.exp
@@ -36,7 +36,7 @@ _WebHistoryEntriesAddedNotification
_WebHistoryEntriesRemovedNotification
_WebHistoryAllEntriesRemovedNotification
_WebHistoryLoadedNotification
-_WebIconDidChangeNotification
+_WebIconDatabaseDidAddIconNotification
_WebIconLargeSize
_WebIconMediumSize
_WebIconNotificationUserInfoSiteURLKey
diff --git a/WebKit/WebView.subproj/WebDataSourcePrivate.m b/WebKit/WebView.subproj/WebDataSourcePrivate.m
index 3cb2bbf..4ca2904 100644
--- a/WebKit/WebView.subproj/WebDataSourcePrivate.m
+++ b/WebKit/WebView.subproj/WebDataSourcePrivate.m
@@ -480,7 +480,17 @@
- (void)iconLoader:(WebIconLoader *)iconLoader receivedPageIcon:(NSImage *)icon;
{
- [[WebIconDatabase sharedIconDatabase] _setIconURL:[iconLoader URL] forSiteURL:[self URL]];
+ WebIconDatabase *iconDB = [WebIconDatabase sharedIconDatabase];
+ NSURL *originalURL = [[self _originalRequest] URL];
+ NSURL *iconURL = [iconLoader URL];
+ NSURL *URL = [self URL];
+
+ // Bind the URL of the original request and the final URL to the icon URL.
+ [iconDB _setIconURL:iconURL forSiteURL:URL];
+ if(![originalURL isEqualTo:URL]){
+ [iconDB _setIconURL:iconURL forSiteURL:originalURL];
+ }
+
[[_private->controller locationChangeDelegate] receivedPageIcon:nil forDataSource:self];
}
@@ -489,18 +499,20 @@
ASSERT(!_private->iconLoader);
if([self webFrame] == [[self controller] mainFrame] && !_private->mainDocumentError){
-
- NSURL *dataSourceURL = [self URL];
+
+ // Use the original URL because thats what history items.
+ NSURL *URL = [self URL];
WebIconDatabase *iconDB = [WebIconDatabase sharedIconDatabase];
- if([iconDB _hasIconForSiteURL:dataSourceURL]){
+ if([iconDB _hasIconForSiteURL:URL]){
// Tell about the icon immediately if the db already has it
[[_private->controller locationChangeDelegate] receivedPageIcon:nil forDataSource:self];
}else{
if(!_private->iconURL){
// No icon URL from the LINK tag so try the server's root
- _private->iconURL = [[[NSURL _web_URLWithString:@"/favicon.ico" relativeToURL:dataSourceURL] absoluteURL] retain];
+ _private->iconURL = [[[NSURL _web_URLWithString:@"/favicon.ico"
+ relativeToURL:URL] absoluteURL] retain];
}
if(_private->iconURL != nil){
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list