* 仕様書

[REFS[
- [12] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#dom-location-reload>'''
]REFS]

* 再読み込み

[4] [[Webブラウザー]]は通常[[再読み込み]]機能を実装しています。これはおおむね
[CODE(JS)@en[[[location.reload]]]] に相当するものです。

[5] [[GUI]] 環境で動作する [[Webブラウザー]]は普通[[ツールバー]]などに[[再読み込み]]ボタンを設けています。

[6] [[Windows]] で動作する [[Webブラウザー]]の多くは [KBD[[[F5]]]] や
[KBD[[[Ctrl]] + [[R]]]] で[[再読み込み]]が実行されます。

[8] [[Webサイト]]によっては、[[利用者]]が [KBD[[[F5]]]] によって[[再読み込み]]を実行することを避けるために[[鍵盤イベント]]を[[取り消し]]することでこれを無効化していることがあります。
誤操作や安易な [[DoS攻撃]]を避けるために有用なこともありますが、
多くの場合は[[利用者]]の利便性を低下させるだけであり、好ましくない挙動と思われています。

[7] 多くの [[Webブラウザー]]は[[スーパーリロード]]も実装しています。

;; [[スーパーリロード]]参照。

[40] 多くの [[Webブラウザー]]は[[文字コード指定メニュー]]も実装しています。

[14] [[利用者]]が[[閲覧文脈]]の[[活性文書]]の[RUBYB[[[再読込]]]@en[reload]]を求めたら、
次のようにする[['''べきです''']] [SRC[>>12]]。
この時[[利用者]]が[VAR[キャッシュ上書き]]を指示できても構いません。
[FIG(steps)[
= [15] [[閲覧文脈]]の[[活性文書]]の [[fetch]] の際の[[要求メソッド]]が[[冪等メソッド]]でないなら、
[[利用者]]に確認します [SRC[>>12]]。
= [16] [[利用者]]が拒んだら、ここで停止します [SRC[>>12]]。
= [20] [[エントリー更新]]のため [[navigate]] します [SRC[>>12]]。
[FIG(list members)[
:[VAR[[[navigate]] する[[閲覧文脈]]]]:[[閲覧文脈]] [SRC[>>12]]
:[VAR[新しい[[資源]]]]:[[閲覧文脈]]の[[活性文書]]と同じ [SRC[>>12]]
:[VAR[[[置換有効]]]]:[[真]] [SRC[>>12]]
: [VAR[[[reload-triggered navigation]]]] : [[真]] [SRC[>>12]]
:[VAR[キャッシュ上書き]] : [VAR[キャッシュ上書き]]
]FIG]
]FIG]

;; [21] 再読込する[[資源]]やその[[要求メソッド]]は、[[閲覧文脈]]の当該[[セッション履歴エントリー]]の指定に拠ります。

;; [37] [[フレーム]]の再読込に対応した [[Webブラウザー]]は、
[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]の場合 (>>27)
も考慮する必要がありそうです。

;; [38] [[navigate]] の際に [[reload-triggered navigation]] も設定する必要がありそうです。

;; [39] [[Webブラウザー]]により、 [[navigate]] 内の [[fetch]] で
[CODE(HTTP)@en[[[Origin:]]]] が設定されるものとされないものがあるようです。
最近の [[Chrome]] は設定しないようです。 [TIME[2015-05-26T08:24:31.200Z]]

[57] [[仕様書]]にはありませんが、[VAR[キャッシュ上書き]]が[[真]]の場合、 
[[navigate]] だけでなく、[[部分資源]]の [[fetch]] でも[F[キャッシュモード]]が適当に設定されるかもしれません。

[HISTORY[
[17] 
かつて[[仕様書]]や [[Firefox]] は、
[[overridden reload]]
を組み込んでいましたが、廃止されました。
]HISTORY]

** 安全性

[9] [[再読み込み]]によって[[要求]]を再度実行しても[[安全]]かどうかは、
[[要求メソッド]]に依存します。 [CODE(HTTP)@en[[[GET]]]] は[[安全]]ですが、
[CODE(HTTP)@en[[[POST]]]] は[[安全]]ではありません。

