2020年8月17日月曜日

openPopup() の使い方 【MailExtensionsメモ】

Thunderbird 78対応アドオン作成のメモ。

ひとまず、アドオンの修正も一段落ついたので、私がはまったときのメモを吐き出していきます。何かのお役に立てれば。まずは、ポップアップ表示(openPopup())ではまったポイント。


browser.browserAction.openPopup() など、スクリプトからツールバーボタンのポップアップを表示する際、以下のメッセージでエラーになる場合がある。

Uncaught (in promise) Error: browserAction.openPopup may only be called from a user input handler

 openPopup()は使用できるケースが限られ、ユーザ操作のイベントからしか呼べない様子。

ツールバーボタンのクリック、コンテキストメニュー、ショートカットキーなどのイベントではポップアップ表示できるが、メッセージ表示時(messageDisplay.onMessageDisplayed())や、ウィンドウ間の通信(runtime.onMessage()/sendMessage())をトリガに実行しても、上記のエラーメッセージになる。WebExtension Experimentsで自作したイベントもNG。

また、ユーザ操作のイベントであっても、非同期関数(async)からは呼び出せないっぽい。例えば、メッセージが選択されている状態でのみポップアップを開きたくて、以下のようにしても、同じエラーメッセージで怒られる。

browser.commands.onCommand.addListener(async (command) => {
  let tabs = await browser.tabs.query({
    active: true,
    currentWindow: true
  });

  //選択中のメッセージを取得
  let messages = [];
  if (tabs[0].mailTab) {
    let msgs = await browser.mailTabs.getSelectedMessages(tabs[0].id);
    messages = msgs.messages;
  }

  //メッセージが選択されていたらopenPopup()する。
  //ここで冒頭のエラーがでてしまう。
  if (command === "cmd_open-popup" && messages.length > 0) {
    browser.browserAction.openPopup();
  }
});


別イベントで選択メッセージを取得しておくなどして、openPopup()をasync関数の中で呼ばないようにしないとダメ。

var messages = [];

browser.mailTabs.onSelectedMessagesChanged.addListener((tab, selectedMessages)=>{
  messages = selectedMessages.messages;
});

browser.commands.onCommand.addListener((command) => {
  if (command === "cmd_open-popup" && messages.length > 0) {
    browser.browserAction.openPopup();
  }
});

MailExtensions APIのドキュメントを見ても、特にこの仕様に関して言及なし。
 
Firefox のWebExtensions APIは以下に説明あり。おそらくFirefoxと同じ動作と思われる。

カット&トライで調べていくしかないが、Thunderbird独自のイベントでは使えないと予想。compose.onBeforeSend()では使えた。


0 件のコメント:

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