/
222.txt
276 lines (208 loc) · 16.7 KB
/
222.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
[2] [DFN[[RUBYB[[[要素を文書に挿入]]]@en[insert an element into a document]]]]するとは、
[[要素]]を[[文書]]の[[子孫]]とすることをいいます。
* 仕様書
[REFS[
- [101] '''[CITE@en-US[DOM Standard]] ([TIME[2014-08-19 13:36:28 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-node-insert-ext>'''
- [1] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-20 22:41:10 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#insert-an-element-into-a-document>'''
- [28] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-27 02:59:24 +09:00]] 版) <https://html.spec.whatwg.org/#node-is-connected>
- [14] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-09 09:15:24 +09:00]] 版) <https://html.spec.whatwg.org/#parser-inserted>
- [18] [CITE@en-US[Fetch Standard]] ([TIME[2016-04-15 18:13:01 +09:00]] 版) <https://fetch.spec.whatwg.org/#concept-request-parser-metadata>
- [24] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-16 15:05:57 +09:00]] 版) <https://html.spec.whatwg.org/#concept-module-script-parser>
- [38] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2016-09-16 22:41:59 +09:00]]) <https://html.spec.whatwg.org/#creating-and-inserting-nodes>
]REFS]
* 挿入
@@
* 構文解析器による挿入
[108] [[構文解析器]]によって[[挿入]]される[[節点]]は、すべて[[構文解析器]]によって新たに作られたものです。
[[挿入]]の時点ではまだ一度も[[スクリプト]]からアクセスされたことがないものですし、
[[子孫]]も存在しません。[[属性]]は、[[挿入]]と同時に設定されることがありますが、
それ以外の方法で追加されたものは存在しません。
;; [111] ただし [[AAA]] で既存の[[節点]]を[[親]]から別の[[要素]]に移動することはあります。
移動対象となる[[節点]]は[[スクリプト]]によって編集されているかもしれませんし、
元々[[スクリプト]]が作ったものである可能性もあります。
[109] [[里親付け]]が発生する場合と、[[根要素]]外を[[構文解析器]]中の場合を除き、
すべての[[節点]]の[[挿入]]・[[append]] 先は[[要素]]です。
[110] [[里親付け]]の場合、挿入先となるはずだった[[節点]]が [CODE(HTMLe)@en[[[table]]]]
[[要素]]などだった時、その[[兄]]として挿入されるので、その[[親]]が
[CODE(DOMi)@en[[[Document]]]] や [CODE(DOMi)@en[[[DocumentFragment]]]] のこともあります。
;; [CODE(DOMi)@en[[[Document]]]] の場合、2つ目の[[根要素]]または
[CODE(DOMi)@en[[[Document]]]] 直下の[[テキスト]]となるので、
[[挿入]]は失敗して捨てられます。 ([[注釈]]は[[里親付け]]の対象となりません。)
* 挿入手順
[102] [[節点]]が別の[[節点]]の[[子供]]として[[挿入]]されると、
[DFN[[RUBYB[[[挿入手順]]]@en[insertion steps]]]] [SRC[>>101]] が呼び出されます。
[[挿入]]された[[節点]]自体のみならず、その[[影根を含む子孫]]についても[[影根を含む木順]]に呼び出されます。
;; [103] [[DOM Standard]] 上の[[アルゴリズム]]である [[pre-insert]]、[[replace]]、
[[replace all]] によって呼び出されます。
[104] この[[フック]]によって次の[[節点]]が何らかの処理を行います。
[FIG(list middle)[
- [CODE(HTMLe)@en[[[option]]]] [SRC[[[HTML Standard]]]]
- ([CODE(HTMLe)@en[[[script]]]] に対して) [[子供]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[source]]]] ([[媒体要素]]) ※ [SRC[[[HTML Standard]]]]
- [[媒体要素]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[img]]]] ([CODE(HTMLe)@en[[[picture]]]]) [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[source]]]] ([CODE(HTMLe)@en[[[picture]]]]) [SRC[[[HTML Standard]]]]
- [[要素の文書への挿入]] ※ [SRC[[[HTML Standard]]]]
- [[節点の接続]] ★※ [SRC[[[HTML Standard]]]]
]FIG]
[105] 仕様上明確には規定されていませんが、次の動作もこの[[フック]]のタイミングで処理されると思われます。
[FIG(list middle)[
- [[画像写像]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[style]]]] の[[子孫]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[track]]]] ※ [SRC[[[HTML Standard]]]]
- [CODE(XML)@en[[[<?xml-stylesheet?>]]]] [SRC[[[CSSOM]]]]
- [[文書基底URL]]・[[凍結基底URL]]の更新 [SRC[[[HTML Standard]]]]
]FIG]
;; [106] 「※」は[[構文解析器]]による挿入かどうかで動作が異なることがあります。
;; [119] 多くは[[要素]]の[[挿入]]に関する処理ですが、
それ以外の種類の[[節点]]の場合もあります。
[107] なお、[[pre-insert]], [[replace]], [[replace all]] 操作は[[挿入]]に先立って [[adopt]]
を行いますので、その中で[[節点]]の種類によっては [[adopting steps]] も実行されます。
@@ [124] [[custom element]] の[[コールバック]]
[49]
[[挿入手順群]]とは別に[[子供テキスト内容変更手順群]]が実行される場合もあります。
* 文書に挿入
[13] [[節点]]が[[挿入手順]]により[[文書中]]となった時、
[DFN[[RUBYB[[[文書に挿入]]]@en[inserted into a document]]]]されたといいます [SRC[>>1]]。
[7] [[文書への挿入]]のタイミングで行われる[[要素]]ごとの処理も存在しています。
[FIG(list middle)[
- [CODE(HTMLe)@en[meta]]
- [CODE(HTMLe)@en[[[style]]]] ☆※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[link]]
- [CODE(HTMLe)@en[[[img]]]] ☆
- [CODE(HTMLe)@en[[[iframe]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[frame]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[object]]]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[param]]]]
- [[フォーム被関連付け要素]] ☆※ [SRC[[[HTML Standard]]]]
- [[ID]] のある[[要素]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLa)@en[[[autofocus]]]] のある[[要素]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[script]] ☆※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[script]] への[[挿入]] ☆※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[embed]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[applet]]]] ※ [SRC[[[HTML Standard]]]]
- [[カスタム要素]] (>>31) ☆ [SRC[[[DOM Standard]]]]
]FIG]
;; [8] [CODE(HTMLe)@en[[[embed]]]] と [CODE(HTMLe)@en[[[applet]]]]
と [CODE(HTMLe)@en[[[frame]]]]
については仕様上 [[in a [CODE(DOMi)@en[Document]]]] を使って半ば宣言的に規定されていますが、
実質的に「[[要素の文書からの挿入]]」の処理に該当します。
[9] 「※」のあるものは、[[構文解析器]]による挿入か否かで動作が異なります。
;; [10] [[レンダリング]]の更新は、また別のタイミングで行われます。
[CODE(HTMLe)@en[[[title]]]] [[要素]]など[[画布]]外の[[UI]]に関する更新は特に規定がありませんが、
[[レンダリング]]と同タイミングが好ましいでしょうか。 ([[相互運用性]]に直接影響しないためか規定がありません。)
[26] 「☆」のあるものは、[DFN[[RUBYB[[[接続された]]]@en[becomes connected]]]]、
すなわち[[挿入手順群]]で[[影を含む文書中]]となったときに実行されます [SRC[>>28]]。
([[節点の挿入]]に加えて、[[影木]]への[[挿入]]でも実行されます。)
[36] 「★」のあるものは、[DFN[[RUBYB[閲覧文脈接続された]@en[becomes browsing-context connected]]]]、
すなわち[[挿入手順群]]で[[閲覧文脈接続]]状態となったときに実行されます
[SRC[>>28]]。
[31] [[カスタム要素]]の処理は、[[仕様書]]上は[[挿入手順群]]ではなく、
[[挿入手順群]]の直後に実行する別の処理として定義されています。
[11] [[Webブラウザー]]によっては、[[文書要素]]の[[文書への挿入]]のタイミングで[[内容スクリプト]]が実行されるかもしれません。
* 構文解析による挿入
[39] [[構文解析器]]による[[要素]][VAR[要素]]の[VAR[位置]]への[[挿入]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>38]]。
[FIG(steps)[
= [43] [VAR[キュー]]を、新しい[[要素キュー]]に設定します。
= [40] [[関連する類似起源閲覧文脈群の単位]]の[F[カスタム要素反応群スタック]]に、[VAR[要素キュー]]を [[push]] します。
= [41] [VAR[要素]]を[VAR[位置]]に[[挿入]]します。
= [42] [[関連する類似起源閲覧文脈群の単位]]の[F[カスタム要素反応群スタック]]を [[pop]] します。
= [44] [VAR[要素キュー]]について[[カスタム要素反応群の呼び出し]]をします。
]FIG]
;; [45] つまり、[[要素]]の[[挿入]]の直後に[[カスタム要素反応群]]の処理が行われます。
;; [46] これは[[開いている要素のスタック]]への [[push]] の前に行われます。
[15] [CODE(HTMLe)@en[script]] [[要素]]は、
[F[[DFN[[RUBYB[[[「構文解析器挿入」]]]@en["parser inserted"]]]]フラグ]]を持ちます [SRC[>>14]]。
[[構文解析器]]が挿入した [CODE(HTMLe)@en[[[script]]]] [[要素]]に設定されます。
初期状態では未設定です [SRC[>>14]]。
;; [20] これは [CODE(HTMLe)@en[script]] [[要素]]の動作に深く関与します。
[CODE(HTMLe)@en[script]] 参照。
;; [30] [[フォーム被関連付け要素]]にも同様のフラグが実装上必要そうです。
[[字句の要素の作成]]と[[フォーム所有者の再設定]]を参照。
[23] [[モジュールスクリプト]]の[DFN[[F[[RUBYB[[[構文解析器状態]]]@en[parser state]]]]]]を持ちます
[SRC[>>24]]。
[[モジュールスクリプトのfetch]]の際に[[要求]]の[F[構文解析器メタデータ]]として使う値を保持するものです。
[F[「構文解析挿入」フラグ]]の設定された [CODE(HTMLe)@en[script]]
[[要素]]から[[作成][モジュールスクリプトの作成]]された[[モジュールスクリプト]]では、
[CODE[parser-inserted]] に設定されます。それ以外の[[モジュールスクリプト]]では、
[CODE[not-parser-inserted]] に設定されます。
[17] [[要求]]は、[DFN[[F[[RUBYB[[[構文解析器メタデータ]]]@en[parser metadata]]]]]]を持ちます。
値は[[空文字列]]、 [DFN[[CODE[parser-inserted]]]]、
[DFN[[CODE[not-parser-inserted]]]] のいずれかです。
初期状態では[[空文字列]]です。 [SRC[>>18]]
;; [21] これは [[CSP]] の指定 [CODE[unsafe-dynamic]] の挙動に影響します。
[32] [[カスタム要素]]が[[挿入]]される場合、[[カスタム要素反応のスタック]]に[[節点の接続]]の[[コールバック]]実行が追加されます。
これがいつ実行されるのかは定かではありません。
* 関連
[6] 逆に[[要素が文書から削除]]される場合に発生する処理もあり、
挿入時と共通しているものも多くあります。
* 歴史
[114] [[挿入手順]]は、 >>112 までは[DFN[[RUBYB[[[節点の挿入]]]@en[node is inserted]]]]と呼ばれていました。
[116] [[HTML Standard]] は現在でも「nodes are inserted」という用語を使っていますが、
[[DOM Standard]] の「insertion steps」を参照するようになっています [SRC[>>115, >>117]]。
[3] [[要素]]の[[根要素]]が変更され、[[文書]]の[[根要素]]となったとき、
[DFN[[RUBYB[[[文書に挿入]]]@en[inserted into a document]]]]されたといいます [SRC[>>1]]。
;; [4] この定義によれば、[[根要素]]が[[文書]]に挿入されて[[文書]]の[[根要素]]となった時には、
[[根要素]]自身は変化していませんから、[[文書に挿入]]はされていないこととなります。
(意図通りなのかは不明です。) 他の定義との整合性を考えると、
このケースも該当すると考えるべきかもしれません。
[REFS[
- [112] [CITE@en[Fix the low-level remove/insert hooks and rewrite NodeIterator in terms ... · 4937f1a · whatwg/dom]] ([TIME[2014-08-21 15:10:21 +09:00]] 版) <https://github.com/whatwg/dom/commit/4937f1a5e39c0914ad2f0a3a35558cf1678e8b89>
- [113] [CITE@en[Bug 24653 – Planning on changing mutation hooks]] ([TIME[2014-08-21 15:10:10 +09:00]] 版) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=24653#c3>
- [115] [CITE@en[Web Applications 1.0 r8769 Integrate with DOM for 'removing steps' and 'insertion steps'.]] ([TIME[2014-09-13 03:23:00 +09:00]] 版) <http://html5.org/r/8769>
- [117] [CITE@en[Sync with r8769 (Integrate with DOM for 'removing steps' and 'insertion ... · 4a62050 · ResponsiveImagesCG/picture-element]] ([TIME[2014-09-15 08:59:45 +09:00]] 版) <https://github.com/ResponsiveImagesCG/picture-element/commit/4a620502e75e2839842fa737a3bc25894836e895>
- [118] [CITE@en[Need to grab children of a DocumentFragment before an insert. Fixes h… · whatwg/dom@1b9e2f9]]
([TIME[2015-05-11 13:27:23 +09:00]] 版)
<https://github.com/whatwg/dom/commit/1b9e2f9765884460410d1396dbba99951eafe838>
- [120] [CITE@en[Fix #34: invoke insertion/removing steps for descendants · whatwg/dom@5ec535e]]
([TIME[2016-03-05 18:26:41 +09:00]] 版)
<https://github.com/whatwg/dom/commit/5ec535e56111d600b8afe89d0b4f709ab844461e>
- [121] [CITE@en[Shadow: run insertion and removing steps also for shadow trees · whatwg/dom@2d5aaed]]
([TIME[2016-03-16 15:14:38 +09:00]] 版)
<https://github.com/whatwg/dom/commit/2d5aaed1f525561a2c92b4e23ae2b7e6ff8244ad>
- [122] [CITE@en[Only pass oldParent to removing steps for the node actually removed · whatwg/dom@baf4e6e]]
([TIME[2016-03-16 15:16:55 +09:00]] 版)
<https://github.com/whatwg/dom/commit/baf4e6e83e473330e5b073df77c091815489bb81>
- [123] [CITE@en[Add support for custom elements · whatwg/dom@7f63535]]
([TIME[2016-04-13 22:17:41 +09:00]] 版)
<https://github.com/whatwg/dom/commit/7f63535da39a1cbf7f8f68563abc6f05f760990a>
]REFS]
[12] [CITE@en[Editorial: synchronize with the DOM Standard · whatwg/html@21c6ec7]] ([TIME[2016-03-20 17:40:31 +09:00]] 版) <https://github.com/whatwg/html/commit/21c6ec77594eb89b836d4872222f5916910967fd>
[16] [CITE@en[Add 'parser metadata' to requests · whatwg/fetch@bc399d5]] ([TIME[2016-04-15 23:11:56 +09:00]] 版) <https://github.com/whatwg/fetch/commit/bc399d58e4dacc625857bd37671e6c1a7844e3ec>
[19] [CITE@en[Use the 'parser metadata' concept from Fetch · w3c/webappsec-csp@4793499]]
([TIME[2016-04-15 23:16:40 +09:00]] 版)
<https://github.com/w3c/webappsec-csp/commit/479349944cc90e1584dcade60e80d17ea1e6b56b>
[22] [CITE@en[Pass parser metadata to Fetch · whatwg/html@e6500b9]]
([TIME[2016-04-16 22:23:08 +09:00]] 版)
<https://github.com/whatwg/html/commit/e6500b90244376c023e7b78642dbc7b86829233f>
[25] [CITE@en[Generalize inserted/removed into/from a document algorithms · whatwg/html@8da5a18]]
([TIME[2016-04-25 17:59:46 +09:00]] 版)
<https://github.com/whatwg/html/commit/8da5a18b447290ffcdd6c23e268a6e75f906c684>
[5] [CITE@en[Add custom elements to HTML · whatwg/html@6e7eaa4]]
([TIME[2016-04-26 18:24:46 +09:00]] 版)
<https://github.com/whatwg/html/commit/6e7eaa4bd2912965fd83766f99f984f249531f3a>
[27] [CITE@en[Execute <script> in shadow trees · whatwg/html@caf203f]]
([TIME[2016-04-27 17:38:49 +09:00]] 版)
<https://github.com/whatwg/html/commit/caf203fd4d9a5047d1ff2edad2290d53e21368ba>
[29] [CITE@en[Make forms work in shadow trees]]
( ([[annevk]]著, [TIME[2016-05-12 00:45:25 +09:00]]))
<https://github.com/whatwg/html/commit/927fda0f305452a9c54a25d3ebf9a6ed5ae29fd3>
[33] [CITE@en[Integrate with the Referrer Policy spec, part 1 of n]]
( ([[domenic]]著, [TIME[2016-05-05 23:01:42 +09:00]]))
<https://github.com/whatwg/html/commit/6a7318072f340ad45229df171245d70d8621c2fe>
[34] [CITE@en[Align with vocabulary changes in the DOM Standard]]
([[annevk]]著, [TIME[2016-07-08 02:32:18 +09:00]])
<https://github.com/whatwg/html/commit/5b9c5d5a39c38b08e5a5c9334e14804f063235b2>
[35] [CITE@en[Make <link rel="stylesheet"> work inside shadow trees]]
([[domenic]]著, [TIME[2016-07-20 16:29:57 +09:00]])
<https://github.com/whatwg/html/commit/43c57866c2bbc20dc0deb15a721a28cbaad2140c>
[37] [CITE@en[Process custom element connectedCallback immediately during parsing]]
([[domenic]]著, [TIME[2016-08-24 15:32:24 +09:00]])
<https://github.com/whatwg/html/commit/ca818ee1c8458c3b862acd00d11779294cb89eea>
[47] [CITE@en[Be more precise about removal and insertion]]
([[annevk]]著, [TIME[2017-04-07 17:44:16 +09:00]])
<https://github.com/whatwg/dom/commit/26faf9a74154b5d1dd3d1f8dd699404716649ae4>
[48] [CITE@en[Add child text content and its change steps]]
([[domenic]]著, [TIME[2017-06-28 01:07:56 +09:00]])
<https://github.com/whatwg/dom/commit/93db3408c360a958c2f1c00fbb99bf6c5d6fa5b2>