2016-07-25 7 views
0

FirefoxアドオンSDK拡張でHTTPリクエストを取得しています。リクエストに関連付けられたDOMウィンドウを取得する必要があります。しかし、私はNS_NOINTERFACEエラーが発生しています。FirefoxアドオンでHTTPリクエストを行ったDOMウィンドウを取得する

は、ここに私のコードです:私はnsIDOMWindownsILoadContextの両方を試してみた

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

が、NS_NOINTERFACEエラーは常にwindowオブジェクトを取得しようとする試みに表示されます。私は最終的に要求を開始したドキュメントのURLを取得するには、例えば

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

を経由して、私は必要なデータを取得するために管理している

+0

*コンソールメッセージ情報**を質問に「コードブロック」**に含まれるテキストとして入力してください。エラーによってテキストが伝えられないものが生成された場合は、エラーのイメージが役立つ場合があります。しかし、ほとんどの場合、コンソールメッセージのイメージを持つことは、それらをテキストとして持つことよりも有意に少なくなります。テキスト形式の場合は、コピー、貼り付け、検索が可能です。テキストとして、彼らは**多くの**より多くの質問に答えると、人々は将来同様の問題に答えを見つけることを試みています。 – Makyen

+0

私は落札して、質問にテキストとして含まれているエラー情報を持たないため、投票を終了することに投票しました。エラーメッセージをテキストとして質問に入れると、私は下向き投票を削除し、近く投票を取り消す。その場合、私は上向きに投票することがあります。 '@ Makyen'とコメントして、変更の通知を受けてください。 – Makyen

+0

@Makyenが助けてくれてありがとう、更新しました。 –

答えて

1

あなたはすでにどのように見つけているので、私は

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

素晴らしい仕事!ここにいくつかのドキュメントがあります - 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

これはあまりよくありませんがe10sフレンドリー。あなたはプロセスマネージャーとして働いています。各タブのフレームスクリプトからnsIWebProgressListenerを使用することが非常に望ましいです - https://github.com/Noitidart/Full-Stop/blob/master/resources/scripts/framescript.js – Noitidart

+0

フレームスクリプトを使用せずにURIを取得できます。ドミノの窓に触れるとe10の下でそれらが必要になります。 – the8472

0

を使用しました要求から<browser>を取得するには、SDK APIに戻るために次の操作を行うことができます。

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

modelFor()がタブモジュールに記載されています。

関連する問題