Thunderbird拡張機能 Tips
同じ内容でハマる人がいるかもしれないんで、取り合えず自分でハマった内容の解決策やらドキュメントで見つかりにくい小技を晒しておいてみる。
・・・コレで世の中に良いPlug-inが増えればいいなぁ・・・。
●機能乗っ取り
XULのオーバーレイでは既存のオブジェクトの属性値の上書きも可能。
コレを使うとoncommand等の属性値を上書きすることで機能自体の乗っ取りも可能。
●アドレス帳の情報一覧取得
nsIAbDirectoryのcardListsが現状(1.0.7と多分1.5.0も・・・)動作しないのでその代わりの手段。
// nsIAbView取得
var viewAddr = Components.classes[”@mozilla.org/addressbook/abview;1″].createInstance(Components.interfaces.nsIAbView);
// AbViewをアドレス帳uriで初期化
var actualSortColumn = viewAddr.init(uri, false, null, “GeneratedName”, “ascending”);
// アドレス帳取得
for (var i=0; ; i++)
{
var card = viewAddr.getCardFromRow(i);
if (!card)
{
// 取得失敗したら全件取得完了
break ;
}
// 取得したアドレス情報に対する処理をここから記述
// 取得される情報にはアドレスリスト情報も含まれる
}
// AdViewを解放
viewAddr.close();
●オーバーレイでポップアップメニュー
既存のメニューに項目追加とかでは問題ないけど、新規にメニューを作る場合はオーバーレイの直下ではなく、拡張するウィンドウの中にメニューオブジェクトを挿入する形にしなければならない。
<window id=”機能拡張するWindowのID”>
<popup id=”popid”>
// ポップアップメニュー定義
</popup>
</window>
</overlay>
もちろん、拡張するのがウィンドウでなくダイアログならば、<window>タグではなく<dialog>タグでなければ駄目。
●関数乗っ取り
JavaScriptは同じ名前の関数があった場合、後宣言側が優先。
{
window.alert(”func1 - old”);
}
function func1()
{
window.alert(”func1 - new”);
}
func1(); // “func1 - new”というウィンドウが表示される
ただ、コレではオリジナルの関数の機能全てを上書きしてしまう為、
「特定の関数の呼び出し時に別の処理もさせて、元の関数の処理も全てさせたい」
という時に関数全部をコピーせねばならず不便だし、互換性も考えると色々面倒。
以下がよりベターな関数の上書き(オブジェクト指向で言うところのオーバーライド)
{
window.alert(”func1 - old”);
}
function my_func1()
{
window.alert(”func1 - new”);
gOldFunc1(); // 元のfunc1を呼び出し
}
gOldFunc1 = func1; // 元のfunc1を記憶
func1 = my_func1; // func1を上書き
func1(); // “func1 - new”というウィンドウが表示され、閉じると”func1 - old”も表示される
ただし組み込み関数や、XPCOM等のコンポーネント系に対して有効かどうかは未検証。
また、単純な宣言上書きに比べて、グローバルスコープの処理実行の順序に左右される。
上の例では「gOldFunc1 = func1;」が実行されるより前で「func1」を呼び出されると元のfunc1が実行されてしまう。
トラックバック URL :