我正在构建的Firefox扩展的一部分获取了“内部窗口”的ID被破坏,就像这样 -
observer.add('inner-window-destroyed', function (subject, data) {
var innerWindowID = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
console.log('destroyed: '+innerWindowID);
})
这样可行,但我想知道该观察者是否也能获得该内窗口外窗的ID。
我可以在我的代码中从另一个通道观察者获得一个outerWindowID,但我不确定当内部窗口被销毁时如何从上面的观察者那里得到它。
希望有道理......
我已经提到了这些页面的详细信息,但无法弄明白 -
https://developer.mozilla.org/en/Observer_Notifications#Windows
https://developer.mozilla.org/en/Code_snippets/Windows#Uniquely_identifying_DOM_windows
答案 0 :(得分:2)
观察者只接收窗口ID,此时不再可以访问窗口本身。但是,此消息始终以dom-window-destroyed
通知开头,该通知获取实时窗口实例(与outer-window-destroyed
通知一样)。因此,您可以注册您的dom-window-destroyed
通知观察者并按照以下方式执行操作:
var innerWindows = {};
...
observer.add("dom-window-destroyed", function(subject, data)
{
var util = subject.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
try
{
var innerWindow = util.currentInnerWindowID;
var outerWindow = util.outerWindowID;
innerWindows[innerWindow] = outerWindow;
} catch (e) {} // Ignore NS_ERROR_NOT_AVAILABLE
});
observer.add("inner-window-destroyed", function(subject, data)
{
var innerWindow = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
if (innerWindow in innerWindows)
{
var outerWindow = innerWindows[innerWindow];
delete innerWindows[innerWindow];
console.log("destroyed: " + innerWindow + " (" + outerWindow + ")");
}
});
我没试过,但看起来它会起作用。