-
Notifications
You must be signed in to change notification settings - Fork 4
/
573.txt
247 lines (189 loc) · 14.5 KB
/
573.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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
* 仕様書
[REFS[
- [15] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#state-object>
- [21] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#dom-history-state>
- [28] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#dom-history-pushstate>
- [34] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#history-notes>
- [41] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#popstateevent>
]REFS]
* 状態オブジェクト
[16] [DFN[[RUBYB[状態オブジェクト]@en[state object]]]]は、[[利用者インターフェイス]]の状態を表す[[オブジェクト]]です [SRC[>>15]]。
[17] [[状態オブジェクト]]は、[[セッション履歴エントリー]]中に設定されることがあります。
[18] [[著者]]は [CODE(DOMm)@en[[[pushState]]]] や [CODE(DOMm)@en[[[replaceState]]]]
により[[状態オブジェクト]]を指定できます。
[19] [[著者]]は [CODE(DOMe)@en[[[popstate]]]] [[イベント]]により[[状態オブジェクト]]を受け取ることができます。
* [CODE(JS)@en[history.state]] 属性 (DOM)
[22] [CODE(DOMi)@en[[[History]]]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[[[state]]]]]] [[IDL属性]]の値は、
[CODE(IDL)@en[[[any]]]] 型です [SRC[>>21]]。
[23] この[[IDL属性]]は、次のようにしなければ[['''なりません''']] [SRC[>>21]]。
[FIG(steps)[
= [25] [[文脈オブジェクト]]の関連付けられた[[文書]]が[[完全に活性]]でないなら、
[CODE(DOMe)@en[[[SecurityError]]]] [[例外]]を投げます。
= [26] そうでなければ、この[[IDL属性]]の値として[[利用者エージェント]]により設定されたものを返します。
]FIG]
[24] この[[IDL属性]]の値は、初期状態では [[null]] でなければ[['''なりません''']] [SRC[>>21]]。
[27] この[[IDL属性]]の値は、[[履歴の探索]]で設定されます。
* [CODE(DOMm)@en[pushState]] メソッド、[CODE(DOMm)@en[replaceState]] メソッド
[29] [CODE(DOMi)@en[[[History]]]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[[[pushState]]]]]] [[メソッド]]と
[DFN[[CODE(DOMm)@en[[[replaceState]]]]]] [[メソッド]]は、
次のようにしなければ[['''なりません''']] [SRC[>>28]]。
[FIG(steps)[
= 第1引数は必須であり、 [CODE(IDL)[[[any]]]] 型とします。
= 第2引数は必須であり、 [CODE(IDL)@en[[[DOMString]]]] 型とします。
= 第3引数は [CODE(IDL)@en[[[DOMString]][[?]]]] 型であり、省略時の既定値は [[null]]
とします。
= [[文脈オブジェクト]]に関連付けられた[[文書]]が[[完全に活性]]でなければ、
[CODE(JS)@en[[[SecurityError]]]] [[例外]]を投げてここで停止します。
= 第1引数の[[構造化クローン]]を得ます。[[例外]]が投げられたら、改めて投げてここで停止します。
= 第3引数が [[null]] 以外なら、
== [[入口設定群オブジェクト]]の[[API基底URL]]を[[基底URL]]として第3引数の[[URLの解決]]を行います。失敗したら [CODE(DOMe)@en[[[SecurityError]]]] [[例外]]を投げてここで停止します。
== [50] [[解決]]結果と[[文書の番地]]の [[path]]、[[query]]、[[素片識別子]]''以外''が異なる場合や、
[[解決]]結果の [[URLの起源]]が[[入口設定群オブジェクト]]の[[有責文書]]の[[文書の起源]]と[[同じ起源]]でない場合で、 [[path]] か [[query]] が異なる場合には、
=== [51] [CODE(DOMe)@en[[[SecurityError]]]] [[例外]]を投げてここで停止します。
== [52] [[解決]]結果を新しい [[URL]] とします。
= それ以外なら、[[文脈オブジェクト]]に関連付けられた[[文書]]の[[閲覧文脈]]の[[セッション履歴]]の[[現在エントリー]]の [[URL]]
を新しい [[URL]] とします。
= [CODE(DOMm)@en[[[pushState]]]] [[メソッド]]なら、
== 必要があれば、[[利用者エージェント]]が永続化させたい状態を[[セッション履歴]]の[[現在エントリー]]に反映させます。[[現在エントリー]]は[[持続的利用者状態付きエントリー]]となります。
== [[文脈オブジェクト]]に関連付けられた[[文書]]の[[閲覧文脈]]の[[セッション履歴]]に新しい[[セッション履歴エントリーを挿入]]します。
[FIG(list members)[
[FIGCAPTION[
[[セッション履歴エントリー]]
]FIGCAPTION]
:[F[[[状態オブジェクト]]]]:第1引数の[[構造化クローン]]。
:[F[[[題名]]]]:第2引数。
:[F[[[URL]]]]:新しい [[URL]]。
:[F[[[要求メソッド]]]]:[CODE(HTTP)@en[[[GET]]]]。
:[F[[[スクロール復元モード]]]]: [[セッション履歴]]の[F[[[現在エントリー]]]]の[F[[[スクロール復元モード]]]]。
]FIG]
== 新しい[[セッション履歴エントリー]]を[[現在エントリー]]とします。
== [[利用者エージェント]]依存のページごとの[[状態オブジェクト]]数の上限を設ける場合、
同じ[[セッション履歴]]中で[[現在エントリー]]と同じ[[文書]]を共有する[[セッション履歴エントリー]]のうち2番目のもの (= [[状態オブジェクト]]を持つ最古のもの) を削除して構いません。
= [CODE(DOMm)@en[[[replaceState]]]] [[メソッド]]なら、
== [[現在エントリー]]を次の通り更新します。
[FIG(list members)[
[FIGCAPTION[
[[セッション履歴エントリー]]
]FIGCAPTION]
:[[状態オブジェクト]]:第1引数の[[構造化クローン]]。
:[[題名]]:第2引数。
:[[URL]]:新しい [[URL]]。
:[[要求メソッド]]:[CODE(HTTP)@en[[[GET]]]]。
]FIG]
= [[文書の番地]]を新しい [[URL]] とします。
= 第1引数の[[構造化クローン]]の[[構造化クローン]]を[[文脈オブジェクト]]の [CODE(DOMa)@en[[[state]]]] [[IDL属性]]の値とします。
= [[現在エントリー]]の[[文書]]の[[最新エントリー]]は、[[現在エントリー]]とします。
]FIG]
;; [37] [[要求メソッド]]を [CODE(HTTP)@en[[[GET]]]] にする時点で、
[[フォームデータ]]など他の [[fetch]] の[[引数]]も無かったことにされるようです。
;; [53] >>50 前段の条件が[[同じ起源]]かどうかの判断ではないので、
[[userinfo]] の有無や値も (あれば) 判定基準となります。
[30] 両[[メソッド]]は[[文書の番地]]を変更することができるものですが、
[[文書の起源]]や[[実効スクリプト起源]]や[[文書のドメイン]]を変更することはできません。
この意味で[[同一起源ポリシー]]を緩和するものではありません。更に、
[CODE(JS)@en[[[document.domain]]]] を使っても変更可能な範囲を拡大することはできません。
;; [31] [[文書の起源]]ではなく[[文書の番地]]の[[起源]]が問題となりますから、
[[文書の起源]]と[[同じ起源]]であっても [CODE(URI)@en[[[about:blank]]]] や [CODE(URI)@en[[[data:]]]]
[[URL]] が[[文書の番地]]となっている時、 [CODE(URI)@en[[[http:]]]] や
[CODE(URI)@en[[[https:]]]] の [[URL]] に変更することはできません。
この意味で[[同一起源ポリシー]]より制限が厳しいと言うこともできますが、
両メソッドの趣旨が[[文書の番地]]を変更するものですから、当然の制約でもあります。
[32] [[砂箱]]によって異なる[[起源]]で動作する[[スクリプト]]は[[素片識別子]]以外を変更することもできません。
;; [33] >>31 と >>32 は、[[文書の起源]]と[[文書の番地]]の[[起源]]の両方と[[同じ起源]]の
[[URL]] には変更できる、と言い換えられます。
[35] [[利用者エージェント]]は、 [CODE(DOMm)@en[[[pushState]]]] の濫用を防ぐため、
[[タイマー]]からの呼び出しや[[利用者]]の明確な操作によらない[[イベントリスナー]]からの呼び出し、短時間での連続呼び出しを無視したほうが良いかもしれません
[SRC[>>34]]。
* [CODE(DOMe)@en[popstate]] イベント
[40] [DFN[[CODE(DOMe)@en[[[popstate]]]]]] [[イベント]]は、[[履歴の探索]]により
[CODE(JS)@en[[[history.state]]]] の値が変更された時に[[発火]]されます。
[42] [DFN[[CODE(DOMi)@en[[[PopStateEvent]]]]]] [[インターフェイス]] [SRC[>>41]] は、
[CODE(DOMe)@en[[[popstate]]]] [[イベント]]と共に用いられます。
[[文書環境]]と[[ワーカー環境]]に[[晒され]]ています [SRC[>>41]]。
;; [[ワーカー環境]]では使われることは無さそうですが・・・。
[44] [CODE(DOMi)@en[[[PopStateEvent]]]] [[インターフェイス]]は、
他の [CODE(DOMi)@en[[[Event]]]] [[インターフェイス]]同様の[[コンストラクター]]を持ちます
[SRC[>>41]]。
初期化のための辞書は [DFN[[CODE(DOMi)@en[[[PopStateEventInit]]]]]] です [SRC[>>41]]。
[43] [CODE(DOMi)@en[[[PopStateEvent]]]] [[インターフェイス]]は、
[CODE(DOMi)@en[[[Event]]]] [[インターフェイス]]を[[継承]]しています [SRC[>>41]]。
[CODE(DOMi)@en[[[PopStateEventInit]]]] [[辞書]]は、
[CODE(DOMi)@en[[[EventInit]]]] [[辞書]]を[[継承]]しています [SRC[>>41]]。
[45] [CODE(DOMi)@en[[[PopStateEvent]]]] [[インターフェイス]]および
[CODE(DOMi)@en[[[PopStateEventInit]]]] [[辞書]]は、[CODE(IDL)@en[[[any]]]]
型の読み取り専用[[IDL属性]] [DFN[[CODE(DOMa)@en[[[state]]]]]]を持ちます [SRC[>>41]]。
初期値は [[null]] です [SRC[>>41]]。[[履歴の探索]]で [CODE(DOMe)@en[[[popstate]]]]
[[イベント]]が[[発火]]される時は、[[状態オブジェクト]] (なければ [[null]])
が設定されます。
* 利用者インターフェイス
[36] [[履歴]]を参照。
* 歴史
[1]
[CITE[History management for "Ajax" applications - Anne’s Weblog]] ([CODE[2007-08-10 19:42:23 +09:00]] 版) <http://annevankesteren.nl/2007/08/ajax-history>
([[名無しさん]] [WEAK[2007-08-10 16:32:50 +00:00]])
[2]
[CITE[Re: several messages about pushState() and related ideas]] ([[Ian Hickson <ian@...>]] 著, [TIME[2007-08-10 00:00:31 +09:00]] 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/11643>
[3] [CITE@en[Web Applications 1.0 r5964 12277]]
( ([TIME[2011-03-25 09:55:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5963&to=5964>
[4] [CITE@en-us[Manipulating the browser history - MDC]]
([TIME[2010-06-01 08:09:18 +09:00]] 版)
<https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history>
[5] [CITE[''''''[''''''whatwg'''''']'''''' Asynchronous history navigation and some inconsistencies]]
( ([TIME[2012-06-29 17:49:57 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036505.html>
[6] [CITE[IRC logs: freenode / #whatwg / 20120629]]
( ([TIME[2012-07-15 16:06:48 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120629>
[7] [CITE@en[Interview with Ian Hickson, HTML editor | HTML5 Doctor]]
( ([TIME[2013-01-13 18:27:28 +09:00]] 版))
<http://html5doctor.com/interview-with-ian-hickson-html-editor/>
[8] [CITE[Issue 45361 - chromium - history.pushState does not update http referrer - An open-source project to help move the web forward. - Google Project Hosting]]
( ([TIME[2013-06-06 03:12:16 +09:00]] 版))
<https://code.google.com/p/chromium/issues/detail?id=45361>
[9] [CITE[Bug 40027 – location.href and outgoing referrer not updated properly by pushState/replaceState]]
( ([TIME[2013-06-06 03:13:42 +09:00]] 版))
<https://bugs.webkit.org/show_bug.cgi?id=40027>
[10] [CITE@en[622088 – XHR referer header is not modified with history.pushState]]
( ([TIME[2013-06-06 03:14:48 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=622088>
[11] [CITE@en[History (Windows)]]
( ([TIME[2013-11-13 13:52:56 +09:00]] 版))
<http://msdn.microsoft.com/en-us/library/ie/hh920758(v=vs.85).aspx>
[12] [CITE@en[''''''[''''''whatwg'''''']'''''' Proposal: Allow disabling of default scroll restoration behavior]]
([[Majid Valipour]] 著, [TIME[2015-03-20 02:31:31 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Mar/0070.html>
[13] [CITE[Customizing Scroll Restoration - Google ドキュメント]]
([TIME[2015-03-20 11:49:21 +09:00]] 版)
<https://docs.google.com/a/chromium.org/document/d/1Tiu8PjvBtNOAgeh6yrs7bOrXxQcavQLiNtRJ_ToLlVM/edit?pli=1#heading=h.j26hb4a80gnf>
[14] [CITE@en[Re: ''''''[''''''whatwg'''''']'''''' Proposal: Allow disabling of default scroll restoration behavior]]
([[Ian Hickson]] 著, [TIME[2015-04-10 04:05:19 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Apr/0075.html>
[20] [CITE[defunkt/jquery-pjax]]
( ([TIME[2012-03-17 14:22:30 +09:00]] 版))
<https://github.com/defunkt/jquery-pjax>
[38] [CITE[IRC logs: freenode / #whatwg / 20090818]]
([TIME[2009-10-12 16:14:46 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090818#l-118>
[39] [CITE[''''''[''''''whatwg'''''']'''''' history.popstate in Firefox4]]
( ([TIME[2012-01-31 08:28:43 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-January/034570.html>
[46] [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>
* メモ
[48] 悪意のある[[著者]]が、[[利用者]]の[[履歴]]操作を妨害するために
[CODE(DOMm)@en[[[pushState]]]]/[CODE(DOMe)@en[[[popstate]]]]
を使うことがあります [SRC[>>47]]。
[REFS[
- [47] [CITE[HTML5 history apiで戻るボタン無効化 - Qiita]] ([TIME[2016-01-07 11:46:33 +09:00]] 版) <http://qiita.com/maruo327/items/a0502c8b508fed4ec169>
]REFS]
[49] [CITE@en[Fix #521: all URLs can be relative · whatwg/html@e99f0bd]]
([TIME[2016-01-19 10:45:36 +09:00]] 版)
<https://github.com/whatwg/html/commit/e99f0bd112e0216698bf9397b64b3f8064995756>
[54] [CITE@en[Write structured clone algorithm in terms of ECMAScript · whatwg/html@bfb960c]]
([TIME[2016-03-02 16:40:50 +09:00]] 版)
<https://github.com/whatwg/html/commit/bfb960c938580c95e77365e614218b952f96375b>
[55] [CITE@en[Editorial: define Event attribute defaults through IDL · whatwg/html@0be0229]]
([TIME[2016-03-23 21:15:19 +09:00]] 版)
<https://github.com/whatwg/html/commit/0be02299f128cbb7c65a7ce259fdd838fd44a4b5>