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

29

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

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

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

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

Я знаю, что прошло много времени с тех пор, как вы спросили об этом. Не могли бы вы рассказать, как вы смогли получить значок страницы? c00000fd

Ваш Ответ

2   ответа
2

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

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

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

Спасибо за это. Вот соответствующие изменения Chromium, чтобы позволить расширениям получать доступ к значкам:bugs.chromium.org/p/chromium/issues/detail?id=37802
22

Из того, что я могу сказать, Chrome заполняет chrome: // favicon / cache после посещения URL-адреса (пропуская часть #hash URL-адреса, если она есть). Похоже, что этот кеш обычно заполняетсяafter страница полностью загружена. Если вы пытаетесь получить доступ к 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-адресов, используя задержку = 100. Увеличение задержки, если вы можете принять ее, повысит надежность (я использую 1500 мс для моего случая использования, и она пропускает & lt; 1% времени для новых URL; эта надежность ухудшается при одновременном открытии многих вкладок). Очевидно, что это довольно неточный способ заставить его работать, но это лучший метод, который я когда-либо выяснил.

Другой возможный подход - вместо этого вытащить значок изhttp://www.google.com/s2/favicons?domain=somedomain.com, Мне не очень нравится этот подход, так как он требует доступа к внешней сети, использует сервис, который не гарантирует работоспособности и сам по себе несколько ненадежен; Я видел, как непоследовательно возвращался «глобус» Значок для URL-адреса www.domain.com пока возвращает правильный значок только для domain.com.

Надеюсь, это поможет каким-то образом.

Я представил отчет о дефекте Chrome в надежде решить эту проблему:code.google.com/p/chromium/issues/detail?id=131018
Не совсем уверен, почему это происходит ... вы используете manifest.json v2? Неиспользование стиля v2 недавно сломало мое расширение.developer.chrome.com/extensions/manifest.html
Я не знал о свойстве faviconURL вкладки! К сожалению, я хочу что-то, что работает задним числом, не открывая страницу во вкладке. Но это было полезно, и я верю, что могу добавить это сейчас, для будущих пользователей. Я просто хотел бы, чтобы это было не так сложно. Erik Rothoff
Я попробовал этот код и не могу заставить его работать. Когда я вызываю chrome.webNavigation.onCompleted.addListener (onCompleted); Я получаю сообщение об ошибке Uncaught TypeError: Невозможно прочитать свойство 'onCompleted & apos; неопределенного. У меня есть разрешение & quot; webNavigation & quot; установить в манифесте. Любая идея, почему chrome.webNavigation кажется неопределенным?

Похожие вопросы