persisted user state restoration

セッション履歴エントリー (Web)

[2] セッション履歴エントリー (session history entry) は、 セッション履歴中のエントリーです。

仕様書

状態

[4] セッション履歴エントリーは、次のものから構成されます。

URL (必須) >>1
資源URL です。
状態オブジェクト (state object)
利用者インターフェイスの状態を表すオブジェクト >>1
題名 (title)
文書のその時点での状態を説明するもの (利用者が履歴上で navigate するためのもの)。 >>1
Document オブジェクト >>1
資源文書です。
初期文書かどうか
初期「about:blank」文書かどうかを表します。 navigate などの際に用いられます。
要求メソッドその他 navigate の引数
セッション履歴エントリーを作成した navigate引数 (URL 以外)。 fetch引数など、履歴の探索で再度 navigate するために使います。 replaceState/pushState で変更されることがあります。
始点閲覧文脈
履歴の探索で使う始点閲覧文脈
時刻
作成時刻。結合セッション履歴におけるエントリー整列に用いられます。
閲覧文脈
セッション履歴エントリーを持つセッション履歴を持つ閲覧文脈
閲覧文脈名
履歴の探索で読み書きされます。
フォームデータ >>1
スクロール復元モード >>1
スクロール位置Webブラウザーが自動的に復元するべきか、 スクリプトに委ねるべきかのモードです。
スクロール位置 >>1
その他
その他の情報も含められます >>1

[20] セッション履歴エントリーの構成や、エントリー作成・変更時の値の詳細は、 HTML Standard では規定されておらず、ほぼ利用者エージェントに任されているようです。

[22] 履歴の探索pushState では、セッション履歴エントリーを構成する各状態が更新されることがあります。 (セッション履歴エントリー文書については次章を参照。)

[32] 次のような状態を保存するべきかもしれません。

[8] セッション履歴エントリーは、セッション履歴現在エントリーである場合があります。

持続的利用者状態

[9] 利用者エージェント定義の状態を持つエントリー持続的利用者状態付きエントリー (an entry with persisted user state) といいます >>1利用者エージェント定義の状態には、フォームデータスクロール位置その他が含まれます >>1

pushState も参照。

[37] セッション履歴エントリーエントリーからの持続的利用者状態の復元 (restore persisted user state) は、 次のようにしなければなりません >>36

  1. [38] エントリースクロール復元モードauto なら、
    1. [39] 文書スクロール可能領域 (子供閲覧文脈を除く。) のスクロール位置を復元して構いません。
  2. [40] その他必要に応じて文書レンダリングを更新して構いません。

[41] その他とは、フォーム制御子の復元や、 テキスト入力系フォーム制御子要素dir 属性値の復元などを行えます >>36

セッション履歴エントリー、閲覧文脈、文書の関係

[25] 閲覧文脈は、文書利用者示す (present) ものです >>23閲覧文脈は、セッション履歴を持ちます >>23セッション履歴は、 その閲覧文脈において過去、現在、未来に示される Document オブジェクトリストです >>23, >>24閲覧文脈は、その各文書に対して強い参照を持ちます >>21

[27] ある時点においては、閲覧文脈にはいずれか1つの文書が示されており、 これを活性文書といいます >>23セッション履歴のうち、 いずれか1つが現在エントリーとなります。履歴の探索の途中の (スクリプトからは観測できない) 状態を除き、現在エントリー文書活性文書です。

[26] 厳密にはセッション履歴セッション履歴エントリーのリストです。 セッション履歴エントリー文書を保持していますが、それ以外の情報も保持しています。 複数のセッション履歴エントリー文書が同じ文書である場合もあります >>1

[11] 状態オブジェクト付きのエントリーが作成された場合や、 素片識別子へのスクロールのみの navigate が行われた場合に、 同じ文書を共有するセッション履歴エントリーが作成されます >>1

[12] 同じ文書となることがあるのは、隣接するセッション履歴エントリーのみです >>1
[16] 同じ URL であってもセッション履歴エントリー文書が同じとは限りません。 また異なるセッション履歴に属するエントリー文書は同じにはなりません。

