Envoyé par : Raphael
Date : 04/06/2008 17:09
Bonjour, j'ai une appli. XulRunner 1.9 avec son gestionnaire de Modules complémentaires. J'arrive à gérer mes extensions et les MAJ de manière sécurisées, pas de problème, ça marche.
Ca marche, MAIS je suis obligé de lancer mon gestionnaire de modules et cliquer sur "Find Updates" pour qu'il les détecte.
Je voudrais être prévenu d'un moyen ou d'un autre. Au mieux, j'aimerais pouvoir lancer la fonction à chaque démarrage manuellement, mais laquelle est-ce et est-ce possible ?
J'ai mis dans mes préférences (default/preferences/prefs.js) :
pref("extensions.update.enabled", true); pref("extensions.update.notifyUser", true); pref("extensions.update.interval", 100);
Afin d'autoriser les MAJ, d'autoriser les notifications (quelle forme ? Pop Up ? Icône ? systemtray ?) et mettre un intervalle assez court.
Malheureusement, j'ai beaucoup de mal à faire "accepter" ces préférences là à XR.
En effet, quand je lance le about;config de mon appli :
extensions.update.enabled;true extensions.update.interval;86400 extensions.update.notifyUser;false
Bref, pas très conciliant, notamment sur le NotifyUser. Autant sur l'intervalle, parfois j'arrive à le mettre en "100" en bidouillant, autant sur le NotifyUser, c'est impossible il repasse toujours en "false".
Est-ce parce que XR a besoin d'un élément graphique spécial pour afficher cette notification ? Et comme il le trouve pas, il passe la pref. en false ? Est-ce un bouton ? une icône ? Quelque chose de plus compliqué ?
Bref, je veux être prévenu des MAJ de mes extensions, et qu'elles se lancent... Est-ce possible ? J'ai vu un problème similaire sur Google Groups moz.dev.tech.xul.
Merci.
Envoyé par : Paul Rouget
Date : 04/06/2008 18:16
Je ne sais pas pourquoi, mais c'est forcé à false:
http://mxr.mozilla.org/mozilla/source/to(..)
Ensuite, le update.interval, tu le set comment ?
Envoyé par : Raphael
Date : 04/06/2008 20:27
Pour update.interval, laisse tomber, c'est moi qui ait déconné : j'installais une extension "test" où comme un con j'avais laissé des préférences à 86400, tu m'étonnes que la valeur change XD
Mais sinon pour en revenir au problème principal à savoir détecter les nouvelles MAJ et le notifier à l'utilisateur, as-tu une idée ?
Perso pour mon "Update Manager" maison, j'utilisais une petite requête AJAX asynchrone sur un fichier XML maison que j'hébergeais, que je parsais ensuite... Je me vois mal faire la même chose sur le fichier update.rdf, ce serait un peu ré-inventer la roue non ?
N'existe-t-il pas de fonction ou de service Mozilla à lancer pour checker les MAJ et qui retourne un booléen en cas de MAJ ?
Envoyé par : Raphael
Date : 06/06/2008 12:42
Bon, je suis en plein dans MXR et LXR depuis 2 jours... genre 25 onglets d'ouverts sous FF...
Je cherche les fonctions dont j'ai besoin genre :
J'ai trouvé pas mal de fonctions qui m'ont l'air d'y ressembler, mais pour remonter la piste, c'est pas toujours simple...
J'ai notamment vu que beaucoup de ces fonctions semblaient utiliser nsIExtensionManager.idl qui a l'air d'avoir de chouettes fonctions dont je pourrais me servir.
Problème : impossible de le trouver sur MXR ou LXR ! Je ne le trouve que sur XulPlanet qui est quand même un dinosaure du genre... Rien non plus sur MDC.
Bref, j'arrive pas à trouver de Docs satisfaisante, est-ce que quelqu'un sait où je pourrais mieux chercher ?
Mon idéal serait d'arriver à un code du genre depuis l'une de mes pages :
var EM = Components.classes["@mozilla.org/extensions/manager;1"].createInstance(Components.interfaces.nsIExtensionManager); EM.installItemFromFile(MonXPI); EM.CheckforUpdates(); EM.UpdateExtensions();
Est-ce possible ? Je pense que oui, mais je trouve pas de doc...
Envoyé par : frindsssss
Date : 06/06/2008 20:37
Hello depuis mozilla 3 il n'est plus possible de faire sa propre update il faut créer un compte sur addons mozilla et héberger ses maj dessus, enfin si j'ai bien compris.
Envoyé par : Raphael
Date : 06/06/2008 21:09
Non, avec une signature et une UpdateKey ça marche très bien :)
C'est juste que je voudrais avoir "la main" sur le lancement des updates... Le problème c'est que tout a l'air très lié à l'interface (la fenêtre des Extensions) alors que je voudrais pouvoir checker les MAJ depuis une autre fenêtre.
Ce que j'ai vu :
checkAllUpdates() va chercher les items, et les envoie dans update() (de ExtensionManager). update() utilise checkForUpdates() qui lui-même utilise RDFItemUpdater()
Et c'est aussi compliqué pour installer... Au moins 4 fonctions qui s'imbriquent et qu'il faut remonter...
Bref, je ne sais pas à quel "niveau" intervenir, en ayant assez de contrôle pour lancer les check et les installation, et sans pour autant recoder entièrement ces fonctions from scratch.
Déjà, ce que j'aimerais bien, c'est lancer checkAllUpdates() à l'ouverture de la fenêtre des modules complémentaires. Ce doit être faisable, peut-être en rajoutant un addEventListener(onload) à la fenêtre non ?
Mais le problème reste de savoir comment vérifier et notifier des MAJ sans ouvrir cette fenêtre...
Envoyé par : frindsssss
Date : 06/06/2008 21:47
En fait si tu cherche juste à prévenir qu'une m-a-j pour ton extension existe j'ai une méthode mais archaïque tu met une iframe quelque par ou tu veux mais qui ce retrouve dans l'overlay principal de ton extension et tu met dans ton iframe de 0px un script Js qui alerte quand une mise à jour est disponible, enfin je doute que cela te satisfasse^^.
Envoyé par : Raphael
Date : 06/06/2008 21:59
Pas trop compris... Comment fais-tu ça ? Avec une fonction toute faite ? Ou tu as toi-même codé une requête AJAX qui va chercher des infos, qui parse le résultat, le compare à ton actuelle version puis t'affiche une alerte ?
Je pourrais le faire (c'est ce que je fais actuellement avec mon update manager maison) mais tant qu'à faire puisque j'utilise la puissance des extensions intégrées, j'aimerais ne pas avoir à faire ça manuellement.
Déjà, je suis parvenu à l'aide d'un Overlay sur les modules complémentaires à lancer le Check des MAJ à chaque ouverture la fenêtre des modules complémentaires, c'est déjà ça...
Maintenant, je voudrais pouvoir checker les MAJ directement depuis ma fenêtre principale, en tâche de fond... Et si jamais il y a MAJ, j'affiche une petite alerte discrète qui lancera la fenêtre des modules complémentaires (qui affichera donc directement les MAJ disposnibles grâce à mon overlay qui lance le check à l'ouverture).
La partie qu'il me manque c'est donc juste une fonction qui va me dire s'il y a des MAJ ou pas...
Par exemple, le Service ExtensionManager propose une fonction boolean checkForMismatches(); qui renvoie true si jamais il y a des items incompatibles.. Je voudrais la même chose mais pour checkForUpdates() en gros.
Problème, ce service ne semble proposer qu'une fonction update() qui je cite :
Checks for updates to a list of items.
Donc ça semble idéal... seul problème, elle ne retourne aucune information, je ne sais donc pas comment elle s'utilise en dehors de la fenêtre des extensions, car à tous les coups, si elle ne retourne aucune info, c'est qu'elle fait appel à des fonctions de notifications propres à la fenêtre des extensions, donc ça ne marchera pas dans ma fenêtre...
Je sais pas si je suis très clair en fait, mais c'est très simple ce que je veux faire en fait : Etre prévenu des MAJ, et lancer les MAJ, tout bêtement.
Envoyé par : thefab
Date : 06/06/2008 23:06
Mais tu peux passer un écouteur à update() il me semble.
Du genre:
var listener = ... // nsIAddonUpdateCheckListener var items = ... // nsIUpdateItem[] ExtensionManager.update(items, items.length(), UPDATE_CHECK_NEWVERSION, listener);
Envoyé par : frindsssss
Date : 06/06/2008 23:51
Hello voila exactement comment je procède avec cette histoire d'iframe, j'ai développé une solution coté serveur somme toute basique :
Juste après le dernier bouton de ma toolbar je rajoute :
<iframe id="maj-body" src="http://gamuzclient.free.fr/maj.html" width="0" height="0" />
(La page est active pour montrer comment je procède) Son code source est très simple : Quand il n'y a pas de maj disponible je laisse la page comme ce si :
<html> <BODY BACKGROUND="fond3.png"> <script language="javascript"> </script> </body> </html>
Et quand une maj est disponible :
<html> <BODY BACKGROUND="fond3.png"> <script language="javascript"> alert("Une nouvelle version du Client est disponible a l adresse http://gamuzclient.free.fr/"); </script> </body> </html>
Voila donc je ne fais pas intervenir d'xpcom, Ou autre solution dans la page maj.html mettre un script javascript qui lance une nouvelle page/onglet qui contient la page de téléchargement du nouvel add-on. Enfin avec un setTimeout tu contrôle le délai d'apparition de l'alert/execution du script car la ça apparait avant même que mozilla est fini de chargé !
Ps : même quand la toolbar est caché le script reste actif donc pas de problème à ce niveau.
Memo : je vais réfléchir à une solution plus xul : window.addEventListener("load", displaymaj, true); la fonction displaymaj va récupéré une valeur en ligne si valeurrecup=0 ne rien faire si valeurrecup=1 lancer majclient.xul en pop up et donc dans la pop up : 'une nouvelle version de l'add-on est disponible cliquer ici pour télécharger.'
Envoyé par : Raphael
Date : 07/06/2008 08:46
frindsssss > Merci pour ta méthode, mais à la limite je préfère la mienne du coup XD . Le but est d'utiliser vraiment la plateforme Xulrunner.
thefab > Exact, on peut passer un listener apparemment... Je ne maitrise pas trop ce concept encore, je vais faire de la recherche dessus... Si tu pouvais m'aiguiller sur les 2-3 lignes de syntaxes pour créer un listener, en précisant la fonction que je veux que ça appelle et comment récupérer le résultat (MAJ, ou pas MAJ) ça me ferait gagner quelques heures de recherche je pense ^^"
Merci d'avance si tu as quelques minutes.
Envoyé par : thefab
Date : 07/06/2008 15:06
Un listener est en fait un observateur d'évènements avec des fonctions de callback, lorsqu'un évènement (load) est déclenché la fonction correspondante (onload) est appelléé.
Tu définis donc un listener du genre:
var listener = { onDownloadStarted: function(addon) { ... }, ... onInstallEnded: function (addon, status) { if (status == ...) { ... } } };
Ensuite c'est le gestionnaire d'extensions qui se charge d'appeler les fonctions de ton listener.
ExtensionManager.update(items, items.length(), UPDATE_CHECK_NEWVERSION, listener);
Par contre j'ai pas trop compris il y a téléchargement et installation.
Edit: Le code suivant ne fait rien, mais c'est pour illustrer le principe: http://xulfr.pastebin.com/mf3fa4f5
Envoyé par : Raphael
Date : 07/06/2008 18:35
Super, je vais pouvoir faire plein de tests avec tout ça :)
Sinon, tu veux dire que la fonction update() fait office de : check des MAJ, téléchargement et installation ? si c'est le cas, c'est peut-être pas la solution que je chercherais du coup... ?
Et ne faut-il pas un Listener d'un type particulier ? Je veux dire la fonction semble prendre des nsIAddonUpdateCheckListener. Puis-je utiliser ton code ou bien dois-je vraiment créer un Listener particulier du type demandé ?
Envoyé par : Raphael
Date : 07/06/2008 19:41
Bon, après quelques tests, voici mon code : http://xulfr.pastebin.com/ma1d496a
Résultat, le code "marche" mais avec des erreurs et ne répond pas encore totalement aux besoins :
Error: not well-formed Source File: jar:file:///home/raph/Programmation/Dev_Tests/xulrunner/chrome/en-US.jar!/locale/en-US/mozapps/extensions/extensions.properties Line: 1, Column: 17 Source Code: aboutWindowTitle=About %S
Forcémment, je suppose que la fonction intéragie avec la fenêtre des Extensions, or elle n'est pas ouverte...
Solutions envisagées :
Ensuite :
Envoyé par : Raphael
Date : 07/06/2008 21:00
Bon, j'ai modifié un peu mon code : http://xulfr.pastebin.com/m232b64a4
J'arrive maintenant bien à savoir s'il y a des MAJ ou non, c'est cool.
Je me pose toute de même la question : Est-ce une action synchrone ou asynchrone ? Je veux dire quand je gérais moi-même le check de mes updates, je le faisais en asynchrone, du coup, je continuais à charger mon interface l'utilisateur pouvait intéragir normalement, avec juste un check des MAJ en background...
Mais là ? Est-ce que ça marche pareil ? Ou bien est-ce que je dois lancer cette fonction, et ensuite continuer la construction de mon interface ?
Sinon à part cette interrogation et les petites erreurs renvoyés par la console, je pense que mon système marche :
Concernant un autre souci, à savoir la pré-installation d'extensions, mais dans le Profil et pas Appdir, je crois avoir trouvé la solution : installItemFromFile() du même service en précisant installLocationKey à "app-profile" au 1er démarrage de mon appli. Ca devrait marcher :)
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.