在Chrome扩展程序中加载外部JavaScript

时间:2015-03-22 00:27:27

标签: javascript google-chrome google-chrome-extension content-security-policy

我正在尝试在Chrome扩展程序中加载一些外部JavaScript代码。但是,由于扩展的沙盒环境,我看不到外部代码定义的任何函数。

外部代码实现了一种依赖机制,一个javascript文件可能需要另一个,依此类推。它还查看用于加载javascript以确定要加载的顶级javascript文件的URL的参数。因此它基本上能够加载任意Web应用程序,并且事先不知道将使用的所有文件。所以我不能在扩展名中使用任何静态定义。

还有一个问题是,由于所有扩展代码都是沙箱,我没有对文档的完全访问权限 - 例如,它无法访问窗口变量。

但是,如果我将所有代码放在外部代码中,如果一个脚本试图加载另一个脚本,我会遇到内容安全问题。我走的全部原因是因为每个浏览器存在CSP的骨头错误,因为bookmarklet无法访问外部资源。

绕过或解决扩展沙箱的最佳做法是什么,基本上能够运行代码,好像页面本身已加载它,而没有任何CSP问题?

1 个答案:

答案 0 :(得分:0)

在内容脚本中,您可以执行类似的操作来加载js文件

function inject(url, exteral) {
    // 1. Build the absolute URL
    // 2. Create a script tag and set src attribute
    // 3. Append script tag to thw window
    if (!external){
       url = chrome.extension.getURL(url);
    }
    var scriptElement = document.createElement('script');
    scriptElement.src = url;
    (document.body || document.head || document.documentElement).appendChild(scriptElement);
}

如果js文件包含扩展名,则必须将其放入 web_accesible_resources下的manifest.json。 不一定,它需要与(http | https)

中注入的页面具有相同的协议

由于不允许内容脚本调用窗口函数,因此可以 调用window.postMessage将数据从实际窗口发送到内容脚本。