我有以下简化代码:
main.js :
var data = require("sdk/self").data;
var tabs = require("sdk/tabs");
tabs.on('ready', function(tab) {
console.log("start");
let worker = tab.attach({
contentScriptFile: [
data.url("jquery.min.js"),
data.url("test.js")
],
});
worker.port.emit("start", data.load("popups/start.html"));
console.log("end");
});
test.js :
console.log("test.js");
self.port.on("start", function (content) {
console.log("I get the message");
$('body').append(content);
});
问题:
这很好用,大多数情况下一切都很好。仅在一个网站中,特别是在众所周知的github.com
中,它会产生以下错误:
console.log: test: start
console.log: test: end
console.error:
Message: Error: call to Function() blocked by CSP
console.error:
Message: TypeError: this.sandbox is undefined
Stack:
receive@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/content/worker-child.js:75:7
emitOnObject@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/event/core.js:112:9
emit@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/event/core.js:89:38
processMessageReceived@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/remote/child.js:54:38
注1 :问题在于交换消息start
。但除了github.com/*
之外,为什么它在其他地方工作?
注意2 :我正在使用cfx
,jpm
它可以正常使用。有什么方法可以解决这个问题,或者我必须更新我的扩展程序才能与jpm
一起运行?
答案 0 :(得分:1)
cfx可能包含旧版本的SDK,而jpm则使用浏览器的内置版本。尝试使用--strip-sdk
运行。
那就是说,不推荐使用cfx,你应该使用jpm。
Github使用CSP directives阻止不安全的脚本执行,包括eval
和new Function()
,许多其他网站都没有。
较新的SDK版本以不同方式初始化插件脚本沙箱,因此不受CSP的影响。