[12] [CODE[[[History]]]] [[インターフェイス]]の [DFN[[CODE[[[scrollRestoration]]]]]]
[[IDL属性]]は、[[履歴]]操作の後[[スクロール位置]]を[[利用者エージェント]]が自動的に復元するべきか、
[[著者]]の[[スクリプト]]に任せるべきかを表すものです。

[13] 通常はページ遷移が発生すると、その時点での[[スクロール位置]]が保存され、
次に履歴移動で戻ってきた際にそれが復元されます。しかしこの[[属性]]を
[CODE[[[manual]]]] に設定しておくことで、この復元を抑制できます。
複雑な表示処理を伴う[[Webアプリケーション]]では、
[[利用者エージェント]]に任せるよりも[[著者]]の[[スクリプト]]で復元作業を行った方が良いことがあります。

* 仕様書

[REFS[
- [1] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-11-17 17:58:32 +09:00]] 版) <https://html.spec.whatwg.org/#scroll-restoration-mode>
- [9] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-11-17 17:58:32 +09:00]] 版) <https://html.spec.whatwg.org/#scrollrestoration>
- [3] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-11-17 17:58:32 +09:00]] 版) <https://html.spec.whatwg.org/#dom-history-scroll-restoration>'''
]REFS]

* 意味

[14] [[利用者エージェント]]による[[スクロール位置]]の復元は、
[[利用者]]の利便性を向上させるための機能です。[[著者]]は、
[[スクロール復元モード]]を濫用して[[スクロール位置]]の復元を無効化したり、
意図的に異なる位置を表示したりするべきではありません。

[31] 
多くの場合、 [[Webブラウザー]]は[[利用者]]の行動を踏まえて最適な方法で[[スクロール位置]]を復元できます。
[[Webアプリケーション]]の[[著者]]が安易にこの挙動を無効化するべきではありません。


* スクロール復元モード

[2] [[セッション履歴エントリー]]の[DFN[[RUBYB[スクロール復元モード]@en[scroll restoration mode]]]]は、
当該[[セッション履歴エントリー]]へと[[履歴を探索]]した際に、
(あれば) 保存していた[[スクロール位置]]を[[利用者エージェント]]が自動的に復元するべきかどうかを表します
[SRC[>>1]]。

[5] [[スクロール復元モード]]は、 [CODE[[[auto]]]] または [CODE[[[manual]]]] です [SRC[>>3]]。
これは[[列挙型]] [DFN[[CODE[[[ScrollRestoration]]]]]] [SRC[>>9]] です。

[6] [DFN[[CODE[[[auto]]]]]] は、[[スクロール位置]]の復元を[[利用者エージェント]]が行うべきことを表します
[SRC[>>3]]。

[7] [DFN[[CODE[[[manual]]]]]] は、[[スクロール位置]]の復元を[[ページ]]が行い[[利用者エージェント]]が行うべきではないことを表します [SRC[>>3]]。

;; [28] なお、これは復元を行わないというだけで、[[原点]]を表示するよう指示するのとは異なります
[SRC[>>3]]。 [[navigate]] の種別や[[キャッシュ]]戦略などによって [SRC[>>3]]、
初期状態で[[原点]]以外が指された状態になっている場合があります。

[4] [[スクロール復元モード]]の既定値は、 [CODE[[[auto]]]] です [SRC[>>3]]。

[16] 新しい[[文書]]への [[navigate]] では、 [CODE[[[auto]]]] に設定されます。
既存の[[文書]]の[[素片識別子]]への [[navigate]] や [CODE[[[pushState]]]]、
[CODE[[[replaceState]]]] で[[セッション履歴エントリー]]が作られる場合は、
現在値が引き継がれます。

;; [[navigate]]、[CODE[[[pushState]]]] を参照。

[17] この値は、[[持続的利用者状態の復元]]の際に参照されます。

* 取得器

[8] [CODE[[[History]]]] [[インターフェイス]]の [CODE[[[scrollRestoration]]]]
[[属性]]は、[[取得時]]、次のようにしなければなりません [SRC[>>3]]。

[FIG(steps)[
= [19] [[文脈オブジェクト]]の[F[[[文書]]]]が[[完全に活性]]でないなら、
== [20] [CODE(DOMe)@en[[[SecurityError]]]] [[例外]]を[[投げ]]ます。
= [21] それ以外なら、
== [22] [[セッション履歴]]の[F[[[現在エントリー]]]]の[F[[[スクロール復元モード]]]]を返します。
]FIG]

* 設定器

[11] [CODE[[[History]]]] [[インターフェイス]]の [CODE[[[scrollRestoration]]]]
[[属性]]は、[[設定時]]、次のようにしなければなりません [SRC[>>3]]。

[FIG(steps)[
= [23] [[文脈オブジェクト]]の[F[[[文書]]]]が[[完全に活性]]でないなら、
== [24] [CODE(DOMe)@en[[[SecurityError]]]] [[例外]]を[[投げ]]ます。
= [25] それ以外なら、
== [26] [[セッション履歴]]の[F[[[現在エントリー]]]]の[F[[[スクロール復元モード]]]]を新しい値に設定します。
]FIG]

[10] この[[属性]]の [[WebIDL]] の[[型]]は、 [CODE[[[ScrollRestoration]]]] です [SRC[>>9]]。
従って [CODE[[[manual]]]] または [CODE[[[auto]]]] を新しい値として指定できます。

* 歴史

[REFS[
- [15] [CITE@en[Add scroll restoration preference to history traversal · whatwg/html@dd6a34e]] ([TIME[2015-11-17 21:03:22 +09:00]] 版) <https://github.com/whatwg/html/commit/dd6a34ec3c191ee1968a0fc8d174b4ce3b615916>
]REFS]

[18] [CITE@en[Tidy up history object API definitions · whatwg/html@a5d4802]]
([TIME[2015-12-01 11:58:03 +09:00]] 版)
<https://github.com/whatwg/html/commit/a5d48020d6f83d4d2719dbdbf62f5bb8be8ef2f8>

[27] [CITE@en[Clarify manual scroll restoration mode · whatwg/html@017a842]]
([TIME[2015-12-19 11:05:16 +09:00]] 版)
<https://github.com/whatwg/html/commit/017a842ec6c63e6ed4f26f77da41270688eab33e>

[29] [CITE@en[Move scroll position restoration after popstate]]
( ([[domenic]]著, [TIME[2016-05-28 03:46:12 +09:00]]))
<https://github.com/whatwg/html/commit/98895af2179ad879da9fa57983ab9589251f7950>

[30] [CITE[Release Notes for Safari Technology Preview 26 | WebKit]]
([TIME[2017-04-19 00:12:53 +09:00]])
<https://webkit.org/blog/7474/release-notes-for-safari-technology-preview-26/>

[32] [CITE[New WebKit Features in Safari 11 | WebKit]]
([TIME[2017-09-26 23:25:00 +09:00]])
<https://webkit.org/blog/7956/new-webkit-features-in-safari-11/>

[33] [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-18T09:57:48.000Z]])
<https://github.com/whatwg/html/commit/6b737bbc428facf34ec3728c0912cf9e172d0ea4>