Comment récupérer l'URL d'un onglet qui vient d'être ouve

Vous vous penchez sur le développement d'applications ou d'extensions pour Mozilla ? C'est alors vers ce forum que se dirigeront naturellement vos requêtes...

Modérateur : chBok

gussticier

Comment récupérer l'URL d'un onglet qui vient d'être ouve

Message par gussticier » 20 juil. 2009, 12:13

Bonjour,

Je développe une extension Firefox (barre d'outils sous forme d'Overlay).

Après de nombreuses recherches et de tests, je ne parviens pas à récupérer l'URL du dernier onglet ouvert.

Je souhaite qu'à chaque fois qu'un utilisateur ouvre un nouvel onglet, mon extension récupèrel'URL de cet onglet pour savoir si l'utilisateur est sur un site particulier.

j'ai essayé ceci :

Code : Tout sélectionner

window.addEventListener(
  "load",
  function () {
        var container = gBrowser.tabContainer;
	container.addEventListener("TabOpen", onTabAdded, false);
  },
  false
);


function onTabAdded(event)
{
	var tabAdded = event.target;
	//alert('TEMPORISATION (ça ne marche pas sans la temporisation)');

	var tabAdded_URL = event.target.linkedBrowser.currentURI.spec; 
   alert(tabAdded_URL);
}
Si je ne met pas l'alert de tempporisation, j'ai toujours tabAdded_URL = about:blank, alors que si je met l'alert, je récupère bien l'url dans tabAdded_URL.

Comment expliquer cela???

Merci de toute aide!

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

gussticier

Message par gussticier » 20 juil. 2009, 12:15

J'ai trouvé ceci qui est peut être une piste concernant mon problème :

http://stackoverflow.com/questions/9921 ... and-beyond



Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

Pastisman
Tyrannosaurus Rex
Messages : 2137
Enregistré le : 27 juin 2008, 15:18

Message par Pastisman » 20 juil. 2009, 13:15

bonjour,

Comme expliqué dans le lien que tu as donné, l'évènement TabOpen intervient avant le chargement de l'URL.

Je pense qu'il faut récupérer le "browser" de l'onglet dans ton eventlistener:

var browser = event.target.linkedBrowser;

et rajouter à ce browser un eventlistener sur load je pense.


Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1
Ma devise : Etre convaincu (en 3 mots)
Mes extensions

gussticier

Message par gussticier » 20 juil. 2009, 14:21

C'est à dire?
A la place de l'evênement TabOpen sur le container, je met un évênement load sur event.target.linkedBrowser ???

Peux tu me donner un exemple de ce que tu proposes, stp!

Merci de ton aide.

Vive la Part-Dieu!!!
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

Pastisman
Tyrannosaurus Rex
Messages : 2137
Enregistré le : 27 juin 2008, 15:18

Message par Pastisman » 20 juil. 2009, 14:31

Bah c'est sans garantie mais peut-être

Code : Tout sélectionner

window.addEventListener(
  "load",
  function () {
        var container = gBrowser.tabContainer;
   container.addEventListener("TabOpen", onTabAdded, false);
  },
  false
);


function onTabAdded(event)
{
   var browser = event.target.linkedBrowser; 
   browser.addEventListener("Load", onURLLoad, false );
}

function onURLLoad(event)
{
   var tabAdded_URL = event.target.linkedBrowser.currentURI.spec;
   alert(tabAdded_URL);
} 
Le problème est que onURLLoad va être appelé à chaque changement d'URL de l'onglet. Si tu veux qu'elle ne soit appelée qu'une fois il faut ajouter dans onURLLoad un event.target.linkedBrowser.removeEventListener('load', onURLLoad, true )

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1
Ma devise : Etre convaincu (en 3 mots)
Mes extensions

chBok
Iguane
Messages : 990
Enregistré le : 17 oct. 2003, 19:17

Message par chBok » 20 juil. 2009, 14:58


gussticier

Message par gussticier » 20 juil. 2009, 15:02

J'ai essayé ta solution, mais l'événement, "load" affecté au browser n'est jamais émis...

Je ne sais pas si l'événement est bien affecté?

En tout cas merci de ton aide aussi rapide!

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

gussticier

Message par gussticier » 20 juil. 2009, 15:15

Oui j'ai exploité au maximum les exemples de cette page mais même avec ce code, je ne parviens pas à récupérer pas l'url du nouvel onglet!

Merci aussi pour l'aide...

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

Pastisman
Tyrannosaurus Rex
Messages : 2137
Enregistré le : 27 juin 2008, 15:18

Message par Pastisman » 20 juil. 2009, 17:28

P... j'ai galéré !!!!

Code : Tout sélectionner

