如何在firefox插件上更改脚本位置?

时间:2012-11-07 23:10:56

标签: javascript firefox browser google-chrome-extension firefox-addon

制作firefox插件的最简单方法是什么,它重复了这个chrome功能:

chrome.webRequest.onBeforeRequest.addListener(
  function(info) {
    if(info.url.indexOf("notifier") + 1){
        return {redirectUrl: "https://domain.null/1.js"};
    }

  },
  {
    urls: [
      "*://domain2.null/*"
    ],
    types: ["script"]
  }, ["blocking"]);

我知道firefox中的 nsIContentPolicy ,但我不明白如何使用它。

所有意见,建议和帮助将不胜感激

答案

我已经确定了无重启扩展的问题。
阻止内容我们可以使用nsIContentPolicy作为Wladimir说。我们还可以使用 windowListener (aWindow.gBrowser)将脚本注入页面。

例如,这种做法非常有效:https://github.com/jvillalobos/AMO-Admin-Assistant/blob/master/src/bootstrap.js

1 个答案:

答案 0 :(得分:5)

我认为现在没有重大黑客可以做到这一点。这是bug 765934的主题,它会向nsIHttpChannel interface添加redirectTo() method。一旦实现,这样的代码应该可以工作:

const Ci = Components.interfaces;
const Cu = Components.utils;

Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");

var observer = {
  QueryInterface: XPCOMUtils.generateQI([
    Ci.nsIObserver,
    Ci.nsISupportsWeakReference
  ]),

  observe: function(subject, topic, data)
  {
    if (topic == "http-on-modify-request" &&
        subject instanceof Ci.nsIHttpChannel)
    {
      var uri = subject.URI;
      if (uri.host == "domain2.null" && /\.js(\?|$)/.test(uri.path))
      {
        var redirectUri = Services.io.newURI("https://domain.null/1.js",
                                             null, null);
        subject.redirectTo(redirectUri);
      }
    }
  }
};

Services.obs.addObserver(observer, "http-on-modify-request", true);

供参考:Services.jsmXPCOMUtils.jsmobserver notificationsnsIHttpChannelnsIURI