セッションストアは、拡張機能が Firefox のセッションを通して簡単にデータの保存と復元ができるようにするための新機能です。拡張機能からセッションストア機能を利用できるようにするためのシンプルな API があります。
拡張機能からセッションストア機能を利用することが重要であるようなシナリオ例: Firefox 2 では閉じたタブを元に戻すことができます。タブの復元時にあなたの拡張機能の状態を復元するためには、セッションストア API の setTabValue()
メソッドを使って、状態を復元する際に必要となる何らかのデータを保存しておく必要があります。そして、タブが復元される時、 getTabValue()
メソッドを呼び出してさきほど保存したデータを取得します。
セッションストア API は nsISessionStore
インターフェースを使って実装されています。
いつ復元されるか知る
Firefoxがタブを復元しようとするとき、 SSTabRestoring
型のイベントが発生します。もしあなたの拡張機能がタブを復元するときにデータの回復を必要とするなら、以下ようなイベントリスナを追加してください:
function myExtensionHandleRestore(aEvent) { Components.classes["@mozilla.org/consoleservice;1"]. getService(Components.interfaces.nsIConsoleService). logStringMessage("restored"); }; document.addEventListener("SSTabRestoring", myExtensionHandleRestore, false);
関数 myExtensionHandleRestore()
を、タブが復元されたときに実行したい処理によって単純に置き換えてください。この例では nsIConsoleService
を使ってconsole にメッセージを表示させています。
SSTabRestoring 型イベントは、タブが復元される直前に発生します。SSTabRestored
型イベントは、個々のタブが復元されるたびに発生します。
タブが閉じられる前にタブに関連付けられたデータを更新するために、いつタブが閉じられようとしたかを検出するには、Firefox 3 以降なら、タブへ送られる "SSTabClosing" イベントを監視してください。
セッション復元処理
セッションが復元されるときに起こる処理の正確な流れは、以下のようになります:
- セッション状態が復元されようとしています。これは Firefox 起動時か、あるいは「閉じたタブを元に戻す」機能に対する応答時に起こりえます。なぜなら、閉じられたタブはそれぞれ別のタブのセッションとして復元されるからです。
- 必要に応じて(セッションストア内に保存された各ウィンドウについて)新しいウィンドウが開かれます。そして、 Cookie や最近閉じたタブのリストが復元されます。
その後、個々のタブの復元に対して以下の手順が踏まれます。
- 既存のタブを再利用するか、あるいは新しいタブを生成するか。後者の場合、
TabOpen
イベントが発生します。 - タブの永続化された XUL 属性(
persistTabAttribute()
の呼び出しによって保存されたデータ)や、パーミッション【訳注: 画像やスクリプトなどの許可/不許可】が復元されます。 -
SSTabRestoring
イベントが発生します。 - タブへ表示すべき URL の読み込みが開始されます。
- ページの読み込みが完了したとき、テキスト入力欄やスクロール状態が復元されます。
- 最後に、
SSTabRestored
イベントが発生します。
ページが読み込まれる前にパーミッションを変更するなどして復元対象のタブを制御したい場合、SSTabRestoring
を監視します。
ページの読み込みが完了した後に何らかの処理を行いたい場合、SSTabRestored
を監視します。
両方のイベントはともに、個々のタブが復元されるたびに常に発生します。イベントの originalTarget
フィールドを見れば、どのタブが復元されようとしているのかを知ることができます。
まずいくつのタブの復元が必要であるかを数え、そして SSTabRestored
イベントの発生回数を数えることでもしない限りは、いつ最後のタブが復元されるのかを知る由はありません。
セッションストア API を使う
この章では、セッションストア API の使い方のシンプルな例をいくつか示します。
タブに値を保存する
次のコードでは、キー/値のペアをタブへ関連付けています【訳注: 原文は attach(取り付ける)】。これによって、タブが復元されたときにそのペアが関連付けられたままになります。
var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]. getService(Components.interfaces.nsISessionStore); var currentTab = getBrowser().selectedTab; var dataToAttach = "I want to attach this"; ss.setTabValue(currentTab, "key-name-here", dataToAttach);
このコードは、 "key-name-here" というキーに対する値を dataToAttach へセットしています。【訳注: 文字列以外にも】あらゆる JavaScript のオブジェクトをデータとして使用することができます。
保存した値を取り出す
タブへ関連付けられた値は、タブが復元される途中であるかどうかに関わらず、以下のようなコードによっていつでも取り出すことができます:
var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]. getService(Components.interfaces.nsISessionStore); var currentTab = getBrowser().selectedTab; var retrievedData = ss.getTabValue(currentTab, "key-name-here");
このコードを実行後、 retrievedData 変数は "key-name-here" キーに対する値を保持します。もしそのキー名に対する値が存在しなければ、 retrievedData は undefined となります。
タブに関連付けられた値を削除する
タブから値を削除するには、以下のようなコードを使ってください:
var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]. getService(Components.interfaces.nsISessionStore); var currentTab = getBrowser().selectedTab; ss.deleteTabValue(currentTab, "key-name-here");
注釈
ウィンドウに対する値の保存と復元機能は、タブに対する機能と似たような関数名でまったく同様に動作します。