2020年8月18日火曜日

WebExtension Experiments の注意点【MailExtensionsメモ】

Thunderbird 78対応アドオン作成のメモ。Experiments API関係。

基本的には、サンプルをテンプレートに作成していく。


■windowオブジェクト
Thunderbirdの内部を触れるようになるが、別のスコープにいる。WindowMediatorを使って、windowオブジェクトを取得しないといけない。

var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");

let rw = Services.wm.getMostRecentWindow("mail:3pane");
if (rw) {
   rw.document.getElementById(...);
}

legacy add-onのコードを持ってくる場合は、
  • document.getElementById()
  • setTimeout()
  • addEventListener()
など、上記で取得したwindowに置き換えないといけない。

getMostRecentWindow()の引数は、取得したいウィンドウに合わせて変える。
  • mail:3pane:メインウィンドウ
  • msgcompose:メッセージ作成ウィンドウ
  • mail:addressbook:アドレス帳
  • mail:messageWindow:別ウィンドウでメールを開いたときのウィンドウ
引数をnullにすれば、すべてのウィンドウの中で、最後にアクティブになったウィンドウを返す。あまり使い道はないかも。


■XMLSerializer
Experimentsのスコープにインポートしないと使えない。

Components.utils.importGlobalProperties(["XMLSerializer"]);

let xmlSerializer = new XMLSerializer(); //importしていないとnewできない
let xmlString = xmlSerializer.serializeToString(xmlNode);


■MailServices.jsm
Thunderbird 78では、MailUtils.getIdentityForServer(server)が、配列を返すようになっている。Identityは戻り値の0番目。公式サイトの「Adapt to Changes in Thunderbird 69-78」にはのっていない。

var { MailServices } = ChromeUtils.import("resource:///modules/MailServices.jsm");

let identity = MailUtils.getIdentityForServer(server)[0];


■Javascript module (*.jsm)
Javascriptコードモジュールはキャッシュされる。Thunderbird終了時にキャッシュをパージする処理を入れないと、アドオンのバージョンアップでモジュールの変更が反映されない場合がある。サンプルコードに入っているので、自分のファイル構成に合わせて変更すればよい。

var myApi = class extends ExtensionCommon.ExtensionAPI {
  getAPI(context) {
    context.callOnClose(this);

    return {
      //Experiments APIの定義。省略。
    }
  }  

  close() {
    Components.utils.unload(extension.rootURI.resolve("modules/utils.jsm"));
    Services.obs.notifyObservers(null, "startupcache-invalidate", null);
  }
};

また、この処理は、デバッグしているときに再読み込みを実施しても呼ばれないので注意。上記例のmodules/utils.jsmを変更して再読み込みを実行しても、キャッシュが使われてしまう。一時読み込みしたアドオンを削除して、再読み込みしないといけない。
 
■document.createElement()
Thunderbird 78から、HTMLエレメントを返すようになった。XULエレメントを作るときは、document.createXULElement() にしないといけない。


0 件のコメント:

人気の投稿(過去7日間)