/
661.txt
229 lines (193 loc) · 14.3 KB
/
661.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
[8] [[閲覧文脈の作成]]は、[[窓]]を開くなどの[[利用者]]の操作により、
あるいは [CODE(HTMLe)@en[[[iframe]]]] [[要素]]の挿入などの[[スクリプト]]の操作により、
行われます。
[41] [[閲覧文脈]]を作成すると、[[閲覧文脈]]に対応する [[JavaScript]]
[[オブジェクト]]であり[[大域オブジェクト]]でもある [CODE(DOMi)@en[[[Window]]]]
と、 [[JavaScript]] から実際にアクセスできる[[オブジェクト]]である
[CODE(DOM)@en[[[WindowProxy]]]] が作成されます。更に、
[[閲覧文脈]]の初期状態である [CODE(URI)@en[[[about:blank]]]] の[[文書]]が作成されます。
そしてこれらの関連付けと初期化が行われます。
* 仕様書
[REFS[
- [1] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#creating-a-new-browsing-context>'''
- [19] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#attr-iframe-sandbox>
- [25] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#the-sessionstorage-attribute>
- [29] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/#nesting>
]REFS]
* 文脈
[9] 次の場面で[[閲覧文脈の作成]]が呼び出されます。
[FIG(list)[
- 新しい[[窓]]や[[タブ]]を開いた場合
- [[閲覧文脈の選択]]
-- [[the rules for choosing a browsing context given a browsing context name]]
で新たに[[閲覧文脈]]を開く場合 [SRC[[[HTML Standard]]]]
-- [[ハイパーリンクをたどる]]際に新しい[[閲覧文脈]]を使う場合
-- [[フォームの提出]]で新しい[[閲覧文脈]]を使う場合
-- [CODE(JS)@en[[[window.open]]]] で新しい[[閲覧文脈]]を使う場合
- [[フレーム]]の[[文書への挿入]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[object]]]] [[要素]]で[[閲覧文脈]]を使う場合
- [CODE(HTMLe)@en[[[embed]]]] [[要素]]で[[閲覧文脈]]を使う場合
- [DEL[[CODE(DOMm)@en[[[showModalDialog]]]] [SRC[[[HTML Standard]]]]]]
]FIG]
* 処理
[2] [DFN[[RUBYB[新しい閲覧文脈の作成]@en[create a new browsing context]]]] [SRC[>>1]] は、
[[引数]]として[VAR[作成子閲覧文脈]] ([[閲覧文脈]]または無指定)、
[VAR[入れ子か最上位か]]、[VAR[[[補助閲覧文脈]]か否か]]を指定できます。
次のようにしなければ[['''なりません''']]。
[FIG(steps)[
= [35] [VAR[作成子文書]]を、[VAR[作成子閲覧文脈]]があればその[F[[[活性文書]]]]、
なければ null に設定します。
= [50] [VAR[閲覧文脈]]を、新しい[[閲覧文脈]]に設定します。
[FIG(list members)[
[FIGCAPTION[
[[閲覧文脈]]
]FIGCAPTION]
:[F[入れ子か最上位か]]: [VAR[入れ子か最上位か]]
:[F[[[補助閲覧文脈]]か]]: [VAR[[[補助閲覧文脈]]か否か]]
:[F[[[作成子閲覧文脈]]]]: [VAR[作成子閲覧文脈]]
:[F[[[作成子[CODE(DOMi)@en[Document]]]]]]: [VAR[作成子文書]]
:[F[[[[CODE(HTMLe)@en[iframe]] sandboxing flag set]]]]:
[CODE(HTMLa)@en[[[sandbox]]]] [[属性]]と [CODE(HTMLa)@en[[[allowfullscreen]]]]
[[属性]]を [[parse the sandboxing directive]]
して得た[[砂箱化フラグ集合]] ([CODE(HTMLe)@en[[[iframe]]]] [[入れ子閲覧文脈]]の場合)
[SRC[>>19]]。
]FIG]
= [48] [VAR[窓]]を、新しい [CODE(DOMi)@en[[[Window]]]] に設定します [SRC[>>1]]。
= [49] [VAR[窓プロキシ]]を、新しい [CODE(DOMi)@en[[[WindowProxy]]]] に設定します [SRC[>>1]]。
[FIG(list members)[
: [F(ss)[Window]] : [VAR[窓]]
]FIG]
= [51] [VAR[閲覧文脈]]の [F[[CODE(DOMi)@en[[[WindowProxy]]]]]] を、[VAR[窓プロキシ]]に設定します。
= [47] [CODE[[[InitializeHostDefinedRealm]]]] [[抽象操作]]を次の通り実行し、
[VAR[realm実行文脈]]を、作成された [[JavaScript実行文脈]]に設定します。 [SRC[>>1]]。
[FIG(list members)[
:[[大域オブジェクト]]: [VAR[窓]]
:[[大域[CODE(JS)[this]]値]]: [VAR[窓プロキシ]]
]FIG]
= [15] [VAR[文書]]を、新しい[DFN[[RUBYB[初期「[CODE(URI)@en[about:blank]]」[[文書]]]@en[initial "[CODE(URI)@en[about:blank]]" document]]]]に設定します [SRC[>>1]]。
[FIG(list members)[
[FIGCAPTION[
[53] [[文書]]
]FIGCAPTION]
:[F[[[文書の番地]]]]:[CODE(URI)@en[[[about:blank]]]]
:[F[[[型]]]]: [[HTML文書]]
:[F[[[文字符号化]]]]: [[utf-8]]
:[F[[[ready for post-load tasks]]]]: [[真]]
:[F[[[completely loaded]]]]: [[真]]
:[F[[[子供節点]]]]: [CODE(HTMLe)@en[[[html]]]] [[要素]]。その[[子供]]は
[CODE(HTMLe)@en[[[head]]]] [[要素]]と [CODE(HTMLe)@en[[[body]]]] [[要素]]
(いずれも[[空]])。
]FIG]
= [37] [VAR[作成子文書]]が null なら [SRC[>>1]]、
== [39] [VAR[文書]]の[F[文書の起源]]を、新しい[[大域的に固有な識別子]]に設定します。
== [40] [VAR[文書]]の[F[実効スクリプト起源]]を、[VAR[文書]]の[F[文書の起源]]の複製に設定します。
= [38] そうでなければ [SRC[>>1]]、
== [42] [VAR[文書]]の[F[文書のreferrer]]を、[VAR[作成子文書]]の[F[文書の番地]]に設定します。
== [43] [VAR[文書]]の[F[文書の起源]]を、[VAR[作成子文書]]の[F[文書の起源]]の複製に設定します。
== [44] [VAR[文書]]の[F[実効スクリプト起源]]を、[VAR[作成子文書]]の[F[実効スクリプト資源]]の値 (非複製) に設定します。
= [18] [VAR[文書]]について[[砂箱化の実装]]を行います [SRC[>>1]]。
= [52] [VAR[realm実行文脈]]について[[閲覧文脈環境設定群オブジェクトの設定]]を行います [SRC[>>1]]。
= [17] [VAR[閲覧文脈]]の[F[[[セッション履歴]]]]に、
新しい[[セッション履歴エントリー]]を追加します [SRC[>>1]]。
[FIG(list members)[
[FIGCAPTION[
[45] [[セッション履歴エントリー]]
]FIGCAPTION]
:[F[[[文書]]]]: [VAR[文書]]
]FIG]
= [16] [VAR[窓]]の[F[[[文書]]]]を、 [VAR[文書]]に設定します [SRC[>>1]]。
= [22] [[最上位閲覧文脈]]の場合、
== [23] 既存の[[閲覧文脈]]の[RUBYB[複製]@en[clone]]の場合は、
[[セッションストレージ領域]]群は元の[[閲覧文脈]]のものの複製とします。
(以後別物と考えます。) [SRC[>>25]]
== [24] 関係する[[文書]]が指定されている場合、
その[[文書の起源]]の[[セッションストレージ領域]]群は元の[[閲覧文脈]]のものの複製とします。
(以後別物と考えます。) [SRC[>>25]]
= [30] [[入れ子閲覧文脈]]の場合、 [SRC[>>29]]
== [31] [[閲覧文脈]]の [[embedding document]] の[[非保安要求ポリシー]]が「格上げする」なら、
=== [32] [[閲覧文脈]]の[[非保安要求ポリシー]]を、「格上げする」に設定します。
=== [33] [[閲覧文脈]]の [[embedding document]] の[[非保安navigate格上げ集合]]の各値について、
[[閲覧文脈]]の[[非保安navigate格上げ集合]]に追加します。
]FIG]
;; [3] [[文書のreferrer]] と [[CSP]] などの [CODE[[[referrer]]]] の指定との関係は不明瞭です。
;; [26] [[閲覧文脈]]の複製というのが具体的にどのような操作なのかは不明です。
そのような [[API]] は無さそうですが、そのような[[利用者]]の操作を実装している
[[Webブラウザー]]があります (例えば [[Chrome]] は[[タブ]]の複製操作があります)。
;; [27] 新しい[[閲覧文脈]]に関係する[[文書]]については、[[閲覧文脈の選択]]を参照。
([[閲覧文脈の選択]]によらない場合でも、理論上は [[Webブラウザー]]依存の方法
([[UI]]) から新しい[[閲覧文脈]]を作成した場合で該当することはあるかもしれません。)
;; [20] [[閲覧文脈]]の作成後、 (本作成手順の呼び出し元で) [[閲覧文脈名]]が設定されることになります。
[10] [CODE(DOMi)@en[[[Window]]]] は[[大域オブジェクト]]ですから、
付随して[[環境設定群オブジェクト]]、 [[JavaScript]] 実行環境、
[[Web IDL]] [[インターフェイスオブジェクト]]なども作られます。
この [CODE(DOMi)@en[[[Window]]]] は、 [[navigate]] により次の[[文書]]に再利用されることがあります。
;; [[文書オブジェクトの初期化]]参照。
[11] 本項の初期化手順の後に、[[閲覧文脈]]が使われる各文脈に依存した次の処理が
(必要なら) 行われます。
[12] [[Webブラウザー]]で新たな[[タブ]]を開いたことによる[[閲覧文脈]]の作成の場合には、
<about:newtab> などの [[Webブラウザー]]依存の初期ページや、
[[利用者]]の設定した[[ホームページ]]へと[[置換有効]]で [[navigate]] されます。
[13] 外部アプリケーションから [[Webブラウザー]]に [[URL]]
を指定して起動 (あるいは[[プロセス間通信]]により [[URL]] を開くことを指示)
した場合には、その [[URL]] へと[[置換有効]]で [[navigate]] されます。
[14] [[お気に入り]]や閲覧[[履歴]]などの [[Webブラウザー]]依存の[[利用者インターフェイス]]を通して
[[URL]] を指定して新しい[[閲覧履歴]]が開かれた場合には、
その [[URL]] へと[[置換有効]]で [[navigate]] されます。
[28] 作成した[[閲覧文脈]]がいつ[[利用者]]に表示されるかは、作成される場面や[[利用者エージェント]]の設計方針により異なります。
[[入れ子閲覧文脈]]の場合は、次の[[レンダリングの更新]]の時点と思われます。
[[最上位閲覧文脈]]の場合は、ただちに表示されるのが普通と思われますが、
敢えてそうしないこともあるかもしれません ([[navigate]] 参照)。
;; [[閲覧文脈の作成]]の呼び出し元で、[[閲覧文脈]]の表示サイズなどの設定が行われることがあります。
[CODE(JS)@en[[[window.open]]]] や[[閲覧文脈の選択]]を参照。
[54] いずれにせよ、 [[閲覧文脈の作成]]と前後して、その[[閲覧文脈]]の表示のための[[窓]]や[[タブ]]、
関係する[[利用者インターフェイス]]などの作成と初期化を適宜行う必要があります。
;; [55] その具体的な方法やタイミングは環境や実装方法に依存しますし、
[[Web互換性]]に直接影響しないので、[[標準化]]されていません。
[36] [[閲覧文脈]]は、[DFN[[F[[RUBYB[作成子閲覧文脈]@en[creator browsing context]]]]]]と[DFN[[F[[RUBYB[作成子[CODE(DOM)@en[Document]]]@en[creator [CODE(DOM)@en[Document]]]]]]]]を持ちます。
これらは[[閲覧文脈の作成]]時に (あれば) 設定されます。
* 最初の [CODE(JS)@en[about:blank]] 文書
[4] [[閲覧文脈の作成]]時に作成される[[文書]]は、仕様書中では
「[[閲覧文脈]]作成時に追加された [CODE(URI)@en[[[about:blank]]]] [[文書]]」、
「初期『[CODE(URI)@en[about:blank]]』文書」などと呼ばれます。
[21] [[閲覧文脈]]作成時に[[セッション履歴]]に追加された
[CODE(URI)@en[[[about:blank]]]] [[文書]]は、次の場面で特別に扱われます。
[FIG(short list)[
- [[文書オブジェクトの初期化]]
- [CODE(JS)@en[[[location.assign]]]]
- [CODE(JS)@en[[[document.open]]]]
- [CODE(JS)@en[[[window.open]]]]
- [[フレーム]]
- [CODE(JS)@en[[[history.length]]]]
]FIG]
[5] 初期文書かどうかは、[[置換有効]]で [[navigate]] するかどうかの判断に使われます。
つまり初期文書は当該[[閲覧文脈]]で [[navigate]] が最初に発生した時に[[セッション履歴]]から削除されることになります。
[6] この判断は初期文書かどうか否かで行うので、[[スクリプト]]により内容を操作しているか否かは影響しません。 (ただし [CODE(JS)@en[[[document.open]]]] や
[CODE(DOMm)@en[[[pushState]]]] で[[セッション履歴エントリー]]が新たに追加されていれば、
初期文書が唯一の[[セッション履歴エントリー]]であるとの条件を満たさなくなります。)
[7] [CODE(DOMm)@en[[[replaceState]]]] や [CODE(JS)@en[[[document.open]]]]
で[[セッション履歴エントリー]]が置換された場合で [[URL]]
が [CODE(URI)@en[[[about:blank]]]] でなくなった場合、
あるいは [CODE(URI)@en[[[about:blank]]]] のままで[[セッション履歴エントリー]]が置き換わった場合にどう影響するのかは明確ではありません。
[[初期「[CODE(URI)@en[about:blank]]」文書]]であるかどうかの判断が[[文書]]に於けるものか[[セッション履歴エントリー]]に於けるものかで変わってきます。
* 歴史
[34] [CITE@en[Refactor browsing context creation · whatwg/html@357f649]]
([TIME[2015-12-16 16:04:28 +09:00]] 版)
<https://github.com/whatwg/html/commit/357f649a2fda01b0ae07c3d7643d3123d29a5538>
[46] [CITE@en[Rewrite global object initialization to delegate to ES · whatwg/html@cf0355d]]
([TIME[2015-12-16 18:15:51 +09:00]] 版)
<https://github.com/whatwg/html/commit/cf0355d7e0e229b98f7fbd51b8c7608010c787f5>
[56] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-22 18:52:25 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>
[57] [CITE@en[Define security around Window, WindowProxy, and Location properly · whatwg/html@acae3df]]
([TIME[2016-03-13 23:23:39 +09:00]] 版)
<https://github.com/whatwg/html/commit/acae3df652b382e9f4f1d1b4dc7e08e2b00df821>
[58] [CITE@en[Remove the origin aliasing concept · whatwg/html@438155d]]
([TIME[2016-03-23 22:18:13 +09:00]] 版)
<https://github.com/whatwg/html/commit/438155d2a2255aa5ea84ae390744d8a8662ebec2>
[59] [CITE@en[Sync with recent changes to the JS spec's job queue · whatwg/html@5af258f]]
([TIME[2016-03-24 21:42:47 +09:00]] 版)
<https://github.com/whatwg/html/commit/5af258f33e3e2f55eb30e611cb7aee625a8bd16a>
[60] [CITE@en[Define the origin of non-initial about:blank documents · whatwg/html@baad9fd]]
([TIME[2016-03-25 13:33:29 +09:00]] 版)
<https://github.com/whatwg/html/commit/baad9fd10e5a49c1c72fc89426ffa2a26e0b72e4>