1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Thunderbird アドオン開発 QuickLinks

Last updated at Posted at 2020-05-04

(主にアドオン開発に有効と思われるリファレンスへのリンクを載せていきます)

Links

アドオン開発の概要から (英語情報)

Adapt to Changes in Thunderbird

Thunderbird は、メジャーバージョンアップを重ねるごと内部構造が変化しています。

Web 標準から取り残されたレガシーなコード (XUL 等) を捨て、新しい Web 標準 (HTML5 等) への準拠を目的にコードの置き換えが進んでいるようです。

アドオン開発については Thunderbird WebExtension API に準拠しているものは問題ありませんが、WebExtension Experiments に依存するものは自己責任で Thunderbird の内部構造へアクセスすることになります。

WebExtension Experiments の利用者は、引き続き Thunderbird の近代化と、内部構造への変化に対して、定期的に追従する事が求められます。

Thunderbird WebExtension APIs

Thunderbird WebExtension APIs:

WebExtension Experiments

WebExtension Experiments を使ったアドオンを実装するには Thunderbird の内部構造をよく調査し、その結果を検証する必要があります。

どのような事ができるのかを例示していきます。

alert を表示する

Thunderbird (Firefox) の開発者ツール (Ctrl+Shift+I) 機能を使って、JavaScript のコードを実行できます。

2022-07-19_17h23_42.png

ここで alert("Hello.") を実行できます。

2022-07-19_17h24_08.png

ここで注意が必要なのは JavaScript には C/C++ のような感じのグローバル変数というものはなく、
alertglobalThiswindowthis などに束縛されているメンバーということです。

開発者ツールで globalThis などを評価し Experimental からアクセスしたいメンバーが、どのオブジェクトに属しているものかを確認してください。

2022-07-19_17h30_21.png

ChromeWindow chrome://messenger/content/messenger.xhtml に関しては Services.wm.getMostRecentWindow("mail:3pane") で取得可能です。

という事で Experimental から alert を使用する方法は、このようになります。

Services.wm.getMostRecentWindow("mail:3pane").alert("Hello.");

表示しているメールの添付ファイル一覧を取得する

Services.wm.getMostRecentWindow("mail:3pane").currentAttachments

John Bieling 氏より OpenAttachmentByExtension ATN の責任者に対して Thunderbird 115 ではつぎのように変更となる旨の連絡がありました。

const getAttachmentsInActiveMail = () => {
  return Services.wm.getMostRecentWindow("mail:3pane").gTabmail.currentAboutMessage.currentAttachments
}

作成中のメール画面に文字列を挿入する

Services.wm.getMostRecentWindow("msgcompose").GetCurrentEditor().insertText("こんにちは")

フォルダーツリーを探索する

※ 基本的には MailExtensions の使用が推奨されます。関連 API:

Experimental ⇔ MailExtensions をしたい:

選択しているフォルダーを取得する

MailExtensions では

browser.mailTabs.query({ currentWindow: true, lastFocusedWindow: true })

Experimental では

let folder = Services.wm.getMostRecentWindow("mail:3pane").GetSelectedMsgFolders()[0]

フォルダの名称を取得

folder.name
"受信トレイ" 

フォルダの URI を取得

folder.URI
"mailbox://xmailuser%40xmailserver.test@localhost/Inbox"

フォルダの URI からフォルダを取得

MailUtils.getExistingFolder("mailbox://xmailuser%40xmailserver.test@localhost/Inbox")
XPCWrappedNative_NoHelper { Init: Init(), QueryInterface: QueryInterface(), GetWeakReference: GetWeakReference(), subFolders: Getter, URI: Getter, flags: Getter & Setter, server: Getter, getNumUnread: getNumUnread(), biffState: Getter & Setter, hasNewMessages: Getter & Setter,  }

歴史的変遷があるようです:

型を取得する

Thunderbird (Firefox) で運用されている XPCOM オブジェクトについては、インターフェイスに相当する定義 (XPIDL) が存在します。この XPIDL を見ていくことになります。

toString() を発行する事で教えてくれるようです。

Services.wm.getMostRecentWindow("mail:3pane").GetSelectedMsgFolders()[0].getEditableFilterList(null).toString()

結果

"[xpconnect wrapped nsIMsgFilterList]" 

名前が判明したら Google で nsIMsgFilterList などと検索して、定義・使い方や使用例についての情報を集めます。

型を変換する

細かい事は判っていませんが nsISimpleEnumerator を用いて列挙ならびに取得したオブジェクトは nsISupports を返す場合があります。

そういった場合は必要なインターフェイス (Ci.nsIFile など) に変換が必要なケースがあります。

const file = obj.QueryInterface(Components.interfaces.nsIFile);

instanceof でインターフェイス実装の判定ができるそうです。参考: https://nanto.asablo.jp/blog/2011/01/12/5634277

Services.wm.getMostRecentWindow("mail:3pane").GetSelectedMsgFolders()[0] instanceof Ci.nsIMsgFolder 
true

Services.wm.getMostRecentWindow("mail:3pane").GetSelectedMsgFolders()[0] instanceof Ci.nsIFolderListener
false

permissions

permissions - Mozilla | MDN: API permissions

  • activeTab
  • alarms
  • background
  • bookmarks
  • browserSettings
  • browsingData
  • captivePortal
  • clipboardRead
  • clipboardWrite
  • contentSettings
  • contextMenus
  • contextualIdentities
  • cookies
  • debugger
  • dns
  • downloads
  • downloads.open
  • find
  • geolocation
  • history
  • identity
  • idle
  • management
  • menus
  • menus.overrideContext
  • nativeMessaging
  • notifications
  • pageCapture
  • pkcs11
  • privacy
  • proxy
  • search
  • sessions
  • storage
  • tabHide
  • tabs
  • theme
  • topSites
  • unlimitedStorage
  • webNavigation
  • webRequest
  • webRequestBlocking

jsm

Standard code modules

List of manifest.json keys

manifest.json - Mozilla | MDN

XPCOM Interface Reference

XPCOM Interface Reference

API Schemas

Docs » Toolkit » WebExtensions API Development » API Schemas

Getting Plugged into the Community

Getting Plugged into the Community

Add-on Developer Community:

Thunderbird Topicbox:

  • A communication platform / mailing list for Thunderbird add-on developers and aspiring add-on developers to ask questions and share knowledge.
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?