【发布时间】:2011-03-05 18:01:08
【问题描述】:
我想为与我的模式匹配的 URL 添加前缀。当我在 Firefox 中打开一个新选项卡并输入匹配的 URL 时,页面不应正常加载,应先修改 URL,然后开始加载页面。
是否可以在页面开始加载之前通过 Mozilla Firefox 插件修改 URL?
【问题讨论】:
标签: url firefox-addon xpcom
我想为与我的模式匹配的 URL 添加前缀。当我在 Firefox 中打开一个新选项卡并输入匹配的 URL 时,页面不应正常加载,应先修改 URL,然后开始加载页面。
是否可以在页面开始加载之前通过 Mozilla Firefox 插件修改 URL?
【问题讨论】:
标签: url firefox-addon xpcom
浏览HTTPS Everywhere 插件建议执行以下步骤:
subject.URI.spec(网址)符合您的条件,请继续nsIHttpChannel
chrome/content/IOUtils.js 开始。请注意,您应该为整个应用程序注册一个“http-on-modify-request”观察者,这意味着您应该将它放在一个 XPCOM 组件中(有关示例,请参见 HTTPS Everywhere)。
以下文章不能直接解决您的问题,但它们确实包含许多您可能会觉得有帮助的示例代码:
【讨论】:
多亏了 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 帖子,其中建议了这种方法。
【讨论】:
您可以改为收听page load event 或DOMContentLoaded 事件。或者您可以创建一个nsIURIContentListener,但这可能更复杂。
【讨论】:
是否可以在页面开始加载之前通过 Mozilla Firefox 插件修改 URL?
是的,这是可能的。
通过设置contentScriptWhen: "start"使用Addon-SDK的page-mod
然后在完全阻止文档被解析后,您可以
document.URL 处理后,调用location.replace()
【讨论】: