从内部窗口销毁获取outerWindowID

时间:2012-07-05 13:39:16

标签: 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);
})

这样可行,但我想知道该观察者是否也能获得该内窗口外窗的ID。

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

希望有道理......

我已经提到了这些页面的详细信息,但无法弄明白 -

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

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

1 个答案:

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

我没试过,但看起来它会起作用。