2012-05-19 17 views
28

मैं आरएसएस फ़ीड के लिए फेविकॉन प्राप्त करने के लिए अपने Google Chrome extension में chrome://favicon/ का उपयोग कर रहा हूं। मैं जो करता हूं वह लिंक पेज का मूल पथ प्राप्त करता है, और इसे chrome://favicon/http://<domainpath> में जोड़ता है।क्रोम एक्सटेंशन में फेविकॉन प्राप्त कर रहे हैं, क्रोम: // फेविकॉन?

यह वास्तव में अविश्वसनीय रूप से काम कर रहा है। कई बार यह मानक "नो-फेविकॉन" -कॉन की रिपोर्टिंग कर रहा है, भले ही पृष्ठ में वास्तव में एक फेविकॉन हो। chrome://favicon तंत्र के संबंध में लगभग 0 दस्तावेज हैं, इसलिए यह समझना मुश्किल है कि यह वास्तव में कैसे काम करता है। क्या यह सिर्फ लिंक का एक कैश है जिसका दौरा किया गया है? क्या यह पता लगाना संभव है कि कोई आइकन था या नहीं?

कुछ सरल परीक्षण से यह सिर्फ आप जिन पन्नों का दौरा किया है के लिए पसंदीदा आइकन की एक कैश है। इसलिए यदि मैं dribbble.com की आरएसएस फ़ीड की सदस्यता लेता हूं, तो यह मेरे विस्तार में एक फेविकॉन नहीं दिखाएगा। फिर यदि मैं chrome://favicon/http://dribbble.com/ पर जाता हूं तो यह सही आइकन नहीं लौटाएगा। फिर मैं किसी अन्य टैब में dribbble.com खोलता हूं, यह टैब में अपना आइकन दिखाता है, फिर जब मैं chrome://favicon/http://dribbble.com/ -tab पुनः लोड करता हूं, तो यह सही फेविकॉन वापस कर देगा। फिर मैं अपने एक्सटेंशन पॉपअप खोलता हूं और यह अभी भी मानक आइकन दिखाता है। लेकिन अगर मैं क्रोम को पुनरारंभ करता हूं तो इसे हर जगह सही आइकन मिल जाएगा।

अब जब कि बस कुछ बुनियादी अनुसंधान से है, और मुझे किसी भी एक समाधान के करीब नहीं मिलता है। तो मेरा सवाल है: क्या chrome://favicon/ मैं जो कर रहा हूं उसके लिए एक सही उपयोग-मामला है। क्या इसके लिए कोई दस्तावेज है? और यह इसका इरादा व्यवहार क्या है?

+1

मुझे पता है कि यह एक समय हो गया है जब से तुम यह पूछा पर टेस्ट। क्या आप साझा कर सकते हैं कि आप किसी पृष्ठ के लिए फेविकॉन कैसे प्राप्त कर पाए? – c00000fd

उत्तर

22

मैंने इस समस्या को भी देखा है और यह वास्तव में अप्रिय है।

मैं क्या बता सकते हैं, क्रोम क्रोम भरता है: // फ़ेविकॉन/कैश के बाद आप (यूआरएल यदि कोई हो की #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); 
    }); 
} 

यह दृष्टिकोण सही फ़ेविकॉन नए URL के लिए समय की लगभग 95%, देरी = 100 का उपयोग कर देता है। देरी को बढ़ाने से आप इसे स्वीकार कर सकते हैं विश्वसनीयता (मैं अपने उपयोग के मामले के लिए 1500ms का उपयोग कर रहा हूं और < नए यूआरएल पर 1% समय याद करता है; यह विश्वसनीयता खराब होती है जब कई टैब एक साथ खोले जा रहे हैं)। जाहिर है, यह काम करने का एक बहुत ही कमजोर तरीका है, लेकिन अब तक यह सबसे अच्छा तरीका है जिसे मैंने अभी तक निकाला है।

एक अन्य संभावित दृष्टिकोण के बजाय http://www.google.com/s2/favicons?domain=somedomain.com से पसंदीदा आइकन को खींचने के लिए है। मुझे इस दृष्टिकोण को बहुत पसंद नहीं है क्योंकि इसे बाहरी नेटवर्क तक पहुंचने की आवश्यकता है, ऐसी सेवा पर निर्भर करता है जिसकी कोई गारंटी नहीं है, और यह कुछ हद तक अविश्वसनीय है; मैंने इसे www.domain.com यूआरएल के लिए "ग्लोब" आइकन असंगत रूप से वापस देखा है, फिर भी डोमेन.com के लिए उचित आइकन वापस कर दिया है।

उम्मीद है कि यह किसी भी तरह से मदद करता है।

+0

मुझे टैब की faviconURL संपत्ति के बारे में पता नहीं था! दुर्भाग्य से, मुझे ऐसा कुछ चाहिए जो टैब में पेज खोलने के बिना पीछे से काम करता है। लेकिन यह सहायक था, और मुझे विश्वास है कि मैं भविष्य में उपयोगकर्ताओं के लिए इसे जोड़ सकता हूं। मैं बस इतना चाहता हूं कि यह इतना जटिल नहीं था। – ErikPerik

+1

मैंने इस समस्या को हल करने की उम्मीद में क्रोम दोष रिपोर्ट सबमिट की है: https://code.google.com/p/chromium/issues/detail?id=131018 – joelpt

+0

मैंने इस कोड को आजमाया और इसे प्राप्त नहीं कर सकता काम। जब मैं chrome.webNavigation.onCompleted.addListener (पूर्ण पर) को कॉल करता हूं; मुझे त्रुटि मिलती है Uncaught TypeError: अपरिभाषित की 'पूर्ण' पर संपत्ति नहीं पढ़ी जा सकती है। मेरे पास मैनिफेस्ट में "WebNavigation" सेट की अनुमति है। कोई विचार क्यों chrome.webNavigation अपरिभाषित प्रतीत होता है? – theMaxx

1

क्रोम: // फेविकॉन/एक्सटेंशन में कुछ साइट का उपयोग करने के लिए। प्रकट।json जरूरत अद्यतन किया जाना:

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

संस्करण 63.0.3239.132 (आधिकारिक बिल्ड) (64-बिट)

+0

इसके लिए धन्यवाद। एक्सटेंशन को फेविकॉन तक पहुंचने की अनुमति देने के लिए यहां प्रासंगिक क्रोमियम परिवर्तन दिए गए हैं: https://bugs.chromium.org/p/chromium/issues/detail?id=37802 –

संबंधित मुद्दे