Permissions 在Chrome扩展中可靠地获得favicons,chrome://favicon?

Permissions 在Chrome扩展中可靠地获得favicons,chrome://favicon?,permissions,google-chrome-extension,favicon,Permissions,Google Chrome Extension,Favicon,我正在使用chrome://favicon/在my中获取RSS源的favicon。我要做的是获取链接页面的基本路径,并将其附加到chrome://favicon/http:// 它的工作非常不可靠。很多时候,它都会报告标准的“无favicon”图标,即使页面上确实有favicon图标。关于chrome://favicon机制,因此很难理解它的实际工作原理。它只是访问过的链接的缓存吗?是否可以检测是否有图标 从一些简单的测试来看,它只是您访问过的页面的favicon缓存。因此,如果我订阅了Drib

我正在使用
chrome://favicon/
在my中获取RSS源的favicon。我要做的是获取链接页面的基本路径,并将其附加到
chrome://favicon/http://

它的工作非常不可靠。很多时候,它都会报告标准的“无favicon”图标,即使页面上确实有favicon图标。关于
chrome://favicon
机制,因此很难理解它的实际工作原理。它只是访问过的链接的缓存吗?是否可以检测是否有图标

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


这只是一些基础研究的结果,并没有让我更接近解决方案。所以我的问题是:
chrome://favicon/
我所做工作的正确用例。有相关文件吗?这是它的预期行为吗?

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

据我所知,Chrome充斥着chrome://favicon/ 访问URL后缓存(如果有,则省略URL的#散列部分)。它似乎通常在页面完全加载后的某个时间填充此缓存。如果您试图访问chrome://favicon/ 在相关页面完全加载之前,您通常会返回默认的“全局图标”。随后刷新显示图标的页面将修复这些问题

因此,如果可以的话,在向用户显示图标之前刷新正在显示图标的页面可能会起到修复作用

在我的用例中,我实际上打开了我想要从中获取favicon的选项卡。到目前为止,我发现获得它们的最可靠方法大致如下:

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%的时间内返回新URL的正确favicon。如果可以接受,增加延迟将提高可靠性(我的用例使用1500ms,为了使用它,它错过了)chrome://favicon/some-site 在extension.manifest.json中,需要更新:

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

在版本63.0.3239.132(官方版本)(64位)上进行测试

我检查了Chrome历史页面中的网站图标,发现了这个更简单的方法。 您可以通过以下方式获取favicon url--


别忘了在Chrome中添加“权限”和“内容安全策略”。(

在Chrome的最新版本中,
78.0.3904.87版(官方版本)(64位)
)测试时,只添加
img srcchrome://favicon;作为
内容安全策略
仍将显示2条警告:

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

以及:

'content\u security\u 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
没有收到任何错误或警告。

我不知道tab的faviconURL属性!不幸的是,我想要一些可以追溯的东西,而不需要在选项卡中打开页面。但这是有帮助的,我相信我现在可以为未来的用户添加这一点。我只是希望它不是那么复杂。我已经提交了一份Chrome缺陷报告,希望解决这个问题:我尝试了这个代码,但无法让它工作。当我调用chrome.webNavigation.onCompleted.addListener(onCompleted)时;我得到错误UncaughtTypeError:无法读取未定义的属性“onCompleted”。我确实拥有清单中设置的“webNavigation”权限。知道为什么chrome.webNavigation看起来没有定义吗?不知道为什么会发生这种情况。。。您正在使用manifest.json v2吗?最近有一段时间没有使用v2样式破坏了我的扩展。我知道你已经有一段时间没问了。你能分享一下你是如何获得一页的favicon的吗?谢谢。下面是允许扩展访问favicons的相关更改:我尝试了这个解决方案,但没有成功。当我的内容脚本试图显示某个选项卡的favicon时,它得到
不允许加载本地资源:chrome://favicon/https://www.google.com
。在铬88.0.4324.146上测试
"permissions": ["chrome://favicon/"],
"content_security_policy": "script-src 'self'; object-src 'self'; img-src chrome://favicon;"