Firefox addon 从内窗取出外套

Firefox addon 从内窗取出外套,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,我正在构建的Firefox扩展的一部分得到了被破坏的“内部窗口”的ID,如下所示- observer.add('inner-window-destroyed', function (subject, data) { var innerWindowID = subject.QueryInterface(Ci.nsISupportsPRUint64).data; console.log('destroyed: '+innerWindowID); }) 这工作正常,但我想知道观察者是

我正在构建的Firefox扩展的一部分得到了被破坏的“内部窗口”的ID,如下所示-

observer.add('inner-window-destroyed', function (subject, data) {
    var innerWindowID = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
    console.log('destroyed: '+innerWindowID);
})
这工作正常,但我想知道观察者是否也可以获得该内部窗口的外部窗口的ID

在我的代码中,我可以从另一个通道观测者那里获得outerWindowID,但我不确定在内部窗口被破坏时如何从上面的观测者那里获得它

希望这有意义

我参考了这些页面上的详细信息,但无法理解-


观察者只接收窗口ID,此时无法访问窗口本身。但是,此消息前面总是有一个
dom window destromed
通知,该通知获取活动窗口实例(与
outer window destromed
通知一样)。因此,您也可以为
dom窗口销毁
通知注册您的观察者,并按照以下思路进行操作:

var innerWindows={};
...
add(“dom窗口已破坏”),函数(主题、数据)
{
var util=subject.QueryInterface(Components.interfaces.nsInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
尝试
{
var innerWindow=util.currentInnerWindowID;
var outerWindow=util.outerWindowID;
innerWindow[innerWindow]=户外窗口;
}catch(e){}//Ignore NS\u ERROR\u不可用
});
添加(“内部窗口被破坏”,函数(主题,数据)
{
var innerWindow=subject.QueryInterface(Ci.nsSupportSpruInt64).data;
如果(innerWindows中的innerWindow)
{
var outerWindow=innerWindows[innerWindow];
删除innerWindow[innerWindow];
日志(“已销毁:“+innerWindow+”(“+outerWindow+”)”);
}
});

我没有尝试过,但这看起来会起作用。

谢谢@Wladimir,这是有道理的,但我不知道如何包装代码并与观察者一起参考。我只使用插件SDK来观察这样的单个事件-
observer=require('api-utils/observer服务');添加('http-on-inspect-response',函数(主题、数据){//检查响应主题
我可以将您的示例放入函数中吗?@Nils:我猜您会有两个使用该API的观察器-我已经相应地调整了我的示例。再次感谢@Wladimir,。您可以在查看控制台时打开和关闭几个选项卡来测试它。这让我意识到,我可能不需要重新设置将ID组合用于匹配内部窗口。看起来外部窗口或内部窗口使用相同的增量,但它始终是对其设置的唯一引用。@Nils:是的,窗口ID是全局唯一的。我以为您将内部窗口与特定选项卡相匹配……谢谢各位提出的好问题,非常好回答,帮了我很多忙,只是为其他人发布了一篇mdn文章的参考资料,介绍了这篇文章的基本内容:谢谢,伙计,很好的问题和很好的回答,帮了我很多忙