Envoyé par : smartiz77
Date : 21/07/2008 03:44
Salut. Je suis novice avec XPCOM et j'ai un petit probleme. J'ai essaye de suivre le tutorial suivant: http://basic.mozillanews.org/mozilla_boo(..) mais seulement la partie pour creer un composant en javascript.
J'ai utilise le sdk "xulrunner-1.9.en-US.win32.sdk.zip" et j'utilise firefox 3
Voici le code de mon interface "nsISimple.idl":
#include "nsISupports.idl" [scriptable, uuid(ce32e3ff-36f8-425f-94be-d85b26e634ee)] interface nsISimple : nsISupports { attribute string yourName; void write( ); void change(in string aValue); };
et le code de mon composant "nsSimple.js":
SimpleComponent.prototype = { mName: "a default value", get yourName() { return this.mName; }, set yourName(aName) { return this.mName = aName; }, write: function () { dump("Hello " + this.mName + "\n"); }, change: function (aValue) { this.mName = aValue; }, QueryInterface: function (iid) { if (!iid.equals(Components.interfaces.nsISimple) && !iid.equals(Components.interfaces.nsISupports)) throw Components.results.NS_ERROR_NO_INTERFACE; return this; } } var Module = { firstTime: true, registerSelf: function (compMgr, fileSpec, location, type) { if (this.firstTime) { dump("*** first time registration of Simple JS component\n"); this.firstTime = false; throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN; } dump(" ***** Registering: Simple JS component! ****\n"); compMgr.registerComponentWithType(this.myCID, "My JS Component", this.myProgID, fileSpec, location, true, true, type); }, getClassObject : function (compMgr, cid, iid) { if (!cid.equals(this.myCID)) throw Components.results.NS_ERROR_NO_INTERFACE if (!iid.equals(Components.interfaces.nsIFactory)) throw Components.results.NS_ERROR_NOT_IMPLEMENTED; return this.myFactory; }, myCID: Components.ID("{98aa9afd-8b08-415b-91ed-01916a130d16}"), myProgID: "@mozilla.org/js_simple_component;1", myFactory: { createInstance: function (outer, iid) { dump("CI: " + iid + "\n"); if (outer != null) if (outer != null) return (new SimpleComponent()).QueryInterface(iid); } }, canUnload: function(compMgr) { dump("****** Unloading: Simple JS component! ****** \n"); return true; } }; // END Module function NSGetModule(compMgr, fileSpec) { return Module; }
J'ai compile l'interface en xpt a l'aide de XPIDL, jusque la tout va bien. Puis j'ai copier les fichiers nsISimple.xpt et nsSimple.js dans mon repertoire firefox/components Ensuite j'ai execute regxpcom.exe
Mais c'est la que ca pose probleme, quand je regarde le fichier xpti.dat (dans le dossier de mon profile), mon interface est bien presente:
1221,nsISimple,{ce32e3ff-36f8-425f-94be-d85b26e634ee},2,-1,1
Mais dans le fichier compreg.dat, il n'y a aucune trace de mon composant!
Est-ce que j'ai oublie de faire quelque chose? Est-ce que mon code est mauvais? (peut-etre que les standards ont evolues depuis la creation du tutorial)
Merci
PS: desole pour les accents a cause de mon clavier anglais
Envoyé par : smartiz77
Date : 21/07/2008 06:46
C'est bon, en fait je ne sais pas ce qui bloquait, mais j'ai trouve un autre tutorial un peu plus officiel et a jour! http://developer.mozilla.org/en/docs/How(..)
Et maintenant tout marche :)
Envoyé par : smartiz77
Date : 21/07/2008 07:05
J'ai encore une petite question. Je suis peut-etre bete mais je croyais possible l'utilisation d'un code java (pas javascript) directement a partir de gecko en utilisant un composant XPCOM ecrit en java... Je me suis trompé n'est-ce pas?
grrr j'ai du mal lire la page : http://developer.mozilla.org/en/docs/JavaXPCOM
En gros je n'ai aucun moyen d'appeler du code java a partir du navigateur firefox?
Envoyé par : Paul Rouget
Date : 21/07/2008 08:26
En effet, tu ne peux pas utiliser de code Java via l'instance XPCom de Gecko.
Envoyé par : smartiz77
Date : 22/07/2008 07:13
En fait je peux tout simplement utiliser un applet java pour executer mon code java et recuperer le resultat.
Ca fonctionne tres bien en appelant un class file distant (http://myhost/myfile.class). Mais je n'arrive pas a inclure le byte code (class file) a partir de mon extension Firefox 3.
En mettant mon fichier avec les autres fichers de l'extension, ca me met une erreur dans la console javascript:
Security Error: Content at http://www.google.com.au/ may not load or link to chrome://sample/content/MessageApplet.class.
Parce qu'en fait mon extension firefox modifie en live le DOM de la page de google pour y inclure l'applet java.
Meme en ajoutant la ligne suivante a mon fichier chrome.manifest:
content sample chrome/content/ contentaccessible=yes
Quelqu'un sait-il comment je peux faire pour inclure cet applet a partir de mon extension?
Envoyé par : Paul Rouget
Date : 22/07/2008 10:23
et via une url file:// ?
Envoyé par : smartiz77
Date : 23/07/2008 02:30
merci pour cette idee, cependant cela donne exactement la meme type d'erreur:
Security Error: Content at http://www.google.com.au/ may not load or link to file://sample/content/MessageApplet.class.
Envoyé par : snotling
Date : 07/08/2008 23:07
Euh, j'ai tout faux si propose de regarder http://developer.mozilla.org/en/docs/Jav(..) ? :)
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.