火狐扩展(观察者) - 仅触发一次"http-on-modify-request"



实际上,我试图在用户按下地址栏上的ENTER键之后和onLocationChange之前立即捕获事件。我有一个观察者设置使用以下链接作为指导:https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Intercepting_Page_Loads,并有类似于下面的东西。

但是,控制台打印许多url,甚至图像和脚本。如何修改代码,使该功能只触发一次,或者在地址栏更改或单击链接之前禁用该功能?

我想我可以设置自己的变量来跟踪请求是否已在URL上触发,但想知道是否有更有效的解决方案。

var httpRequestObserver = {
    ioService: Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService),
    observe: function(subject, topic, data) {
                if (topic == "http-on-modify-request") {
                    var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
                    console.log(httpChannel.URI.spec);
                }
            },
    register: function() {
        this.observerService.addObserver(this, "http-on-modify-request", false);
    },
    unregister: function() {
        this.observerService.removeObserver(this, "http-on-modify-request");
    }
};
httpRequestObserver.register();

我最初使用的是"http-on-modify-request"观察者,因为它是在请求头中修改引用者的建议位置。然而,我后来意识到Chrome的Web请求api是可用的,并使用以下代码代替。

const {WebRequest} = Cu.import("resource://gre/modules/WebRequest.jsm", {});
WebRequest.onBeforeSendHeaders.addListener(setReferrer, { types: ['main_frame'] }, ['blocking', 'requestHeaders']);
function setReferrer(e) {
    //some other code
    for (var i in e.requestHeaders) {
        if (e.requestHeaders[i].name === 'Referer') {
            e.requestHeaders.splice(i, 1);
            break;
        }
    }
    e.requestHeaders.push({name : 'Referer', value : 'myreferer.com'});
    return { requestHeaders: e.requestHeaders };
}

最新更新