1

我正在构建的 Firefox 扩展的一部分将“内窗”的 ID 销毁,如下所示 -

observer.add('inner-window-destroyed', function (subject, data) {
    var innerWindowID = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
    console.log('destroyed: '+innerWindowID);
})

这工作正常,但我想知道该观察者是否也可以获取该内部窗口的外部窗口的 ID。

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

希望这是有道理的...

我已经参考了这些页面上的详细信息,但无法弄清楚 -

https://developer.mozilla.org/en/Observer_Notifications#Windows

https://developer.mozilla.org/en/Code_snippets/Windows#Uniquely_identifying_DOM_windows

4

1 回答 1

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 + ")");
  }
});

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

于 2012-07-05T14:07:28.893 回答