firefox扩展名opendialog opener null

时间:2015-03-18 17:14:39

标签: javascript firefox firefox-addon

我有一个扩展程序,以帮助它的网站打开包含内容的对话框。子窗口需要操作开启窗口(重新加载父/开启者的内容)。

因此,子窗口尝试执行如下代码:

parent.opener.location.reload();parent.close();

parent.opener.document.forms[0].hdReload.value="false";
parent.opener.document.forms[0].submit();

我怎样才能让子窗口以这种方式与父母通信?

作为旁注,我如何限制访问,以便从ip X加载的代码可以打开一个包含ip X内容的窗口?

这与关于模态窗口的this question有关。

编辑1: 首先在附加组件

中尝试此代码
window.openDialog(url,name,features,event.target.ownerDocument);

在子窗口中,我可以通过

引用开启窗口
window.arguments[0];

但子窗口反过来会加载另一个文档,看起来子窗口中加载的第二个文档没有window.arguments。 我猜他们在子窗口加载另一个文档时会被删除。

1 个答案:

答案 0 :(得分:1)

如果您使用的是SDK open(),则可以传递父窗口,该窗口随后可以作为window.parent属性提供给孩子。

如果窗口位于同一个域上并因此共享会话存储,则可以使用StorageEvent s来进行相互通信。 在窗口上安装事件监听器并在另一个窗口中写入存储,他们将能够以这种方式传递消息并相互作用。

但IP X / Y表明它们来自不同的起源,但是如果您可以控制网络,则可以通过将这些IP作为子域映射到公共域,然后将document.domain设置为放宽同一起源政策的基础域。

如果两者都不是一个选项,你可以将一个窗口的窗口对象注入到另一个窗口的上下文中,这样它们就可以使用window.postMessage(),但我认为由于安全障碍可能会失败。

最后一个选项是以这种方式退回邮件:窗口A< - > Addon< - >窗口B.这可以通过让插件代码使用.postMessage将数据发送到窗口本身来完成,然后窗口通过向插件安装了特权事件监听器的自身发送另一条消息来回复。如果您正在使用SDK,则还必须通过端口API将其反弹,因此将涉及多个间接层。