먼저 아니, 당신이 얻을 필요가 DOMWindow
nsIChannel
에서 :
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();