2016-09-11 13 views
0

몇 년 전에 만든 오버레이 기반 애드온의 기능을 복제하기 위해 Thunderbird를위한 재시작 (부트 스트랩 된) 애드온을 생성합니다. 새로운 이메일 본문에있는 일부 텍스트를 조작하는 것이 좋습니다. the old overlay version에서 꽤 간단했습니다 : gMsgCompose 객체를 사용할 수있었습니다. 재시작 할 수없는 Addon의 작성 창에 gMsgCompose 객체를 얻으려면 어떻게해야합니까?재시작되지 않는 (부트 스트랩 된) 애드온에서 Thunderbird의 이메일 편집기 객체 얻기

여기 내 코드가 있습니다. 잠시 동안 나는 edElem이 내가 원했던 거의 것이라고 생각했기 때문에 edElem.editortype (실제로 올바른 객체가있을 때 "textmail"또는 "htmlmail"이어야 함)을 테스트 덤프하는 이유입니다.

'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 

내가 원하는에 가까이 I에 유래에서 발견 유일한 문제는 Get sender and recipients in Thunderbird extension upon sending message입니다. 내가 그곳에서하는 일을 시도해 봤지만, 그렇게하는 것만 큼 이미 내가 얻을 수있는 전체적으로 작곡 윈도우를 얻는 다른 방법을 제공하는 것입니다. (uploadHook에서) 다음 그래서

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

내가 가진 편집기를 얻을 수 있습니다 :

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

그러나 더 나은 솔루션을 찾고을

답변

0

은 내가 onOpenWindow의 타이머 못생긴 그루터기를했습니다 .

+0

@Jaap : 질문은 꽤 똑같습니다. 나는 (누군가 다른 사람들에게 도움이 될 수도있는) 대답을 가지고있다. 그러나 나는 그것이 가능한 최선의 것이 아니라는 것을 이제 알았다. 삭제해야합니까? – Valerij

+1

나는 마지막 문장을 잘못 읽었는데, 처음에는 대답을 찾고 있었다. 나는 내 의견을 제거하고 그대로 답을 남겨 둡니다 (또는 더 나은 해결책으로 개선하십시오 ;-)) – Jaap