拡張機能に共通する要望は、タスクや状態を管理するあるスクリプトが、継続的に実行され続けることだ。バックグラウンド・ページはその要望に応える。
概要で説明したように、バックグラウンド・ページは拡張機能のプロセスで実行されるHTMLページである。拡張機能が読み込まれている限り存在し続け、同時に1つのインスタンスのみ有効になる。
典型的なバックグラウンド・ページを含む拡張機能において、ユーザインターフェース(例えばブラウザアクションやページアクション、オプションページのような)は見栄えだけの表示機能として用意される。この表示機能が何か状態を必要とする時、それはバックグラウンド・ページから要求される。バックグラウンド・ページが状態の変化を監視し、その変化を表示側に通知する形をとる。
バックグラウンド・ページを使うには、Manifest Fileに次のように記述する。
{
"name": "My extension",
...
"background_page": "background.html",
...
}
拡張機能内の様々なページ間で、ちょうどフレーム間のそれのように直接スクリプトを呼び出すことが出来る。extension.getViewsメソッドを呼べば、拡張機能に属する全ての有効なWindowオブジェクトを取得できる。またextension.getBackgroundPageメソッドはバックグラウンド・ページを返す。
次のコード例は、どのようにバックグラウンド・ページが拡張機能内の他のページを操作するのかを示している。同時に、バックグラウンド・ページでどのように、ユーザによりクリックのようなイベントを利用するのかも理解できる。
この拡張機能は、バックグラウンド・ページと、tabs.createによって複数のタブに読み込まれた image.html を含んでいる。
/* バックグラウンド・ページ */ <html> <script> // ブラウザアクションがクリックされた場合の処理 chrome.browserAction.onClicked.addListener(function(tab) { var viewTabUrl = chrome.extension.getURL('image.html'); var imageUrl = /* an image's URL */;
// この拡張機能に属するビューを全て確認し、今回使うものを見つける var views = chrome.extension.getViews(); for (var i = 0; i < views.length; i++) { var view = views[i];
// ビューが該当するURLを指し、未使用のものであれば... if (view.location.href == viewTabUrl && !view.imageAlreadySet) {
// ...関数を呼び出し、使用済みに状態を変える view.setImageUrl(imageUrl); view.imageAlreadySet = true; break; // 完了 } } }); </script> </html>
/* image.html */ <html> <script> function setImageUrl(url) { document.getElementById('target').src = url; } </script>
<body> <p> Image here: </p>
<img id="target" src="white.png" width="640" height="480">
</body> </html>