◆ localStorage の監視で sendMessage を減らせるかも ◆ タブ更新したときの URL は info じゃなくて tab の方を使う

オプション画面での設定変更をバックグラウンドページで知りたい

設定変更するたびに sendMessage やるのかー と思ってたのですが 設定変更したら普通はローカルストレージを更新しますよね

ということは バックグラウンドページでローカルストレージの更新を監視すればいいんです
window.addEventListener("storage", function(eve){
reload()
}, false)

こんなの書いておくと ローカルストレージが更新されたときに reload 関数を実行できます

このイベントはちょっと賢くて 存在しないキーを消す操作や上書きしたけど値が変わってなかったときは発火しません
また 別のページで変更された場合だけでこのリスナを設定したページ内で更新しても発火しません
もちろん 読み取りでも発火はしないです

タブ更新時の URL 取得

タブの更新は chrome.tabs.onUpdated.addListener で監視できます
chrome.tabs.onUpdated.addListener(function(tabid, info, tab){
// info.url
// tab.url
})
引数は上の通りで tabid, info, tab です

このイベントは タブを開いたり タブのページが遷移したりリロードしたりで発火します

URL を取り出したいときは info と tab のどちらのオブジェクトからもとれますが tab.url のほうを使わないとダメです

info は changeInfo で変更があった情報が入ります
つまり F5 などのリロードでは url プロパティが存在しません

タブ開いたりページ遷移だと入ってるので info.url でいけると思ってしまうかもしれないですがリロードのときにちゃんと動かなくなるので注意です
逆に info.url があるかどうかでリロードかどうかを判定するという使い方もできそうです

タブ更新のイベントは 2 回発生する

上の chrome.tabs.onUpdated.addListener ですが ここで設定した関数は 2 回呼び出されます
状態が loading のときと complete のときです
それぞれの文字が info.status に入るので処理は if 文でムダに 2 回処理をしないようにしないといけないです