2013-09-29 4 views
1

firefox-addon에서 hiddenDOMWindow (또는 그 안의 iframe)에서 발생한 요청을 식별하는 데 사용할 수있는 이벤트 리스너는 무엇입니까? 예를 들어, "http-on-modify-request"이벤트에서 요청이 전송되기 전에이 작업을 수행해야합니다. 나는 무엇을 시도했다hiddenDOMWindow (또는 해당 iframe 중 하나)에서 발생한 요청 식별

:

  • 레지스터를 세계에 대해 "HTTP-에-요청을 수정"; 하지만 난 소스 창을 구별 할 수 없다.
  • hiddenDOMWindow 자체에 리스너를 추가한다. 하지만 어떤 before-load-event도 찾을 수 없습니다.
  • 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(); 
관련 문제