所以当他尝试加载的页面符合我的条件(正则表达式)时,我正试图将浏览器重定向到另一个网页。目前它看起来像这样:(提出它here)
function listener(event) {
var channel = event.subject.QueryInterface(Ci.nsIHttpChannel);
var url = event.subject.URI.spec;
if (isToBeRedirected(url)) {
// replace url
}
}
exports.main = function() {
events.on("http-on-modify-request", listener);
}
但问题是,这也会将URL替换为例如嵌入在页面中的图像。我的问题是,有没有办法通过输入网址或点击页面链接来改变http请求?所以只要每次网址都显示在地址栏中 我想过阅读当前标签的网址并将其与请求网址进行比较,但我还是无法确切地知道它是怎么回事。
答案 0 :(得分:3)
我有个主意。
如果您执行console.log(Ci.nsIHttpChannel)
,则会看到它有一堆flag
,请参见底部的img。
所以我正在考虑测试它是否是主要负载,意味着它不在子框架中,而是通过测试Ci.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI
的标志来检查标签的整个文档。如果是整个文档,可能来自链接,网址栏或搜索栏。
所以试试这个:
function listener(event) {
var channel = event.subject.QueryInterface(Ci.nsIHttpChannel);
var url = event.subject.URI.spec;
if (channel.loadFlags & Ci.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI) {
//the whole document of the tab is changing
if (isToBeRedirected(url)) {
// replace url
}
}
}
exports.main = function() {
events.on("http-on-modify-request", listener);
}
我的另一个想法是,如果你只想更改网址栏。然后添加一个事件监听器来更改url bar值。如果用户点击进入或点击进入更改后,则会注册观察者。然后在测试Ci.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI
之后,取消注册观察者。