Search code examples
firefox-addonfirefox-addon-sdk

firefox addon, how to modify(change) the url before the request is sent (even made) by the browser?


I want to remove some parameters in a url, currently my code:

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;
    }
}

But it will send two urls(requests) to the server, the original one (I can see the response without the video being played) and the truncated one(as expected).


Solution

  • Your two options are http-on-modify-request and http-on-opening-request. The first is fine, but the second fires earlier and you lose a lot of a ability. The first method the url is fine because server never sees it.

    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');
            }
        }
    };
    

    or instead of the redirectTo line you can do httpChannel.cancel(Cr.NS_BINDING_ABORTED); than get that loadConext and change the url.

    To start observing

    To start start obseving all requests do this (for example on startup of your addon)

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

    To stop observing

    Its important to stop observring (make sure to run this at least on shutdown of addon, you dont want to leave the observer registered for memory reasons)

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