Page 1 sur 1
Nettoyer l'User-Agent avec userChrome.js
Publié : 02 avr. 2009, 16:43
par ~HP
Bon, c'est pas vraiment un application
je ne sais pas si il est vraiment nécessaire d'en faire une extension à part entière, notamment de part l'intérêt "geekesque" de la chose
Mais j'ai écrit un script qui "réinitialise" (pas vraiment) toutes les clefs
general.useragent.extra.*, fonctionnant "comme une extension" mais nécessitant l'utilisation de
userChromeJS. Parce que l'on voit souvent des UA de cette sorte, par exemple :
Code : Tout sélectionner
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
Explications et script :
nettoyer l'User-Agent avec userChrome.js.
Commentaires, remarque, suggestions ; ici, ailleurs ou pas

.
Message envoyé avec : Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr-FR; rv:1.9.1b4pre) Gecko/20090401 Minefield/3.5b4pre
Publié : 03 avr. 2009, 20:43
par martin
Mes remarques:
1- j'approuve l'initiative

, je déteste (vraiment

) que des extensions changent mon UA, d'autant que je me souviens que çà faisait planter le plugin Java (je ne sais pas si c'est toujours d'actualité).
2- l'idée de l'userChromeJS me semble pertinente. (Je m'en suis encore jamais servi d'ailleurs)
3- j'aurai personnellement préféré un reset de la préférence en question, plutôt que de vouloir la créer. Example pratique, j'ai déjà eu un bug dans une de mes extensions, ne survenant pas avec le Firefox "officiel", mais survenant sur le Firefox d'une distribution. Bref, l'info de l'UA est pertinente dans le cas des compilations particulières.
Publié : 04 avr. 2009, 10:42
par ~HP
martin a écrit :3- j'aurai personnellement préféré un reset de la préférence en question, plutôt que de vouloir la créer. Example pratique, j'ai déjà eu un bug dans une de mes extensions, ne survenant pas avec le Firefox "officiel", mais survenant sur le Firefox d'une distribution.
Heu
je ne suis pas sûr d'avoir compris
mais en s'en servant ainsi :
Code : Tout sélectionner
(function() {
function main() {
var UACleaner = new UserAgentCleaner();
UACleaner.unsetExtras();
}
ça ne touche pas
general.useragent.extra.firefox, donc
ce qui explique la fonction main() placée en haut du fichier, pour faciliter sa modification
pour le reste, je vais ajouter un test pour éviter de modifier la clef
firefox si elle ne le nécessite pas ; c'est simple et logique mais ça m'avait échappé.
Je vais aussi modifier le nom de l'objet en
UserAgentCleaner pour éviter toute confusion.
Message envoyé avec : Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr-FR; rv:1.9.1b4pre) Gecko/20090403 Minefield/3.5b4pre
Publié : 04 avr. 2009, 15:19
par Invité
je préfère effectivement cette solution

. Ma remarque était cependant mal formulée, et je n'avais regardé en détail comment fonctionnait le userAgent (j'avais pas percuté qu'il était construit par firefox sur plusieurs préférences).
Comme j'ai regardé un peu plus précisément ton code, quelque remarques supplémentaires (qui se veulent constructives

):
Je ne sais pas si c'est une très bonne idée de définir le prototype d'un objet dans le corps de son constructeur :s . Je n'ai jamais vu celà auparavant, et çà implique que les méthodes concernées sont redéfinies à chaque instanciation... (Prefs et Console par exemple). Une meilleurs indentation de ton code le met en évidence.
Je ne vois pas trop l'intérêt de créer ces objets Prefs et Console par ailleurs. Leurs instances pointeront je pense vers le même objet, puisque ce sont des services XPCOM (donc singleton), et leur méthodes natives semblent suffisantes (getCharPref par exemple). Donc une simple variable initialisé sur le service désiré, suffirait pour tout le script.
Publié : 04 avr. 2009, 15:21
par martin
flûte, encore oublié de me loguer...
Publié : 04 avr. 2009, 16:49
par ~HP
Pour l'indentation et les prototypes
tout çà
ouais, j'ai merdé
mais je débute en POO en JavaScript
alors, j'y comprends pas grand chose à la syntaxe !
Rhino me disait que j'avais pas d'erreur de syntaxe, alors bêtement je continuais
Le but c'était aussi d'essayer des nouveaux trucs
mais ce que je voulais c'était des classes toutes bêtes avec leurs méthodes dedans
ça fait propre et rangé
j'ai pas encore bien compris comment on fait çà en JavaScript

