chrome:// favicon可靠地在Chrome扩展程序中获得favicon?

时间:2012-05-19 12:47:48

标签: permissions google-chrome-extension favicon

我正在使用Google Chrome extension中的chrome://favicon/获取RSS Feed的favicon。我所做的是获取链接页面的基本路径,并将其附加到chrome://favicon/http://<domainpath>

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

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

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

5 个答案:

答案 0 :(得分:22)

我也看到了这个问题,这真的令人讨厌。

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

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

在我的用例中,我实际上打开了我想从中获取favicons的标签。到目前为止,我发现获得它们的最可靠方法看起来大致如下:

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);
    });
}

此方法使用delay = 100在新网址的大约95%的时间内返回正确的图标。如果你可以接受它,增加延迟将提高可靠性(我使用1500ms用于我的用例,它在新URL上错过了<1%的时间;当同时打开许多选项卡时,这种可靠性会恶化)。显然,这是一种非常不精确的工作方式,但它是迄今为止我想到的最佳方法。

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

希望这在某种程度上有所帮助。

答案 1 :(得分:2)

要在扩展程序中使用chrome:// favicon / some-site。 manifest.json需要更新:

Error in parse_con(txt, bigint_as_char) : parse error: trailing garbage
      6b967967c8","type":"custom"} {"ts":1512318029084,"userid":"5
                 (right here) ------^

测试版本63.0.3239.132(官方版本)(64位)

答案 2 :(得分:2)

As of Oct 2020,看来使用清单版本 3 的 chrome 扩展程序不再能够访问 chrome://favicon/* url。我没有找到该消息所指的“专用 API”。

<块引用>

Manifest v3 和更高版本的扩展将无法访问 chrome://favicon 主机;相反,我们将提供一个专用的 API 权限和不同的 URL。这导致能够 收紧我们对 chrome:-scheme 的权限。

答案 3 :(得分:1)

在最新版本的Chrome浏览器中,Version 78.0.3904.87 (Official Build) (64-bit))经过测试,仅将img-src chrome://favicon;添加为content_security_policy仍会显示2条警告:

  

'content_security_policy':必须指定CSP指令'script-src'(通过'default-src'显式或隐式指定),并且必须仅将安全资源列入白名单。

并且:

  

'content_security_policy':必须指定CSP指令'object-src'(通过'default-src'显式或隐式指定),并且必须仅将安全资源列入白名单。

要摆脱它们,请使用:

"permissions": ["chrome://favicon/"],
"content_security_policy": "script-src 'self'; object-src 'self'; img-src chrome://favicon;"

现在,您可以使用chrome://favicon/http://example.com而不会收到任何错误或警告。

答案 4 :(得分:0)

我检查了Chrome历史记录页面中的网站图标,发现了这种更简单的方法-

favIcon = "chrome://favicon/size/16@1x/" + tab.url;

请不要忘记在Chrome中添加“权限”和“ content_security_policy”。 (https://stackoverflow.com/a/48304708/9586876