2016-09-11 3 views
0

Je crée un addon sans redémarrage (amorcé) pour Thunderbird afin de répliquer la fonctionnalité d'un addon basé sur une superposition que j'ai créé il y a des années. Le désir est de manipuler une partie du texte dans le corps du nouveau courriel. En the old overlay version, c'était assez simple: je pourrais juste utiliser l'objet gMsgCompose. Comment puis-je obtenir l'objet gMsgCompose pour une fenêtre de composition dans un addon sans redémarrage?Obtention de l'objet éditeur de courrier électronique de Thunderbird à partir d'un addon sans redémarrage (amorçage)

Voici mon code en ce moment. Pendant un moment, je pensais qu'EdElem était presque ce que je voulais, et c'est pourquoi je suis en train de tester testing edElem.editortype (qui devrait être soit "textmail" ou "htmlmail" quand j'ai vraiment le bon objet).

'use strict'; 

    const Cc = Components.classes; 
    const Ci = Components.interfaces; 
    const Cu = Components.utils; 

    Cu.import("resource://gre/modules/Services.jsm"); 

    function startup(data, reason) 
    { 
     Services.wm.addListener(MyAddon.windowListener); 
    } 

    function shutdown(data, reason) 
    { 
     Services.wm.removeListener(MyAddon.windowListener); 
    } 

    function install(aData, aReason) { } 
    function uninstall(aData, aReason) { } 

    if(!MyAddon) var MyAddon = {}; 
    MyAddon.windowListener = { 
     onOpenWindow: function(aXULWindow) { 
      let aDOMWindow = aXULWindow 
       .QueryInterface(Ci.nsIInterfaceRequestor) 
       .getInterface(Ci.nsIDOMWindow); 
      if (!aDOMWindow) return; 

      aDOMWindow.addEventListener("load", function _cl_load(event){ 
       aDOMWindow.removeEventListener("load", _cl_load, false); 
       MyAddon.handleOpenWindow(aDOMWindow, event.target); 
      }, false); 
     } 
    }; // MyAddon.windowListener 

    MyAddon.handleOpenWindow = function(aDOMWindow, DOMdocument) { 
     if(DOMdocument.documentURI != "chrome://messenger/content/messengercompose/messengercompose.xul") 
      return; 
     let edWindow = DOMdocument.documentElement; 
     // Just to be sure 
     if(edWindow.id != 'msgcomposeWindow') 
      return; 

     let edElem = DOMdocument.getElementById("content-frame"); 

     /* I thought edElem was the element I want, but the following 
     * returns an empty result, which I take to mean the element isn't 
     * fully loaded yet. 
     */ 
     dump("XXX handleOpenWindow: edElem.editortype="+edElem.editortype+"\n"); 

     /* Adding a listener to this element doesn't get the behaviour 
     * I want either. I've tried hooking several events 
     * in the following fashion, and the event handler code doesn't 
     * execute for any of them, so maybe edElem isn't what I want. 
     */ 
     [ "load", 
      "unload", 
      "compose-window-init", 
      "compose-window-close", 
      "compose-fields-ready", 
      "compose-send-message", 
     ].forEach(function(eventName) { 
      edElem.addEventListener(eventName, function _eE_FIXME(event){ 
       dump("XXX "+eventName+": edElem.editortype="+edElem.editortype+"\n"); 
      }, false); 
     }); 

     /* So, how do I get control of the editor, 
     * so I can read and play with its content? 
     */ 

    }; // MyAddon.handleOpenWindow 

La seule question que je trouve sur stackoverflow qui est proche de ce que je veux est Get sender and recipients in Thunderbird extension upon sending message. J'ai essayé ce qu'ils font là-bas, mais tout ce qu'il semble faire est de me donner une autre façon d'obtenir la fenêtre de composition dans son ensemble, ce que je peux déjà obtenir.

Répondre

0

J'ai fait un talon laid avec une minuterie dans le onOpenWindow:

domWindow.setTimeout(function() { uploadHook(domWindow); }, 500); 

Alors (en uploadHook) je peux obtenir avec l'éditeur:

var editorNode = domWindow.document.getElementById("content-frame"); 
// GetCurrentEditor() equivalent: 
nsIEditor = editorNode.getEditor(editorNode.contentWindow) 

Mais la recherche d'une meilleure solution .

+0

@Jaap: la question est plutôt la même. J'ai même une réponse (peut-être utile à quelqu'un d'autre), mais je sais que ce n'est pas la meilleure possible. Devrais-je le supprimer? – Valerij

+1

J'ai été égaré par votre dernière phrase, ce qui m'a d'abord indiqué que vous cherchiez une réponse. Je supprimerai mes commentaires et vous laisserez votre réponse telle quelle (ou l'améliorerez avec une meilleure solution ;-)) – Jaap