Javascript 如何使contentScript在contentScriptFile之前运行?

Javascript 如何使contentScript在contentScriptFile之前运行?,javascript,firefox-addon,firefox-addon-sdk,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({ contentScrip

我最近正在开发一个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,但未成功

感谢您的时间。

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

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

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

  • 在某种特权上下文(即内容脚本)中执行远程脚本,该脚本具有常规网站脚本所不具备的某些特权功能
  • 在当前选项卡中执行不安全的
    http://
    脚本(您在示例中给出了该脚本),该脚本可能是
    https://
    。这将允许中间人攻击。(顺便说一句,即使您从https
    https
    提供了“配置”,加载项网站仍会拒绝您的提交,因为无法对其进行审核,因为活动内容不完整)
  • 因此,实际上,您有两个安全漏洞,它们都可以而且应该存在

    但是,您可以使用非活动/非可执行格式检索配置,例如JSONXML(如果愿意,也可以使用纯文本)

    传递这些配置值可以通过以下方式实现

    • 使用
      contentScriptOptions
      (如粗略测试所示,
      tabs
      worker
      中均未记录,但应适用于所有人)。完整示例:

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


    你可以,但你真的不应该。一旦发现在(某种程度上)特权上下文中执行远程脚本,这无疑会使您进入阻止列表,这是一个安全漏洞。@nMail
    data.load
    with a relative path返回与SDK加载项捆绑在一起的文件的内容。是的,但
    response.text
    肯定不会;)我应该在评论中说得更清楚些。很抱歉造成混淆。不管安全问题如何,您的方法确实很有帮助。谢谢。@user2552042虽然它目前还有效,但我强烈建议您认真考虑一下@nmaler的建议。对于配置,
    contentScriptOptions
    是一种方法。仅对与扩展捆绑在一起的静态内容脚本使用我的答案中的方法。感谢您提供详细的指南。我现在知道怎么处理了。