【问题标题】:Loading a script file in a Chrome App Sandbox在 Chrome 应用沙盒中加载脚本文件
【发布时间】:2014-11-29 22:52:09
【问题描述】:

我正在开发一个 Chrome 应用程序,并且我有一个脚本文件保存在应用程序的沙盒文件系统中。 (可通过 URL filesystem:chrome-extension_****/Persistent/script.js

我可以使用 Chrome 的 FileSystemAPI 来读取应用程序主窗口中的文件。但是,我需要它可以在沙盒页面中访问和执行。

我的清单中有以下内容 -

"sandbox": {
      "pages": ["sandboxed_page.html"],
      "content_security_policy": "sandbox allow-scripts;"
},

我正在使用这样的页面:

<iframe id="sandbox_frame" seamless="seamless" src="sandboxed_page.html" sandbox="allow-scripts"></iframe>

我尝试在主应用程序窗口中加载文件,使用window.URL.createObjectURL() 将其转换为 blob: URL,并通过postMessage() 将此 URL 传递给沙箱。在沙箱中,我试图将 URL 加载到 <script> 元素中。我收到一条错误消息:Not allowed to load local resource: blob:chrome-extension%3A//...

另一个选项(正在工作)是在主应用程序中加载 script.js 的内容,并通过 postMessage() 发送整个字符串。不确定这是个好主意,因为 script.js 可能会变得很大。

是我做错了什么,还是在 Chrome 的安全政策禁止的沙盒中加载本地脚本?

我通过https://developer.chrome.com/apps/app_external,但没有提到将外部资源发送到沙箱。

【问题讨论】:

  • 看起来你没有在沙箱 CSP 中设置一个备用 script-src,所以我认为你可以通过

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


【解决方案1】:

沙盒页面在唯一的来源中执行,即与应用程序本身不同的来源,您无法访问不同来源的文件系统 URL。从这些文件创建的对象 URL 也是如此。

您基本上坚持使用 postMessage 方法,尽管您可以通过将其作为 ArrayBuffer 传输而不是将数据复制为字符串来提高效率。见https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers#Passing_data_by_transferring_ownership_(transferable_objects)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2015-04-06
    • 2013-05-09
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多