[10] [[Webブラウザー]]は[[非安全]]な[[要求]]を[[再読み込み]]する前に[[利用者]]に[[モーダルダイアログ]]によって[[再読み込み]]を本当に実行するか確認するのが普通です。

;; [11] [[安全なメソッド]]も参照。

;; [23] [[冪等なメソッド]]であっても、[[再読込]]までの間に自身または他者により他の操作が行われていた場合、
元とは異なる結果になるかもしれません。[[冪等なメソッド]]であっても[[安全なメソッド]]でなければ、
確認するべきかもしれません。ただし現在の [[Web]] で [[navigate]]
可能な[[要求メソッド]]の中では、[[冪等]]で[[非安全]]なものはありませんから、
問題とはなりません。 ([[Web Forms 2.0]] を実装していた [[Webブラウザー]]では
[CODE(HTTP)@en[[[PUT]]]] と [CODE(HTTP)@en[[[DELETE]]]] への [[navigate]]
があり得ました。)

[75] 最近、[[Chrome]] は[[認証ダイアログ]]後の[[再読込]]でも、
[[安全]]でないとき[[モーダルダイアログ]]で確認するようになりました。
[TIME[2020-01-11T01:44:51.600Z]]

* [CODE(DOMi)@en[Location]] インターフェイス [CODE(DOMm)@en[reload]] メソッド

[13] [CODE(DOMi)@en[[[Location]]]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[[[reload]]]]]] [[メソッド]]は、
次のようにしなければ[['''なりません''']]。
[FIG(steps)[
= [34] [VAR[キャッシュ上書き]]を、第1引数を [CODE(IDL)@en[[[boolean]]]] として解釈した結果に設定します。
= [43] [[文脈オブジェクト]]の[F[[[関係する[CODE(DOMi)@en[Document]]]]]]の[F[起源][文書の起源]]と[[入口設定群オブジェクト]]の[F[起源]]が[[同じ起源ドメイン]]でなければ、
== [44] [CODE(DOMe)@en[SecurityError]] [[例外]]を[[投げ]]、ここで停止します [SRC[>>12]]。
= [26] [[現在走っているタスク]]が[[利用者]]による[[閲覧文脈]]の [[resize]]
に起因する [CODE(DOMe)@en[[[resize]]]] の [[dispatch]] を行っているものなら、
== [45] [[閲覧文脈]]の [[repaint]] を行い、ここで停止します [SRC[>>12]]。
= [27] [[閲覧文脈]]の[F[活性文書]]が [F[[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]]]なら、
== [46] [[閲覧文脈]]の[F[閲覧文脈包含子]]について
[[[CODE(HTMLe)@en[iframe]]の属性を再処理]]します。 [SRC[>>12]]
= [28] それ以外で、[[閲覧文脈]]の[F[活性文書]]が [F[reload override flag]] を設定されているなら、
== [29] [[overridden reload]] を実行します。[VAR[[[原始閲覧文脈]]]]は、[[閲覧文脈]]とします。 [SRC[>>12]] [VAR[キャッシュ上書き]]も引き渡します。
[[例外]]が[[投げ]]られたら、[[再度投げ]]ます [SRC[>>12]]。
= [30] それ以外なら、
== [31] [[エントリー更新]]のため [[navigate]] します [SRC[>>12]]。
[FIG(list members middle)[
: [VAR[[[navigate]] する[[閲覧文脈]]]] :[[閲覧文脈]] [SRC[>>12]]
: [VAR[新しい[[資源]]]] : [[閲覧文脈]]の[F[活性文書]]の[F[文書の番地]] [SRC[>>12]]
: [VAR[[[置換有効]]]]:[[真]] [SRC[>>12]]
: [VAR[[[例外有効]]]]:[[真]] [SRC[>>12]]
: [VAR[[[原始閲覧文脈]]]]:[[閲覧文脈]] [SRC[>>12]]
: [VAR[[[reload-triggered navigation]]]] :[[真]] [SRC[>>12]]
: [VAR[キャッシュ上書き]] : [VAR[キャッシュ上書き]]
: [VAR[エントリー更新するエントリー]] : [VAR[閲覧文脈]]の[F[セッション履歴]]の[F[現在エントリー]]
]FIG]
[[例外]]が[[投げ]]られたら、[[再度投げ]]ます [SRC[>>12]]。
]FIG]