.
Exemple en PHP4 :
Code : Tout sélectionner
class maClasse {
var $p1;
var $p2;
var $p3;
function maClasse() {
$this->p1 = "something";
}
}
avec une classe et son constructeur
Message envoyé avec : Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr-FR; rv:1.9.1b4pre) Gecko/20090403 Minefield/3.5b4pre
Publié : 04 avr. 2009, 17:39
par martin
~HP a écrit :
Rhino me disait que j'avais pas d'erreur de syntaxe, alors bêtement je continuais
Parce qu'il ne doit pas y en avoir, même si c'est incongru

.
Exemple en PHP4 :
~HP a écrit :
Code : Tout sélectionner
class maClasse {
var $p1;
var $p2;
var $p3;
function maClasse() {
$this->p1 = "something";
}
}
avec une classe et son constructeur
A l'arrache:
Code : Tout sélectionner
function MyClass(aArg) {
// constructeur
this.myProperty3 = aArg;
}
MyClass.prototype = {
// propriétés et methodes "partagées" par toutes les instances
myProperty1: 'string',
myProperty2: 0,
myProperty3: null,
myMethod1: function(aArg) {
this.myProperty1 = aArg;
}
};
MyClass.prototype.anotherMethod = function(aArg) {
//cette methode est aussi partagée par toutes les instances
}
// cette propriété est aussi connue de toutes les instances
MyClass.prototype.anotherProperty = "toto";
// une instance
var myObject1 = new Myclass("test_1");
myobject1.myMethod2 = function(aArg) {
// cette méthode n'est disponible que pour cette instance
};
MyClass.prototype.myMethod1 = function(aArg) {
// cette méthode est maintenant modifiée pour toutes les instances
alert(aArg);
}
Publié : 04 avr. 2009, 20:40
par ~HP
Ok, et si je garde tout pareil
et que je mets des
this à la place des
ClassName.prototype.functionName
J'ai ma syntaxe (ou presque) comme en PHP ou Python
où les méthodes sont dans la classe
Ou j'ai rien compris
Message envoyé avec : Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr-FR; rv:1.9.1b4pre) Gecko/20090403 Minefield/3.5b4pre
Publié : 04 avr. 2009, 21:42
par Invité
tu veux dire quelque chose comme çà ? :
Code : Tout sélectionner
function MyClass(aArg) {
// constructeur
this.p1 = "string";
this.myMethod = function() {
alert("tralala");
};
}
Oui mais non

, à ce moment là tu définis des méthodes à chaques instanciations, tu ne bénéficies pas de la chaines des prototypes de JavaScript.
Le principe des prototypes en JS, c'est que lors de l'appel d'une méthode sur un objet, JS regarde si la méthode existe sur cet objet, puis sur le prototype de cet objet, puis sur le prototype parent, et ainsi de suite.
Ce qu'on lis la plupart du temps, c'est que JS n'est pas un language objet, mais un language prototype. Mais ces formulations permettent d'appliquer les principes objets sur ce langage. Y'a des pages très intéressantes sur MDC (chercher OOP javascript).
Bref, çà revient au même pour toi, tu définis le constructeur, puis le prototype à la suite, çà ressemblera quand même un peu à PHP

.
J'espère ne pas dire de bêtises...
Publié : 04 avr. 2009, 21:44
par martin
décidement, je met pas de gâteaux de côté en ce moment

...