Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Autres langages pour le Web
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/05/2008, 11h30   #1
Membre régulier
 
Avatar de Mr Pink Eyes
 
Étudiant
Inscription : mai 2007
Messages : 116
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 116
Points : 94
Points : 94
Envoyer un message via MSN à Mr Pink Eyes
Par défaut [XUL/JS] Tester le chargement complet d'une page avec frames

Bonjour,

Je développe une extension pour Firefox ayant pour but (entre autre) d'inspecter les frames éventuellement contenues dans la page affichée dans le Browser. En temps normal ça marche très bien lorsque je clique sur l'onglet qui contient la page avec frames mais pas lors de son premier chargement. Je suppose que c'est du au fait que la fonction est lancée avant que la page est fini de charger.

Du coup j'aurais voulu savoir comment tester si la page est chargée. J'ai testé avec DOMContentLoaded mais ça ne semble pas marcher.

Je ne sais pas si je suis très clair alors n'hésitez pas à poser des questions.

Merci d'avance.
Mr Pink Eyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 07h56   #2
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
Bonjour,

et DOMFrameContentLoaded ?
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 09h04   #3
Membre régulier
 
Avatar de Mr Pink Eyes
 
Étudiant
Inscription : mai 2007
Messages : 116
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 116
Points : 94
Points : 94
Envoyer un message via MSN à Mr Pink Eyes
J'étais passé à coté de cet event!!!

Merci beaucoup en tout cas! ça marche impeccablement du coup!

EDIT : ça marche quand la page est rechargée via la restauration de session (ce qui n'était pas le cas avant) mais pas quand je charge pour la première fois la page en rentrant son URL dans la barre d'adresse...

Je mets un bout de code pour expliquer grosso-modo comment je gère ça :
Code Javascript :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
var myExt_urlBarListener = {
  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(aProgress, aRequest, aURI)
  {
	if(window.content.document.location!='about:blank'){
	    myExtension.processNewURL(aURI);
	}
  },
 
  onStateChange: function() {},
  onProgressChange: function() {},
  onStatusChange: function() {},
  onSecurityChange: function() {},
  onLinkIconAvailable: function() {}
};
 
var myExtension = {
oldURL: null,
 
  init: function() {
    // Scrutateur pour les chargements de pages Web
    gBrowser.addProgressListener(myExt_urlBarListener,
        Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
  },
 
    inspectDOM: function(usedURI){
		var frames = window.content.document.getElementsByTagName("frame");
		var nbDanger = 0;
 
		var frameButton = document.getElementById("PishBar-Frame-Button")
 
		// create a global history object in JS
		var hist = 
		  Components.classes["@mozilla.org/browser/global-history;2"].getService(Components.interfaces.nsIGlobalHistory2);
		  // create an IO Service in JS
		var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
 
 
		var i=0;
		for(i=0; i<frames.length; i++){
			var source=frames.item(i).getAttribute("src");
 
			if(source.charAt(0)=='.'){
				var URIpath = usedURI.spec.substr(0,usedURI.spec.lastIndexOf('/'));
				var pageSource = source.substr(source.indexOf('/'));
				source = URIpath+pageSource;
			}
 
			var bURI=ioService.newURI(source,null,null);
			if((frames.item(i).baseURIObject.host != bURI.host)||(frames.item(i).contentDocument.getElementsByTagName("frame").length>0)){
				nbDanger++;
			}
		}
		//alert("id =" + frameButton.id +" value=" + frameButton.test);
 
		if (nbDanger>0){
			nbDanger--; // because the first frame that belongs to the good domain name is also counted
			frameButton.style.listStyleImage="url(\"chrome://phishbar/skin/Frame/stop_16.png\")";
			frameButton.style.fontWeight="bolder";
			frameButton.style.color="red";
			frameButton.label=nbDanger + " suspicous element(s)";
		}
		else{
			frameButton.style.listStyleImage="url(\"chrome://phishbar/skin/Frame/22.png\")";
			frameButton.style.fontWeight="normal";
			frameButton.style.color="green";
			frameButton.label="Structure is ok";
		}
    },
 
  processNewURL: function(usedURI) {
 
	  if (usedURI.host!= this.oldURL){
		    // maintenant, nous savons que l'url est nouvelle...
		    this.oldURL = usedURI.host;
		  this.inspectDOM(usedURI);
	  }
  },
 
};
 
window.addEventListener("DOMFrameContentLoaded", function() {myExtension.init()}, false);

Voilà...
Mr Pink Eyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 10h21   #4
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
Heu, alors pas d'idée car je ne vois pas trop comment s'architecture l'ensemble.
Quand tu dis "ne fonctionne pas" c'est une exception JS ? Dans quel environnement es-tu ?
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 10h37   #5
Membre régulier
 
Avatar de Mr Pink Eyes
 
Étudiant
Inscription : mai 2007
Messages : 116
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 116
Points : 94
Points : 94
Envoyer un message via MSN à Mr Pink Eyes
Et bien en fait, je pense que le problème vient du onLocationChange qui est appelé lorsque je change de page. Du coup il n'attends pas la fin du chargement pour lancer l'appel à la méthode suivante et la console d'erreur de FireFox me retourne Erreur*: Permission refusée d'appeler la méthode Location.toString.

Après je sais pas trop ce que tu entends par environnement... mais si ça aide : Mozilla 5.0
Windows XP Pro
Firefox 3.0b5
Mr Pink Eyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 11h43   #6
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
J'imagine que tu as lu cela http://developer.mozilla.org/fr/docs...&printable=yes
Comme dans ton exemple, je ne vois pas la gestion du onStateChange ??
Et on dirait qu'ici http://groups.google.com/group/mozil...61196fdc2cf01d, quelqu'un a un problème similaire (sur le premier chargement). Peut-être le contacter ??
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 12h25   #7
Membre régulier
 
Avatar de Mr Pink Eyes
 
Étudiant
Inscription : mai 2007
Messages : 116
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 116
Points : 94
Points : 94
Envoyer un message via MSN à Mr Pink Eyes
Citation:
Envoyé par Christophe Charron Voir le message
Oui, je m'en suis même largement inspiré
Citation:
Envoyé par Christophe Charron Voir le message
Et on dirait qu'ici http://groups.google.com/group/mozil...61196fdc2cf01d, quelqu'un a un problème similaire (sur le premier chargement). Peut-être le contacter ??
J'avais déjà lu ce thread aussi mais il est vrai que je n'ai pas pensé à écrire à l'auteur...

Quoiqu'il en soit, j'ai réussi à le faire marcher. Maintenant je ne suis pas sur que ce soit la méthode la plus élégante qui soit mais bon... En fait j'ai juste modifié les EventListeners :

Code Javascript :
1
2
window.addEventListener("load", function() {myExtension.init()}, false);
window.addEventListener("DOMFrameContentLoaded", function() {myExtension.inspectDOM()}, false);
Mr Pink Eyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h50.


 
 
 
 
Partenaires

Hébergement Web