/
481.txt
388 lines (315 loc) · 18.2 KB
/
481.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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
[30] [DFN[[RUBY[閲覧文脈][えつらんぶんみゃく]@en[browsing context]]]]は、
[[Webブラウザー]]における[[窓]]や[[タブ]]、[[フレーム]]に相当する内部オブジェクトです。
;; [31] [[JavaScript]] からは [CODE(DOMi)@en[Window]] [[オブジェクト]]のように見えますが、
厳密には異なります。
* 仕様書
[REFS[
- [2] [[HTML Standard]]
-- [3] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-03-31 07:16:44 +09:00]] 版) <https://html.spec.whatwg.org/#browsing-context>'''
-- [40] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#garbage-collection-and-browsing-contexts>
-- [22] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-10 21:36:05 +09:00]] 版) <https://html.spec.whatwg.org/#concept-document-bc>
-- [45] [CITE@en-US-x-hixie[HTML Standard]], [TIME[2021-04-12T15:12:42.000Z]], [TIME[2021-04-13T09:41:29.832Z]] <https://html.spec.whatwg.org/#determining-the-origin>
]REFS]
* 意味
[1] [DFN[[RUBY[閲覧文脈][えつらんぶんみゃく]@en[browsing context]]]]は、そこに於いて [CODE(DOMi)@en[[[Document]]]] [[オブジェクト]]が[[利用者]]に[RUBYB[提示される]@en[presented]][RUBYB[[[環境]]]@en[environment]]です
[SRC[WA1 >>3]]。
;; [7] [[閲覧文脈]]とは要は[[Webブラウザー]]の[[タブ]]であったり [CODE(HTMLe)@en[[[iframe]]]]
[[要素]]であったりと、[WEAK[([[文書]]の側からすると)]]
[CODE(JS)@en[[[window]]]] [[オブジェクト]]によって表されるものなのですが、
実際にはこの周辺の仕組みは極めて複雑なためにまどろっこしい定義になっています。
[EG[
[4] [[Webブラウザー]]の[[窓]]や[[タブ]]は通常[[閲覧文脈]]を1つ含んでいます。
[5] [CODE(HTMLe)@en[[[iframe]]]] [[要素]]や [CODE(HTMLe)@en[[[frame]]]] [[要素]]は[[閲覧文脈]]を作ります。
[6] [CODE(HTMLe)@en[[[object]]]] [[要素]]はその[RUBYB[[[表す]]]@en[represent]]内容によっては[[閲覧文脈]]を作ります。
[HISTORY[
[15] [[ウィジェット実現値]]は[[閲覧文脈]]です。
]HISTORY]
]EG]
* 状態
[20] [[閲覧文脈]]は、次の状態を持ちます。
[FIG(list members)[
:[[入れ子閲覧文脈]]か:[[入れ子閲覧文脈]]か[[最上位閲覧文脈]]か。
作成時に決まり、変化することはありません。
:[[補助閲覧文脈]]か:[[補助閲覧文脈]]かどうか。作成時に決まり、変化することはありません。
:[[二次的閲覧文脈]]か:[[二次的閲覧文脈]]かどうか。作成時に決まり、変化することはありません。
:[CODE(DOMi)@en[[[WindowProxy]]]]:>>10
:[CODE(DOMi)@en[[[Window]]]]:[[大域オブジェクト]]です。
:[[セッション履歴]]:本[[閲覧文脈]]で表示した[[文書]]と付随する状態のリスト。
: [F[作成子閲覧文脈]] : 作成の責を負った[[閲覧文脈]] [SRC[>>3]]。
: [F[作成子URL]] : 作成元の[[文書の番地]]。
: [F[作成子起源]] : 作成元の[[文書の起源]]。
: [F[作成子基底URL]] : 作成元の[[文書基底URL]]。
: [F[作成子文脈セキュリティー]] :
:[[閲覧文脈包含子]]:
:[[親閲覧文脈]]:
:[[最上位閲覧文脈]]:[[親閲覧文脈]]をそれ以上辿れない[[閲覧文脈]]です。
:[F[[[opener閲覧文脈]]]]の逆関係の[[閲覧文脈]]群:
[[直接到達可能閲覧文脈]]かどうかの判定のために[[opener閲覧文脈]]の逆方向の[[閲覧文脈]]かどうか決定できる必要があります。
:[[script-closable]]:[CODE(JS)@en[[[window.close]]]] が機能する条件です。
: [F[is closing]] :
:[[閲覧文脈名]]:
:[[活性文書]]:[[現在エントリー]]の[[文書]]です。
:[[関連する類似起源閲覧文脈の単位]]:所属する[[関連する類似起源閲覧文脈の単位]]です。
[[活性文書]]が変化すると、変化するかもしれません。
:[[イベントループ]]:[[関連する類似起源閲覧文脈の単位]]の[[イベントループ]]です。
:[[画布]]:
:[[閲覧領域]]:
:[[非保安要求ポリシー]]: [CODE(URI)@en[[[http:]]]] → [CODE(URI)@en[[[https:]]]]
の [[URL]] 書き換えを行うか否か。
:[[非保安navigate格上げ集合]]: [[navigate]] 時に
[CODE(URI)@en[[[http:]]]] → [CODE(URI)@en[[[https:]]]] の [[URL]] 書き換えを行うか否か。
: [F[one permitted sandboxed navigator]] :
: [F[レンダリング機会]] :
: [F[厳密混合内容検査フラグ]] :
[HISTORY[
: [F[[[作成子[CODE(DOMi)@en[Document]]]]]] :
作成時点での[[作成子閲覧文脈]]の[[活性文書]] (あれば)
[SRC[>>3]]。
: [F[作成子参照元ポリシー]] : 作成元の[[文書]]の[F[参照元ポリシー]]。
]HISTORY]
]FIG]
[29] [[最上位閲覧文脈]]は、加えて次の状態を持ちます。
[FIG(list members)[
: [F[窓][窓 (Web)]] : 本[[最上位閲覧文脈]]が表示されている[[窓][窓 (Web)]]です。
:[[popup sandboxing flag set]]:
:[[セッション履歴探索キュー]]:[[セッション履歴]]上の移動の処理を扱う[[タスクキュー]]です。
:[[セッション履歴イベントループ]]:[[セッション履歴探索キュー]]を処理するものとして[[並列に]]実行されるものです。
:[[結合セッション履歴]]:[[セッション履歴]]と[[入れ子閲覧文脈]]の[[セッション履歴]]を結合したものです。
:[[セッションストレージ領域]]群:
[[セッションストレージ領域]]は、 [CODE(DOMm)@en[[[sessionStorage]]]] で使われます。
[[起源]]ごとに存在します。
]FIG]
[25] [[入れ子閲覧文脈]]は、加えて次の状態を持ちます。
[FIG(list members)[
: [F[閲覧文脈包含子]] :[[入れ子閲覧文脈]]を作成した[[要素]]に関連付けられます。
:[[delaying [CODE(DOMe)@en[load]] events mode]]:[[delay the load event]] の適用対象になっているかどうかのフラグ。
:[[[CODE(HTMLe)@en[iframe]] sandboxing flag set]]:
[CODE(HTMLe)@en[[[iframe]]]] [[要素]]の[[属性]]から得られた [[sandboxing flag set]]。
[HISTORY[
:[F[[[seamless browsing context flag]]]]:
]HISTORY]
]FIG]
[27] [[補助閲覧文脈]]は、加えて次の状態を持ちます。
[FIG(list members)[
:[F[[[opener閲覧文脈]]]]: 本[[閲覧文脈]]を開いた元の[[閲覧文脈]]。
:スクリプトにより作成されかどうか:[[script-closable]] かどうかの決定で参照されます。
]FIG]
* 閲覧文脈同士の関係
[FIG(short list)[
- [[親閲覧文脈]]
- [[子閲覧文脈]]
- [[祖先閲覧文脈]]
- [[最上位閲覧文脈]]
- [[入れ子閲覧文脈]]
- [[familiar with]]
- [[allowed to navigate]]
- [[直接到達可能閲覧文脈群]]
]FIG]
[16] [[閲覧文脈]]群には次のようなグループ化の単位があります。
[FIG(short list)[
- [[関連する類似起源閲覧文脈の単位]]
- [[関連閲覧文脈の単位]]
]FIG]
[26] [[閲覧文脈]]を介した[[文書]]との関係
[FIG(short list)[
- [[nested through]]
- [[文書族]]
]FIG]
[28] [[閲覧文脈]]は使われ方により次のように分類されます (次のリストの各項目は、
互いに排他的とは限りません)。
[FIG(list short)[
- [[最上位閲覧文脈]]
- [[入れ子閲覧文脈]]
- [[auxiliary browsing context]]
- [[secondary browsing context]]
]FIG]
* 文書との関係
[21] [DFN[[RUBYB[[CODE(DOMi)@en[Document]]の[F[閲覧文脈]]]@en[[CODE(DOMi)@en[Document]]'s [F[browsing context]]]]]]は、
[F[[[セッション履歴]]]]に当該 [CODE(DOMi)@en[[[Document]]]] を含むような[[閲覧文脈]]であって、
その[F[捨てられた][閲覧文脈を捨てる]]が[[偽]]であるもの (あれば)
です [SRC[>>22]]。
[CODE(JS)@en[document.defaultView]] に相当します。
[37] [[文書]]の[F[閲覧文脈]]があることを、「[[閲覧文脈]][RUBYB[中にある]@en[in]]」
などといいます。 [[navigate]] で作られた[[文書]]など[[閲覧文脈]]中にある[[文書]]もあれば、
[[XHR]] で作られた[[文書]]など[[閲覧文脈]]を持たない[[文書]]もあります。
[38] [[閲覧文脈]]に現在表示中の[[文書]]のことを[F[活性文書]]といいます。
[CODE(JS)@en[window.document]] に相当します。
[23] [[セッション履歴]]、[[セッション履歴エントリー]]も参照。
* 窓との関係
[10] [[閲覧文脈]]には、それに対応する [CODE(DOMi)@en[[[WindowProxy]]]]
[[オブジェクト]]が1つあります。 [SRC[>>3]]
[[閲覧文脈]]は、 [CODE(DOMi)@en[[[WindowProxy]]]] への[[強い参照]]を持ちます [SRC[>>40]]。
[11] それに対して[[閲覧文脈]]で提示される [CODE(DOMi)@en[[[Document]]]]
[[オブジェクト]]には、''それぞれ''対応する [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]が1つずつあります。[SRC[>>3]]
;; [32] なお [CODE(DOMi)@en[[[Window]]]] は [[JavaScript]] [[大域オブジェクト]]です。
[63] [CODE(DOMi)@en[[[WindowProxy]]]] はその名の通り「[RUBYB[[[串]]]@en[proxy]]」であり、
すべてをその[[閲覧文脈]]の[[活性文書]]の [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]に転送します。 [SRC[>>3]]
[35] 仕様上 [CODE(DOMi)@en[[[WindowProxy]]]] と[[閲覧文脈]]は別のオブジェクトとして規定されていますが、
[[閲覧文脈]]は仕様書上にのみ登場する内部オブジェクトで、[[JavaScript]]
からはアクセスできませんから、どう実装されるかは
[[Webブラウザー]]によります。両者は常に一対一対応していますから、
実質的に同じオブジェクトとみなすこともできます。
-*-*-
[46]
[DFN[[RUBYB[[RUBY[起源][きげん]]を[RUBY[決定][けってい]]][determine the origin]]]]するには、
[VAR[[[閲覧文脈]]]]、
[VAR[[[URL]]]]、
[VAR[[[砂箱化フラグ集合]]]]、
[VAR[呼び出し起源]]、
[VAR[活性文書navigate起源]]を、
次のようにします。
[SRC[>>45]]
[FIG(steps)[
= [47]
[VAR[砂箱化フラグ集合]]の[F[砂箱化起源閲覧文脈フラグ]]が[[真]]の場合、
== [48]
新しい[[不透明起源]]を返します。
= [49]
それ以外で、
[VAR[[[URL]]]]
が
[CODE[null]]
の場合、
== [50]
新しい[[不透明起源]]を返します。
= [51]
それ以外で、
[VAR[活性文書navigate起源]]が [CODE[null]] で''なく''、
[VAR[URL]]
の[F[scheme][URL scheme]]
が
[CODE[javascript][javascript:]]
の場合、
== [52]
[VAR[活性文書navigate起源]]を返します。
= [53]
それ以外で、
[VAR[呼び出し起源]]が
[CODE[null]]
で''なく''、
[VAR[URL]]
が
[CODE[about:blank]]
の場合、
== [54]
[VAR[呼び出し起源]]を返します。
= [55]
それ以外で、
[VAR[URL]]
が
[CODE[about:srcdoc]]
の場合、
== [56]
[VAR[閲覧文脈]]の[F[包含子文書]]の[F[起源][文書の起源]]を返します。
= [57]
それ以外の場合、
== [58]
[VAR[URL]]
の[F[起源][URLの起源]]を返します。
]FIG]
[61] [[新しい閲覧文脈を作成]]する手順群と
[[navigate]] の[[文書オブジェクトの作成と初期化]]から呼び出されます。
[HISTORY[
[60] この[[手順群]]は[TIME[令和元(2019)年][2019]]の改訂で独立した手順群となりました。
それ以前はいろいろなところで分散して規定されていました。
[62]
[[navigate]] 時についてまとめると次の通りでした。
[268] [[文書の[F[起源]]]][DEL[と[[実効スクリプト起源]]]]は、次のように決定しなければ[MUST[なりません]]。
[FIG(steps)[
= [390] [VAR[応答]]が[[ネットワークエラー]]の場合など、
[[navigate応答の処理]]で[[非文書表示]]とされた場合、
== [448] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、新しい[[不透明起源]]に設定します
[SRC[>>12]]。
= [256] それ以外で、[VAR[新しい[[文書]]]]の[F[活性砂箱化フラグ集合]]の[F[砂箱化起源閲覧文脈フラグ]]が設定されていれば、 [SRC[>>244]]
== [257] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、新しい[[不透明起源]]に設定します。
= [119] それ以外で、[VAR[新しい[[文書]]]]の[F[文書の番地]]の[F[scheme][URL scheme]]が
[[network scheme]] なら、[SRC[>>244]]
== [247] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、[VAR[新しい[[文書]]]]の[F[番地][文書の番地]]の[F[起源][URLの起源]]の複製に設定します。
= [255] それ以外で、
[VAR[新しい[[文書]]]]の[F[文書の番地]]が [CODE(URI)@en[about:blank]] なら、[SRC[>>244]]
== [259] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、[VAR[文書の起源]]に設定します。
= [260] それ以外で、[VAR[新しい[[資源]]]]の [F[URL]] ([[リダイレクト]]前の最初のもの)
があってその [F[scheme][URL scheme]] が [CODE(URI)@en[javascript][javascript:]] なら、
[SRC[>>244]]
== [261] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、[VAR[文書の起源]]に設定します。
= [262] それ以外で、 [VAR[[[[CODE(HTMLa)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]]]なら、
[SRC[>>244]]
== [263] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、
[VAR[[[navigate]] する[[閲覧文脈]]]]の[F[閲覧文脈包含子]]の[F[節点文書]]の[F[起源][文書の起源]]に設定します。
= [264] それ以外なら、 [SRC[>>244, >>266]]
== [265] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、新しい[[不透明起源]]に設定します。
]FIG]
[REFS[
- [244] [CITE[HTML Standard]] の[[起源]]の規定 (当時)
- [12] [CITE[HTML Standard]] の [[navigate]] の規定 (当時)
- [266] [CITE[DOM Standard]] の[[文書]]の規定
]REFS]
;; [334] [[HTML Standard]] は [CODE(URI)@en[about:blank]] への [[navigate]] をすべて >>255
としていますが、[[著者]]以外が [[URL]] を与えた場合 ([[アドレスバー]]や[[お気に入り]]からの選択の場合など)
は >>264 が適用されると思われます。
;; [333] [[初期[CODE(URI)@en[about:blank]]文書]]は [[navigate]] で作成される[[文書]]ではなく、
[[閲覧文脈の作成]]で作成される[[文書]]です。[[起源]]は[[初期[CODE(URI)@en[about:blank]]文書]]を参照。
]HISTORY]
;; [327] [CODE(URI)@en[view-source:]] は >>264 より[[不透明起源]]となります。
;; [328] [CODE(URI)@en[chrome:]] や [CODE(URI)@en[chrome-extension:]]
やその他の [CODE(URI)@en[about:]] のような[[Webブラウザー]]固有の [[URL]]
や[[ブラウザー拡張]]の [[URL]] への [[navigate]]
では、[[Webブラウザー]]依存の方法で決めた[[起源]]に設定すると思われます。
[[Webブラウザー]]依存の[[起源]]については現在の仕様上は扱いが明確になっていません。
* 作成
[8] [[閲覧文脈の作成]]を参照。
* 破棄
[39] [[閲覧文脈]]を破棄する処理はいくつかあります。
[FIG(list)[
- [CODE(JS)@en[[[window.close]]]]
- [[閲覧文脈を閉じる]]
- [[閲覧文脈を捨てる]]
]FIG]
* レンダリング
[9] [[レンダリングの更新]]を参照。
* 歴史
[33] [[Netscape]] 2 により [[JavaScript]] と[[フレーム]]が導入されました。
現在の[[閲覧文脈]]に相当するものはこの時に登場したことになります。
[34] [[閲覧文脈]]という用語が登場しその性質と挙動が初めて明確に規定されたのは、
その10年後の [[Web Applications 1.0]] (現 [[HTML Standard]]) でした。
[13] [CITE[''''''[''''''whatwg'''''']'''''' Should events be paused on detached iframes?]]
( ([TIME[2010-12-07 21:22:35 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2010-December/029346.html>
[14] [CITE@en-US[Window Object 1.0]]
( ([TIME[2006-04-08 02:19:28 +09:00]] 版))
<http://www.w3.org/TR/Window/#dfn-browsing-context>
[17] [CITE@en[Web Applications 1.0 r8776 Try to fix the logic around opening new tabs because the user said so, even in sandboxed environments]]
( ([TIME[2014-09-17 05:32:00 +09:00]] 版))
<https://html5.org/r/8776>
[18] [CITE@en[MIX: Drop "JavaScript Global Environment". · 5d32821 · w3c/webappsec]]
( ([TIME[2014-10-21 09:48:34 +09:00]] 版))
<https://github.com/w3c/webappsec/commit/5d32821b21f3cb06a651c966f729b3044292a08a>
[19] [CITE@en[Web Applications 1.0 r8882 Add hyperlinks for creating browsing contexts.]]
( ([TIME[2015-01-16 08:39:00 +09:00]] 版))
<https://html5.org/r/8882>
[24] [CITE@en[Clarify the definition of window.frameElement · whatwg/html@a398377]]
([TIME[2016-02-10 23:01:26 +09:00]] 版)
<https://github.com/whatwg/html/commit/a398377bbc8483e27c4fc478a097ef72f3057593>
[36] [CITE@en[Use new "document's browsing context" concept everywhere · whatwg/html@6fe2ac7]]
([TIME[2016-02-11 11:40:38 +09:00]] 版)
<https://github.com/whatwg/html/commit/6fe2ac75f7ab63b98fe1637129f0a8574a542e55>
[41] [CITE@en[Remove the concept of creator Document so we don't leak a document · whatwg/html@a996f3b]]
([TIME[2016-04-06 17:35:12 +09:00]] 版)
<https://github.com/whatwg/html/commit/a996f3b4982f20697f71a23c919567a638519959>
[42] [CITE@en[Be more precise about nested and discarded browsing contexts]]
([[domenic]]著, [TIME[2016-07-20 22:58:49 +09:00]])
<https://github.com/whatwg/html/commit/39118df640ad4a3f03f164fb5ffe0a56316297be>
[43] [CITE@en[Set the top-level browser context to use for a session. (#929)]]
([[shs96c]]著, [TIME[2017-06-05 20:40:50 +09:00]])
<https://github.com/w3c/webdriver/commit/70a3387eaa8021027c5ae543ae9d2c3df167a913>
[44] [CITE@en[540988 - ☂ Speed up discarded tab restoration - chromium - Monorail]]
([TIME[2018-04-03 23:40:33 +09:00]])
<https://bugs.chromium.org/p/chromium/issues/detail?id=540988>
[59] [CITE@en[Refactor the navigation algorithm]]
([[dtapuska]], [TIME[2019-07-12 00:49:55 +09:00]], [TIME[2021-07-01T09:37:14.000Z]])
<https://github.com/whatwg/html/commit/061e782437c6cff600f18bc96c1a11489e09c3ab>
[64] [CITE@en[Refactor navigation algorithm. by dtapuska · Pull Request #4664 · whatwg/html]]
([TIME[2021-07-02T08:22:28.000Z]])
<https://github.com/whatwg/html/pull/4664>