;; [25] [[閲覧文脈]]とは、[[文脈オブジェクト]]の[F[文書]]の[F[閲覧文脈]]を指すと思われます。

;; [22] [[利用者]]が[[再読込]]を指示した場合と違って、
[[冪等メソッド]]でなくても確認ダイアログは出ず、常に [CODE(HTTP)@en[GET]]
となる [SRC[>>12]] ようです。

[24] [[IE]] と [[Firefox]] は [[overridden reload]] に対応しているようですが、
[[Chrome]] は対応していないようです。 [TIME[2015-05-06T08:14:43.800Z]]

[35] [[HTML Standard]] はなぜか[[引数]]を規定していませんが、実際には省略可能な
[CODE(IDL)@en[[[boolean]]]] 型の[[引数]]が1つあるようです。

[47] [CODE(DOMm)@en[reload]] [[メソッド]]は、 [CODE(IDL xattr)@en[Unforgeable]]
です [SRC[>>12]]。

[41] [CODE(DOMi)@en[[[PluginArray]]]] [[インターフェイス]]の
[CODE(DOMm)@en[[[refresh]]]] [[メソッド]]は、本メソッド相当の動作をすることがあります。

* 再読込要求

[65] [[要求]]は、
[DFN[[F[reload-navigation flag]]]] を持ちます。
初期値は[[偽]]です。 [SRC[[CITE[Fetch Standard]]]]

[63] [CODE[Request]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[isReloadNavigation]]]]
[[IDL属性]]の[[取得器]]は、次のようにします [SRC[[CITE[Fetch Standard]]]]。

[FIG(steps)[
= [64] [[文脈オブジェクト]]の [F[reload-navigation flag]] を [CODE(IDL)@en[boolean]] で返します。
]FIG]


[61] [[navigate]] [[アルゴリズム]]は、[[引数]]として
[DFN[[VAR[reload-triggered navigation]]]] を持ちます [SRC[[CITE[HTML Standard]]]]。
[[再読込]]の時に設定されます。

;; [[navigate]]、[[履歴の探索]]参照。

[77] 
[[navigate]] は[[再読込]]のフラグが設定されますが、
それに付随して発生する [[fetch]]
([[CSS]] や[[画像]]などの読み込み)
には設定されません。
[[サービスワーカー]]の[[キャッシュ]]を[[再読込]]時に回避するような用途を考慮すると、
[[再読込]]だけでなく[[再読込]]から呼び出された [[fetch]]
も[[再読込]]に準じるものとみなす必要が出てきます。

[HISTORY[
[76] 
[[Chrome]] は
[CODE[FetchEvent]] に
[DFN[[CODE[isReload]]]]
[[プロパティー]]があります。
[CODE[isReloadNavigation]]
には未対応です。
[TIME[2020-02-28T01:36:15.00Z]]

]HISTORY]

[78] 
[[再読込]]と[[再読込]]からの [[fetch]] を識別する例

[PRE(js code)[
var isReloadClientId = {};
addEventListener ('fetch', ev => {
  var isReload = false;
  if (ev.request.isReloadNavigation || ev.isReload) {
    isReload = isReloadClientId[ev.resultingClientId] = true;
  } else if (isReloadClientId[ev.clientId]) {
    isReload = true;
  }
  ...
});
]PRE]

[79] 
ただしこの実装例では[[再読込]]後の [[fetch]] はすべて[[再読込]]と判断してしまいます。
最初の読み込みが終わった後の[[利用者]]の指示による [[fetch]]
まで[[再読込]]として扱うべきかどうか検討の余地があります。
どの時点まで[[再読込]]として (最初の読み込みとして)
扱うべきかはアプリケーションごとに違いそうです。

