Un url blocker in trenta linee di codice

La settimana scorsa mi hanno chiesto quanto potesse essere complesso scrivere, utilizzando XUL, del codice che inibisse la navigazione su certi indirizzi web, dato che non era la prima volta che mi veniva chiesto ho deciso di buttare giu' una proof of concept.

Inibire totalmente la navigazione su una pagina e' cosa ben diversa dal bloccare selettivamente alcuni elementi presenti sulla pagina cosi' come fa Adblock Plus e per certi versi e' perfino piu' semplice.

Di seguito il codice che dimostra quanto potenti siano le API accessibili dalle estensioni infatti basta aggiungere un observer su http-on-modify-request

   1    var miniUrlBlocker = {
2 // Lista delle regular expression contenenti le URL da bloccare
3 blackList : [/http:\/\/www\.badurl\.com/],
4
5 observe:function(subject, topic, data) {
6 if (topic != "http-on-modify-request") {
7 return;
8 }
9 try {
10 var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
11 var URI = httpChannel.URI.spec;
12
13 for (var i in this.blackList) {
14 var re = this.blackList[i];
15
16 if (re.test(URI)) {
17 var isMainDoc = httpChannel.loadFlags
18 & httpChannel.LOAD_INITIAL_DOCUMENT_URI;
19 httpChannel.cancel(isMainDoc
20 ? Components.results.NS_ERROR_CONNECTION_REFUSED
21 : Components.results.NS_ERROR_ABORT);
22 break;
23 }
24 }
25 } catch(err) {
26 }
27 }
28 }
29
30 Components.classes["@mozilla.org/observer-service;1"]
31 .getService(Components.interfaces.nsIObserverService)
32 .addObserver(miniUrlBlocker, "http-on-modify-request", false);