来自chrome打包应用程序的沙盒页面的本地xmlhttprequest

时间:2013-12-28 16:40:18

标签: javascript google-chrome google-chrome-app

我有一个打包的应用程序,它在iframe中嵌入了一个应用程序本地页面(用于嵌入库中禁止的东西)。 我的沙盒页面想要对相对URL进行xmlhttprequest(所以仍然在相同的扩展名中),但是它被拒绝,并显示以下消息:

  

XMLHttpRequest无法加载   镀铬的扩展://nilibhiopchihkgnnecfblfjegmogpgn/libs/fonts/miss_fajardose/MissFajardose-Regular.ttf。   请求中不存在“Access-Control-Allow-Origin”标头   资源。因此,不允许原点'null'访问。

说实话,我找到了相关的文件:

一些上下文:我在Chrome网络应用程序和互联网上使用相同的代码,在这个例子中,我正在加载字体,排版某些内容并计算用于勾勒文本轮廓的工具路径。如果页面是chrome应用程序,则会有一个按钮将其发送到路由器,如果它在Web上,您只能看到工具路径。

1 个答案:

答案 0 :(得分:1)

经过大约半天的生活,这是我找到的最好的解决方法。从沙盒页面,postmessage到父请求加载本地文件:

window.top.postMessage({ XMLFile: "levels/foo.xml" }, "*");

在nonsandboxed页面中,启动文件的异步加载,然后使用文件的字符串版本回调到沙盒页面:

document.body.onload = function() {
    // Listen for request messages from child window
    window.addEventListener("message", function (event) {
        if (event.data.XMLFile) {
            // Load the requested XML file, must be async
            var xhttp = new XMLHttpRequest();

            xhttp.open("GET", event.data.XMLFile, true);
            xhttp.send(null);

            // After loading, pass the resulting XML back down to sandboxed page
            xhttp.onload = function (e) {
                document.getElementById("idSandbox").contentWindow.postMessage({ sResponseText: xhttp.responseText }, '*');
            }
        }
    } );
}

返回沙盒页面,当您收到xml响应文本时,将其转换回DOM对象进行解析:

// Receive messages from containing window
window.addEventListener("message", function (event) {
    // XML file retrieved
    if (event.data.sResponseText) {
        parser = new DOMParser();
        xmlDoc = parser.parseFromString(event.data.sResponseText, "text/xml");

        onAfterLoadLevel(xmlDoc);
    }
});

顺便说一下,whatwg页面上的混合颜色会在任何尚未拥有它的人身上触发ADD。其他参考页面没用。关于这个问题有很多讨论,但没有人发布代码所以我想我会在这里做。