Revision: 26778
          http://sourceforge.net/p/bibdesk/svn/26778
Author:   hofman
Date:     2021-08-30 14:09:29 +0000 (Mon, 30 Aug 2021)
Log Message:
-----------
Cache favicons to use for history items, and reuse when loading the same URL

Modified Paths:
--------------
    trunk/bibdesk/BDSKWebGroupViewController.m
    trunk/bibdesk/BDSKWebView.h
    trunk/bibdesk/BDSKWebView.m

Modified: trunk/bibdesk/BDSKWebGroupViewController.m
===================================================================
--- trunk/bibdesk/BDSKWebGroupViewController.m  2021-08-30 13:43:48 UTC (rev 
26777)
+++ trunk/bibdesk/BDSKWebGroupViewController.m  2021-08-30 14:09:29 UTC (rev 
26778)
@@ -51,6 +51,7 @@
 #import "NSString_BDSKExtensions.h"
 #import "NSURL_BDSKExtensions.h"
 #import "NSPasteboard_BDSKExtensions.h"
+#import "BDSKWebView.h"
 
 #define MAX_HISTORY 50
 #define BACK_SEGMENT_INDEX 0
@@ -205,7 +206,7 @@
             title = [url isFileURL] ? [[url path] lastPathComponent] : [[url 
absoluteString] stringByRemovingPercentEncoding];
         }
         NSMenuItem *menuItem = [menu addItemWithTitle:title 
action:@selector(goBackForwardInHistory:) keyEquivalent:@""];
-        [menuItem setImageAndSize:[item icon]];
+        [menuItem setImageAndSize:[BDSKWebView faviconForURLString:[item 
URLString]] ?: [item icon]];
         [menuItem setTarget:self];
         [menuItem setRepresentedObject:item];
     }

Modified: trunk/bibdesk/BDSKWebView.h
===================================================================
--- trunk/bibdesk/BDSKWebView.h 2021-08-30 13:43:48 UTC (rev 26777)
+++ trunk/bibdesk/BDSKWebView.h 2021-08-30 14:09:29 UTC (rev 26778)
@@ -64,6 +64,8 @@
 
 - (IBAction)addBookmark:(id)sender;
 
++ (NSImage *)faviconForURLString:(NSString *)URLString;
+
 @end
 
 #pragma mark -

Modified: trunk/bibdesk/BDSKWebView.m
===================================================================
--- trunk/bibdesk/BDSKWebView.m 2021-08-30 13:43:48 UTC (rev 26777)
+++ trunk/bibdesk/BDSKWebView.m 2021-08-30 14:09:29 UTC (rev 26778)
@@ -82,6 +82,8 @@
 
 @dynamic delegate, navigationDelegate, URL;
 
+static NSMutableDictionary *webIcons;
+
 - (id)initWithFrame:(NSRect)frameRect frameName:(NSString *)frameName 
groupName:(NSString *)groupName {
     self = [super initWithFrame:frameRect frameName:frameName 
groupName:@"BibDeskWebGroup"];
     if (self) {
@@ -173,7 +175,16 @@
 
 #pragma mark Favicon
 
-- (void)downloadFavicon {
+- (void)retrieveFavicon {
+    NSImage *icon = [[self class] faviconForURLString:[self mainFrameURL]];
+    if (icon) {
+        [favicon release];
+        favicon = [icon retain];
+        if ([[self frameLoadDelegate] 
respondsToSelector:@selector(webView:didReceiveIcon:forFrame:)])
+            [[self frameLoadDelegate] webView:self didReceiveIcon:favicon 
forFrame:[self mainFrame]];
+        return;
+    }
+    
     NSMutableArray *favicons = [NSMutableArray array];
     WebFrame *frame = [self mainFrame];
     NSArray *nodes = [[frame DOMDocument] 
nodesForXPath:@"/html/head/link[@rel='icon' or @rel='shortcut icon' or 
@rel='apple-touch-icon' or @rel='apple-touch-icon-precomposed']"];
@@ -252,6 +263,11 @@
         [data release];
         if (favicon && [[self frameLoadDelegate] 
respondsToSelector:@selector(webView:didReceiveIcon:forFrame:)])
             [[self frameLoadDelegate] webView:self didReceiveIcon:favicon 
forFrame:[self mainFrame]];
+        if (favicon) {
+            if (webIcons == nil)
+                webIcons = [[NSMutableDictionary alloc] init];
+            [webIcons setObject:favicon forKey:[self mainFrameURL]];
+        }
     }
 }
 
@@ -258,9 +274,13 @@
 - (NSImage *)mainFrameIcon {
     if (RUNNING_BEFORE(10_13))
         return [super mainFrameIcon];
-    return favicon ?: [NSImage imageNamed:@"Bookmark"];
+    return favicon ?: [[self class] faviconForURLString:[self mainFrameURL]] 
?: [NSImage imageNamed:@"Bookmark"];
 }
 
++ (NSImage *)faviconForURLString:(NSString *)URLString {
+    return [webIcons valueForKey:URLString];
+}
+
 @end
 
 #pragma mark -
@@ -355,8 +375,8 @@
         }
         if (RUNNING_BEFORE(10_13))
             [self webView:sender setIcon:[sender mainFrameIcon]];
-         else if ([sender respondsToSelector:@selector(downloadFavicon)])
-             [(BDSKWebView *)sender downloadFavicon];
+         else if ([sender respondsToSelector:@selector(retrieveFavicon)])
+             [(BDSKWebView *)sender retrieveFavicon];
         [self webView:sender setTitle:title];
     }
     [self webView:sender setLoading:[sender isLoading]];

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
Bibdesk-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to