[2] [DFN[[RUBYB[セッション履歴エントリー]@en[session history entry]]]]は、
[[セッション履歴]]中の[[エントリー]]です。

* 仕様書

[REFS[
- [23] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#browsing-context>
- [1] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#session-history-entry>'''
- [21] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#garbage-collection-and-browsing-contexts>
- [24] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#session-history>
- [36] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-11-17 17:58:32 +09:00]] 版) <https://html.spec.whatwg.org/#restore-persisted-user-state>
]REFS]

* 状態

[4] [[セッション履歴エントリー]]は、次のものから構成されます。
[FIG(list members)[
:[[URL]] (必須) [SRC[>>1]]:[[資源]]の [[URL]] です。
:[RUBYB[[[状態オブジェクト]]]@en[state object]]:
[[利用者インターフェイス]]の状態を表すオブジェクト [SRC[>>1]]。
:[RUBYB[題名]@en[title]]:
[[文書]]のその時点での状態を説明するもの ([[利用者]]が履歴上で [[navigate]]
するためのもの)。 [SRC[>>1]]
:[CODE(DOMi)@en[[[Document]]]] オブジェクト [SRC[>>1]]:[[資源]]の[[文書]]です。
:初期文書かどうか:[[初期「[CODE(URI)@en[about:blank]]」文書]]かどうかを表します。
[[navigate]] などの際に用いられます。
:[[要求メソッド]]その他 [[navigate]] の引数:本[[セッション履歴エントリー]]を作成した [[navigate]] の[[引数]] ([[URL]] 以外)。
[[fetch]] の[[引数]]など、[[履歴の探索]]で再度 [[navigate]] するために使います。
[CODE(DOMm)@en[[[replaceState]]]]/[CODE(DOMm)@en[[[pushState]]]] で変更されることがあります。
: [F[始点閲覧文脈]] :
[[履歴の探索]]で使う[[始点閲覧文脈]]。
:[[時刻]]:作成時刻。[[結合セッション履歴]]における[[エントリー]]の[[整列]]に用いられます。
:[[閲覧文脈]]:本[[セッション履歴エントリー]]を持つ[[セッション履歴]]を持つ[[閲覧文脈]]。
:[[閲覧文脈名]]:[[履歴の探索]]で読み書きされます。
:[[フォームデータ]] [SRC[>>1]]:
:[[スクロール復元モード]] [SRC[>>1]]: [[スクロール位置]]を [[Webブラウザー]]が自動的に復元するべきか、
[[スクリプト]]に委ねるべきかのモードです。
:[[スクロール位置]] [SRC[>>1]]:
:その他:その他の情報も含められます [SRC[>>1]]。
]FIG]

@@ [CITE@en[Web Animations]] ([TIME[2015-06-18 15:58:27 +09:00]] 版) <http://w3c.github.io/web-animations/#interaction-with-page-display>

;; [20] [[セッション履歴エントリー]]の構成や、エントリー作成・変更時の値の詳細は、
[[HTML Standard]] では規定されておらず、ほぼ[[利用者エージェント]]に任されているようです。

[22] [[履歴の探索]]や [CODE(DOMm)@en[[[pushState]]]] 
では、[[セッション履歴エントリー]]を構成する各状態が更新されることがあります。
([[セッション履歴エントリー]]の[[文書]]については次章を参照。)

[32] 次のような状態を保存するべきかもしれません。
[FIG(list)[
- [[DOM]]
- [[viewport]] および[[スクロール可能]]な[[箱]]について、[[スクロール位置]]
- [[テキスト入力制御子]]および [[editing host]] について、[[カーソル位置]]
- [[viewport]] および[[テキスト入力制御子]]について、[[選択]]
- [[フォーム制御子]]について、[[フォームデータ]]
- [[フォーカス]]
- 埋め込まれた[[画像]]、[[媒体]]の状態
- [[プラグイン]]の状態
- [[入れ子閲覧文脈]]の状態
- [[スクリプト無効]]、[[文字符号化]]の明示的指定その他[[文書]]依存の設定
]FIG]

[8] [[セッション履歴エントリー]]は、[[セッション履歴]]の[[現在エントリー]]である場合があります。

** 持続的利用者状態

[9] [[利用者エージェント]]定義の状態を持つ[[エントリー]]を[DFN[[RUBYB[持続的利用者状態付きエントリー]@en[an entry with persisted user state]]]]といいます
[SRC[>>1]]。[[利用者エージェント]]定義の状態には、[[フォームデータ]]、
[[スクロール位置]]その他が含まれます [SRC[>>1]]。

;; [CODE(DOMm)@en[[[pushState]]]] も参照。

