2012-05-19 20 views
28

Sto usando lo chrome://favicon/ nel mio Google Chrome extension per ottenere la favicon per i feed RSS. Quello che faccio è ottenere il percorso di base della pagina collegata e aggiungerlo a chrome://favicon/http://<domainpath>.Ottenere le favicon in modo affidabile nelle estensioni di Chrome, chrome: // favicon?

Sta funzionando in modo inaffidabile. Molto spesso sta segnalando lo standard "no-favicon" -icon, anche quando la pagina ha davvero una favicon. C'è quasi 0 documentazione riguardante il meccanismo chrome://favicon, quindi è difficile capire come funzioni effettivamente. È solo una cache di link che sono stati visitati? È possibile rilevare se c'era un'icona o no?

Da alcuni semplici test è solo una cache di favicon per le pagine che hai visitato. Quindi se mi iscrivo al feed RSS di dribbble.com, non mostrerà una favicon nella mia estensione. Quindi se visito lo chrome://favicon/http://dribbble.com/ non restituirà l'icona giusta. Quindi apro dribbble.com in un'altra scheda, mostra la sua icona nella scheda, quindi quando ricarico il chrome://favicon/http://dribbble.com/ -tab, restituirà la favicon corretta. Quindi apro il mio popup delle estensioni e mostra ancora l'icona standard. Ma se poi riavvio Chrome otterrà l'icona corretta ovunque.

Questo è solo da una ricerca di base e non mi avvicina a una soluzione. Quindi la mia domanda è: è il chrome://favicon/ un caso d'uso corretto per quello che sto facendo. C'è qualche documentazione per questo? E qual è questo il suo comportamento previsto?

+1

So che è stato un po 'che avete chiesto esso. Puoi condividere come sei stato in grado di ottenere la favicon per una pagina? – c00000fd

risposta

22

Ho visto anche questo problema ed è davvero odioso.

Da quello che posso dire, Chrome popola il chrome: // favicon/cache dopo aver visitato un URL (omettendo la parte #hash dell'URL, se presente). Sembra che in genere compili questa cache prima o poi dopo il una pagina sia stata caricata completamente. Se si tenta di accedere a chrome: // favicon/http://yoururl.com prima che la pagina associata sia completamente caricata, si tornerà spesso all'icona del globo predefinita. Successivamente, l'aggiornamento della pagina su cui stai visualizzando l'icona o le icone verrà risolto.

Quindi, se è possibile, se è possibile aggiornare semplicemente la pagina in cui si visualizzano le icone appena prima di visualizzarle all'utente, può servire da correzione.

Nel mio caso d'uso, in realtà sto aprendo le schede da cui desidero ottenere le favicon. Finora l'approccio più affidabile che ho trovato per ottenerli appare grosso modo così:

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

Questo approccio restituisce la favicon corretto circa il 95% del tempo per i nuovi URL, utilizzando ritardo = 100. Aumentare il ritardo se si riesce ad accettarlo aumenterà l'affidabilità (sto usando 1500 ms per il mio caso d'uso e manca lo < l'1% delle volte su nuovi URL, questa affidabilità peggiora quando vengono aperte più schede contemporaneamente). Ovviamente questo è un modo abbastanza impreciso per farlo funzionare, ma è il miglior metodo che ho capito finora.

Un altro approccio possibile è quello di estrarre le favicon da http://www.google.com/s2/favicons?domain=somedomain.com. Non mi piace molto questo approccio in quanto richiede l'accesso alla rete esterna, fa affidamento su un servizio che non ha garanzia di essere attivo, ed è in qualche modo inaffidabile; L'ho visto in modo incoerente restituire l'icona "globo" per un URL www.dominio.com e restituire l'icona corretta solo per dominio.com.

Spero che questo aiuti in qualche modo.

+0

Non conoscevo la proprietà faviconURL di tab! Sfortunatamente, voglio qualcosa che funzioni retroattivamente, senza aprire la pagina in tab. Ma questo è stato utile, e credo di poterlo aggiungere ora, per gli utenti futuri. Spero solo che non sia stato così complicato. – ErikPerik

+1

Ho inviato un rapporto sui difetti di Chrome nella speranza di risolvere questo problema: https://code.google.com/p/chromium/issues/detail?id=131018 – joelpt

+0

Ho provato questo codice e non riesco a ottenerlo lavoro. Quando chiamo chrome.webNavigation.onCompleted.addListener (onCompleted); Ricevo l'errore Uncaught TypeError: Impossibile leggere la proprietà 'onCompleted' di undefined. Ho il permesso "webNavigation" impostato nel manifest. Qualche idea sul perché chrome.webNavigation sembra essere indefinito? – theMaxx

1

Per utilizzare chrome: // favicon/un sito in estensione. manifesto.necessità JSON da aggiornare:

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

test sulla versione 63.0.3239.132 (Build ufficiale) (64-bit)

+0

Grazie per questo. Ecco le modifiche rilevanti di Chromium per consentire alle estensioni di accedere alle favicon: https://bugs.chromium.org/p/chromium/issues/detail?id=37802 –