2013-09-29 29 views
1

可以使用哪些事件偵聽器來識別firefox-addon中源於hiddenDOMWindow(或其中的iframe)的請求?例如,在請求發送之前,我需要在「http-on-modify-request」事件中執行此操作。確定源自hiddenDOMWindow(或其iframe之一)的請求

我已經試過什麼:

  • 寄存器爲全球「HTTP上 - 修改 - 要求」;但我無法區分源窗口
  • 將偵聽器添加到隱藏的DOM窗口本身;但我找不到任何加載前事件
  • 將偵聽器添加到hiddenDOMWindow.document;沒有加載前事件
  • 將偵聽器添加到創建的hiddenDOMWindow.document.iframe;沒有前負荷事件

回答

4

首先,你需要獲得一個DOMWindownsIChannel

function getDOMWindowFromChannel(ch) { 
    var wp; 
    try { 
     if (ch.loadGroup && ch.loadGroup.groupObserver) { 
      wp = ch.loadGroup.groupObserver. 
       QueryInterface(Ci.nsIWebProgress); 
     } 
    } catch (ex) {} 
    try { 
     if (!wp) { 
      wp = ch.notificationCallbacks. 
       getInterface(Ci.nsIWebProgress); 
     } 
    } 
    catch (ex) {} 
    try { 
     if (wp) { 
      return wp.DOMWindow || null; 
     } 
    } 
    catch (ex) {} 
    return null; 
} 

現在你得到了一個DOMWindow,你需要找到那個DOMWindow頂層窗口,這是不是真的直觀:

function getToplevelWindow(win) { 
    try { 
     return win.QueryInterface(Ci.nsIInterfaceRequestor). 
       getInterface(Ci.nsIWebNavigation). 
       QueryInterface(Ci.nsIDocShell). 
       treeOwner. 
       QueryInterface(Ci.nsIInterfaceRequestor). 
       getInterface(Ci.nsIXULWindow). 
       docShell. 
       contentViewer.DOMDocument.defaultView; 
    } 
    catch (ex) { 
     // Likely already a top-level window. 
     return win; 
    } 
} 

現在,讓我們的工藝和安裝觀測,把它們放在一起:

function observe(channel, topic, data) { 

    if (!(channel instanceof Ci.nsIChannel)) { 
     return; 
    } 
    var win = getDOMWindowFromChannel(channel); 
    if (!win) { 
     return; 
    } 
    var topWin = getToplevelWindow(win); 
    if (topWin.location.href.indexOf("chrome://browser/content/hiddenWindow") != 0) { 
     return; 
    } 
    // do stuff, e.g. 
    console.log(topWin.location.href); 
} 

Services.obs.addObserver(observe, "http-on-modify-request", false); 

應當指出的是,並非所有的請求都nsIChannel,而不是所有nsIChannel實際上有DOMWindow或相關實loadGroup(例如後臺請求),因此所有這些塊都是try catch

此外,不要忘記在某些時候刪除觀察者,我跳過了這一點。 ;)

最後,這裏是一些代碼來實際測試這個(我跑了整個事情的便籤:NEWTAB標籤,其中恰好有鍍鉻特權就像加載項):

var hw = Services.appShell.hiddenDOMWindow; 
var iframe = hw.document.createElement("iframe"); 
hw.document.documentElement.appendChild(iframe); 
var r = iframe.contentWindow.XMLHttpRequest(); 
r.open("GET", "http://example.org/"); 
r.send(); 
相關問題