[18] 利用者エージェントは、ページごとに追加できる状態オブジェクト数に上限を設けて構いません >>1。 つまり同じ文書を保持するセッション履歴エントリーの個数に上限を設けることができます。 上限に達したら、状態オブジェクトを持つ最古のもの (= 同じ文書を持つ、索引の小さい方から2番目のもの) から削除していきます。

pushState を参照。

[28] 文書から閲覧文脈へも、強い参照があります >>21 (文書の閲覧文脈)。

[6] 文書完全に活性でなければ、資源を解放するために捨てて構いません >>1。 また閲覧文脈を捨てると、閲覧文脈セッション履歴のすべてのセッション履歴エントリー文書について、文書を捨てることとなります >>21

[45] Chrome非表示状態のタブ活性文書捨てることがあるようです。 メモリー等の資源の節約のためなのでしょうが、しかしこれは必ずしも利用者の期待に即した動作ではないようです。

document.hidden 参照。

[5] 文書を捨てると、閲覧文脈から文書への強い参照を破棄されます >>21

[10] document.open では、文書を意図的に未設定状態にしたセッション履歴エントリーが作られることがあります。

[14] 文書が捨てられた場合、履歴の探索で再度必要になった時点で、 エントリー更新navigate により改めて文書が作られます。 元々同じ文書を共有していたすべてのセッション履歴エントリーがその新しい文書を共有します >>1

bfcachenavigate を参照。
[7] 閲覧文脈から文書への強い参照が破棄される (= セッション履歴エントリー文書が捨てられる) としても、 どのセッション履歴エントリーが同じ文書を参照していたかの情報は、 保持し続ける必要があります。

[33] セッション履歴エントリー文書 (閲覧文脈と関連付けられる文書) は、 navigate によって作成されるか、 閲覧文脈の作成で作成される初期about:blank文書かのいずれかです。

[34] Presto には setDocument もありました。

[30] Webブラウザー組み込みのフィードビューアーへの navigate やエラー画面への navigate などにより、閲覧文脈文書以外を表示する状態になることもあります。 もっとも、その場合でも (ダミーの) 文書は存在しています。

navigate非文書表示の項を参照。

文脈

[3] セッション履歴は、セッション履歴エントリーによって構成されるリストです >>1セッション履歴現在エントリーは、そのうちのいずれかのエントリーです。

[15] 結合セッション履歴は、セッション履歴エントリーによって構成されるリストです。

[13] 文書最新エントリーは、セッション履歴エントリーです。

レンダリング

[19] 履歴を参照。

メモ

[17] history.back()の入力データ保持について #HTML - Qiita ( ( 版)) http://qiita.com/items/c2de591b4eaff59d3e07

[29] Custom Scroll Restoration Proposal ( 版) http://majido.github.io/scroll-restoration-proposal/

[31] majido/scroll-restoration-proposal ( 版) https://github.com/majido/scroll-restoration-proposal

[35] [whatwg] Order of popstate event and scroll restoration - interop issue (Majid Valipour 著, 版) https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Aug/0010.html

[42] Add scroll restoration preference to history traversal · whatwg/html@dd6a34e ( 版) https://github.com/whatwg/html/commit/dd6a34ec3c191ee1968a0fc8d174b4ce3b615916

[43] Clarify manual scroll restoration mode · whatwg/html@017a842 ( 版) https://github.com/whatwg/html/commit/017a842ec6c63e6ed4f26f77da41270688eab33e

[44] Editorial: clean up "traverse the history" (annevk著, ) https://github.com/whatwg/html/commit/b9c90431ad4c8aa583aee1691a6a1bd355b68b53

[46] Breaking: refactor structured clone into serialize/deserialize (domenic著, ) https://github.com/whatwg/html/commit/97d644c97335956610a31e8ad98d1a388c063e84

[47] document.open() simplifications, part 2 (TimothyGu著, ) https://github.com/whatwg/html/commit/ae7cf0cc1936c6c309d7279c822dffc3af147851

[48] document.open() can make a document's URL go out of sync with its history entry · Issue #3885 · whatwg/html () https://github.com/whatwg/html/issues/3885

[49] Editorial: nested browsing context is a member, not a type (annevk, , ) https://github.com/whatwg/html/commit/6b737bbc428facf34ec3728c0912cf9e172d0ea4