[3] [DFN[[RUBYB[[[開いている要素のスタック]]]@en[stack of open elements]]]]は、
[[HTML構文解析器]]と[[XML構文解析器]]において、(明示的または暗示的な)
[[開始タグ]]が現れ、まだ[[終了タグ]]が現れていない[[要素]]が積まれる[[スタック]]です。

* 仕様書

[REFS[
- [2] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#stack-of-open-elements>'''
- [7] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#parsing-xhtml-documents>
- [8] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#update-a-style-block>
- [11] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#the-object-element>
- [12] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#text-track>
- [13] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#the-applet-element>
- [25] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-03-05 09:33:40 +09:00]] 版) <https://html.spec.whatwg.org/#the-textarea-element>
]REFS]

* 操作と状態

[4] この[[スタック]]は[RUBYB[下方向]@en[downward]]へと進みます。
最初に追加された[[要素]] ([[根要素]]) は[RUBYB[最上]@en[topmost]]、
最も直近に追加された[[要素]]は[RUBYB[最下方]@en[bottommost]]と呼ばれています。

[5] このスタックには次のような変更操作が行われます。
[FIG(short list)[
- [[節点]]を1つ [[push]]
- [[節点]]をいくつか [[pop]]
- ある位置に[[節点]]を挿入 ([[AAA]])
- ある位置の[[節点]]を削除 ([[AAA]])
- すべて削除 (終了時)
]FIG]

[22] このスタックは、末尾、先頭など任意の位置にアクセスがあります。

[6] 初期状態ではこの[[スタック]]は空です。 [[HTML構文解析器]]の場合、一旦[[要素]]が追加されると、
最後まで空にはなりません。
[[XML構文解析器]]の場合、[[文書要素]]の[[終了タグ]]により空になります。
どちらの[[構文解析器]]でも、最終的に [[stops parsing]] により、
すべての[[要素]]が[[スタック]]から除去されます。 ([[abort a parser]]
が行われる場合は、[[スタック]]から除去されないまま[[構文解析器]]が破棄されることになります。)

** has an element in scope

[FIG(list middle)[

[HISTORY[
- [DFN[has an element in select scope]]
]HISTORY]

]FIG]

* 現在節点

[16] [[開いている要素のスタック]]の最下方の[[要素]] (最も直近に追加された[[要素]])
のことを[DFN[[RUBYB[[[現在節点]]]@en[current node]]]]といいます [SRC[>>2]]。

[17] [DFN[[RUBYB[[[調整済み現在節点]]]@en[adjusted current node]]]]とは、
[[HTML素片構文解析アルゴリズム]]によって起動された[[構文解析器]]で[[開いている要素のスタック]]の[[要素]]が1つだけの時は[[文脈要素]]、
それ以外の時は[[現在節点]]と同じものです [SRC[>>2]]。

;; [18] [[調整済み現在節点]]は、[[構文解析器]]によって[[外来要素]]に関する処理がなされる際に参照されます。
[[HTML素片構文解析アルゴリズム]] ([CODE(HTMLa)@en[[[innerHTML]]]]) でも[[開いている要素のスタック]]の最上方の[[要素]]は [[HTML]] の [CODE(HTMLe)@en[[[html]]]] [[要素]]ですが、
[[調整済み現在節点]]としてはそのかわりに[[文脈要素]]が使われるので、
[[文脈要素]]が[[外来要素]] ([[SVG]]、[[MathML]]) ならそのように処理されることとなります。

[19] [[現在節点]]は、[[構文解析器]]のあらゆる部分で参照されています。

[20] [[調整済み現在節点]]は、[[構文解析器]]の次の処理で参照されています。
[FIG(list)[
- [[HTML構文解析器]]における [CODE(HTML)@en[[[CDATA]]]] [[区間]]に関する分岐
- [[HTML構文解析器]]における[[木構築発送器]]の分岐
- [[HTML構文解析器]]における[[外来要素]]の[[名前空間]]の決定
]FIG]

;; [21] [[reset the insertion mode appropriately]] でも最上方の [CODE(HTMLe)@en[[[html]]]]
[[要素]]のかわりに[[文脈要素]]が参照されます。 (ただし[[現在節点]]とは限りません。)

* 要素の処理

[10] [[開いている要素のスタック]]から[[要素]]が除去された時に、
副作用として[[要素]]固有の処理が実行されることがあります。

[9] そのような[[要素]]固有の処理は、[[開いている要素のスタック]]上にあるかどうかによって分岐することがあります。

[FIG(list)[
- [[update a [CODE(HTMLe)@en[style]] block]] [SRC[>>8]]
- [CODE(HTMLe)@en[[[object]]]] [[要素]]の処理 [SRC[>>11]]
- [[text track]] の処理 [SRC[>>12]]
- [CODE(HTMLe)@en[[[textarea]]]] [[要素]]の[[再設定アルゴリズム]] [SRC[>>25]]

[HISTORY[
- [CODE(HTMLe)@en[[[applet]]]] [[要素]]の処理 [SRC[>>13]]
]HISTORY]
]FIG]

;; [23] このような[[要素]]の一覧は次の [[JSON]] データファイルの [CODE[has_popped_action]] から得られます。
[REFS[
- [CITE@en[data-web-defs/elements.txt at master · manakai/data-web-defs]] ([TIME[2014-08-09 13:23:14 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/elements.txt>
]REFS]

[26] 一般にこうした操作は[[構文解析器]]外では[[要素]]が[[挿入]]された時点で実行されるものですが、
[[構文解析器]]内では[[終了タグ]]時点まで実行が遅延されることになります。

;; [14] [[HTML]] と [[SVG]] の [CODE(HTMLe)@en[[[script]]]] [[要素]]も[[終了タグ]]時点で特別な動作がありますが、[[EOF]]
や祖先の[[終了タグ]]によって[[開いている要素のスタック]]から除去される場合には動作しないので、
>>9 とは異なります。

;; [15] [CODE(HTMLe)@en[[[link]]]] [[要素]]の処理など、[[構文解析器]]によるかどうかに関わらず、
[[木]]に[[要素]]が挿入された時点で発生するものも多々あります。

* 歴史

[28] [DFN[開いている要素]]という語は [[SGML]] でも使われていました。

[REFS[
- [1] [CITE[IRC logs: freenode / #whatwg / 20140611]]
( ([TIME[2014-06-12 11:20:51 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140611>
- [24] [CITE@en[Web Applications 1.0 r8886  Make sure <textarea> is reset when you parse the end tag, since otherwise it wouldn't actually ever work...]] ([TIME[2015-03-05 08:08:00 +09:00]] 版) <https://html5.org/r/8886>
]REFS]

[27] [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>

[29] [CITE@en[Remove <applet>]]
([[zcorpan]]著, [TIME[2017-08-21 22:19:30 +09:00]])
<https://github.com/whatwg/html/commit/b9b9d60f9451c05f8e8d542e4094f987ae1a5fb8>

[30] [CITE@en[<style> should use child text content changed steps · Issue #2996 · whatwg/html]]
([TIME[2017-09-19 22:43:33 +09:00]])
<https://github.com/whatwg/html/issues/2996>