前に作った拡張機能で意気揚々とファイルをダウンロ-ドしようとしたら何故か初回だけダウンロ-ドが行われないバグに遭遇した。

で、ざっと調べたら Service Worker が非アクティブなのが原因っぽいなというのはすぐに気づいた。
なんかこれマニフェスト V3 になってから Service Worker が使われなくなってから 30 秒ぐらいで非アクティブになるようになったみたいでちょこちょこ記事があった。
- 【Chrome拡張機能開発】Manifest V3でService workerが自動停止してしまう問題の原因と対処法
- Chrome拡張機能で一定時間を経過するとService Workerが「無効(Inactive)」状態になり、event.jsでChrome拡張機能のAPIが動作しなくなる問題の回避策について
- Service Worker(無効)とは何ですか?Chrome拡張機能に関して教えてください。
それを見て私も何か Service Worker を非アクティブにさせない小細工しなきゃいけないのかな-ってなって色々模索したんだけど上手くいかなくて。
そもそも非アクティブになったら上手く呼び出せないとか天下の Google がそんな仕組み許すもんか ? って考えて違うところいじったら上手く行った。
function onSubmit(data: z.infer<typeof FormSchema>) {
if (Array.isArray(downloadlinks)) {
requestDownloads(
tab,
downloadlinks,
data.isChangeFilename ? data.filename : undefined,
);
set({ isChangeFilename: data.isChangeFilename });
}
window.close();
}
上記コ-ドはリリ-ス直後のコ-ドで、ダウンロ-ドボタンを押下後の処理で『requestDownloads (戻り値 Promise<void>)』をキックしたら問答無用でウィンドウを閉じて終了させてる。
はい。
Serive Worker がアクティブ時はそれで問題ないんだけど、非アクティブ時は『requestDownloads』のダウンロ-ド依頼処理が完了するより先に呼び出し元の処理 (ウィンドウ) が終了しちゃって上手くいかなくなったんだと思います。知らんけど。
function onSubmit(data: z.infer<typeof FormSchema>) {
if (Array.isArray(downloadlinks)) {
requestDownloads(
tab,
downloadlinks,
data.isChangeFilename ? data.filename : undefined,
).then(() => {
set({ isChangeFilename: data.isChangeFilename });
window.close();
});
}
}
なので『requestDownloads』が完了するのを待つようにしたら上手く行きました。∩(・ω・)∩ばんじゃ-い
結論
非同期処理を呼び出したら、呼び出し元は呼び出し先の処理が終わるまで待たずにプロセス終了しては絶対にいけない !!
おまけ
そういえば Chrome Web Store の審査早くて驚いた。