[80] 
この例では [[navigation]] 全体が再読み込みかどうかチェックしましたが、
[CODE[fetch]]
で
[CODE[[[cache]]: [[reload]]]]
を指定した場合のように、
[[fetch]]
単位の再読み込みというのもあります。
そちらも拾いたい時は次のような条件を見ると良いでしょう。

[PRE(javascript code)[
      ev.request.cache === "no-store" ||
      ev.request.cache === "reload" ||
      ev.request.cache === "no-cache"
]PRE]



* overridden reload

[36] [[overridden reload]] は、 [CODE(JS)@en[[[document.open]]]] により生成されたページの再読込を行うものです。

;; [CODE(JS)@en[[[document.open]]]] を参照。

* 歴史

[1] [CITE@en-US[Window Object 1.0]]
( ([TIME[2006-04-08 02:19:28 +09:00]] 版))
<http://www.w3.org/TR/Window/#dfn-reload>

[2] [CITE@en[Web Applications 1.0 r5709     Make document.reload() reload the input to document.write(), not reload the URL of the page. Also, a number of editorial fixes.]]
( ([TIME[2010-12-08 07:10:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5708&to=5709>

[3] [CITE@en[Web Applications 1.0 r8400     Turns out location.reload() does work even when you have a fragment identifier...]]
( ([TIME[2014-01-17 02:51:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8399&to=8400>

[32] [CITE@en-US[Location.reload() - Web API Interfaces | MDN]]
([TIME[2015-04-20 10:22:31 +09:00]] 版)
<https://developer.mozilla.org/en-US/docs/Web/API/Location/reload>

[33] [CITE@ja[location.reloadはhref属性で使うと処理が完了するまで待ちになる at HouseTect, JavaScriptな情報をあなたに]]
([[HouseTect, JavaScriptな情報をあなたに]] 著, [TIME[2012-04-02 15:07:38 +09:00]] 版)
<http://hisasann.com/housetect/2008/03/locationreloadhref.html>

[42] [CITE@en[1069724 – Multiple HTTP2 Connections on shift-reload]]
([TIME[2015-08-28 11:54:24 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1069724>

[48] [CITE@en[Merge effective script origin into origin · whatwg/html@8a843f2]]
([TIME[2016-03-31 18:13:58 +09:00]] 版)
<https://github.com/whatwg/html/commit/8a843f2169a6864a3024c4329528dccb2051d275>

[49] [CITE@en[Editorial: turn "exceptions enabled" into a flag]]
( ([[annevk]]著, [TIME[2016-05-02 16:13:36 +09:00]]))
<https://github.com/whatwg/html/commit/879edbfcb25586caec8df93f303a434a700a18bc>

[50] [CITE@en[1267474 – Cache-Control: immutable]]
( ([TIME[2016-06-06 11:11:13 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=1267474>

[51] [CITE@en[Issue 505048 - chromium - Chrome makes more conditional re-validation requests than other browsers - Monorail]]
( ([TIME[2016-06-06 11:12:07 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=505048>

[52] [CITE@en[Issue 600636 - chromium - Change behavior of Reload to (validate main resource + regular load) instead of the current forced reload which triggers conditional requests on all the things - Monorail]]
( ([TIME[2016-06-06 11:12:40 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=600636>

[53] [CITE[Reload, reloaded - Google ドキュメント]]
( ([TIME[2016-06-06 11:15:19 +09:00]]))
<https://docs.google.com/document/d/1vwx8WiUASKyC2I-j2smNhaJaQQhcWREh7PC3HiIAQCo/edit?pref=2&pli=1>

[54] [CITE@en[Issue 578941 - chromium - document.location.reload('''['''false''']''') always reloads from Server instead of Cache - Monorail]]
( ([TIME[2016-06-06 11:16:10 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=578941>

[FIG(quote)[
[FIGCAPTION[
[55] [CITE@en[Issue 42528 - chromium - Chrome/Chromium caches negative DNS responses and ignores changes to /etc/resolv.conf - Monorail]]
( ([TIME[2016-06-16 21:23:06 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=42528>
]FIGCAPTION]

> 
> You should be able to workaround your problem by hitting refresh, which should bypass that cache. (There are 
> some exceptions, let me know if you are hitting them).

]FIG]


[56] [CITE@en[Issue 44386 - chromium - The "Reload" link on the network error page does not actually do a reload - Monorail]]
( ([TIME[2016-06-16 21:32:49 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=44386>

[58] [CITE@en[Fix reloads to not wipe out future session history]]
([[domenic]]著, [TIME[2016-08-25 23:22:44 +09:00]])
<https://github.com/whatwg/html/commit/6c777d89fa177cbae2a0671ca9d681d7c81688e3>

[59] [CITE@en[For users on very slow connections, block document.written scripts · Issue #17 · WICG/interventions]]
([TIME[2017-07-15 23:49:56 +09:00]])
<https://github.com/WICG/interventions/issues/17>

[60] [CITE@en[747812 - Re-submitted POST request (page reload) does not contain Content-Type - chromium - Monorail]]
( ([TIME[2017-08-21 01:49:07 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=747812>

[62] [CITE@en[Set request's reload-navigation flag for reloads]]
([[yutakahirano]]著, [TIME[2018-04-27 16:20:41 +09:00]])
<https://github.com/whatwg/html/commit/3072f1d71fc66c792412e1f5785f047f637545b9>

[66] [CITE@en[Introduce reload-navigation flag by yutakahirano · Pull Request #685 · whatwg/fetch]]
([TIME[2018-05-01 13:59:52 +09:00]])
<https://github.com/whatwg/fetch/pull/685>

[67] [CITE@en[Set request's reload-navigation flag when the navigation is reload-trigerred by yutakahirano · Pull Request #3592 · whatwg/html]]
([TIME[2018-05-01 14:01:37 +09:00]])
<https://github.com/whatwg/html/pull/3592>

[68] [CITE@en[Proposal: FetchEvent.navigationLoadType · Issue #1167 · w3c/ServiceWorker]]
([TIME[2018-05-01 14:02:04 +09:00]])
<https://github.com/w3c/ServiceWorker/issues/1167>

[69] [CITE@en[FetchEvent.prototype.isReload is no longer part of the specification by cdumez · Pull Request #8669 · w3c/web-platform-tests]]
([TIME[2018-05-01 14:07:00 +09:00]])
<https://github.com/w3c/web-platform-tests/pull/8669>

[70] [CITE@en[Editorial: move definition of "reload-navigation flag"]]
([[yutakahirano]]著, [TIME[2018-05-28 19:09:59 +09:00]])
<https://github.com/whatwg/fetch/commit/efe088f656a79af08d98d904e4c5550dc3edc403>

[71] [CITE@en[Move definition of reload-navigation flag · Issue #732 · whatwg/fetch]]
([TIME[2018-06-01 01:03:43 +09:00]])
<https://github.com/whatwg/fetch/issues/732>

[72] [CITE@en[Move definition of "reload-navigation flag" by yutakahirano · Pull Request #739 · whatwg/fetch]]
([TIME[2018-06-01 01:03:55 +09:00]])
<https://github.com/whatwg/fetch/pull/739>

[73] [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:40:11 +09:00]])
<https://github.com/whatwg/html/issues/3885>

[74] [CITE@en[Remove overridden reload concept]]
([[TimothyGu]]著, [TIME[2018-08-18 05:31:49 +09:00]])
<https://github.com/whatwg/html/commit/6440ccae7340ea41d3eb5bf8ff0b3b27363eda85>

[18] [CITE@en[556002 - document.open() and write() after parsing is complete breaks reload button - we reload new, not original document]]
([TIME[2018-09-05 23:38:22 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=556002>

[19] [CITE@en[document.open() simplifications, part 2 by TimothyGu · Pull Request #3946 · whatwg/html]]
([TIME[2018-09-05 23:39:10 +09:00]])
<https://github.com/whatwg/html/pull/3946>

[81] [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:47:38.000Z]])
<https://github.com/whatwg/html/commit/6b737bbc428facf34ec3728c0912cf9e172d0ea4>