2012-05-19 9 views
28

Estoy usando el chrome://favicon/ en mi Google Chrome extension para obtener el favicon para los feeds RSS. Lo que hago es obtener la ruta base de la página vinculada y anexarla al chrome://favicon/http://<domainpath>.Obteniendo favicons de manera confiable en las extensiones de Chrome, chrome: // favicon?

Está funcionando de manera poco confiable. Muchas veces se informa el icono estándar "no favicon", incluso cuando la página realmente tiene un favicon. Hay casi 0 documentación sobre el mecanismo chrome://favicon, por lo que es difícil entender cómo funciona realmente. ¿Es solo un caché de enlaces que han sido visitados? ¿Es posible detectar si hubo un icono o no?

De algunas pruebas simples es solo un caché de favicons para las páginas que ha visitado. Entonces, si me suscribo a la fuente RSS de dribbble.com, no mostrará un favicon en mi extensión. Entonces, si visito chrome://favicon/http://dribbble.com/, no devolverá el ícono correcto. Luego abro dribbble.com en otra pestaña, muestra su ícono en la pestaña, luego cuando recargo el chrome://favicon/http://dribbble.com/ -tab, devolverá el favicon correcto. Luego abro mi ventana emergente de extensiones y todavía muestra el ícono estándar. Pero si luego reinicio Chrome obtendrá el icono correcto en todas partes.

Ahora, eso es solo por una investigación básica, y no me acerca a una solución. Entonces mi pregunta es: ¿Es el chrome://favicon/ un caso de uso correcto de lo que estoy haciendo? ¿Hay alguna documentación para eso? ¿Y cuál es este su comportamiento previsto?

+1

Sé que ha pasado un tiempo desde que se le pida. ¿Puedes compartir cómo pudiste obtener el favicon para una página? – c00000fd

Respuesta

22

He visto este problema también y es realmente desagradable.

Según lo que puedo decir, Chrome rellena el cromo: // favicon/caché después de visitar una URL (omitiendo la parte #hash de la URL, si la hay). Parece que generalmente llena este caché en algún momento después de una página está completamente cargada. Si intenta acceder a chrome: // favicon/http://yoururl.com antes de que la página asociada esté completamente cargada, a menudo obtendrá el 'icono de globo' predeterminado. Posteriormente, actualizar la página en la que está mostrando los íconos los arreglará.

Así que, si puede, posiblemente solo actualizar la página que está mostrando los iconos justo antes de mostrarlo al usuario puede servir como una solución.

En mi caso de uso, en realidad estoy abriendo pestañas de las que quiero obtener los favicons. Hasta ahora, el método más fiable que he encontrado para obtenerlos se ve más o menos así:

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); 
    }); 
} 

Este método devuelve el favicon correcta alrededor del 95% del tiempo para las nuevas direcciones URL, utilizando retraso = 100. Aumentar el retraso si puede aceptarlo aumentará la confiabilidad (estoy usando 1500ms para mi caso de uso y falla < 1% del tiempo en URL nuevas; esta fiabilidad empeora cuando se abren muchas pestañas simultáneamente). Obviamente, esta es una forma bastante imprecisa de hacerlo funcionar, pero es el mejor método que he descubierto hasta ahora.

Otro enfoque posible es extraer los favicons de http://www.google.com/s2/favicons?domain=somedomain.com. No me gusta mucho este enfoque, ya que requiere acceder a la red externa, depende de un servicio que no tiene garantía de estar activo, y en sí mismo es poco confiable; He visto que devuelve de manera irregular el ícono del "globo" para una URL de www.domain.com y devuelve el ícono correcto solo para domain.com.

Espero que esto ayude de alguna manera.

+0

¡No sabía acerca de la propiedad faviconURL de la pestaña! Desafortunadamente, quiero algo que funcione retroactivamente, sin abrir la página en la pestaña. Pero esto fue útil, y creo que puedo agregar esto ahora, para futuros usuarios. Solo desearía que no fuera tan complicado. – ErikPerik

+1

He enviado un informe de defectos de Chrome con la esperanza de solucionar este problema: https://code.google.com/p/chromium/issues/detail?id=131018 – joelpt

+0

Intenté este código y no puedo obtenerlo. trabajo. Cuando llamo a chrome.webNavigation.onCompleted.addListener (onCompleted); Aparece el error Uncaught TypeError: no se puede leer la propiedad 'onCompleted' de undefined. Tengo el permiso "webNavigation" establecido en el manifiesto. ¿Alguna idea de por qué chrome.webNavigation parece estar indefinido? – theMaxx

1

Para usar chrome: // favicon/some-site en la extensión. manifiesto.JSON necesidad de ser actualizado:

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

prueba en la versión 63.0.3239.132 (Build oficial) (64 bits)

+0

Gracias por esto. Aquí hay cambios relevantes de Chromium para permitir que las extensiones tengan acceso a los favicons: https://bugs.chromium.org/p/chromium/issues/detail?id=37802 –

Cuestiones relacionadas