[37] [[セッション履歴エントリー]][VAR[エントリー]]からの[DFN[[RUBYB[持続的利用者状態の復元]@en[restore persisted user state]]]]は、
次のようにしなければ[['''なりません''']] [SRC[>>36]]。
[FIG(steps)[
= [38] [VAR[エントリー]]の[F[[[スクロール復元モード]]]]が [CODE[[[auto]]]] なら、
== [39] [[文書]]や[[スクロール可能領域]] ([[子供閲覧文脈]]を除く。) の[[スクロール位置]]を復元して構いません。
= [40] その他必要に応じて[[文書]]や[[レンダリング]]を更新して構いません。
]FIG]

;; [41] その他とは、[[フォーム制御子]]の[[値]]の復元や、
[[テキスト]]入力系[[フォーム制御子]]の[[要素]]の [CODE(HTMLa)@en[[[dir]]]]
[[属性値]]の復元などを行えます [SRC[>>36]]。

* セッション履歴エントリー、閲覧文脈、文書の関係

[25] [[閲覧文脈]]は、[[文書]]を[[利用者]]に[RUBYB[示す]@en[present]]ものです [SRC[>>23]]。
[[閲覧文脈]]は、[[セッション履歴]]を持ちます [SRC[>>23]]。[[セッション履歴]]は、
その[[閲覧文脈]]において過去、現在、未来に示される
[CODE(DOMi)@en[[[Document]]]] [[オブジェクト]]の[[リスト]]です [SRC[>>23, >>24]]。
[[閲覧文脈]]は、その各[[文書]]に対して[[強い参照]]を持ちます [SRC[>>21]]。

[27] ある時点においては、[[閲覧文脈]]にはいずれか1つの[[文書]]が示されており、
これを[[活性文書]]といいます [SRC[>>23]]。[[セッション履歴]]のうち、
いずれか1つが[[現在エントリー]]となります。[[履歴の探索]]の途中の
([[スクリプト]]からは観測できない) 状態を除き、[[現在エントリー]]の[[文書]]が[[活性文書]]です。

[26] 厳密には[[セッション履歴]]は[[セッション履歴エントリー]]のリストです。
[[セッション履歴エントリー]]は[[文書]]を保持していますが、それ以外の情報も保持しています。
複数の[[セッション履歴エントリー]]の[[文書]]が同じ[[文書]]である場合もあります
[SRC[>>1]]。

[EG[
[11] [[状態オブジェクト]]付きの[[エントリー]]が作成された場合や、
[[素片識別子へのスクロール]]のみの [[navigate]] が行われた場合に、
同じ[[文書]]を共有する[[セッション履歴エントリー]]が作成されます [SRC[>>1]]。
]EG]

;; [12] 同じ[[文書]]となることがあるのは、隣接する[[セッション履歴エントリー]]のみです [SRC[>>1]]。

;; [16] 同じ [[URL]] であっても[[セッション履歴エントリー]]の[[文書]]が同じとは限りません。
また異なる[[セッション履歴]]に属する[[エントリー]]の[[文書]]は同じにはなりません。

[18] [[利用者エージェント]]は、ページごとに追加できる[[状態オブジェクト]]数に上限を設けて構いません [SRC[>>1]]。
つまり同じ[[文書]]を保持する[[セッション履歴エントリー]]の個数に上限を設けることができます。
上限に達したら、[[状態オブジェクト]]を持つ最古のもの (= 同じ[[文書]]を持つ、[[索引]]の小さい方から2番目のもの)
から削除していきます。

;; [CODE(DOMm)@en[[[pushState]]]] を参照。

[28] [[文書]]から[[閲覧文脈]]へも、[[強い参照]]があります [SRC[>>21]]
([[文書の閲覧文脈]])。

[6] [[文書]]が[[完全に活性]]でなければ、[[資源]]を解放するために捨てて構いません [SRC[>>1]]。
また[[閲覧文脈を捨てる]]と、[[閲覧文脈]]の[[セッション履歴]]のすべての[[セッション履歴エントリー]]の[[文書]]について、[[文書を捨てる]]こととなります [SRC[>>21]]。

;; [[文書を捨てる]]、[[閲覧文脈を捨てる]]、[[bfcache]] を参照。

[45] [[Chrome]] は[[非表示][document.hidden]]状態の[[タブ]]の[[活性文書]]も[[捨てる][文書を捨てる]]ことがあるようです。
[[メモリー]]等の[[資源]]の節約のためなのでしょうが、しかしこれは必ずしも[[利用者]]の期待に即した動作ではないようです。

;; [CODE(JS)@en[document.hidden]] 参照。

-*-*-

[5] [[文書を捨てる]]と、[DFN[[[閲覧文脈から文書への強い参照を破棄]]]]されます [SRC[>>21]]。

[10] [CODE(JS)@en[[[document.open]]]] では、[[文書]]を意図的に未設定状態にした[[セッション履歴エントリー]]が作られることがあります。

