2012-04-06 6 views
3

Wir haben ein Thunderbird (11) -Plugin entwickelt, mit dem wir den Inhalt einer Nachricht auf der Festplatte speichern können. Jetzt erweitern wir diese Erweiterung, um eine automatische Verarbeitung einer Nachricht zu ermöglichen, wenn Sie sie schließen. Wir stoßen auf eine Reihe von Problemen:Zugriff auf die Thunderbird-Nachricht beim Schließen einer Nachrichtenregisterkarte

Wir können keine Möglichkeit finden, sich in ein "Close Tab" -Ereignis einzuklinken. Wir haben auch Probleme, den Nachrichten-URI der aktuell geöffneten Tabs zu erhalten (wir versuchen nun, Klick- und Tastaturereignisse zu erfassen). Diese Information scheint nicht im DOM des Registerkartencontainers verfügbar zu sein.

Gibt es eine Möglichkeit, das Schließen einer Mail-Nachrichtenregisterkarte oder eines Fensters generisch zu erkennen, zusammen mit dem Abrufen des URI der geschlossenen Mail-Nachricht für die weitere Verarbeitung?

Wir haben die Dokumentation der Registerkarte Container, die NsIWindowMediator, ausprobiert, verschiedene Event Listeners, aber bisher kein Glück.

Bearbeiten: Wir erhalten einige Ergebnisse mit der zuletzt geschlossenen Tabs-Liste. Keine sehr elegante Lösung, aber zumindest haben wir einen Hinweis auf die Registerkarte. Jetzt müssen wir nur den URI auf die Nachricht, die in der Registerkarte enthalten war, abrufen.

Antwort

4

Wir können keine Möglichkeit finden, sich in ein "Close Tab" -Ereignis einzuklinken.

Das Element (badly documented) <tabmail> ermöglicht die Registrierung von Registerkartenmonitoren. So etwas sollte funktionieren:

var tabmail = document.getElementById("tabmail"); 
var monitor = { 
    onTabClosing: function(tab) 
    { 
    ... 
    } 
}; 
tabmail.registerTabMonitor(monitor); 

Wir sind auch Probleme, die Botschaft URI des aktuell geöffneten Tabs

Das <tabmail> Element eine Eigenschaft tabInfo enthält Informationen über die aktuell geöffneten Registerkarten. Sie möchten wahrscheinlich nur die Registerkarten betrachten, in denen mode.name"message" ist (es gibt auch eine Reihe anderer Modi, z. B. "folder" oder "contentTab"). Dieser Modus hat eine getBrowser() Methode, so etwas wie dies tun soll:

var tabmail = document.getElementById("tabmail"); 
for (var i = 0; i < tabmail.tabInfo.length; i++) 
{ 
    var tab = tabmail.tabInfo[i]; 
    if (tab.mode.name == "message") 
    alert(tab.mode.getBrowser().currentURI.spec); 
} 

bearbeiten: Als Peter in den Kommentaren weist darauf hin, der Ansatz, um die URI für eine Nachricht zu erhalten, wird die aktuell geladene Nachricht nur funktionieren - Alle Registerkarten verwenden dasselbe Browserelement für die E-Mail-Nachrichten. Immer die URI richtig komplizierter ist, müssen Sie die nsIMsgDBHdr instance für die Nachricht über TabInfo.folderDisplay.selectedMessage und dann nsIMsgFolder.getUriForMsg() verwenden, um die URI für sie zu konstruieren:

var tabmail = document.getElementById("tabmail"); 
for (var i = 0; i < tabmail.tabInfo.length; i++) 
{ 
    var tab = tabmail.tabInfo[i]; 
    if (tab.mode.name != "message") 
    continue; 
    var message = tab.folderDisplay.selectedMessage; 
    alert(message.folder.getUriForMsg(message)); 
} 
+0

Danke, das sieht vielversprechend aus! –

+0

Der zweite Teil (getBrowser.currentURI.spec) funktioniert nicht, da alle Nachrichten-/Ordnerregister dasselbe Browserobjekt verwenden. (getBrowser: (function (aTab)) { // Nachrichtenregisterkarten verwenden immer den Nachrichtenfenster-Browser return document.getElementById ("messagepane"); })) – Peter

+0

@Peter: Sie haben Recht, Mails werden immer in dasselbe geladen Damit gibt Ihnen dieser Ansatz nur den URI für die aktuell geöffnete Mail. Ich habe meine Antwort mit dem richtigen Weg aktualisiert, um den URI zu erhalten. –

0

Für den zweiten Teil der Frage:

Die Der folgende Beispielcode liefert Ihnen die msgDBHdr-Objekte aller geöffneten Registerkarten. Sie sollten einige Kontrollen auf der Art tun in einem Kalender Registerkarte eine Nachricht zu vermeiden Zugriff).

tabInfos = window.document.getElementById("tabmail").tabInfo; 
for (i = 0; i < tabInfos.length; i++) {  
    msgHdr = tabInfos[i].folderDisplay.selectedMessage; 
    alert(
    msgHdr.mime2DecodedSubject+"\n" 
    +msgHdr.messageId+"\n" 
    +"in view type "+tabInfos[i].mode.type 
); 
} 

Die TABINFO Einträge einige weitere interessante Informationen. Öffnen Sie einfach die ErrorConsole und führen Sie

top.opener.window.document.getElementById("tabmail").tabInfo[0].toSource() 

aus und lesen Sie sie sorgfältig durch.

Verwandte Themen