我想为与我的模式匹配的网址添加前缀。当我在Firefox中打开一个新选项卡并输入匹配的URL时,不应该正常加载页面,首先应该修改URL,然后开始加载页面。
是否可以在页面开始加载之前通过Mozilla Firefox Addon修改URL?
答案 0 :(得分:8)
浏览HTTPS Everywhere插件会显示以下步骤:
subject.URI.spec
(网址)符合您的条件,则继续nsIHttpChannel
chrome/content/IOUtils.js
开始。请注意,您应该为整个应用程序注册一个“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 event或DOMContentLoaded
事件。或者你可以制作nsIURIContentListener
,但这可能更复杂。
答案 3 :(得分:0)
是否可以在页面开始加载之前通过Mozilla Firefox Addon修改URL?
是的,这是可能的。
通过设置contentScriptWhen: "start"
然后在完全阻止文档被解析后,您可以
document.URL
次处理后执行location.replace()
调用