Je veux que mon extension Firefox ajoute un objet à la fenêtre de contenu de la page parcourue. Je veux qu'il ait le même effet que l'exécution:
top.myobj = {val : 3};
Dans un élément de script dans la page.
Des idées?
Je ne pense pas qu'il y ait un risque de sécurité ici car je n'ajoute qu'un objet avec une seule propriété entière. Existe-t-il un moyen simple d'obtenir l'objet de fenêtre de contenu à partir du code d'extension?
utilisation
var mainWindow = window .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebNavigation) .QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindow); mainWindow.getBrowser().addEventListener("DOMContentLoaded", youreventhandler, true); function youreventhandler(event) { if (event.originalTarget instanceof HTMLDocument) { var doc = event.originalTarget; //doc = the document in the just loaded window var win = doc.defaultView; // if it's just a frame element, then return and wait for the // main event to fire. if (win.frameElement) return; else { win.myobj = { val: 3}; //your other code here } } }
Vous devez utiliser evalInSandbox pour exécuter l'affectation dans le contexte de window.content
manière similaire à ce code :
// |content| refers to the current tab's |window| object var s = new Components.utils.Sandbox(content); s.window = content; Components.utils.evalInSandbox( "window.wrappedJSObject.test = function() { } ", s)
BTW, re "Je ne pense pas qu'il existe un risque de sécurité ici" – l'ajout d'une propriété à un objet peut entraîner l'exécution du code (puisque JS a des configurateurs), il est donc nécessaire de toucher le contenu toujours dangereux. L'exemple ci-dessus ne touche que l'objet non sécurisé ( content.wrappedJSObject
) dans un bac à sable sans autorisation chrome, donc c'est OK.
Est-ce qu'il faut que ce soit la fenêtre, ou peut-il être le document lui-même? Vous pouvez toujours utiliser le document content.document la page elle-même. Ou window.content pour la fenêtre de contenu principal.