0

我有一个扩展名,里面有一个 XUL 文件(我们称之为 A)。XUL 文件包含一个<iframe>,其中加载了一些网页(我们称之为 B)。B 是从不同的域加载的。
A 是 B 的父母。我想使用 B 向 A 发送消息window.parent.postMessage()。我收到以下异常:

... 拒绝 B 调用方法 ChromeWindow.postMessage 的权限

如何修复该错误?如果没有办法做到这一点,我该如何将消息从 B 传递给 A?

我在 Windows 7 下使用 Firefox 16.0.1。

4

3 回答 3

1

我有一个非常相似的问题,只是我有一个无法将“postMessage”发送到我的 xul-background-task 的 html-popup(本地)。我想我让它工作了,奇怪的是通过启动我自己的 MessageEvent (与 postMessage 所做的一样)但有一个(我相信过时的)后备......简而言之:我从 MDN 和其他网站一起酿造了一些东西;)

我在内容中的脚本:

var Communicator = 
{
    postMessage: function(data) 
    { 
        // We need some element to attach the event to, since "window" wont work
        // let's just use a fallback JSON-stringified textnode
        var request = document.createTextNode(JSON.stringify(data));
        // and as always attach it to the current contentwindow
        document.head.appendChild(request);
        // Now let's make a MessageEvent of our own, just like window.postMessage would do
        var event = document.createEvent("MessageEvent");
        event.initMessageEvent ("own_message", true, false, data, window.location, 0, window, null);
        // you might want to change "own_message" back to "message" or whatever you like
        //and there we go
        request.dispatchEvent(event);
    }
}

而不是 window.postMessage(data) 现在使用 Communicator.postMessage(data) 就是这样!现在在我的覆盖中除了我们的好老

addEventListener('own_message', someMessageFunc, false, true);
//or maybe even "message" just like originally

希望这也对您有用(没有在 iframe 上检查...)

于 2013-01-11T13:19:11.950 回答
0

你应该检查typeiframe B

编辑:

显然,您必须将您的 chrome 标记为contentaccessible,并考虑到安全性。

于 2012-10-27T09:27:57.847 回答
0

只是张贴以防有人遇到同样的问题。使用此处
描述的事件成功地将消息从 B 内部发送到A。

但这不是答案,因为window.parent.postMessage()仍然无法按预期工作。

于 2012-11-06T07:56:19.180 回答