
Un détail qui m'agace c'est la tendance de certaines extensions, mais aussi certaines builds, d'ajouter des éléments, dont la pertinence n'est pas toujours très bien définie, à la chaîne user agent de Firefox. Évidemment, on pourrait utiliser le user.js pour régler ceci… en théorie, et en théorie seulement. En pratique, il s'avère que le user.js semblant inefficace, j'ai souvent été obligé de passer par le about:config. Aussi, c'est pourquoi je me suis décidé à écrire un petit script JavaScript qui soit relativement facile à modifier et utiliser, pour réinitialiser la clef general.useragent.extra.firefox et facilement effacer n'importe quelle clef de type general.useragent.extra.
CleanMyUserAgent.js
/**
* Time-stamp: <2009-04-04 12:40:31 (blogosx.homeunix.org)>
* @name CleanMyUserAgent.js
* @namespace org.blogosx.cleanmyuseragent
* @version 1.0.2
* @homepage http://blogosx.homeunix.org/
* @description Clean User-Agent in Mozilla Firefox.
*/
(function() {
function main() {
var UACleaner = new UserAgentCleaner();
// UACleaner.appName = String('Minefield');
UACleaner.main();
}
function Console() {
this.ConsoleService = Components.classes["@mozilla.org/consoleservice;1"].
getService(Components.interfaces.nsIConsoleService);
Console.prototype.log = function(message) {
this.ConsoleService.logStringMessage(message);
};
}
function Prefs() {
this.PrefServ = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
Prefs.prototype.setCharPref = function(key, value) {
this.PrefServ.setCharPref(key, value);
};
Prefs.prototype.getCharPref = function(key) {
try {
return this.PrefServ.getCharPref(key);
} catch(e) {
return false;
}
};
Prefs.prototype.getChildList = function(domain) {
var ConServ = new Console();
var rChilds = [];
try {
var Branch = this.PrefServ.getBranch(domain);
rChilds = Branch.getChildList("", {});
ConServ.log('Extras: ' + rChilds.join(', '));
} catch(e) {
ConServ.log('Error: ' + e);
}
return rChilds;
};
}
function UserAgentCleaner() {
this.AppInfos = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULAppInfo);
this.PrefServ = new Prefs();
this.Console = new Console();
this.appName = String(this.AppInfos.name);
this.extraFirefox = String(this.appName + '/' + this.AppInfos.version);
UserAgentCleaner.prototype.initExtraName = function () {
this.extraFirefox = String(this.appName + '/' + this.AppInfos.version);
};
UserAgentCleaner.prototype.resetExtraName = function () {
var id = 'general.useragent.extra.' + this.AppInfos.name.toLowerCase();
this.initExtraName();
if (this.PrefServ.getCharPref(id) != this.extraFirefox) {
this.PrefServ.setCharPref(id, this.extraFirefox);
this.Console.log("`" + id + "' has been reset.");
}
};
UserAgentCleaner.prototype.unsetExtra = function(last_id) {
try {
if (last_id != this.AppInfos.name.toLowerCase()) {
var id = 'general.useragent.extra.' + last_id;
if (this.PrefServ.getCharPref(id)) {
this.PrefServ.setCharPref(id, '');
this.Console.log("`" + id + "' has been unset.");
return true;
} else {
this.Console.log("`" + id + "' can not be altered using this method.");
}
}
} catch(e) {
this.Console.log('Error: ' + e);
}
return false;
};
UserAgentCleaner.prototype.getExtras = function() {
return this.PrefServ.getChildList('general.useragent.extra.');
};
UserAgentCleaner.prototype.unsetExtras = function() {
var extras = this.getExtras();
for (i=0; i< extras.length; i++) {
if (extras[i] != this.AppInfos.name.toLowerCase()) {
this.unsetExtra(extras[i]);
}
}
};
UserAgentCleaner.prototype.main = function() {
this.resetExtraName();
this.unsetExtras();
};
}
main();
})();
/**
* Local Variables:
* mode: JavaScript
* coding: utf-8
* End:
*/
Explications
Malheureusement, pour des raisons de sécurité, en l'état, cette fonction n'est pas utilisable avec Greasemonkey, si bien que je ne le propose pas en UserScript, pour éviter les soucis. J'utilise, donc, cette fonction avec userChromeJS qui permet d'avoir un comportement, vis-à-vis de la sécurité, similaire à celui d'une extension.
La fonction va réinitialiser la clef general.useragent.extra.firefox avec pour valeur la propriété appName et le numéro de version de Firefox, avant d'essayer de donner comme valeur une chaîne nulle à toutes les clefs general.useragent.extra.* existantes, si nécessaire ; sauf, évidemment, pour la clef general.useragent.extra.firefox.
Et c'est là que la supériorité par rapport au user.js est flagrante…
tout est entièrement automatisé ! 
Un User-Agent tout propre !
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr-FR; rv:1.9.1b4pre) Gecko/20090401 Minefield/3.5b4pre
Comparez avec :
Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.6 MEGAUPLOAD 1.0 (.NET CLR 3.5.30729)
Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.5, Ant.com Toolbar 1.3 (.NET CLR 3.5.30729)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FunWebProducts; Every Toolbar; .NET CLR 1.1.4322)
Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr; rv:1.8.1.4pre) Gecko/20070426 Firefox/2.0.0.4pre (Mac Community Build, ElFurbe)
Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.6) Gecko/20070725 ImageShackToolbar/4.2.1 Firefox/2.0.0.6
Utilisation
Pour son utilisation, il suffit d'ajouter, par exemple, dans le userChrome.js :
if (location == "chrome://browser/content/browser.xul") {
userChrome.import("/ucjs/CleanMyUserAgent.js", "UChrm");
}
De part l'utilisation dans l'userChrome.js, le script sera chargé et exécuté au démarrage du navigateur, cette modification sera considérée comme étant une modification effectuée par l'utilisateur, avec toutes les conséquences que ça suppose. C'était aussi, et surtout, une occasion d'utiliser les Components.classes de Firefox, et de m'exercer à la POO en JavaScript ; ça doit sûrement être perfectible
.