URL and history update steps

セッション履歴 (Web)

[3] セッション () (れき) (session history) は、 ある閲覧文脈中の文書の列です >>2

仕様書

閲覧文脈とセッション履歴

[8]閲覧文脈は、 セッション履歴を持ちます >>1, >>2閲覧文脈セッション履歴は、 その閲覧文脈で過去、現在、未来に於いて提示される (presented) Document オブジェクトリストです >>1閲覧文脈セッション履歴は、 閲覧文脈の作成と同時に作成されます。

[4] 最上位閲覧文脈子供閲覧文脈も、 それぞれ1つずつセッション履歴を持ちます。

[5] セッション履歴は、セッション履歴エントリーの平坦なリストです >>2

[7] セッション履歴に含まれるセッション履歴エントリーのいずれか丁度1つは、 現在エントリーとなります。

[21] セッション履歴は、必ず1つ以上のセッション履歴エントリーを持ちます。 空のセッション履歴は存在しません。閲覧文脈の作成時には、 初期「about:blank」文書が自動的に作成されます。

[17] セッション履歴エントリーには文書が関連付けられています。 複数のセッション履歴エントリーが同じ文書を共有する場合があり、 そのようなエントリーセッション履歴上で連続しています。

[18] 同じ文書を共有するセッション履歴エントリーが複数ある場合、 最後のものが文書最新エントリーとなります。 同じ文書を共有するセッション履歴エントリーの個数には、 利用者エージェント依存の上限が設定されていることがあります。

pushState を参照。

[6] History オブジェクトは、セッション履歴を表しています。 History オブジェクトDocument ごとに存在しています。

History を参照。

[12] 次の場面でセッション履歴の操作が行われます。

セッション履歴エントリーの挿入

[13] セッション履歴セッション履歴エントリーを挿入する操作は、 置換有効について、 次のように行わなければなりません >>28, >>19, >>20

  1. [30] 置換有効の場合、
    1. [14] セッション履歴エントリーのうち、現在エントリーよりも後のものを (あれば) 削除します。 (現在エントリーは含みません。)
  2. [15] セッション履歴閲覧文脈最上位閲覧文脈文書族文書に関連付けられた履歴探索タスク源タスクを (あれば) タスクキューから削除します。
  3. [16] セッション履歴の最後に新しいエントリーを追加します。

[22] navigate で新しい文書に移動する場合 >>20 にはタスクキューからの削除 (>>15) は行われませんが、 直後の履歴の探索内で結局削除が行われますから、同じこととなります。

[23] URLおよび履歴更新手順群 (URL and history update steps) は、 文書新URL直列化済みデータ (省略可能)、 題名 (省略可能)、 状態pushフラグ (省略可能) について、次のようにします HTML Standard

  1. [38] 閲覧文脈を、 文書閲覧文脈に設定します。
  2. [39] 状態pushフラグの場合、
    1. [41] 閲覧文脈セッション履歴において、 現在エントリーよりも後のセッション履歴エントリーをすべて削除します。
    2. [42] 閲覧文脈最上位閲覧文脈文書族に属する文書に関連付けられた履歴探索タスク源タスクをすべて削除します。
    3. 必要があれば、利用者エージェントが永続化させたい状態をセッション履歴現在エントリーに反映させます。現在エントリー持続的利用者状態付きエントリーとなります。
    4. 文脈オブジェクトに関連付けられた文書閲覧文脈セッション履歴現在エントリー直後に新しいセッション履歴エントリーを挿入します。
      [86] セッション履歴エントリー
      直列化済み状態
      直列化済みデータ
      題名
      題名
      URL
      新URL
      要求メソッド
      GET
      スクロール復元モード
      セッション履歴現在エントリースクロール復元モード
    5. 新しいセッション履歴エントリー現在エントリーとします。
    6. 利用者エージェント依存のページごとの状態オブジェクト数の上限を設ける場合、 同じセッション履歴中で現在エントリーと同じ文書を共有するセッション履歴エントリーのうち2番目のもの (= 状態オブジェクトを持つ最古のもの) を削除して構いません。
  3. [40] それ以外の場合、
    1. 現在エントリーを次の通り更新します。
      直列化済み状態
      直列化済みデータ (無指定なら現在の値のまま)
      題名
      題名 (無指定なら値なし)
      URL
      新URL
      要求メソッド
      GET
  4. [77] 文書URLを、新しいURLに設定します。
[37] 要求メソッドGET にする時点で、 フォームデータなど他の fetch引数も無かったことにされるようです。

[43] この手順群は、 pushState, replaceState, document.open から呼び出されます。

セッション履歴エントリーの削除

[24] 挿入時にある位置から後のセッション履歴エントリーがすべて削除されることがあります (>>13)。

[26] 履歴の探索であるセッション履歴エントリーセッション履歴から削除されることがあります。

[25] document.open によって同じ文書を持つセッション履歴エントリーがまとめて削除されることがあります。

関連

[9] 結合セッション履歴は、複数のセッション履歴をまとめたものです。

[11] HTTPキャッシュにおいては新鮮寿命などの規定がありますが、 これは必ずしも履歴に適用されるものではありません >>10履歴を戻って腐敗応答表示しても何ら問題ありません。 逆に腐敗していることを利用者表示したり、 Cache-Control: no-store に従ったりしても構いません。

歴史

[27] <iframe> and the History API · Issue #184 · w3c/webcomponents ( ()) https://github.com/w3c/webcomponents/issues/184

[29] cbrewster/ServoNavigation: Proposal for Servo Navigation () https://github.com/cbrewster/ServoNavigation

[31] Fragment navigation should use replacement enabled (annevk著, ) https://github.com/whatwg/html/commit/cf02423dc52686d084a3191833d939919b5907fd

[32] Bug in hash change algorithm with replace flag · Issue #2796 · whatwg/html () https://github.com/whatwg/html/issues/2796

[33] Fragment navigation should use replacement enabled by annevk · Pull Request #2869 · whatwg/html () https://github.com/whatwg/html/pull/2869

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

[35] 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

[36] At least Blink does not support document.open()'s replace parameter · Issue #3564 · whatwg/html () https://github.com/whatwg/html/issues/3564

[37] document.open() simplifications, part 2 by TimothyGu · Pull Request #3946 · whatwg/html () https://github.com/whatwg/html/pull/3946

[44] Editorial: Factor out history.push/replaceState() steps (TimothyGu著, ) https://github.com/whatwg/html/commit/f42dcf0bf2ebf86bc5ca79aecea098a8fed6cf3e

[45] Remove overridden reload concept (TimothyGu著, ) https://github.com/whatwg/html/commit/6440ccae7340ea41d3eb5bf8ff0b3b27363eda85

[46] 556002 - document.open() and write() after parsing is complete breaks reload button - we reload new, not original document () https://bugzilla.mozilla.org/show_bug.cgi?id=556002

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

[48] Xユーザーのたなさん: 「最近 history API悪用してブラウザバックで離脱しようとするとおすすめ記事ページみたいなのを一度挟むサイト増えてない? 口汚く罵りたいんだけど」 / X, , https://twitter.com/side_tana/status/1774213110511067202