Ответ 1
Я тоже видел эту проблему, и это действительно неприятно.
Из того, что я могу сказать, Chrome заполняет хром://favicon/cache после посещения URL-адреса (исключая #hash часть URL-адреса, если таковая имеется). Кажется, что он обычно заполняет этот кеш когда-то после полной загрузки страницы. Если вы попытаетесь получить доступ к 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% времени для новых URL-адресов, используя delay = 100. Увеличение задержки, если вы можете принять ее, повысит надежность (я использую 1500 мс для моего варианта использования, и она пропускает менее 1% времени на новых URL-адресах, эта надежность ухудшается при одновременном открытии многих вкладок). Очевидно, это довольно неточный способ заставить его работать, но это лучший метод, который я догадался до сих пор.
Другой возможный подход заключается в том, чтобы вместо этого вывести favicons из http://www.google.com/s2/favicons?domain=somedomain.com. Мне не очень нравится такой подход, поскольку он требует доступа к внешней сети, полагается на услугу, которая не гарантирует, что она будет вверх, и сама по себе ненадежна; Я видел, что он непоследовательно возвращает значок "глобуса" для URL-адреса www.domain.com, но возвращает правильный значок только для домена .com.
Надеюсь, это поможет в некотором роде.