Question

Je suis en bêta test d'une application qui comprend une extension Firefox comme un seul composant. Il a été initialement déployé lorsque FF3.5.5 était la dernière version et a survécu 3.5.6 et 3.5.7. Cependant, sur FF3.6, j'obtiens ce qui suit dans ma console d'erreur:

Warning: reference to undefined property Components.interfaces.nsIProcess2
Source file: chrome://overthewall/content/otwhelper.js
Line: 55

Error: Component returned failure code: 0x80570018 (NS_ERROR_XPC_BAD_IID) 
         [nsIJSCID.createInstance]
Source file: chrome://overthewall/content/otwhelper.js
Line: 55

La fonction lançant l'erreur est:

48 function otwRunHelper(cmd, aCallback) {
49  var file =
50      Components.classes["@mozilla.org/file/local;1"].
51      createInstance(Components.interfaces.nsILocalFile);
52  file.initWithPath(otwRegInstallDir+'otwhelper.exe');
53
54  otwProcess = Components.classes["@mozilla.org/process/util;1"]
55                  .createInstance(Components.interfaces.nsIProcess2);
56
57  otwProcess.init(file);
58  var params = new Array();
59  params = cmd.split(' ');
60  
61  otwNextCallback = aCallback;
62  otwObserver = new otwHelperProcess();
63  otwProcess.runAsync(params, params.length, otwObserver, false);
64 }

Comme vous pouvez le voir, toute cette fonction est d'exécuter un fichier externe EXE Helper (situé par une clé de registre) avec certains paramètres de ligne de commande et configure un observateur pour attendre de manière asynchrone une réponse et traiter le code de sortie.

La ligne incriminée implique que Composants.interfaces.nsiprocess2 n'est plus défini dans FF3.6. Où est-il allé? Je ne trouve rien dans la documentation de Mozilla indiquant qu'il a été modifié dans la dernière version.

Était-ce utile?

La solution

La méthode sur Nsiprocess2 a été déplacée vers Nsiprocess. Pour que votre code fonctionne dans les deux versions, modifiez cette ligne:

otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(Components.interfaces.nsIProcess2);

pour ça:

otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(Components.interfaces.nsIProcess2 || Components.interfaces.nsIProcess);

Vous obtiendrez toujours l'avertissement, mais l'erreur disparaîtra et votre code fonctionnera très bien dans les deux versions. Vous pouvez également stocker l'interface IID dans une variable et utiliser la variable:

let iid = ("nsIProcess2" in Components.interfaces) ?
  Components.interfaces.nsIProcess2 :
  Components.interfaces.nsIProcess;
otwProcess = Components.classes["@mozilla.org/process/util;1"]
                .createInstance(iid);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top