Search code examples
javascriptfirefoxfirefox-addonfirefox-addon-sdk

Firefox extension: How to intercept the requested url conditionally and block it?


In my Firefox extension I want to intercept the url that the browser is requesting and block the request entirely if some condition matches

How can I intercept URL being requested?


Solution

  • you can have a look at the source of those addons

    https://addons.mozilla.org/en-us/firefox/addon/blocksite/?src=search https://addons.mozilla.org/en-us/firefox/addon/url-n-extension-blockune-bl/?src=search

    or use service observer with nsIHTTPChannel for fast handling

    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-modify-request': {
            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
                if (requestUrl.indexOf('google.com') > -1) {
                   //httpChannel.cancel(Cr.NS_BINDING_ABORTED); //this aborts the load
                   httpChannel.redirectTo(Services.io.newURI('data:text,url_blocked', null, null)); //can redirect with this line, if dont want to redirect and just block, then uncomment this line and comment out line above (line 17)
                }
            },
            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');
            }
        }
    };
    

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

    Full working example of the observer service to block/redirect urls: https://github.com/Noitidart/PortableTester/tree/block-urls