[14] [[文書]]が捨てられた場合、[[履歴の探索]]で再度必要になった時点で、
[[エントリー更新]]の [[navigate]] により改めて[[文書]]が作られます。
元々同じ[[文書]]を共有していたすべての[[セッション履歴エントリー]]がその新しい[[文書]]を共有します [SRC[>>1]]。

;; [[bfcache]] や [[navigate]] を参照。

;; [7] [[閲覧文脈]]から[[文書]]への[[強い参照]]が破棄される (= [[セッション履歴エントリー]]の[[文書]]が捨てられる) としても、
どの[[セッション履歴エントリー]]が同じ[[文書]]を参照していたかの情報は、
保持し続ける必要があります。

[33] [[セッション履歴エントリー]]の[[文書]] ([[閲覧文脈]]と関連付けられる[[文書]])
は、 [[navigate]] によって作成されるか、 [[閲覧文脈の作成]]で作成される[[初期[CODE(URI)@en[about:blank]]文書]]かのいずれかです。

[HISTORY[
[34] [[Presto]] には [CODE(DOMm)@en[[[setDocument]]]] もありました。
]HISTORY]

[30] [[Webブラウザー]]組み込みの[[フィードビューアー]]への [[navigate]] やエラー画面への
[[navigate]] などにより、[[閲覧文脈]]が[[文書]]以外を表示する状態になることもあります。
もっとも、その場合でも (ダミーの) [[文書]]は存在しています。

;; [[navigate]] の[[非文書表示]]の項を参照。

* 文脈

[3] [[セッション履歴]]は、[[セッション履歴エントリー]]によって構成されるリストです [SRC[>>1]]。
[[セッション履歴]]の[[現在エントリー]]は、そのうちのいずれかの[[エントリー]]です。

[15] [[結合セッション履歴]]は、[[セッション履歴エントリー]]によって構成されるリストです。

[13] [[文書]]の[[最新エントリー]]は、[[セッション履歴エントリー]]です。

* レンダリング

[19] [[履歴]]を参照。

* メモ

[17] [CITE[history.back()の入力データ保持について #HTML - Qiita]]
( ([TIME[2013-03-13 01:44:48 +09:00]] 版))
<http://qiita.com/items/c2de591b4eaff59d3e07>

[29] [CITE[Custom Scroll Restoration Proposal]]
([TIME[2015-06-29 23:46:31 +09:00]] 版)
<http://majido.github.io/scroll-restoration-proposal/>

[31] [CITE@en[majido/scroll-restoration-proposal]]
([TIME[2015-06-30 00:40:17 +09:00]] 版)
<https://github.com/majido/scroll-restoration-proposal>

[35] [CITE@en[''''''[''''''whatwg'''''']'''''' Order of popstate event and scroll restoration - interop 	issue]]
([[Majid Valipour]] 著, [TIME[2015-08-11 23:08:46 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Aug/0010.html>

[42] [CITE@en[Add scroll restoration preference to history traversal · whatwg/html@dd6a34e]] ([TIME[2015-11-17 21:30:10 +09:00]] 版) <https://github.com/whatwg/html/commit/dd6a34ec3c191ee1968a0fc8d174b4ce3b615916>

[43] [CITE@en[Clarify manual scroll restoration mode · whatwg/html@017a842]]
([TIME[2015-12-19 11:06:13 +09:00]] 版)
<https://github.com/whatwg/html/commit/017a842ec6c63e6ed4f26f77da41270688eab33e>

[44] [CITE@en[Editorial: clean up "traverse the history"]]
([[annevk]]著, [TIME[2016-07-07 16:31:28 +09:00]])
<https://github.com/whatwg/html/commit/b9c90431ad4c8aa583aee1691a6a1bd355b68b53>

[46] [CITE@en[Breaking: refactor structured clone into serialize/deserialize]]
([[domenic]]著, [TIME[2017-03-21 06:09:33 +09:00]])
<https://github.com/whatwg/html/commit/97d644c97335956610a31e8ad98d1a388c063e84>

[47] [CITE@en[document.open() simplifications, part 2]]
([[TimothyGu]]著, [TIME[2018-08-21 03:57:31 +09:00]])
<https://github.com/whatwg/html/commit/ae7cf0cc1936c6c309d7279c822dffc3af147851>

[48] [CITE@en[document.open() can make a document's URL go out of sync with its history entry · Issue #3885 · whatwg/html]]
([TIME[2018-09-05 22:41:16 +09:00]])
<https://github.com/whatwg/html/issues/3885>

[49] [CITE@en[Editorial: nested browsing context is a member, not a type]]
([[annevk]], [TIME[2019-11-27 02:46:03 +09:00]], [TIME[2022-01-18T10:00:48.000Z]])
<https://github.com/whatwg/html/commit/6b737bbc428facf34ec3728c0912cf9e172d0ea4>