【问题标题】:How to change script location on firefox addon?如何更改Firefox插件上的脚本位置?
【发布时间】:2012-10-28 02:36:51
【问题描述】:

制作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,但我不明白如何使用它。

我们将不胜感激所有意见、建议和帮助

回答

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为现在没有重大黑客攻击就无法做到这一点。这是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

    【讨论】:

    • 弗拉基米尔。非常感谢您的快速回答。我会尝试使用它。 (另外感谢 adblockplus)
    • 弗拉基米尔,我可以通过扩展阻止在网页上加载某些脚本吗?
    • @AndreiNikolaev:正如我所说,redirectTo() 尚未实现,因此您无法使用它。但是,您已经可以在频道上调用 cancel() 来停止它。或者你可以use content policies,这样你会得到更好的上下文信息。
    • 天哪,你救了我,使用这些 API 太难了,文档不够我真的不知道该怎么办。我一直在寻找如何制作 redirectURI 几个小时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2013-10-03
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多