var Test = {

  init : function() {
      var container = gBrowser.tabContainer;
      container.addEventListener("TabOpen", Test.onTabAdded, false);
   },
   
   onTabAdded : function(event)
   {
      var appcontent = document.getElementById("appcontent");   // browser
      appcontent.addEventListener("DOMContentLoaded", Test.onULoad, true);
   },

   onULoad : function(event)
   {
      var doc = event.originalTarget; // doc is document that triggered "onload" event
      alert(doc.location.href);
      var appcontent = document.getElementById("appcontent");   // browser
      appcontent.removeEventListener("DOMContentLoaded", Test.onULoad, true);
   },
}

  
addEventListener("load", Test.init, false);
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1
Ma devise : Etre convaincu (en 3 mots)
Mes extensions

gussticier

Message par gussticier » 20 juil. 2009, 17:48

WAOUH...

Enorme!!!

Ca faisait plus d'une semaine que je cherchais une solution à ce problème!!!

Merci infiniment et Bravo...


RESOLU

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

gussticier

Message par gussticier » 21 juil. 2009, 11:07

Oups, un dernier petit soucis!

Le "event.originalTarget" de la fonction onULoad, renvoie le document qui a émis l'évênement "onLoad".

Comment faire pour récupérer l'onglet qui contient ce document ? J'ai besoin de cet onglet pour lui affecter un attribut (avec le setAttribute)!

Merci d'avance...

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

Pastisman
Tyrannosaurus Rex
Messages : 2137
Enregistré le : 27 juin 2008, 15:18

Message par Pastisman » 21 juil. 2009, 13:19

gBrowser.tabContainer.selectedItem ?

Mais cela ne fonctionne que quand l'onglet ouvert prend le focus. Sinon, en allant chercher le dernier, généralement je pense que c'est celui la, sauf utilisation d'une extension.

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1
Ma devise : Etre convaincu (en 3 mots)
Mes extensions

gussticier

Message par gussticier » 21 juil. 2009, 14:21

En effet, ça ne marche que lorsque l'onglet a le focus, ce qui n'est pas toujours le cas...

Prendre le dernier onglet n'est pas la solution, car parfois, le dernier onglet ouvert n'est pas en fin de liste des onglets ouverts...

j'ai essayé ceci dans la fonction onUload que tu as proposé :

Code : Tout sélectionner

onULoad : function(event)
{
     var doc = event.originalTarget; // doc est le document qui a émis l'évenement "DOMContentLoaded"
     var docAdded_URL = doc.location.href;
     var tabAdded;
     var num = gBrowser.mPanelContainer.childNodes.length;

     for (var i = 0; i < num; i++) 
		{
			var b = gBrowser.getBrowserAtIndex(i);
			var url_temp = b.currentURI.spec;
			if(url_temp == docAdded_URL) 
			{
				tabAdded = b;
			}
		}
     alert('URL du nouvel onglet : ' + tabAdded.currentURI.spec); // renvoie la bonne URL
		
     tabAdded.setAttribute("TEST", "valeur_fictive");
     alert(tabAdded.getAttribute("TEST")); // valeur_fictive
}
tabAdded est bien l'onglet qui vient d'être ouvert (l'url le confirme), mais l'attribut TEST n'est pas conservé ou pas enregistré.

Pour le savoir, j'ai fait une alerte de l'attribut TEST lorsque je clique sur l'onglet, l'attribut TEST renvoie rien...

Je pense que le problème vient de l'élément tabAdded qui n'est pas vraiment l'onglet (Est-ce clair?? :? )

En tout cas, merci beaucoup de ton aide!

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

Pastisman
Tyrannosaurus Rex
Messages : 2137
Enregistré le : 27 juin 2008, 15:18

Message par Pastisman » 21 juil. 2009, 14:42

En fait l'onglet en haut (avec le titre la page) et le browser en bas qui affiche la page sont dissociés. On peut facilement retrouver le browser à partir de l'onglet, l'id du browser étant dans la propriété "linkedPanel" de l'onglet ( classe tabbrowser-tab).
L'inverse, retrouver l'onglet à partir du browser (et surtout du document) est moins facile.

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1
Ma devise : Etre convaincu (en 3 mots)
Mes extensions

gussticier

Message par gussticier » 21 juil. 2009, 14:57

C'est ce que je craignais...

Moins facile veut dire impossible???

Si je comprends bien, j'essaie d'associer à l'onglet un attribut (TEST) alors que je n'ai pas encore récupéré l'onglet (j'ai seulement le browser <=> tabAdded).

Alors y'a t'il quand même un moyen d'associer un attribut à un onglet que l'on vient d'ouvrir?
(Pour mon extension, je voudrais que : Si l'utilisateur ouvre un nouvel onglet qui contient le même nom de domaine que l'onglet actuellement selectionné, le nouvel onglet ait les mêmes attributs que l'onglet actuellement selectionné)


Merci de ton aide, je commence à y voir clair, sans pour autant parvenir à ce que je voudrais...

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11

Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité