【问题标题】:Modify URL before loading page in firefox在Firefox中加载页面之前修改URL
【发布时间】:2011-03-05 18:01:08
【问题描述】:

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

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

【问题讨论】:

    标签: url firefox-addon xpcom


    【解决方案1】:

    浏览HTTPS Everywhere 插件建议执行以下步骤:

    1. 使用nsIObserverService"http-on-modify-request" 观察者主题注册observer
    2. 如果您的观察者通知的主题是 nsIHttpChannel 的实例并且 subject.URI.spec(网址)符合您的条件,请继续
    3. 创建一个新的nsIStandardURL
    4. 创建一个新的nsIHttpChannel
    5. 用新频道替换旧频道。在 HTTPS Everywhere 中执行此操作的代码非常密集,可能远远超出您的需要。我建议从 chrome/content/IOUtils.js 开始。

    请注意,您应该为整个应用程序注册一个“http-on-modify-request”观察者,这意味着您应该将它放在一个 XPCOM 组件中(有关示例,请参见 HTTPS Everywhere)。

    以下文章不能直接解决您的问题,但它们确实包含许多您可能会觉得有帮助的示例代码:

    【讨论】:

    • 这正是我所需要的。谢谢!
    【解决方案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();
    

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

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

    附:我看过一个 SO 帖子,其中建议了这种方法。

    【讨论】:

    • 你有完整的例子吗?
    【解决方案3】:

    您可以改为收听page load eventDOMContentLoaded 事件。或者您可以创建一个nsIURIContentListener,但这可能更复杂。

    【讨论】:

      【解决方案4】:

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

      是的,这是可能的。

      通过设置contentScriptWhen: "start"使用Addon-SDK的page-mod

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

      1. 从同一个域中获取不同的文档并将其注入到页面中。
      2. 经过document.URL 处理后,调用location.replace()

      这里是做1的例子。https://stackoverflow.com/a/36097573/6085033

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多