私もこの問題を見てきましたが、本当に不快です。
私が知る限り、URL にアクセスした後、Chrome は 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);
});
}
このアプローチでは、delay=100 を使用すると、新しい URL に対して約 95% の確率で正しいファビコンが返されます。許容できる場合は遅延を増やすと、信頼性が向上します (私の使用例では 1500 ミリ秒を使用していますが、新しい URL では 1% 未満の時間で失われます。この信頼性は、多くのタブが同時に開かれている場合に悪化します)。明らかに、これはかなり不正確な方法ですが、これは私がこれまでに見つけた最良の方法です。
別の方法として、代わりにhttp://www.google.com/s2/favicons?domain=somedomain.comからファビコンを取得することもできます。このアプローチは、外部ネットワークへのアクセスが必要であり、稼働しているという保証のないサービスに依存し、それ自体がやや信頼できないため、あまり好きではありません。www.domain.com URL の「地球」アイコンを返すのに一貫性がなく、domain.com だけの適切なアイコンを返すのを見てきました。
これが何らかの形で役立つことを願っています。