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 件のコメント:
コメントを投稿