firefox插件,如何在浏览器发送(甚至提出)请求之前修改(更改)url?

时间:2014-08-20 08:34:08

标签: firefox-addon firefox-addon-sdk

我想删除网址中的一些参数,目前是我的代码:

require("sdk/tabs").on("ready", removeList);

function removeList(tab) {
    var index = tab.url.indexOf("&list=");
    if (tab.url.indexOf("youtube.com") > -1 && index > -1) {
        console.log(tab.url);
        var temp = tab.url.slice(0, index);
        console.log(temp);
        tab.url = "";
        tab.url = temp;
    }
}

但是它会向服务器发送两个URL(请求),原始的(我可以看到没有播放视频的响应)和截断的(如预期的那样)。

1 个答案:

答案 0 :(得分:0)

您的两个选项是http-on-modify-requesthttp-on-opening-request。第一种情况很好,但是第二次发射得更早,你失去了很多能力。第一种方法是网址很好,因为服务器永远不会看到它。

const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components;
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/devtools/Console.jsm');

var observers = {
    'http-on-examine-response': {
        observe: function (aSubject, aTopic, aData) {
            console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
            var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
            var requestUrl = httpChannel.URI.spec
var index = requestUrl.indexOf('&list=');
            if (requestUrl.indexOf('youtube.com') > -1 && index > -1) {
               console.log(requestUrl);
var temp = requestUrl.slice(0, index);
               httpChannel.redirectTo(Services.io.newURI(temp, null, null));
            }
        },
        reg: function () {
            Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false);
        },
        unreg: function () {
            Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request');
        }
    }
};

或代替redirectTo行,您可以httpChannel.cancel(Cr.NS_BINDING_ABORTED);而不是获取loadConext并更改网址。

开始观察

要开始观察所有请求,请执行此操作(例如,在启动插件时)

for (var o in observers) {
    observers[o].reg();
}

停止观察

重要的是要停止观察(确保至少在关闭插件时运行它,你不想让观察者因记忆原因而注册)

for (var o in observers) {
    observers[o].unreg();
}