← コラム一覧に戻る

2026/9/9

Chrome拡張機能が「起動時に動かない」不具合の直し方|Manifest V3特有の落とし穴

Chrome拡張機能の改修依頼で、「起動時に処理が始まらないことがある」という不具合修正を担当したことがあります。Manifest V3(以下MV3)特有のポップアップのライフサイクルが原因で、再現性が低く原因調査に手間取りやすい不具合です。今回はその実例と直し方、そして拡張機能のロジックをブラウザ無しでテストする方法を解説します。

実際にあったご相談内容

情報収集を自動化するChrome拡張機能で、ポップアップのボタンを押して処理を開始しても、タイミングによって処理が始まらないことがある、という不具合修正のご依頼でした。毎回ではなく起きたり起きなかったりするため、原因の切り分けに時間がかかりやすいタイプの不具合です。

原因:ポップアップが閉じると処理が止まる

MV3のポップアップ(popup.js)は、ユーザーの操作で表示されている間しか生きていません。ポップアップ内で新しいタブを開く処理(chrome.tabs.create({active: true}))を実行すると、新しいタブがアクティブになった瞬間にポップアップが閉じてしまい、その直後に実行しようとしていた保存処理(chrome.storage.local.setなど)が完了しないまま止まってしまうことがあります。ポップアップが閉じるタイミングと処理の完了タイミングの競争になっており、遅いと処理が欠けます。

  • タブの作成など、完遂が必須の処理はポップアップ(popup.js)ではなくbackground(service worker)側に寄せる
  • ポップアップ側は「処理の開始をbackgroundに伝える」役割に留め、実処理はポップアップが閉じても生き続けるbackground側で行う
  • ユーザーへのフィードバック(進捗表示など)は、background側からポップアップやタブへメッセージを送る形で行う

見落としがちな副次バグ

この案件では、アイコン画像一式(16/48/128pxのPNG)が拡張機能に同梱されていないという別の問題も見つかりました。表示上は大きな支障が無いため見落とされがちですが、chrome.notifications.create()による通知機能もアイコン未指定を理由に失敗しており、処理の完了をユーザーに知らせる手段が実質機能していませんでした。「動いているはずなのに反応が無い」という不具合は、処理そのものだけでなく、結果を伝える経路が壊れているケースもあるため、あわせて確認するようにしています。

ブラウザを起動せずにロジックをテストする

Chrome拡張機能は実ブラウザが無いとテストできないと思われがちですが、chrome名前空間のAPIをスタブ(ダミー実装)に差し替え、Node.jsのvmモジュールでbackground.jsをそのまま読み込むことで、抽出・判定ロジックの部分だけを実ブラウザ無しでユニットテストできます。この案件では、想定外のパターンも含めて40件のテストケースで検証し、修正が既存の挙動を壊していないことを確認しながら進めました。

事例:リード獲得用Chrome拡張機能の改修

Chrome拡張機能の不具合修正・機能追加もZEROVENTUREで対応しています。「前の担当者が離れてメンテナンスできる人がいない」という拡張機能があれば、お気軽にご相談ください。

コーディングのご相談は、お気軽にどうぞ。

お問い合わせ →