在Chrome打包应用程序沙箱从当地页的XMLHttpRequest(local xmlhttpre

2019-10-19 04:04发布

我有一个打包的应用程序,在iframe嵌入一个应用本地页面(嵌入库不做违禁的东西)。 我的沙盒页面想要使一个XMLHttpRequest到一个相对URL(所以还是在同一个扩展名),但它与下面的消息拒绝:

XMLHttpRequest的无法加载铬扩展://nilibhiopchihkgnnecfblfjegmogpgn/libs/fonts/miss_fajardose/MissFajardose-Regular.ttf。 没有“访问控制允许来源”标头出现在所请求的资源。 因此,原产地“空”是不允许访问。

说实话,我发现有关单证:

  • http://developer.chrome.com/apps/manifest/sandbox.html
  • http://www.whatwg.org/specs/web-apps/current-work/multipage/the-if​​rame-element.html#attr-iframe-sandbox

    但他们却没有意义的我,也许是颜色的搭配和ADD。

上下文的一点:我用我的Chrome网络应用内和互联网上相同的代码,在这种情况下我加载的字体,排版的东西,计算刀具路径轮廓的文本。 如果页面是Chrome应用程序有一个按钮将其发送到路由器,如果它是你可以看到刀具路径在网络上。

Answer 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在尚未有它任何人。 其他参考页是无用的。 有一些关于这个问题的讨论,但没有人发布的代码,所以我想我会做到这一点在这里。



文章来源: local xmlhttprequest from sandboxed page in chrome packaged app