我有chromeless应用程序,其中一些特权JavaScript代码与系统交互。现在我想将特权JavaScript(jsctypes)与服务器中托管的应用程序混搭。远程应用程序将加载到Iframe中,并且chromeless应用程序和远程应用程序之间的交互通过html5 postMessage进行。
父母确实将消息发布到所包含的Iframe,并由iframe成功收到e.origin作为“resource:\ app” 而如果我尝试将ifMessage从iframe发布到window.parent,并将domain作为资源:\ app,则不会调用父级中的onmessage侦听器
布局,
执行时,> chromeless examples \ testapp \ index.html 在chromeless构建文件夹中生成xul应用程序,并显示以下内容。
+-----------------------------------Chromeless----+ | | | --- MessageToIframeButton | | | | +--------------------------Iframe--+ | | |Msg Recvd from: resource://app | | | |(this is the message from parent) | | | | | | | | _TxtBox_sendMessage | | | | | | | | | | | | | | | +----------------------------------+ | | Msg Recvd: | | | +-------------------------------------------------+
iframe内的postMessage
[Code]
var sendMessage = function(){
var iframe = window.parent;
iframe.postMessage("test","resouce://app");
};
[/Code]
onMessage of Parent,
var onmessage = function(e) {
alert("message");
}
if(typeof window.addEventListener != 'undefined') {
window.addEventListener('message', onmessage, false);
}
else if(typeof window.attachEvent != 'undefined') {
window.attachEvent('onmessage', onmessage);
}
任何帮助表示赞赏!
Palant,我尝试使用自定义事件实现跨域通信,但无法成功,
在Priviliged index.html [Chromeless examples \ testapp \ index.html]中:
var myExtension = {
myListener: function(evt) {
alert("Received from web page: " +
evt.target.getAttribute("attribute1"));
}
}
document.addEventListener("MyExtensionEvent", function(e) {myExtension.myListener(e); }, false, true); // The last value is a Mozilla-specific value to indicate untrusted content is allowed to trigger the event.
//content.addEventListener("MyExtensionEvent", function(e) {myExtension.myListener(e); }, false, true); //Also tried with content.
在远程应用程序Iframe remote.html中: 点击按钮,
var element = document.createElement("MyExtensionDataElement");
element.setAttribute("attribute1", "foobar");
document.documentElement.appendChild(element);
var evt = document.createEvent("Events");
evt.initEvent("MyExtensionEvent", true, false);
element.dispatchEvent(evt);
触发事件不会冒泡到特权父域。如果将一个eventListener添加到Iframe本身,则会收到调度的事件,类似地,如果在特权上下文(index.html)中生成自定义事件,那么父事件窗口确实会收到通知,但不会跨层次结构。我错过了一些基本的东西吗?
答案 0 :(得分:2)
鉴于你链接到Prevent target="_top" from taking over UI in Mozilla Chromeless我猜你加载远程应用程序的帧是一个内容框架(它肯定应该是)。这意味着在您的特权代码和内容之间建立了安全边界,特别是对于它看起来位于顶层的框架 - 它无法访问特权文档(易于检查,添加alert(window == window.parent)
到帧代码)。所有这些在安全方面都有意义,但这也意味着使用postMessage()
进行通信是不可能的。
在https://developer.mozilla.org/en/Code_snippets/Interaction_between_privileged_and_non-privileged_pages上描述了一种更尴尬的沟通方法。它的优点是可以安全地跨越安全边界。