/
93.txt
206 lines (150 loc) · 12.2 KB
/
93.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
* 仕様書
[REFS[
- [20] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#session-history>
- [41] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-10-23 20:18:13 +09:00]] 版) <https://html.spec.whatwg.org/#pagetransitionevent>
- [32] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#unloading-documents>
]REFS]
* セッション履歴エントリーにおける文書
[21] [[利用者エージェント]]は、[[現在エントリー]]以外の[[セッション履歴エントリー]]の[[文書]]で[[スクリプト]]から参照されていないものについて、
[[文書を捨てる]]ことにしても構いません。 [SRC[>>20]]
[23] [[利用者エージェント]]がいつ[[キャッシュ]]を保持し続けるべきか、
いつ捨てるべきかは [[HTML Standard]] としては規定していません [SRC[>>20]]。
;; [25] [[利用者エージェント]]は、[[利用者]]体験と利用可能な[[メモリー]]等の[[資源]]の制約のバランスを考慮して保持するかどうかを決められます。
[22] 捨てられた場合、[[利用者]]または[[スクリプト]]により再度そのページに遷移した時は、
新たにそのページを読み込む ([[エントリー更新]]の [[navigate]]
を実行する) ことになります [SRC[>>20]]。
[24] 捨てたかどうかによって[[セッション履歴]]に関する処理に影響があってはなりません。
文書が捨てられていて新たに読み込み直した場合は、同じ[[文書]]を共有していた他の[[セッション履歴エントリー]]の[[文書]]も同じ新しい[[文書]]としなければ[['''なりません''']] [SRC[>>20]]。
[28] しかしながら、捨てて再 [[navigate]] して同じ状態が復元される保証はありません。
(むしろ一般には異なる状態になります。) [[ネットワーク]]が切断されて接続できなくなれば、
以前は通常の[[文書]]だったものが[[ネットワークエラー]]の表示に変わったりします。
[FIG(list)[
- [29] 再 [[navigate]] が[[閲覧文脈]]内の表示ではなく、[[ダウンロード]]等[[閲覧文脈]]外の表示となった場合、
[[セッション履歴エントリー]]の更新は行われず、[[セッション履歴]]の移動 ([[履歴の探索]])
も行われません。
- [30] 再 [[navigate]] が[[閲覧文脈]]の[[活性文書]]の[[素片識別子へのスクロール]]だけに留まった場合、[[セッション履歴エントリー]]の更新は行われず、かわりに[[現在エントリー]]の次に[[素片識別子]]へスクロールした[[セッション履歴エントリー]]が挿入されることになります。
- [31] それ以外なら[[エントリー更新]]が行われますが、新しい[[文書]]の[[スクリプト]]が
[[navigate]] を行った場合など、新[[現在エントリー]]とそれ以後の[[セッション履歴エントリー]]を新しく作成することになる場合もあります。[[文書]]の破棄前の[[セッション履歴]]の状態が復元される保証はありません。
]FIG]
[40] [[安全メソッド]]では無いなら、自動的に再 [[fetch]] するのは好ましくありませんから、
エラー文書がかわりに表示されるべきと思われます。[[利用者]]が明示的に[[再読込]]したら、
再度 [[fetch]] するべきです。
;; [39] [[セッション履歴エントリー]]も参照。
* bfcache (Firefox)
[1] [CITE@en-us[Using Firefox 1.5 caching - MDC]] ([TIME[2009-01-24 00:43:53 +09:00]] 版) <https://developer.mozilla.org/ja/Using_Firefox_1.5_caching>
- [11] [[Firebug]] が動作していると機能しない? [TIME[2011-02-08T06:29:29.700Z]]
- [12] [[XHR]] が接続中だと機能しない? [TIME[2011-02-08T06:29:40.500Z]]
* Fast history navigation (Opera)
[2] [CITE@en[JavaScript and History Navigation - Opera Knowledge Base]] ([TIME[2009-02-08 17:32:47 +09:00]] 版) <http://www.opera.com/support/kb/view/827/>
>Starting in Opera 9.0 Technical Preview 2, Opera attempts to detect pages that rely on this behavior, and will not use fast history navigation on those pages. This means that the page, and any scripts it contains, will be loaded from cache, and processed again when the page is loaded using the back or forward navigation. This is known as "compatible history navigation".
[5] いつ互換モードになるのかの条件は >>2 に明記されていませんが、
[CODE(JS)@en[[[onload]]]] と [CODE(JS)@en[[[onunload]]]] が関わっているようです。
[3] [[利用者JavaScript]] で[[履歴ナビゲーション・モード]]を指定するには、
[CODE(JS)@en[[[opera.setOverrideHistoryNavigationMode]]]] [[特性]]を使います。
値は [CODE(JS)@en[[[automatic]]]]、[CODE(JS)@en[[[fast]]]]、
[CODE(JS)@en[[[compatible]]]] です。 [SRC[>>2]]
[4] [[著者]]が[[スクリプト]]で[[履歴ナビゲーション・モード]]を明示的に指定するには、
[CODE(JS)@en[[[history.navigationMode]]]] [[特性]]を使います。
値は [CODE(JS)@en[[[automatic]]]]、[CODE(JS)@en[[[fast]]]]、
[CODE(JS)@en[[[compatible]]]] です。 [SRC[>>2]]
[6] なんか、 [CODE(DOMa)@en[[[onunload]]]] を設定しても [CODE(DOMa)@en[[[onload]]]]
が呼ばれないという情報がありました。どういうときに自動判定で互換モードになるのでしょうかね?
* Page cache (WebKit)
[REFS[
- [17] [CITE[Surfin' Safari - Blog Archive » WebKit Page Cache I – The Basics]] ([TIME[2014-10-27 02:01:28 +09:00]] 版) <https://www.webkit.org/blog/427/webkit-page-cache-i-the-basics/>
- [18] [CITE[Surfin' Safari - Blog Archive » WebKit Page Cache II – The unload Event]] ([TIME[2014-10-27 02:01:43 +09:00]] 版) <https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/>
]REFS]
* イベント
[FIG(short list)[
- [CODE(DOMe)@en[[[pageshow]]]]
- [CODE(DOMe)@en[[[pagehide]]]]
]FIG]
[35] [CODE(DOMe)@en[[[pagehide]]]] は、[[文書のunload]]時に[[発火]]されることがあります。
[33] [[文書]]の [DFN[[[page showing]]]] フラグは、 [CODE(DOMe)@en[[[pageshow]]]]
と [CODE(DOMe)@en[[[pagehide]]]] の整合性を保つためのフラグです [SRC[>>32]]。
[[文書]]作成時の初期値は[[偽]]です [SRC[>>32]]。両イベントの[[発火]]により値が変化します
([[履歴の探索]]、[[文書のunload]]、[[stops parsing]] 参照)。
* [CODE(DOMi)@en[PageTransitionEvent]] インターフェイス
[42] [DFN[[CODE(DOMi)@en[[[PageTransitionEvent]]]]]] [[インターフェイス]] [SRC[>>41]] は、
[CODE(DOMe)@en[[[pageshow]]]]/[CODE(DOMe)@en[[[pagehide]]]] [[イベント]]と共に用いられます。
[[文書環境]]と[[ワーカー環境]]に[[晒され]]ています [SRC[>>41]]。
;; [[ワーカー環境]]では使われることは無さそうですが・・・。
[44] [CODE(DOMi)@en[[[PageTransitionEvent]]]] [[インターフェイス]]は、
他の [CODE(DOMi)@en[[[Event]]]] [[インターフェイス]]同様の[[コンストラクター]]を持ちます
[SRC[>>41]]。
初期化のための辞書は [DFN[[CODE(DOMi)@en[[[PageTransitionEventInit]]]]]] です [SRC[>>41]]。
[43] [CODE(DOMi)@en[[[PageTransitionEvent]]]] [[インターフェイス]]は、
[CODE(DOMi)@en[[[Event]]]] [[インターフェイス]]を[[継承]]しています [SRC[>>41]]。
[CODE(DOMi)@en[[[PageTransitionEventInit]]]] [[辞書]]は、
[CODE(DOMi)@en[[[EventInit]]]] [[辞書]]を[[継承]]しています [SRC[>>41]]。
* [CODE(DOMi)@en[PageTransitionEvent]] インターフェイス [CODE(DOMa)@en[persisted]] 属性
[45] [CODE(DOMi)@en[[[PageTransitionEvent]]]] [[インターフェイス]]および
[CODE(DOMi)@en[[[PageTransitionEventInit]]]] [[辞書]]は、[CODE(IDL)@en[[[boolean]]]]
型の読み取り専用[[IDL属性]] [DFN[[CODE(DOMa)@en[[[persisted]]]]]]を持ちます [SRC[>>41]]。
初期値は[[偽]]です [SRC[>>41]]。
[34] [[文書]]は、 [DFN[[[''salvageable'']]]] かどうかの状態を持ちます [SRC[>>32]]。
これが [CODE(DOMa)@en[[[persisted]]]] [[属性]]の値として使われます。
[37] [[''salvageable'']] の初期値は[[真]]です [SRC[>>32]]。
[36] 次の操作を行うと、 [[''salvageable'']] は[[偽]]となります。
[FIG(list)[
- [CODE(JS)@en[[[document.open]]]] の実行
- [CODE(DOMe)@en[[[beforeunload]]]] の[[イベントリスナー]]の呼び出し ([[prompt to unload a document]])
- [CODE(DOMe)@en[[[unload]]]] の[[イベントリスナー]]の呼び出し ([[文書のunload]])
- [CODE(DOMi)@en[[[WebSocket]]]] [[オブジェクト]]が[[文書を捨てる]]時点で未破棄
- [[文書のabort]]による [[abort]] の発生
- [[子孫閲覧文脈]]が [[''salvageable'']] ([[文書のunload]])
]FIG]
[46] [CODE(JS)@en[[[document.open]]]] では、 [[''salvageable'']] が[[偽]]になったあと、
再び[[真]]となることがあります。
[38] [[利用者エージェント]]は適宜未参照の[[文書]]を捨てられますから (>>21)、
[CODE(DOMa)@en[[[persisted]]]] が[[真]]であっても、後から [[bfcache]]
で再表示される保証はありません。
* 歴史
[7] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-10-21 23:23:27 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4230&to=4231>
[8] [CITE[Bug 7896 – Specify pageshow and pagehide events]]
([TIME[2009-10-25 15:53:56 +09:00]] 版)
<http://www.w3.org/Bugs/Public/show_bug.cgi?id=7896>
[9] [CITE[Changeset 47824 – WebKit]]
([TIME[2009-10-25 15:58:08 +09:00]] 版)
<http://trac.webkit.org/changeset/47824>
[10] [CITE[IRC logs: freenode / #whatwg / 20100113]]
([TIME[2010-01-15 23:57:05 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20100113#l-474>
[13] [CITE[''''''[''''''whatwg'''''']'''''' pagehide vs pagevis]]
( ([TIME[2013-08-30 00:53:42 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-August/040657.html>
[14] [CITE@en[Web Applications 1.0 r8160 Provide hook for pagevis. Correctly return false for event.persisted in pagehide. Define one of the variables in an algorithm.]]
( ([TIME[2013-09-01 06:43:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8159&to=8160>
[15] [CITE@en[274784 – (blazinglyfastback) Make back and forward blazingly fast and side-effect free]]
( ([TIME[2013-12-16 09:05:37 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=blazinglyfastback>
[16] [CITE[IRC logs: freenode / #whatwg / 20131214]]
( ([TIME[2013-12-16 09:01:34 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20131214>
[FIG(quote)[
[FIGCAPTION[
[19] [CITE@ja[Chrome で高速にページを読み込む新しい技術のご紹介 - Google Developer Japan Blog]]
([TIME[2015-04-10 17:01:36 +09:00]] 版)
<http://googledevjp.blogspot.jp/2015/04/chrome.html>
]FIGCAPTION]
> Chrome 42 では、このコンパイル済みコードのローカルコピーを保持する拡張技術を採用することで、ユーザーがそのページに戻ってきたときにパースをダウンロードしてコンパイルする手順をすべて省略できるようになります。これによってすべてのページでコンパイル時間の 40% を削減し、モバイル端末において貴重なバッテリーの消費量を減らすことができます。
]FIG]
[26] [CITE[Surfin’ Safari - Blog Archive » WebKit Page Cache II – The unload Event]]
([TIME[2009-10-25 15:54:55 +09:00]] 版)
<http://webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/>
[27] [CITE@en[Web Applications 1.0 r8160 Provide hook for pagevis. Correctly return false for event.persisted in pagehide. Define one of the variables in an algorithm.]]
( ([TIME[2013-09-01 06:43:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8159&to=8160>
[FIG(quote)[
[FIGCAPTION[
[47] [CITE[JavaScript - ブラウザバック時にリロードさせる - Qiita]]
([TIME[2015-07-17 12:48:40 +09:00]] 版)
<http://qiita.com/nabettu/items/48f066155f49629be83e>
]FIGCAPTION]
> window.onpageshow = function(evt) {
> if (evt.persisted) {
> location.reload();
]FIG]