2011-06-26 9 views
7

मैं फ़ायरफ़ॉक्स एक्सटेंशन, TryAgain में कुछ नई कार्यक्षमता जोड़ रहा हूं, जो HTTP त्रुटि कोड (उदा। 500) जाल करता है और कुछ अंतराल के बाद पृष्ठ को स्वचालित रूप से लोड करता है।किसी DOM विंडो से जुड़े टैब को ढूंढना

कोड का ट्रैपिंग उत्कृष्ट काम करता है, और मैं पुनः प्रयासों की कुल संख्या और store this in the tab using Session Store का मिलान करने की कोशिश कर रहा हूं। दुर्भाग्यवश, अभी मुझे एक डोम विंडो (interfaceRequestor.getInterface(Components.interfaces.nsIDOMWindow) के माध्यम से) का संदर्भ मिल रहा है, लेकिन मुझे nsISessionStore docs on setTabValue() के अनुसार nsIDOMNode एक टैब के संदर्भ की आवश्यकता है।

क्या मैं (इस उदाहरण से बाहर वास्तविक पुन: प्रयास मैं कतरना है) अब तक है:

// This function implements the nsIObserverService interface and observes 
// the status of all HTTP channels 
observe : function(aSubject, aTopic, aData) { 
    var httpChannel = aSubject 
      .QueryInterface(Components.interfaces.nsIHttpChannel); 
    if (httpChannel.responseStatus == 500) { 
     var domWindow; 
     try { 
      var notificationCallbacks; 
      if (httpChannel.notificationCallbacks) { 
       notificationCallbacks = httpChannel.notificationCallbacks; 
      } else { 
       notificationCallbacks = aSubject.loadGroup 
         .notificationCallbacks; 
      } 
      var interfaceRequestor = notificationCallbacks 
        .QueryInterface(Components.interfaces 
         .nsIInterfaceRequestor); 
      domWindow = interfaceRequestor 
        .getInterface(Components.interfaces.nsIDOMWindow); 
     } catch (e) { 
      // No window associated with this channel 
      return; 
     } 
     var ss = Components.classes["@mozilla.org/browser/sessionstore;1"] 
       .getService(Components.interfaces.nsISessionStore); 
     ss.setTabValue(domWindow, "foo", "bar"); 
    } 
}, 
निश्चित रूप से

यह एक अमान्य पैरामीटर के साथ setTabValue पर विफल रहता है। मैं डोम विंडो से जुड़े टैब को कैसे प्राप्त कर सकता हूं?

वैकल्पिक समाधान के रूप में, क्या मैं किसी डीओएम विंडो से जुड़े चर को किसी तरह से स्टोर कर सकता हूं जैसे कि मुझे स्मृति को साफ करने की आवश्यकता नहीं है?

+0

ध्यान दें कि बजाय 'getInterface (Components.interfaces.nsIDOMWindow) की' आप nsILoadContext का अनुरोध करना चाहिए - https://developer.mozilla.org/En/Updating_extensions_for_Firefox_3.5#Getting_a_load_context_from_a_request – Nickolay

उत्तर

6

domWindow एक सामग्री विंडो है, सबसे पहले आपको इसमें क्रोम विंडो प्राप्त करने की आवश्यकता है। यही कारण है कि इस बल्कि बदसूरत कोड द्वारा किया जाता है:

var browser = chromeWindow.gBrowser.getBrowserForDocument(domWindow.top.document); 
:

var chromeWindow = window.QueryInterface(Ci.nsIInterfaceRequestor) 
         .getInterface(Ci.nsIWebNavigation) 
         .QueryInterface(Ci.nsIDocShellTreeItem) 
         .rootTreeItem 
         .QueryInterface(Ci.nsIInterfaceRequestor) 
         .getInterface(Ci.nsIDOMWindow); 

तो फिर तुम टैब (ध्यान रखें कि domWindow.top में पास करना चाहिए शीर्ष फ्रेम क्योंकि domWindow नहीं हो सकता है) के बारे में <tabbrowser> तत्व पूछना चाहता हूँ

ध्यान दें कि यह <browser> तत्व है, जो संबंधित <tab> नहीं है (बाद में आपको getBrowserIndexForDocument की आवश्यकता होगी और फिर gBrowser.tabs[index] देखें)। लेकिन मुझे लगता है कि आप बस इस टैब के लिए एक संपत्ति स्टोर करना चाहते हैं, क्या यह संपत्ति सत्रों में नहीं रहती है? तो फिर तुम एक expando संपत्ति का उपयोग कर सकते हैं:

if (!("_myExtensionErrorCount" in browser)) 
    browser._myExtensionErrorCount = 0; 
browser._myExtensionErrorCount++; 

यहाँ _myExtensionErrorCount एक ऐसा नाम है जो पर्याप्त अद्वितीय अन्य एक्सटेंशन को रूप में अच्छी तरह expando गुण का उपयोग करना चाहें साथ टकराव से बचने के लिए है होना चाहिए।

+0

यह समझने के लिए धन्यवाद कि मैं क्या करने की कोशिश कर रहा हूं! आप सही हैं: इस संपत्ति को सत्रों में स्टोर करने की कोई आवश्यकता नहीं है, इसलिए यह मेरी आवश्यकताओं के लिए एक बेहतर समाधान की तरह लगता है। –

4

nsISessionStore APIs nsIDOMNode aTab का संदर्भ देने के लिए आपको डेटा संग्रहित टैब नोड को पकड़ने की आवश्यकता होती है। यदि आप ब्राउज़र.क्सुल ओवरले में काम कर रहे हैं और वर्तमान में चयनित टैब चाहते हैं, तो यह gBrowser.selectedTab जितना सरल है। तुम सिर्फ कुछ सामग्री दस्तावेज़ के लिए एक संदर्भ ओवरले के क्रोम विंडो में पकड़ तो आप निम्न तरीके से उसके संगत टैब लगता है:

function tabFromDoc(doc) { 
    var no = gBrowser.getBrowserIndexForDocument(doc); 
    return gBrowser.tabContainer.childNodes[no]; 
} 

// example use: 
Cc['@mozilla.org/browser/sessionstore;1'] 
    .getService(Ci.nsISessionStore) 
    .setTabValue(tabFromDoc(myContentDoc), 'myKey', 'myValue'); 
+0

चूंकि मुझे नहीं पता कि कौन सा टैब HTTP कोड लौटा रहा है, मुझे यह पता लगाने की आवश्यकता है कि कौन सा टैब किस विंडो से संबंधित है। ऐसा लगता है कि आपका कोड बिल्कुल ठीक है; मैं इसे जल्द से जल्द एक शॉट दे दूंगा। –

+0

आपको 'gBrowser.tabContainer.childNodes' का उपयोग नहीं करना चाहिए जबतक कि आप टैब नोड्स को पुन: व्यवस्थित नहीं कर रहे हैं, इसके बजाय' gBrowser.tabs' का उपयोग करें। –

+0

@Wladimir Palant मैं आपकी टिप्पणी को ध्यान में रखूंगा। –

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