この記事は Thunderbird 3 の新機能について述べています
Content Tab を使うと Thunderbird でタブの中に、ユーザがブラウザと(ほとんど)同じように閲覧可能なリモートコンテンツを表示できるようになります。例えば、Thunderbird の ヘルプ | 新着情報 メニューオプションはウェブコンテンツを表示するタブを開きます。Thunderbird チームはウェブサイトを経由してこのコンテンツをいつでも更新することができます。
Content Tabs はフォーム、自動補完、パスワードマネージャ、Cookie、クイック検索、その他のブラウザの機能を活用することができます。
Content Tab を開く
Content Tab は tabmail インタフェースを経由して開かれます。以下の例では、新着メッセージをタブに開くかメッセージウィンドウに開くかのユーザ設定を調べ、Thunderbird のナイトリービルドのための「新着情報」ページを(ユーザの設定に応じて、Content Tab または新規メッセージウィンドウに)表示します。
let url = "https://www.mozillamessaging.com/en-US/thunderbird/nightly/whatsnew/"; let tabmail = document.getElementById("tabmail"); if (!tabmail) { // Try opening new tabs in an existing 3pane window let mail3PaneWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator) .getMostRecentWindow("mail:3pane"); if (mail3PaneWindow) { tabmail = mail3PaneWindow.document.getElementById("tabmail"); mail3PaneWindow.focus(); } } if (tabmail) tabmail.openTab("contentTab", {contentPage: url}); else window.openDialog("chrome://messenger/content/", "_blank", "chrome,dialog=no,all", null, { tabType: "contentTab", tabParams: {contentPage: url} });
Content Tab に何かを開くのをテストするには、以下の内容をエラーコンソールに入力して コードを評価 をクリックします:
Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("mail:3pane").document.getElementById("tabmail").openTab("contentTab", {contentPage: "https://www.mozillamessaging.com/en-US/thunderbird/nightly/whatsnew/"});
上の例はいずれもデフォルトのクリックハンドラで Content Tab を開きます。
クリックのハンドリング
Content Tab を指定されたクリックハンドラを用いずに開くには defaultClickHandler
を使用します。デフォルトのクリックハンドラはすべての about:、
http:、
https:
リンクを外部のブラウザに送り、それ以外は network.protocol-handler.expose.*
の設定に応じて内部なたは外部にロードします。
Contents Tab を開くときに clickHandler
引数を与えることによって明示的に defaultClickHandler
を定義することができます。これは clickHandler を定義しない場合と等価であることに注意してください
:
tabmail.openTab("contentTab", {contentPage: url, clickHandler: "specialTabs.defaultClickHandler(event);" });
clickHandler
は contentTab
のために生成されたブラウザ要素の onclick
属性に挿入される値です。
閲覧するサイトを制限する
Thunderbird は 正規表現 を引数に持つ siteClickHandler を提供します。これにより以下の機能が実現されます:
- クリックされたリンクが
http
またはhttps
スキームを持っており、正規表現がそのリンクにマッチしない場合、リンクは外部ブラウザで開かれます。 - それ以外は、リンクはブラウザ要素の内部に開かれます(そして
network.protocol-handler.expose.*
設定にしたがって)。
http
の制限とリダイレクトの可能性により、サイトが変わったり JavaScript を使用したりすると、onclick
ハンドラは contentTab
がひとつのサイトにとどまることを保証することができなくなるかもしれません。この機能を使用する拡張機能はハンドラを実装するときにこのことを考慮すべきです。サイト制限の良い例が Personas 拡張機能です。これはギャラリーを閲覧するための Content Tab を開きますが、ユーザがサイトの外に出ようとするとそれは外部ブラウザに飛ばされ、一般的な閲覧のためにより良いサポートを提供します。これを実現するコードは比較的単純であり、簡単に書くと以下のようになります:
let PersonasController = { get _thunderbirdRegExp() { delete this._thunderbirdRegExp; return this._thunderbirdRegExp = new RegExp("^https://www.getpersonas.com/"); }, openURLInTab: function (url) { ... openTab("contentTab", { contentPage: url, clickHandler: "specialTabs.siteClickHandler(event, PersonaController._thunderbirdRegExp);" }); ... } };
その他のクリックハンドラ
拡張機能は自分自身のクリックハンドラを提供できますが、それは siteClickHandler を元にすべきであり、バグを修正する更新を定期的にチェックするべきです。
クリックハンドラを保存する
Content Tabs は tabmail が提供するセッション保存コードによってフックアップされます。クリックハンドラは Content Tab の URL と一緒に保存され、アプリケーションが再起動したときに復元されます。
Content Tab を拡張する
拡張機能は Content Tab を二つの方法で拡張できます: 現在の Content Tab コードを拡張する事によって(これはすべての拡張機能に影響します)または、自信のテンプレートとサポートコードによって。
専用タイプを実装するには、以下を参照してください:
- specialTabs.xul - Content Tab の XUL テンプレート
- specialTabs.js - Content Tab の JavaScript 実装(
contentTabType
を参照)
セキュリティ
拡張機能はセキュリティに注意すべきです。Thunderbird はデフォルトではブラウジングをサポートしていないので、今のところは最小限のセキュリティ UI しか提供していません。考慮すべきセキュリティ課題には以下が含まれます:
- URL バーを提供する
- セキュリティレベルを表示する
- このページ(displaying web content in an extension)には関連情報が含まれています。
参照
Thunderbird の Content Tab 実装に関するバグは Bugzilla に登録してください。最初に existing known bugs をチェックしてください。あなたのバグが新しいものであれば、バグを作成するときに "Thunderbird" プロダクトと "Toolbars and Tabs" コンポーネントを指定してください。