Thunderbird 3のタブあれこれ

でThunderbird3のアドオン作ることで知ったことをメモするよ。

Webページをタブに開きたかったら

var url = "http://example.com"
var tabmail = document.getElementById("tabmail");
tabmail.openTab("contentTab", { contentPage: url });

でOK
tabmail.openTabメソッドの第一引数はタブのタイプを指定するんだけど、これ、タイプ別に10個までしか開けないみたい。まぁThunderbirdでそこまでタブを開くことは無いだろうからいいけど。

んで、第二引数はページ情報としてオブジェクトを渡すようになっている。最低限、contentPageがあればタブに開けるが、上記ページの追記で書いたようにリンクをクリックすると外部ブラウザにURLを渡されてしまう。

調べていくと、chrome://messenger/content/specialTabs.jsbrowser要素にonclickイベントハンドラをくっつけていて、openTabメソッド第二引数のオブジェクトにclickHandlerがあればそれを、なければデフォルトのハンドラを付けている事が分かる。
さらに見ていくと、タブのタイプにchromeTabを指定したとき、contentTabを指定したときと、どこにも使われていないと思われるspecialTabs.siteClickHandlerメソッドがある。このメソッドは第一引数にEventオブジェクト、第二引数にRegExpオブジェクトを取っている。デフォルトの設定に加えて、この正規表現にマッチしなかったら外部ブラウザに投げる形になっている。この正規表現/.*/等としておけば全URLをThunderbird内で表示することが可能。

まとめておくと

var url = "http://example.com"
var tabmail = document.getElementById("tabmail");
tabmail.openTab("contentTab", {
  contentPage: url,
  clickHandler: function(event){
    specialTabs.siteClickHandler(event, /.*/);
  }
});

これだとさすがにヤバイので、同一ドメイン限定に絞ると以下のような感じ。

var url = "http://example.com"
var tabmail = document.getElementById("tabmail");
var uri = makeURI(url);
var reg = new RegExp("^" + uril.prePath.replace(/\./g, "\\.") + "($|/)");
tabmail.openTab("contentTab", {
  contentPage: url,
  clickHandler: function(event){
    specialTabs.siteClickHandler(event, reg);
  }
});

因みに、Thunderbird内にはopenLinkExternally(urlString)メソッドが用意されている。外部のデフォルトブラウザにURLを投げるメソッドだ。これも何かに使えそうな感じ。