Forums : Extensions

Aller à la discussion :  Plus récente Plus ancienne

# [clos] fenêtres et espace mémoire javascript

Envoyé par : Whitedog

Date : 30/09/2009 11:49

Bonjour.

Débutant en programmation XUL, mais assez habitué aux rudiments javascript, je tente de développer une petite extension firefox pour améliorer l'expérience de jeu pour ogame .

Problème posé par ce site, il ouvre des fenêtres "pop-up" ( des rapports de combats dont je veux récupérer les données et les stocker ) qui initialisent une nouvelle fois mon add-on, et surtout créent un autre "espace mémoire" pour javascript. La variable globale que je crée lors de l'initialisation de mon add-on dans la fenêtre principale n'est pas détectée depuis la pop-up, et donc une autre variable globale est créée, avec ses propres valeurs.

Voici sur quelle pistes je suis pour remédier à ce problème :

  • un scrutateur de progression comme dans le tuto suivant

https://developer.mozilla.org/fr/Extraits_de_code/Scrutateurs_de_progression

  • la fonction getEnumerator() du nsIWindowMediator pour détecter les fenêtres déjà ouvertes.

Je cherche d'une part à comprendre pourquoi les pages du site _ogame_ énumère plusieurs fenêtres ( sans doute des cadres ou des frames? ) et surtout pourquoi certaines d'entre elles n'ont pas de titre, pas de typeOf, et que je n'arrive pas à les "filtrer" et n'énumérer que les fenêtres qui contiennent un objet document avec lequel je puisse travailler... D'autre part, si une variable est enregistrée dans l'espace global en utilisant une déclaration sans le mot-clé _var_ ( et repérée dans les autres onglets ), comment y accéder depuis la pop-up qui ne détecte pas cette variable?

Voici les bouts de code que je dois sûrement modifier pour arriver à ce que je veux :

overlay de browser.xul

<overlay id="codevert" 
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script src="chrome://codevert/content/js/codevert.js"/>


<vbox id="appcontent" flex="1">
 <hbox id="codevertBottomBar" hidden="true">
 	<label id="codevertBottomBar_label" value="ceci est un test"/>
 </hbox>
</vbox>


<statusbar id="status-bar">
 <statusbarpanel id="codevert_statusBarIcon" onclick="Codevert.codevertBottomBar_activate();"><image  id="statusbar_codevert_icon" src="chrome://codevert/skin/codevert.png"/>
 </statusbarpanel>
</statusbar>
</overlay>

codevert.js

if(typeof(Codevert) !== 'object')
Codevert = new Object();
else
alert('error: L\'objet Codevert existe déjà');

Codevert.message = 'Bienvenue! ';

Codevert.urlListener = {
QueryInterface: function(aIID)
{
	if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
	aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
	aIID.equals(Components.interfaces.nsISupports))
	return this;
	throw Components.results.NS_NOINTERFACE;
},

onLocationChange: function() {},

onStateChange: function(aProgress, aRequest, aFlag, aStatus)
{
	if(aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP)
	{
		// ici lorsque le chargement est terminé
		var all_Windows;
		var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                  .getService(Components.interfaces.nsIWindowMediator);
		var enumerator = wm.getEnumerator("navigator:browser");
		while(enumerator.hasMoreElements())
		{
 				var win = enumerator.getNext();
 				// win is [Object ChromeWindow] (just like window), do something with it
//les deux lignes suivantes me donnent des alertes vides, donc signalent des fenêtres dont le titre est vide, mais n'est pas égal à null, ni à une chaine vide, typeOf(win.document) renvoie également du vide.
				
                               if(typeof(win.document.title) == 'string')
			alert(win.document.title + "\n" + typeof(win.document));

		}
			
		if(Codevert.message == 'Bienvenue! ')
		Codevert.codevertBottomBar_activate();
		else
		Codevert.urlEvaluate();
	}

},
onProgressChange: function() {},
onStatusChange: function() {},
onSecurityChange: function() {},
onLinkIconAvailable: function() {}
};

window.addEventListener("load", function(){ gBrowser.addProgressListener(Codevert.urlListener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT);}, false);

J'ai bien conscience que l'utilisation de l'alerte est maladroite, c'est un raccourci que je trouve pratique à ce stade ( probablement à tort ).

# Re: fenêtres et espace mémoire javascript

Envoyé par : Whitedog

Date : 01/10/2009 10:04

Bon, j'ai retouché la portion de code qui me fâche un peu, et trouvé une solution partielle à mon problème, à savoir l'accès à mon objet Codevert de la page principale depuis la pop-up :

while(enumerator.hasMoreElements())
{
	var win = enumerator.getNext();
	// win is [Object ChromeWindow] (just like window), do something with it
	if(win.document.title)
	all_Windows[all_Windows.length] = win.document.title + " : " + win.Codevert.message;
}
alert(all_Windows);

Pourtant, je ne m'explique pas encore l'apparition d'alertes complètement vides, même un typeOf(win) n'écrit rien dans l'alerte. Pas "null", pas "undefined", encore moins "Object", rien, juste du vide. Pire : même les bouts de texte que je fais écrire dans les alertes sont absentes! Et aucune réaction de firebug ou autre ( ou alors je cherche mal ).

Petite idée que j'ai eue, les objets flash embarqués sur une page génèrent-ils un STATE_STOP, tout en n'étant pas considérés comme des fenêtres ( ce qui expliquerait vaguement les alertes vides )? Ogame tourne pas mal avec de l'AJAX maintenant, donc qu'en est-il des XMLHttpRequest?

Bon, pour la suite de ce que je veux faire, je pense pouvoir "bidouiller" quelque chose, mais j'aimerais qu'on m'explique ce qui se passe ici, ou qu'on me donne une manière "propre" de faire les choses :(

# Re: fenêtres et espace mémoire javascript

Envoyé par : Whitedog

Date : 01/10/2009 12:15

Ok, j'ai pigé ce qui ouvre des alertes vides.

Les "pseudos boutons" ( liens qui ont une image comme label ) dont l'image change quand on passe dessus ne chargent la nouvelle image que lorsqu'on déclenche le onMouseOver.

Et donc le onStateChange() est déclenché, ainsi que l'alerte qu'il contient.

Je vois donc bien que le titre de mon sujet n'est plus adapté, et que je ne dois pas être bien loin d'une solution convenable, mais sans qu'on puisse m'aider à moins d'être à côté de moi à rédiger le code ( soit ni plus ni moins coder à ma place ).

J'indique donc que le sujet est clos...

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.