37

RSS フィードのファビコンを取得するためchrome://favicon/に、Google Chrome 拡張機能でを使用しています。私がしていることは、リンクされたページのベース パスを取得し、それを に追加することchrome://favicon/http://<domainpath>です。

それは本当に信頼できないほど働いています。多くの場合、ページに実際にファビコンがある場合でも、標準の「ファビコンなし」アイコンが報告されます。メカニズムに関するドキュメントがほとんどないchrome://faviconため、実際にどのように機能するかを理解するのは困難です。アクセスしたリンクの単なるキャッシュですか? アイコンがあったかどうかを検出することは可能ですか?

いくつかの簡単なテストから、これはあなたが訪れたページの単なるファビコンのキャッシュです. そのため、dribbble.com の RSS フィードを購読すると、拡張機能にファビコンが表示されません。次に、アクセスchrome://favicon/http://dribbble.com/しても正しいアイコンが返されません。次に、別のタブで dribbble.com を開くと、タブにアイコンが表示されます。タブをリロードするchrome://favicon/http://dribbble.com/と、正しいファビコンが返されます。次に、拡張機能のポップアップを開くと、標準のアイコンが表示されます。しかし、Chrome を再起動すると、どこにでも正しいアイコンが表示されます。

これはいくつかの基本的な研究からのものであり、解決策に近づくことはできません。だから私の質問は次のとおりですchrome://favicon/。私がやっていることの正しいユースケースですか。それに関するドキュメントはありますか?そして、これは意図された動作は何ですか?

4

5 に答える 5

25

私もこの問題を見てきましたが、本当に不快です。

私が知る限り、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 だけの適切なアイコンを返すのを見てきました。

これが何らかの形で役立つことを願っています。

于 2012-05-20T02:36:34.330 に答える
7

拡張機能で chrome://favicon/some-site を使用するには。manifest.json を更新する必要があります。

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

バージョン 63.0.3239.132 (公式ビルド) でのテスト (64 ビット)

于 2018-01-17T15:34:10.897 に答える
4

最新バージョンの Chrome ではVersion 78.0.3904.87 (Official Build) (64-bit)、テスト時に ) を追加すると、 2 つの警告が表示img-src chrome://favicon;されcontent_security_policyます。

'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これで、エラーや警告を受け取ることなく使用できます。

于 2019-11-02T04:27:38.973 に答える