在firefox中加载页面之前修改URL

时间:2011-03-05 18:01:09

标签: url firefox-addon xpcom

我想为与我的模式匹配的网址添加前缀。当我在Firefox中打开一个新选项卡并输入匹配的URL时,不应该正常加载页面,首先应该修改URL,然后开始加载页面。

是否可以在页面开始加载之前通过Mozilla Firefox Addon修改URL?

4 个答案:

答案 0 :(得分:8)

浏览HTTPS Everywhere插件会显示以下步骤:

  1. 使用observer
  2. "http-on-modify-request"观察者主题注册nsIObserverService
  3. 如果观察者通知的主题是nsIHttpChannel的实例并且subject.URI.spec(网址)符合您的条件,则继续
  4. 制作新的nsIStandardURL
  5. 制作新的nsIHttpChannel
  6. 用新的替换旧频道。在HTTPS Everywhere中执行此操作的代码非常密集,可能远远超出您的需要。我建议从chrome/content/IOUtils.js开始。
  7. 请注意,您应该为整个应用程序注册一个“http-on-modify-request”观察者,这意味着您应该将它放在XPCOM组件中(例如,参见HTTPS Everywhere)。

    以下文章并未直接解决您的问题,但它们确实包含许多您可能会发现有用的示例代码:

答案 1 :(得分:2)

感谢Iwburk,我已经能够做到这一点。

我们可以使用新的覆盖nsiHttpChannel来执行此操作,这样做有点复杂但幸运的是,加载项https-everywhere实现此操作以强制执行https连接。

https-everywhere的源代码可用here

这需要的大部分代码都在文件中

IO Util.js ChannelReplacement.js

我们可以单独使用上述文件,前提是我们已经设置了基本变量,如Cc,Ci设置和函数xpcom_generateQI

var httpRequestObserver =
{ 
  observe: function(subject, topic, data) {
    if (topic == "http-on-modify-request") {

        var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);     
        var requestURL = subject.URI.spec;

        if(isToBeReplaced(requestURL))  {

            var newURL = getURL(requestURL);        
             ChannelReplacement.runWhenPending(subject, function() {
                    var cr = new ChannelReplacement(subject, ch);
                    cr.replace(true,null);
                    cr.open();
                });
        }
    }

  },

  get observerService() {
    return Components.classes["@mozilla.org/observer-service;1"]
                     .getService(Components.interfaces.nsIObserverService);
  },

  register: function() {
    this.observerService.addObserver(this, "http-on-modify-request", false);

  },

  unregister: function() {
    this.observerService.removeObserver(this, "http-on-modify-request");

  }
};


httpRequestObserver.register();

代码将替换请求不重定向。

虽然我已经足够好地测试了上面的代码,但我不确定它的实现。据我所知,它复制了所请求频道的所有属性,并将它们设置为要覆盖的频道。之后以某种方式使用新通道提供原始请求所请求的输出。

P.S。我看过一篇SO帖子,其中提出了这种方法。

答案 2 :(得分:0)

您可以改为监听page load eventDOMContentLoaded事件。或者你可以制作nsIURIContentListener,但这可能更复杂。

答案 3 :(得分:0)

  

是否可以在页面开始加载之前通过Mozilla Firefox Addon修改URL?

是的,这是可能的。

通过设置contentScriptWhen: "start"

来使用Addon-SDK的page-mod

然后在完全阻止文档被解析后,您可以

  1. 从同一个域中获取不同的文档并将其注入页面。
  2. document.URL次处理后执行location.replace()调用
  3. 以下是执行1. https://stackoverflow.com/a/36097573/6085033

    的示例