permissions - 可靠地在 Chrome 扩展程序中获取收藏夹图标,chrome ://favicon?

标签 permissions google-chrome-extension favicon

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

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

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

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

最佳答案

我也看到了这个问题,它真的很讨厌。

据我所知,Chrome 会在您访问 URL 后填充 chrome://favicon/缓存(省略 URL 的 #hash 部分,如果有)。它似乎通常在页面完全加载后的某个时间填充此缓存。如果您尝试访问 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);
    });
}

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

另一种可能的方法是从 http://www.google.com/s2/favicons?domain=somedomain.com 拉取收藏夹图标。 .我不太喜欢这种方式,因为它需要访问外网,依赖的服务无法保证上线,而且本身有些不可靠;我已经看到它不一致地返回 www.domain.com URL 的“地球”图标,但只返回 domain.com 的正确图标。

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

关于permissions - 可靠地在 Chrome 扩展程序中获取收藏夹图标,chrome ://favicon?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10665321/

相关文章:

ios - NSURLSessionDownloadTask移动临时文件

permissions - 不同资源组中 Blob 上的数据工厂触发器失败

javascript - DOM 的字符集与屏幕上显示的不同

google-chrome - 使用 Chrome 使用的 Google 用户以外的 Google 用户登录 Chrome 扩展程序

html - 如何禁用 FavIcon.ico

c - 在低级 c 图形代码中管理 linux framebuffer(fb0) 权限

PHP正在上传没有读取权限的文件

javascript - 如何在 javascript 中使用 Curl

Asp.Net MVC 5 - 网站图标

html - Favicon 在 IE11 中不工作;适用于 FF 和 Chrome