/
222.txt
205 lines (157 loc) · 12.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
[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>'''
- [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>
]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)[
- [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]]]]
]FIG]
[105] 仕様上明確には規定されていませんが、次の動作もこの[[フック]]のタイミングで処理されると思われます。
[FIG(list)[
- [[画像写像]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[style]]]] の[[子孫]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[track]]]] ※ [SRC[[[HTML Standard]]]]
- [CODE(XML)@en[[[<?xml-stylesheet?>]]]] [SRC[[[CSSOM]]]]
- [[フォーム被関連付け要素]] ※ [SRC[[[HTML Standard]]]]
- [[文書基底URL]]・[[凍結基底URL]]の更新 [SRC[[[HTML Standard]]]]
]FIG]
;; [106] 「※」は[[構文解析器]]による挿入かどうかで動作が異なることがあります。
;; [119] 多くは[[要素]]の[[挿入]]に関する処理ですが、
それ以外の種類の[[節点]]の場合もあります。
[107] なお、[[pre-insert]], [[replace]], [[replace all]] 操作は[[挿入]]に先立って [[adopt]]
を行いますので、その中で[[節点]]の種類によっては [[adopting steps]] も実行されます。
@@ [124] [[custom element]] の[[コールバック]]
* 文書に挿入
[13] [[節点]]が[[挿入手順]]により[[文書中]]となった時、
[DFN[[RUBYB[[[文書に挿入]]]@en[inserted into a document]]]]されたといいます [SRC[>>1]]。
[7] [[文書への挿入]]のタイミングで行われる[[要素]]ごとの処理も存在しています。
[FIG(list middle)[
- [CODE(HTMLe)@en[[[meta]]]]
-- [CODE(HTML)@en[[[http-equiv]]=[[content-language]]]] [SRC[[[HTML Standard]]]]
-- [CODE(HTML)@en[[[http-equiv]]=[[default-style]]]] [SRC[[[HTML Standard]]]]
-- [CODE(HTML)@en[[[http-equiv]]=[[refresh]]]] [SRC[[[HTML Standard]]]]
-- [CODE(HTML)@en[[[http-equiv]]=[[set-cookie]]]] [SRC[[[HTML Standard]]]]
-- [CODE(HTML)@en[[[name]]=[[theme-color]]]] [SRC[[[meta-theme-color]]]]
- [CODE(HTMLe)@en[[[style]]]] ※ [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[link]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[img]]]] [SRC[[[HTML Standard]]]]
- [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[[[embed]]]] [SRC[[[HTML Standard]]]]
- [CODE(HTMLe)@en[[[applet]]]] ※ [SRC[[[HTML 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]]に関する更新は特に規定がありませんが、
[[レンダリング]]と同タイミングが好ましいでしょうか。 ([[相互運用性]]に直接影響しないためか規定がありません。)
[11] [[Webブラウザー]]によっては、[[文書要素]]の[[文書への挿入]]のタイミングで[[内容スクリプト]]が実行されるかもしれません。
* 構文解析による挿入
[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]] 参照。
[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]] の挙動に影響します。
* 関連
[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>