2010-12-10 8 views
1

J'ai développé un petit addon pour Firefox dans lequel j'économise des proxies http car je travaille beaucoup avec eux. Tous les proxys, une fois chargés dans ff, demandent un nom d'utilisateur et un mot de passe dans une fenêtre contextuelle. Mon addon a cette information sauvegardée donc je dois trouver un moyen de définir la valeur des champs d'entrée dans cette boîte de notification qui est affichée afin de s'authentifier auprès du serveur proxy et éviter d'avoir à entrer manuellement ces détails chaque fois que je change Procuration.XUL getNotificationBox

Je dois avouer que je suis un débutant absolu avec XUL et javascript. J'ai cherché sur le Web et testé toutes sortes d'extraits mais je ne peux pas obtenir le contenu de la notification, décider si c'est ce que je cherche et entrer les bonnes valeurs.

J'ai un morceau de code qui obtient probablement près de ce que je veux, mais il ne semble pas fonctionner:

function getNotificationBox() { 
     const Ci = Components.interfaces; 

     function getChromeWindow(aWindow) { 
       var chromeWin = aWindow 
       .QueryInterface(Ci.nsIInterfaceRequestor) 
       .getInterface(Ci.nsIWebNavigation) 
       .QueryInterface(Ci.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Ci.nsIInterfaceRequestor) 
       .getInterface(Ci.nsIDOMWindow) 
       .QueryInterface(Ci.nsIDOMChromeWindow); 
       return chromeWin; 
     } 

     var notifyWindow = window.top; 

     var chromeWin = getChromeWindow(notifyWindow); 

     var notifyBox = chromeWin.getNotificationBox(notifyWindow); 

     return notifyBox; 
} 

function clickNotificationButton() { 
     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); 

     var box = getNotificationBox(); 
     var bar = box.getNotificationWithValue("is requesting a username and password"); 
     var button = bar.getElementsByTagName("button").item("OK"); 
     button.doCommand(); 
} 

window.addEventListener("DOMNodeInserted", function(e) { clickNotificationButton; 
}, false); 

Le morceau de ficelle que vous voyez là-bas « demande un nom d'utilisateur et mot de passe » est partie du texte affichée dans la fenêtre de notification. Quelqu'un peut-il repérer si je fais quelque chose de mal ici?

Toute aide est très appréciée. Merci!

Répondre

0

Recevez-vous la boîte de notification correctement? Vous pouvez simplifier votre fonction getChromeWindow à:

function getChromeWindow(aWindow) { 
    var chromeWin = aWindow.QueryInterface(Ci.nsIInterfaceRequestor) 
          .getInterface(Ci.nsIWebNavigation) 
          .QueryInterface(Ci.nsIDocShell) 
          .chromeEventHandler.ownerDocument.defaultView; 
    return chromeWin; 
} 

(http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js#1208)

Vous pouvez également avoir besoin d'un .wrappedJSObject dans votre variable chromeWin.

(http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js#1295)

+0

Vous devez le .wrappedJSObject sur les versions de Firefox avant 4, car ils utilisent XPCNativeWrapper qui enveloppe toujours des propriétés des objets retournés emballés, mais Firefox 4 utilise XrayWrapper qui remarque que le chromeEventHandler est un objet chromé et donc ne dérange pas l'emballage il. – Neil

0

D'après votre description, cela ressemble à la boîte de dialogue » réessayer d'intercepter est en fait la boîte de dialogue d'authentification, plutôt que la barre de notification (qui apparaît après que le mot de passe a été entré pour confirmer si vous voulez le sauvegarder/changé). En d'autres termes, il semble que vous voulez corriger le bug Mozilla 223636 (https://bugzilla.mozilla.org/show_bug.cgi?id=223636). Firefox 4 betas ont déjà un correctif pour exactement ce cas (https://bugzilla.mozilla.org/show_bug.cgi?id=521467), mais il est désactivé par défaut (nécessite de changer un pref caché en utilisant about: config).

Le code que vous avez collé ne va pas être très utile pour ça, malheureusement. Pour intercepter les boîtes de dialogue d'authentification à partir d'une extension dans les versions actuellement expédiées, vous souhaitez probablement une combinaison de code qui respecte la rubrique "common-dialog-loaded" et la logique de gestion des boîtes aux lettres de http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/test/prompt_common.js. Je peux fournir plus de détails si vous me trouvez sur irc.mozilla.org/#extdev.