我正在尝试在Chrome扩展程序中加载一些外部JavaScript代码。但是,由于扩展的沙盒环境,我看不到外部代码定义的任何函数。
外部代码实现了一种依赖机制,一个javascript文件可能需要另一个,依此类推。它还查看用于加载javascript以确定要加载的顶级javascript文件的URL的参数。因此它基本上能够加载任意Web应用程序,并且事先不知道将使用的所有文件。所以我不能在扩展名中使用任何静态定义。
还有一个问题是,由于所有扩展代码都是沙箱,我没有对文档的完全访问权限 - 例如,它无法访问窗口变量。
但是,如果我将所有代码放在外部代码中,如果一个脚本试图加载另一个脚本,我会遇到内容安全问题。我走的全部原因是因为每个浏览器存在CSP的骨头错误,因为bookmarklet无法访问外部资源。
绕过或解决扩展沙箱的最佳做法是什么,基本上能够运行代码,好像页面本身已加载它,而没有任何CSP问题?
答案 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将数据从实际窗口发送到内容脚本。