Page 1 sur 2
Comment récupérer l'URL d'un onglet qui vient d'être ouve
Publié : 20 juil. 2009, 12:13
par gussticier
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
Publié : 20 juil. 2009, 12:15
par gussticier
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
Publié : 20 juil. 2009, 13:15
par Pastisman
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
Publié : 20 juil. 2009, 14:21
par gussticier
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
Publié : 20 juil. 2009, 14:31
par Pastisman
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
Publié : 20 juil. 2009, 14:58
par chBok
Publié : 20 juil. 2009, 15:02
par gussticier
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
Publié : 20 juil. 2009, 15:15
par gussticier
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
Publié : 20 juil. 2009, 17:28
par Pastisman
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
Publié : 20 juil. 2009, 17:48
par gussticier
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
Publié : 21 juil. 2009, 11:07
par gussticier
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
Publié : 21 juil. 2009, 13:19
par Pastisman
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
Publié : 21 juil. 2009, 14:21
par gussticier
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
Publié : 21 juil. 2009, 14:42
par Pastisman
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
Publié : 21 juil. 2009, 14:57
par gussticier
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