权限被拒绝在XUL页面内调用iframe方法ChromeWindow.postMessage

时间:2012-10-26 12:16:26

标签: javascript firefox firefox-addon cross-domain xul

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

  

... B拒绝调用方法ChromeWindow.postMessage

如何修复该错误?如果无法做到这一点,我怎样才能将消息从B传递给A?

我在Windows 7下使用Firefox 16.0.1。

3 个答案:

答案 0 :(得分:1)

我有一个非常类似的问题, 只是我有一个html-popup(本地)无法将'postMessage'发送到我的xul-background-task。 我想我得上班了, 奇怪的是,通过启动我自己的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(数据)现在使用Communicator.postMessage(数据) 就这样! 现在,在我的叠加层中除了我们的旧版

之外什么都没有
addEventListener('own_message', someMessageFunc, false, true);
//or maybe even "message" just like originally

希望这也适合你(没有在iframe上检查......)

答案 1 :(得分:0)

您应该查看type of iframe B

编辑:

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

答案 2 :(得分:0)

发布以防有人遇到同样的问题 成功使用here所述的事件将消息从B内发布到A.

但这不是答案,因为window.parent.postMessage()仍无法正常工作。