Подтвердить что ты не робот

Надежность получения значков в расширениях Chrome, хром://favicon?

Я использую chrome://favicon/ в своем расширении Google Chrome, чтобы получить значок для RSS-каналов. Я получаю базовый путь к связанной странице и добавляю ее к chrome://favicon/http://<domainpath>.

Он работает действительно неудовлетворительно. Много времени он сообщал о стандартном "не-favicon" -icon, даже если на странице действительно есть значок. Существует почти 0 документации относительно механизма chrome://favicon, поэтому трудно понять, как это работает. Это только кеш ссылок, которые были посещены? Можно ли определить, есть ли значок или нет?

Из некоторого простого тестирования это всего лишь кеш favicons для страниц, которые вы посетили. Поэтому, если я подпишусь на RSS-канал dribbble.com, он не покажет значок в моем расширении. Затем, если я нахожусь chrome://favicon/http://dribbble.com/, он не вернет значок справа. Затем я открываю dribbble.com на другой вкладке, он показывает свой значок на вкладке, а затем, когда я перезагружаю chrome://favicon/http://dribbble.com/ -tab, он вернет правильный значок. Затем я открываю всплывающее окно с расширениями, и он по-прежнему показывает стандартный значок. Но если я перезапущу Chrome, он получит правильный значок везде.

Теперь, что только из некоторых фундаментальных исследований, и не приближает меня к решению. Поэтому мой вопрос: правильный ли вариант chrome://favicon/ для того, что я делаю. Есть ли для этого документация? И каково это его предполагаемое поведение?

4b9b3361

Ответ 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.

Надеюсь, это поможет в некотором роде.

Ответ 2

Чтобы использовать chrome://favicon/some-site в расширении. manifest.json необходимо обновить:

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

Тест на версии 63.0.3239.132 (официальная сборка) (64-разрядная версия)

Ответ 3

Я проверил значок веб-сайта на странице истории Chrome и нашел этот более простой метод -

favIcon = "chrome://favicon/size/[email protected]/" + tab.url;

Не забудьте добавить "разрешения" и "content_security_policy" в Chrome. (fooobar.com/info/193250/...)