2012-05-19 79 views
28

我在我的Google Chrome extension中使用chrome://favicon/来获取RSS提要的图标。我所做的是获取链接页面的基本路径,并将其附加到chrome://favicon/http://<domainpath>在Chrome扩展中可靠地获取图标,chrome:// favicon?

它工作真的不可靠。很多时候它报告标准的“no-favicon”-icon,即使页面确实有favicon。几乎没有关于chrome://favicon机制的文档,因此很难理解它是如何工作的。它只是一个访问过的链接缓存吗?是否有可能检测是否有图标?

从一些简单的测试,它只是您访问过的网页的图标缓存。所以如果我订阅dribbble.com的RSS源,它不会在我的扩展中显示一个favicon。然后,如果我访问chrome://favicon/http://dribbble.com/它不会返回正确的图标。然后,我在另一个选项卡中打开dribbble.com,它在选项卡中显示其图标,然后当我重新加载chrome://favicon/http://dribbble.com/选项卡时,它将返回正确的图标。然后我打开我的扩展弹出窗口,它仍然显示标准图标。但是如果我重新启动Chrome,它会在任何地方都能看到正确的图标。

现在这只是一些基础研究,并没有让我更接近解决方案。所以我的问题是:chrome://favicon/是我正在做的一个正确的用例。有没有关于它的文档?它的预期行为是什么?

+1

我知道它已经有一段时间,因为你问它测试。你能分享你如何获得网页的图标? – c00000fd

回答

22

我也看过这个问题,它真的令人讨厌。

从我所知道的,Chrome在访问URL(忽略URL的#hash部分)后填充chrome:// favicon/cache。它似乎通常会在之后的某个时间填充此缓存页面已完全加载。如果您在关联页面完全加载之前尝试访问chrome:// favicon/http://yoururl.com,则通常会返回默认的“地球图标”。随后,刷新正在显示图标的页面将会修复它们。

因此,如果可以的话,可能只是在显示给用户之前刷新显示图标的页面就可以作为修补程序。

在我的使用案例中,我实际上打开了我想从中获取图标的标签。到目前为止,最可靠的方法,我已经找到了获得他们看起来大致是这样的:

chrome.webNavigation.onCompleted.addListener(onCompleted); 

function onCompleted(details) 
{ 
    if (details.frameId > 0) 
    { 
     // we don't care about activity occurring within a subframe of a tab 
     return; 
    } 

    chrome.tabs.get(details.tabId, function(tab) { 
     var url = tab.url ? tab.url.replace(/#.*$/, '') : ''; // drop #hash 
     var favicon; 
     var delay; 

     if (tab.favIconUrl && tab.favIconUrl != '' 
      && tab.favIconUrl.indexOf('chrome://favicon/') == -1) { 
      // favicon appears to be a normal url 
      favicon = tab.favIconUrl; 
      delay = 0; 
     } 
     else { 
      // couldn't obtain favicon as a normal url, try chrome://favicon/url 
      favicon = 'chrome://favicon/' + url; 
      delay = 100; // larger values will probably be more reliable 
     } 

     setTimeout(function() { 
      /// set favicon wherever it needs to be set here 
      console.log('delay', delay, 'tabId', tab.id, 'favicon', favicon); 
     }, delay); 
    }); 
} 

这个方法返回正确的图标大约95%的时间用于新的网址,使用延迟= 100。如果可以接受它,增加延迟将增加可靠性(我的使用情况为1500毫秒,并且它在新的URL上错过了1%的时间<;当许多选项卡同时打开时,这种可靠性会恶化)。很显然,这是一个非常不精确的方式,但它是迄今为止我发现的最好的方法。

另一种可能的方法是取而代之从http://www.google.com/s2/favicons?domain=somedomain.com中收集图标。我不太喜欢这种方法,因为它需要访问外部网络,依赖于无法保证启动的服务,而且本身有点不可靠;我已经看到它不一致地返回www.domain.com URL的“globe”图标,但只返回domain.com的正确图标。

希望这有助于某种方式。

+0

我不知道tab的faviconURL属性!不幸的是,我想要一些追溯工作的东西,而不需要在标签中打开页面。但这是有帮助的,我相信我现在可以将其添加到未来的用户中。我只是希望它不那么复杂。 – ErikPerik

+1

我已经提交了一份Chrome缺陷报告,希望能够解决这个问题:https://code.google.com/p/chromium/issues/detail?id=131018 – joelpt

+0

我试过这段代码,无法得到它工作。当我调用chrome.webNavigation.onCompleted.addListener(onCompleted);我得到错误Uncaught TypeError:无法读取未定义的属性'onCompleted'。我确实在清单中设置了“webNavigation”权限。任何想法为什么chrome.webNavigation似乎是未定义的? – theMaxx

1

为了在扩展中使用chrome:// favicon/some-site。表现。JSON需要更新:

"permissions": ["chrome://favicon/"], 
"content_security_policy": "img-src chrome://favicon;" 

的版本63.0.3239.132(正式版本)(64位)

+0

谢谢你。以下是相关的Chromium更改以允许扩展程序访问网站图标:https://bugs.chromium.org/p/chromium/issues/detail?id = 37802 –