몇 년 전에 만든 오버레이 기반 애드온의 기능을 복제하기 위해 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)
그러나 더 나은 솔루션을 찾고을
@Jaap : 질문은 꽤 똑같습니다. 나는 (누군가 다른 사람들에게 도움이 될 수도있는) 대답을 가지고있다. 그러나 나는 그것이 가능한 최선의 것이 아니라는 것을 이제 알았다. 삭제해야합니까? – Valerij
나는 마지막 문장을 잘못 읽었는데, 처음에는 대답을 찾고 있었다. 나는 내 의견을 제거하고 그대로 답을 남겨 둡니다 (또는 더 나은 해결책으로 개선하십시오 ;-)) – Jaap