2016-07-25 27 views
0

Ich nehme die HTTP-Anfragen in einer Firefox Add-on SDK Erweiterung auf. Ich muss das mit der Anfrage verknüpfte DOM-Fenster abrufen. Ich bekomme jedoch einen NS_NOINTERFACE Fehler.Firefox-Add-on bekomme das DOM-Fenster, das eine HTTP-Anfrage gemacht habe

Hier ist mein Code:

var httpRequestObserver = { 
    observe: function (subject, topic, data) { 
     var httpRequest = subject.QueryInterface(Ci.nsIHttpChannel); 
     var requestUrl = subject.URI.host; 
     var domWin; 
     var assWindow; 
     console.log('URL: ', requestUrl); 
     try { 
     domWin = httpRequest.notificationCallbacks.getInterface(Ci.nsIDOMWindow); 
     assWindow = httpChannel.notificationCallbacks.getInterface(Ci.nsILoadContext) 
           .associatedWindow; 
     console.log(domWin); 
     } catch (e) { 
     console.log(e); 
     } 
     // console.log('TAB: ', tabsLib.getTabForWindow(domWin.top)); 

     var hostName = wn.domWindow.getBrowser().selectedBrowser.contentWindow.location.host; 
     console.log('HOST: ', hostName); 
    }, 

    get observerService() { 
     return Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService); 
    }, 

    register: function() { 
     this.observerService.addObserver(this, 'http-on-modify-request', false); 
    }, 

    unregister: function() { 
     this.observerService.removeObserver(this, 'http-on-modify-request'); 
    } 
    }; 

    httpRequestObserver.register(); 

ich beide nsIDOMWindow und nsILoadContext versucht haben, aber NS_NOINTERFACE Fehler erscheint immer auf dem Versuch, das window Objekt zu erhalten.

+0

* Bitte *, [bearbeiten] Sie die Frage, um Informationen zur Konsolennachricht ** in die Frage als Text einzufügen, der in einem 'Codeblock' ** enthalten ist. Wenn der Fehler etwas generiert, das der Text nicht übermitteln kann, kann ein Bild des Fehlers hilfreich sein. In den meisten Fällen ist es jedoch wesentlich weniger hilfreich, ein Bild von Konsolennachrichten zu haben, als sie als Text zu haben. Im Textformat können sie kopiert, eingefügt und durchsucht werden. Als Text sind sie ** viel nützlicher, sowohl für die Beantwortung der Frage als auch für Leute, die versuchen, die Antwort auf ihr ähnliches Problem in der Zukunft zu finden. – Makyen

+0

Ich habe abgelehnt und votet, um zu schließen, weil die Fehlerinformationen in der Frage nicht als Text enthalten sind. Wenn Sie die Fehlermeldungen in die Frage als Text eingeben, werde ich meine Down-Vote entfernen und meine enge Abstimmung zurückziehen. In diesem Fall kann ich abstimmen. Bitte hinterlassen Sie einen Kommentar mit '@ Makyen', damit ich über die Änderung informiert werde. – Makyen

+0

@Makyen danke für Hilfe, aktualisiert. –

Antwort

1

Ich habe es endlich geschafft, die Daten, die ich über

httpRequest.notificationCallbacks.getInterface(Ci.nsILoadContext).topFrameElement 

Zum Beispiel müssen zu erhalten, URL des Dokuments zu erhalten, die die Anfrage gestartet, ich

verwendet
httpRequest.notificationCallbacks.getInterface(Ci.nsILoadContext).topFrameElement._documentURI.href 
+1

Super Job! Hier ist eine Dokumentation, die helfen könnte - https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Tabbed_browser#Getting_the_browser_that_fires_the_http-on-modify-request_notification_(example_code_updated_for_loadContext) – Noitidart

+1

Beachten Sie jedoch, dass dies nicht sehr ist e10s freundlich. Wie Sie im Prozessmanager arbeiten. Es ist viel vorzuziehen, nsIWebProgressListener aus dem Framescript jeder Registerkarte zu verwenden - https://github.com/Noitidart/Full-Stop/blob/master/resources/scripts/framescript.js – Noitidart

+0

der URI kann ohne Verwendung von Frame-Skripten erhalten werden. aber das dom-Fenster zu berühren wird sie unter e10s brauchen. – the8472

0

Da Sie bereits gefunden, wie Um die <browser> aus der Anfrage zu erhalten, können Sie Folgendes tun, um zurück zu SDK APIs zu gelangen:

let browser = ....topFrameElement 
let xulTab = browser.ownerDocument.defaultView.gBrowser.getTabForBrowser(browser) 
let sdkTab = modelFor(xulTab) 

modelFor() ist im Registerkartenmodul dokumentiert.