Firefox扩展 - 错误:调用由CSP阻止的Function()

时间:2015-10-12 18:22:26

标签: firefox-addon firefox-addon-sdk

我有以下简化代码:

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 :我正在使用cfxjpm它可以正常使用。有什么方法可以解决这个问题,或者我必须更新我的扩展程序才能与jpm一起运行?

1 个答案:

答案 0 :(得分:1)

cfx可能包含旧版本的SDK,而jpm则使用浏览器的内置版本。尝试使用--strip-sdk运行。

那就是说,不推荐使用cfx,你应该使用jpm。

Github使用CSP directives阻止不安全的脚本执行,包括evalnew Function(),许多其他网站都没有。

较新的SDK版本以不同方式初始化插件脚本沙箱,因此不受CSP的影响。