Thunderbird アドオン開発

※ 2010/04/30 から興味を持ち始めました。なので調査結果には反比例して、Thunderbird の歴史的事情には疎いです。

## unimportant thing

そもそも Windows 3.1 (1993) から Windows は触り始めていますが、Desktop App でのフリーソフトのメーラーで昨今開発が続いているのは Thunderbird と Sylpheed ぐらいではないでしょうか。

私自身は最終的にメールアカウントを gmail.com に一本化していて、Thunderbird の利用は限定的 (作業自動化の一環で、添付ファイルを MAPI 送信するなど) です。

MAPI といえば Sylpheed を MAPI 対応にする DLL を書き、[掲示板へ投稿](http://sylpheed-support.good-day.net/bbs_article.php?pthread_id=634)しました。完全に放置状態ですが一応 [GitHub](https://github.com/HiraokaHyperTools/YourSimpleMAPI) にソースコードがあります。

## 添付ファイルの Content-Type と filename extension、どちらが優先か

※ この問題は Thunderbird 91.4.1 で改善されました。該当 issue: [1729632 - Temporary file during mail transfers are sometimes not in the correct extensions](https://bugzilla.mozilla.org/show_bug.cgi?id=1729632)

Thunderbird ではメールの添付ファイルを開くことはできるのですが…
送信者の都合によって DXF ファイルが `Text Document` と認識されたり `DWG TrueView Drawing Interchange` と認識されたり、`Content-Type` の宣言によって解釈が変わる趣向があります。この現象は報告済みです: [1633982 - Problem when opening CAD file attachments.](https://bugzilla.mozilla.org/show_bug.cgi?id=1633982)
DXF ファイルはテキスト形式です。しかし DXF ファイルをメモ帳で開いて事が足りるのでしょうか…?
ググっていると OpenAttachmentByExtension という「添付ファイルを、拡張子に関連付けしたアプリで開く」というアドオンを発見しました。

![Thunderbird 68.7.0 で動作するように手直しした OpenAttachmentByExtension](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/c0aa0bce-26af-7d21-e1e3-90ae44dddfe4.png)

しかし Thunderbird 68.7.0 では動作しませんでした。

原因は「古い仕様に準拠していたから」です。`install.rdf` というサポートが終了したらしい形式を使用していました。
そこで `manifest.json` に置き換えると、とりあえず若干の変更とともに動作するようになりました。

このバージョンはつぎの場所で公開しています:

- https://github.com/HiraokaHyperTools/OpenAttachmentByExtension
- https://addons.thunderbird.net/ja/thunderbird/addon/openattachmentbyextension/

懸念点は「将来の Thunderbird でも引き続き動作するのか…?」という点です。執筆時点の最新版 Beta 版 76.0b3 で試すと動作しない。

そもそも OpenAttachmentByExtension の動作原理ですが、

- 「[XUL Overlays](https://so-zou.jp/add-on/tech/firefox/ui/xul/overlays/) (Cross Package Overlays?) で、`AttachmentInfo.prototype.open` という内部メソッドをラップし、動作を変更する」という手法が使われています。

ですので XUL Overlays が廃止されると動作しなくなります。

今後は「[Thunderbird WebExtension APIs](https://thunderbird-webextensions.readthedocs.io/en/latest/) に準拠した拡張機能しか動作しない」という事になるようです…

で、そうしたらいつから XUL Overlays が使えなくなるのか…? が気になります。

- 68.7.0 (release) 使える
- 76.0b3 (beta) 使えない

[ここ](https://archive.mozilla.org/pub/thunderbird/releases/) にたくさんのリリースがありましたので、順番に試していきました。

- 69.0b4 使える
- 70.0b4 使える
- 71.0b1 使える
- 72.0b1 使える
- 72.0b3 使える
- 73.0b1 使えない
- 74.0b1 使えない

検証の結果 73.0b1 から XUL Overlays が使用不可になる事がわかりました。

## strict_min_version, strict_max_version

Thunderbird 73.0 以降では動作しないように宣言しておきたいです。`strict_min_version` と `strict_max_version` を指定するのですが…


```manifest.json
{
  "manifest_version": 2,
  "name": "__MSG_extensionName__",
  "description": "__MSG_extensionDescription__",
  "version": "0.2.0",
  "applications": {
    "gecko": {
      "id": "OpenAttachmentByExtension@digitaldolphins.jp",
      "strict_min_version": "68.7.0",
      "strict_max_version": "72.*"
    }
  },
  "icons": {
    "64": "icons/64.png",
    "48": "icons/48.png",
    "32": "icons/32.png",
    "24": "icons/24.png",
    "16": "icons/16.png"
  },
  "author": "kenjiuno",
  "homepage_url": "https://github.com/HiraokaHyperTools/OpenAttachmentByExtension",
  "default_locale": "en",
  "legacy": true
}
```

当局が把握していないバージョンを指定すると、アップロードの段階で拒絶されます。

![2020-05-02_16h01_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/45d52d1c-4b97-7966-d36b-ddc70c8f6af3.png)

[Application Versions :: Add-ons for Thunderbird](https://addons.thunderbird.net/en-US/thunderbird/pages/appversions/) を確認して、記載のあるバージョンを指定すると通りました。

![2020-05-02_16h01_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/9d853ec9-cc16-09b0-1130-3b9aab2765e6.png)

## Browser Extensions

Thunderbird でアドオンを開発しようとすると、基本的には近代的な Mozilla Firefox / Google Chrome で見られるような [ブラウザー拡張機能](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions) (WebExtensions) を書く流れになります。

但し、メーラーに固有の機能 (MailExtensions) があります。メールの作成に関する [compose](https://webextension-api.thunderbird.net/en/latest/compose.html) API などが該当します。

詳細は Thunderbird WebExtension API Documentation を確認してください。

https://webextension-api.thunderbird.net/en/latest/

### Experiments の標準サポート

Thunderbird での重要な特徴として Experiments の標準サポートがあります。

Experiments は、アドオンに対して `Thunderbird とコンピューターへの完全に無制限なアクセス` を与える機能です。Experiments 権限を要求するアドオンは、利用者にとって非常に危険なものですが、Thunderbird 本体の提供する API だけでは実現できないような機能を作る際には必須のものです。

https://developer.thunderbird.net/add-ons/mailextensions/experiments

※ Experiments 使用の有無にかかわらず、[ATN](https://addons.thunderbird.net/ja/thunderbird/) で公開されるアドオンは Thunderbird 開発者による確認と承認を受けて初めて公開されるものですので、未チェックのアドオンが延々と並べられている訳ではありません。

Thunderbird 60 系列までは Overlay Extension の仕組み上 `Thunderbird とコンピューターへの完全に無制限なアクセス` が出来る状態でした。
Thunderbird の UI は Mozilla が開発した XUL (XML User Interface Language) をベースにしています。
XUL Overlays という技術があり、アドオン開発者の書いた HTML/JavaScript を直接 Thunderbird の UI へ融合する形でアドオンが動作していたからです。

※ 便宜上 HTML と書きましたが XHTML and XUL ですので HTML とは作法がかなり異なります。

しかし Thunderbird 70 系列からは、Browser Extensions のみのサポートになりました。
Thunderbird 60 系列まで延々と使われてきた Overlay Extension のサポートは削除されています。
XUL は今でも Thunderbird の中で生き続けていますが、Browser Extensions には XUL の記述がありません。
そういう訳で、過去のアドオンが絶滅する運びになっています。

Browser Extensions は、マニフェストファイルをベースにした宣言型の仕様です。
やりたい事があっても、マニフェストファイルで解決できないような機能は実現ができません。

かといって Thunderbird 70 系列の Beta 公開時点では、十分な数の API が MailExtensions に確保されている状況でもありませんでした。
そこで技術的な回避策を提供するために Experiments が引き続き標準サポートされているようです。

Experiments を実装すると XUL に干渉可能です。
これにより、XUL をベースに開発されている既存のアドオンについても、
引き続き Thunderbird 70 系列以降で存続できる見通しが立ちました。

見通しが立っただけで、移行するかどうかはアドオン開発者に依存します。

#### OpenAttachmentByExtension 

OpenAttachmentByExtension という放棄されたアドオンを Experiments 対応で復活させました。Browser Extensions / MailExtensions の機能を多く利用できるように UI を変化させています。

参考図です

https://raw.githubusercontent.com/HiraokaHyperTools/OpenAttachmentByExtension/master/screenshots/screen-migration-memo.png

Experiments の利用用途です:

- プログラムまたはフォルダを選択するために [nsIFilePicker](https://udn.realityripple.com/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIFilePicker) を利用。
- 添付ファイル一覧を取得。
- 添付ファイルを起動するために [nsIProcess](https://udn.realityripple.com/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIProcess) を利用。

Experiments の実装です: [api/implementation.js](https://github.com/HiraokaHyperTools/OpenAttachmentByExtension/blob/master/src/api/implementation.js)

### Experiments アドオン: インストール時

Experiments を使用するアドオンをインストールしようとすると、確認を求められます。下記の文言です。

> Thunderbird とコンピューターへの完全に無制限なアクセス
> [詳細情報](https://support.mozilla.org/ja/kb/permission-request-messages-thunderbird-extensions)

![2021-12-21_10h43_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/05db5253-4aec-c9a8-6841-0f823085312d.png)

IT リテラシーの高い方は、この要求に対して拒否反応を示すかもしれません。

### UI 要素

ブラウザー拡張機能を起動するための UI 要素を宣言できます。既知のものが 3 種類あります：

- browser_action (画面の右上部にボタンを追加する)
- message_display_action (メッセージのプレビュー画面にボタンを追加する)
- compose_action (メッセージの作成画面にボタンを追加する)

Supported UI Elements こちらの情報がより詳細です。

https://developer.thunderbird.net/add-ons/mailextensions/supported-ui-elements

### browser_action

サンプル コード: https://github.com/thundernest/sample-extensions/tree/master/layout

リファレンス: https://thunderbird-webextensions.readthedocs.io/en/latest/browserAction.html

右上にアイコンが追加されます。

![2020-05-04_20h01_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/8b8134cf-b836-270a-7d37-51977288407d.png)

### message_display_action

サンプル コード: https://github.com/thundernest/sample-extensions/tree/master/messageDisplay

リファレンス: https://thunderbird-webextensions.readthedocs.io/en/latest/messageDisplayAction.html

メールプレビューの右上にアイコンが追加されます。

![2020-05-04_20h08_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/eed6f8e1-bc00-2e14-23cc-7664437c0f8a.png)

### compose_action

サンプル コード: https://github.com/thundernest/sample-extensions/tree/master/composeBody

リファレンス: https://thunderbird-webextensions.readthedocs.io/en/latest/composeAction.html

メール作成画面の右上にアイコンが追加されます。

![2020-05-04_20h11_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/1cf83ea0-096d-4956-a657-d8b9d407a365.png)

## 実行コンテキストについて

### 概要

Thunderbird は、一部の機能が JavaScript で実装されています。
セキュリティー確保の目的で、使用できる機能が execution context (実行コンテキスト) によって異なります。

- 特権コンテキスト
  - Thunderbird の主要な内部機能を実装・提供している JavaScript 実行コンテキストです。
  - [WebExtension Experiments](https://webextension-api.thunderbird.net/en/91/how-to/experiments.html) を実装すると、特権コンテキストが取得できます。
      - `browser.xxx` の `xxx` を、自分で作成できます。
      - 設定により、特権コンテキストでも実行ができます。
  - ローカルコンピューターへのアクセスが可能。つまり、サンドボックスの外側で実行されます。
- background.js
  - サービス・デーモンのような性質を持ちます。
  - ページからのメッセージを [runtime.onMessage](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) で受信できます。
  - ローカルコンピューターへのアクセスは不可能。つまり、サンドボックスの内側で実行されます。
- ページ
  - browser_action, message_display_action, compose_action などの HTML に関連付けられた JavaScript 環境。
  - background.js へのメッセージを [runtime.sendMessage()](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage) で送信できます。
  - [WebExtension Experiments](https://webextension-api.thunderbird.net/en/91/how-to/experiments.html) を実装している場合は、それにアクセス可能です。
  - ローカルコンピューターへのアクセスは不可能。つまり、サンドボックスの内側で実行されます。


### background.js との通信サンプル

サンプル: https://github.com/gumara-dev/thunderbird/tree/master/open_email_in_separate_window

- [browser.runtime.onMessage](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) で待ち受け
- [browser.runtime.sendMessage](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage) でコンタクト

## Legacy Bootstrap Extension と Legacy Overlay Extensions 移行の助け

かねてよりの予告通り、Thunderbird バージョン 70 系ではレガシーアドオンが使えなくなっています。

https://developer.thunderbird.net/add-ons/updating/tb78#removing-support-for-legacy-extensions-overlay-and-bootstrapped-extensions

> Removing support for legacy extensions (overlay and bootstrapped extensions)
> 
> Support for legacy extensions was removed from the Thunderbird Beta version 74, released in February 2020.
> 
> The next major release version of Thunderbird, version 78, will be out around June 2020. Until then, code wise many things are going to change. For instance, what is left of XUL will be gradually going away. Thunderbird's XUL documents have already been converted to XHTML, and will have less and less of a XUL flavor until the conversion from XUL to HTML is complete.

そして、その予告通り「最新版 78.0.1 - 2020年7月21日」(Wikipedia より引用) がリリースされました。

レガシーアドオンの開発者は、アドオンの移行 (規模的には再開発) が必要です。

70 系リリースまでは恐らく存在しなかったであろう情報が、70 系リリース後に発信されています:

- [Update add-ons for Thunderbird 78 using wrapper APIs](https://github.com/thundernest/addon-developer-support/wiki)
- [Supporting Add-On Developers](https://github.com/thundernest/addon-developer-support)

開発者向け情報 (英語) についてはこちらをどうぞ。

- [Developer Community - Thunderbird](https://developer.thunderbird.net/add-ons/community)