WebExtensionsのAPIの非同期対応が呼び出し箇所により異なる(Async,Primise)

 TL;DR

FireFoxでchrome.*()系APIを使うとき、content_scriptだけpromiseなAPIで、ほかはコールバックな模様


概要

そもそも、
- FireFoxはChrome拡張機能互換の一環として、chrome.storage.local.get()といったchrome.*()系APIを実装している
https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/get
> この API は Chromium の chrome.storage API に基づいています。
- MDNのドキュメントではchrome.*()系APIはコールバックで非同期を返すものとなっている
(前述のURLにて。2024年現在も)
- Chromeブラウザのchrome.*()系APIは実際にコールバックのAPIで、Primise非対応だった
(おそらく当初、あるいはmanifest V2の頃は)
- 2023年時点のFireFoxでは、chrome.*()系APIはPrimise非対応だった
(当時の挙動からおそらくそう思われる)

- 一方、現在のChromeはchrome.storage.local.get()はPromiseを返すようになっている
(2024年現在。ドキュメントに記載されている通りならば)
https://developer.chrome.com/docs/extensions/reference/api/storage?hl=ja
> chrome.storage.local.get(["key"]).then((result) => {

- 2024年、FireFoxのchrome.*()系APIは、content_script内ではpromiseを返すようになった模様
(とりあえずchrome.storage.local.get()は。全てのAPIが対応しているかは不明。)


説明


気づいたのはdaisy AddCharaIconブラウザ拡張の開発中で、これはページ内のゲーム登場人物名の横に顔アイコンを付与するブラウザ拡張。
毎回アイコン画像をloadするのは負荷が高いため、ローカルでキャッシュするためにWebExtensionsのstorage APIを叩いていて気づいた。




https://github.com/MichinariNukazawa/add_chara_icon_webextensions


```: option_page/option_page.js

const getHashFromTitle = async (title) => {
return new Promise((resolve) => {
// TODO FireFoxではchrome.storage.local.*()で
//promise構文が通用しない様子
// (FireFox127.0.2, 2024/07, Ubuntu 24.04)
chrome.storage.local.get(null, (hash) => {
//console.log('src', hash);
const filterHashFromTitle = (title, hash) => {
let res = {};
for(let key in hash){
if(hash[key].title == title){
res[key] = hash[key];
}
}
return res;
}
const res = filterHashFromTitle(title, hash);
resolve(res);
});
});
};

```


面白いのはoption_pageでもPromise()構文自体は有効であることで、これはcallback版をPromiseでwrapして機能していることからわかる。
つまりFireFoxではchrome.storage.local.get() API側が2種類あるということで、content_scriptとそれ以外で同じAPIのインタフェースが異なる、ということを示しているのだと考えられる。

WebExtensionsのAPIの非同期対応が呼び出し箇所により異なる(Async,Primise)

 TL;DR FireFoxでchrome.*()系APIを使うとき、content_scriptだけpromiseなAPIで、ほかはコールバックな模様 概要 そもそも、 - FireFoxはChrome拡張機能互換の一環として、chrome.storage.local.get(...