如何在内容脚本文件之前运行内容脚本?

时间:2014-07-29 10:01:30

标签: javascript firefox-addon firefox-addon-sdk

我最近正在开发一个FF插件。我的插件将在评估contentScriptFile之前下载一些配置文件。我的代码是这样的:

panel.on("show", function() {
var url = "http://domain/config.js";
request({
    url:url,
    onComplete: function(response) {
        worker = tabs.activeTab.attach({
           contentScript:response.text,
           contentScriptFile: [data.url("js/do1.js"), data.url("js/do2.js")]
         });
        ...
    }
  })
}

但是正如你的文档所说,contentScriptFile将在contentScript之前运行,所以如果我想先运行contentScript,我该怎么办? 我试图连接两次,首先只附加contentScript,然后附加contentScriptFile,但不成功。

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

您不能在特权上下文中执行远程脚本,也不能在可能安全的上下文中执行不安全的远程脚本。你问的问题都失败了:

  1. 在某种特权上下文中执行远程脚本,即内容脚本,它具有常规网站脚本所具有的一些特权功能。
  2. 在当前标签中执行一个不安全的http://脚本(您在示例中给出了该脚本),该脚本可能是https://。这将允许中间人攻击。 (即使您从https投放了“配置”,附加网站仍会拒绝您的提交,BTW,因为无法审核,因为活动内容不完整)。
  3. 因此,实际上,您有两个安全漏洞,这两个漏洞都可以并且应该make your add-on end up on the blocklist

    但是,您可以使用非活动/不可执行格式检索配置,例如 JSON XML (或简单文字,如果你愿意的话。)

    传递这些配置值可以通过

    实现
    • 使用contentScriptOptionstabsworker中未记录,但在page-mod中,但应该适用于所有人,如粗略测试所示) 。完整的例子:

      var tabs = require("sdk/tabs");
      
      tabs.on('activate', function(tab) {
        tab.attach({
          contentScript: 'console.log(self.options);',
          contentScriptOptions: {"abc": 123}
        });
      });
      
    • regular messaging

答案 1 :(得分:0)

您可以使用self SDK模块中的data.load将内容脚本加载到字符串中,并将值附加到contentScript数组:

worker = tabs.activeTab.attach({
    contentScript: [
        response.text,
        data.load("js/do1.js"),
        data.load("js/do2.js")
    ]
});