Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : arkenjh

Date : 02/12/2008 19:43

Bonjour, je développe depuis quelques jours une application xul (extension), mais là je dois avouer que je bloque complètement j'ai deux fenêtres, une principale et l'autre contenue dans une iframe et je cherche à appeler une fonction (fenêtre principale) depuis mon iframe...

j'ai épluché le forum, le mdc, questionné l'ami google aucune méthode n'a fonctionné pour l'instant,
window.top.Log()
window.parrent.Log()
window.opener.Log()

l'erreur : window.top.Log is not a function

merci

ps : Firefox 3.0.4

# Re: Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : arkenjh

Date : 04/12/2008 14:57

toujours rien, je poste quand même le fruit de mes recherches...

var mainWindow = 
window
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);

(exemple trouvé sur le mdc)

la variable permet d'accéder à la fenêtre principale de firefox à partir de là j'ai tenté de "redescendre" dans le dom pour récupérer ma fenêtre...

avec la méthode frames :

mainWindow.frames[x]

où x représente un index numérique... j'y suis arrivé oui, mais ça n'a aucun intérêt puisque ça dépend du contexte... (?)

mainWindow.frames['nom_fenêtre']

rien de ce côté (avec id et nom de fenêtre identique)

autre axe de recherche, en utilisant l'interface nsIWindowWatcher et sa méthode getWindowByName

var windowWatcher = 
Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Components.interfaces.nsIWindowWatcher);

var fen = windowWatcher.getWindowByName('nom_de_ma_fenetre', null);

j'obtiens null à tout les coups...

pour rappel window.parent ou window.top ne me permettent pas d'accéder à ma fenêtre principale (ni fonction perso, ni même un objet du dom)
la seule chose qui fonctionne est un alert sur .document.title

__Quelqu'un aurait une petite idée ??? je débute et toute aide est la bienvenue.__

en attendant un ptit coup de pouce : je vais me construire un exemple simple dans le chrome
et pourquoi pas faire le test avec une autre version de firefox

# Re: Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : arkenjh

Date : 04/12/2008 17:15

enfin du nouveau !

le survol d'une page sur l'objet XPCNativeWrapper m'a donné quelques idées,
j'ai sortis mon aplli du chrome (et donc remplacé les différents chemins d'accès)

Miracle sa marche ! je peux accéder au dom de ma fenêtre pricipale depuis mon iframe,
et un getWindowByName me donne enfin autre chose que null (Permission denied to get property XPCComponents.classes : logique vu que je suis hors chrome)

le problème doit venir des chemins d'accès donc, vu que j'avais cru bon d'utiliser des liens absolu partout chrome://mon_aplli y compris pour le src de mon iframe...

et c'est reparti pour une tournée de test

# Re: Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : arkenjh

Date : 04/12/2008 22:26

je poste la solution ci ca peut aider quelqu'un
les chemins d'accès ne sont pas la cause du problème, j'ai finit par réussir à joindre ma fenêtre principale depuis le chrome en désactivant le XPCNativeWrapper dans le chrome.manifest (xpcnativewrappers=no)

ça résoud le problème en attendant de mieux cerner le fonctionnement de cet objet =)

# Re: [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : tonyfrom

Date : 04/08/2009 10:09

Salut, j'ai le même problème que toi et parmi les différentes méthodes que tu proposes, je n'arrive pas à trouver laquelle fonctionne. Pourrais-tu récapituler ta solution STP?

Sinon as-tu trouvé quelque chose d'autre depuis le temps?

Merci

# Re: [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : thefab

Date : 05/08/2009 17:39

La méthode avec top fonctionne (ça fonctionne aussi hors chrome):

parent.xul

<?xml version="1.0" encoding="utf-8"?>

<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<window title="Test" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script type="application/x-javascript">
function hello()
	{
	alert("Hello depuis parent");
	}
</script>

<button label="Hello" oncommand="hello();"/>

<iframe src="child.xul"/>

</window>

child.xul

<?xml version="1.0" encoding="utf-8"?>

<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

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

<button label="Hello (top)" oncommand="window.top.hello();"/>
<button label="Hello (parent)" oncommand="parent.hello();"/>

</page>

# Re: [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : tonyfrom

Date : 06/08/2009 08:42

Oui, en effet cela fonctionne bien hors du chrome (lorsque j'exécute la page comme ça...) mais quand je passe par le chrome (par mon extension) cela ne fonctionne plus. J'ai une erreur "window.top.hello is not a function" dans firebug.

Aurais-tu la solution à ce problème?

Merci

# Re: [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : thefab

Date : 06/08/2009 11:24

Mais dans ton extension il s'agit aussi d'une fenêtre indépendante, càd ouverte à part et non pas incluse dans Firefox, genre un overlay ?

Je vais essayer avec une extension...

# Re: [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : tonyfrom

Date : 06/08/2009 13:41

En fait mon extension contient une fenêtre principale (avec menubar) dans laquelle est contenue une iframe qui change de source (src) selon les éléments du menu cliqués. C'est un extension chrome Firefox (XUL, javaScript, RDF) donc tout est dans FF.

Par contre j'ai trouvé ça : https://developer.mozilla.org/fr/XPCNativeWrapper

ça a l'air de traiter complètement mon problème et ça doit pouvoir intéresser pas mal de monde. Je n'ai pas encore eu le temps de tester sur mon extension (et de tout comprendre! C'est bien long et compliqué) mais j'ai bon espoir.

En tout cas, ta solution fonctionne très bien dès lors qu'on ajoute le flag "xpcnativewrappers=no" sur le content concerné dans le fichier "chrome.manifest" (méthode radicale qui esquive quelque peu la sécurité de FireFox). Donc on peut dire que mon problème est résolu mais malgré cela je pense que je vais quand même étudier le comportement et l'utilisation de XPCNativeWrapper pour pouvoir régler ça proprement (et en laissant le moins de failles de sécurité possible dans l'extension).

Merci à toi et si tu as plus d'infos n'hésite pas à compléter cet article... (pour moi ou pour les gens qui tomberont dessus prochainement parce c'est sûr qu'il y en aura...lol)

# Re: [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : thefab

Date : 07/08/2009 08:47

Effectivement avec window.open() ça ne fonctionne pas... mais avec window.openDialog() oui...

# Re: [Résolu] Comment appeler une fonction depuis une iframe ? (erreur avec window.top)

Envoyé par : tonyfrom

Date : 07/08/2009 15:10

Ouais bah moi je voulais appeler une fonction à moi (chargée dans la page principale) et ça marchait pas sans le flag "xpcnativewrappers=no" mais j'ai réussi après pas mal de temps à essayer de comprendre la doc XPCNativeWrapper !

Voici mon bout de code qui fonctionne, "disableMenu()" étant une fonction à moi déclarée dans un fichier js chargé dans la page principale (window.top) :

var topWindow = new XPCNativeWrapper(window.top).wrappedJSObject;
topWindow.disableMenu(false);

Voilà, donc plus besoin du flag "xpcnativewrappers=no" dans le fichier "chrome.manifest"...

Enfin... tout ça pour une pauvre fonction qui active le menu quand on s'identifie! lol

Allez, merci de ton aide et peut-être à la prochaine sur le forum de xul.fr pour d'autres prises de tête!

Tony

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.