Javascript Firefox扩展中的ContentScript,不使用附加SDK

Javascript Firefox扩展中的ContentScript,不使用附加SDK,javascript,firefox,firefox-addon,content-script,Javascript,Firefox,Firefox Addon,Content Script,有没有一种简单的方法可以在不使用附加SDK和PageMod的情况下为简单的内容脚本创建Firefox扩展?安装Python和SDK,学习如何使用SDK和API,添加不必要的膨胀层和抽象层,只是为了执行一个简单的内容脚本,这看起来真是太麻烦了 我已经尝试使用XUL浏览器覆盖并在那里注入脚本,但是将所有内容都注入到浏览器中。XUL上下文而不是文档。body也增加了很多复杂性 那么,在html文档而不是XUL文档中插入一些脚本和css文件的最简单、轻量级的方法是什么呢?您的问题的边界线太宽,因此我不会

有没有一种简单的方法可以在不使用附加SDK和PageMod的情况下为简单的内容脚本创建Firefox扩展?安装Python和SDK,学习如何使用SDK和API,添加不必要的膨胀层和抽象层,只是为了执行一个简单的内容脚本,这看起来真是太麻烦了

我已经尝试使用XUL浏览器覆盖并在那里注入脚本,但是将所有内容都注入到
浏览器中。XUL
上下文而不是
文档。body
也增加了很多复杂性


那么,在html文档而不是XUL文档中插入一些脚本和css文件的最简单、轻量级的方法是什么呢?

您的问题的边界线太宽,因此我不会详细讨论所有问题,而是给出一个总体概述

Easy可能言过其实,但SDK内容脚本(实际上也是模块)、Greasemonkey/Scriptish以及其他类似于内容脚本的内容在内部使用。即使是无重启加载项中的
bootstrap.js
,也会在沙箱中执行

基本思路如下:

  • 获取对要附加的内容窗口的引用
  • 选择脚本应在其下运行的“主体”。主体本质上是定义相同来源的安全上下文/策略。非特权内容脚本通常使用内容窗口本身(它也是主体),而特权脚本(chrome访问
    组件
    )脚本则使用系统主体
  • 选择是否需要X射线包装。文档会告诉你更多关于它的信息
  • 选择沙箱原型(“全局”或顶级原型)。通常,对于内容脚本内容,您将选择内容窗口
  • 创建
    沙盒
  • 将内容脚本可能需要的任何内容添加到沙箱中
  • 通过
    evalInSandbox
    或执行脚本
  • 下面是一个将非特权内容脚本添加到窗口的有限示例:

    // 1. get the content window, e.g. the currently selected tab window
    var contentWindow = gBrowser.contentWindow;
    // 2. Choose the principal, e.g. just use the content window again
    var principal = contentWindow;
    // 3. We want XRay wrappers, to keep our content script and the actual
    // page scripts in their own corners.
    var wantXrays = true;
    // 4. Our prototype will be the window
    var sbProto = contentWindow;
    // 5. Putting it all together to create a sandbox
    var sandbox = Cu.Sandbox(principal, {
      sandboxPrototype: sbProto,
      wantXrays: wantXrays
    });
    // 6. Adding a random helper function (e.g.)
    sandbox.getRandomInt = function (min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
    };
    // 7. Execute some content script, aka. the stupid example.
    try {
      var execute = function() {
        var demo1 = document.querySelector('title').textContent;
        var demo2 = getRandomInt(1, 1000);
        alert(demo1 + " " + demo2);
      }
      Cu.evalInSandbox(
        "(" + execute.toSource() + ")()",
        sandbox
      );
    } catch(ex) {
      console.error(ex);
    }
    
    PS:这个示例将在一个文件中逐字运行

    关于风格:

    做SDK做的事情,我想,这是简化的:

    var wu = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).
             getInterface(Ci.nsIDOMWindowUtils);
    var uri = Services.io.newURI(
      "chrome://myaddon/style/content-style.css",
      null,
      null);
    wu.loadSheet(uri, wu.USER_SHEET);
    

    谢谢,这帮了大忙。你能提供更多关于装载单方法的信息吗?在文档中找到一些东西是如此痛苦。。。我找不到任何东西,在第一次加载文档后,loadSheet给了我垃圾:组件返回失败代码:0x80070057(NS\u错误\u非法\u值)[nsIDOMWindowUtils.loadSheet]。没关系,我在错误的窗口加载了工作表。。。啊!如果我能找到文档,那就太好了:)用你的沙盒示例,我只需要在XUL中加载脚本,对吗?SDK通过
    contentScriptFile
    加载它们,但XUL只会使用常规的
    script
    标记。