記事一覧はこちら

background_pageとoptions_pageは違う

バックグラウンドページ、オプションページ、コンテキストメニュー初期化スクリプトはこんな感じです。
chromeを起動して拡張が読み込まれた時も、オプションページを開いた時も、コンテキストメニュー初期化処理を実行させたくてこう書きました。

ところが、拡張を有効にした時はコンテキストメニューがちゃんと表示されるのですが、オプションページでコンテキストメニュー関連の設定を変更し、コンテキストメニューを初期化するとコンテキストメニューをクリックしても登録した関数のclick()が実行されません。

数分悩んだのですが、拡張を有効にした時はバックグラウンドページでコンテキストメニューの初期化処理が実行され、コンテキストメニューがクリックした時はバックグラウンドページでclick()が実行されます。
ところが、オプションページで再度コンテキストメニュー初期化処理を実行し、コンテキストメニューをクリックすると、オプションページでclick()が実行され、オプションページにclick()が無いのでエラーとなっていました。

この現象を改善するには、オプションページからではなく、バックグラウンドページでコンテキストメニュー初期化処理を実行させる必要があります。
そのためには、オプションページでchrome.extension.sendRequest({},function(){});の通信を行うと無事オプションページからバックグラウンドページに通信が行われ、バックグラウンドページでコンテキストメニューの初期化が行われ、コンテキストメニューをクリックした時にはバックグラウンドページのclick()が実行されました。