foster parenting

里親付け (HTML)

[3] 里親付け (foster parenting) とは、 HTML構文解析において table 要素子孫になりそうな要素テキストを他の要素に挿入することをいいます。

仕様書

文脈

[11] 里親付けは、を構成する要素 (こま見出し以外) の内容となるべき部分に以外の要素テキストが出現した時に行われます。

[12] 例えば

<table>hoge<p>abc</p><tr><td>aaa</table>

... では「hoge」や「<p>」が里親付けによって処理されます。

「abc」は p 要素子供となりますから、 このテキスト自体は里親付けの対象ではありません。

[13] 挿入モードとしては in tablein table bodyin table row が該当します。

[15] ただし仕様書上は「using the rules for」によって規定を他の挿入モードに委ねていることがあるので、 in bodyin head などの仕様上の規定に基づく要素テキストの挿入が里親付けされることがあります。
[16] また里親付けAAA活性書式付け要素の再構築の内部で発生することもあります。

[34] 里親付けが有効な状態で処理が行われるのは、 >>13挿入モードにおける 「空白以外の文字字句」、「<input type=hidden> 以外の input 開始タグ」、「その他の開始タグ」、「その他の終了タグ」 です。空白注釈字句DOCTYPEEOF里親付けの影響を受けません。終了タグもほとんどは影響を受けませんが、 brp終了タグ開始タグに置き換えられ、 影響をうけることがあります。また終了タグによって AAA が実行されて要素挿入されることもあります。

[14] 里親付けHTML構文解析器でのみ行われ、XML構文解析器では行われません。

[36] 里親付けは、構文的に正しくない文書を処理するための規則です。 HTML Standard に適合する HTML文書では、 里親付けが動作することはありません。

[37] 現在の DOM が整備される前の Webブラウザーは、 構文解析する際に、を構成するこまを記憶しつつ、 table 要素内部にありながらの一部を構成しない要素テキストをその場でレンダリングし、 table 終了タグまで到達してからレンダリングする形になっていました。

[38] この伝統的なレンダリングDOM との整合性から、 現在の里親付けを行う構文解析になっています。

処理

[17] 必要なら里親付けを考慮した節点の挿入位置のことを仕様書は節点を挿入する適切な場所 (appropriate place for inserting a node) >>5 と呼んでいます。これは次のように決定します >>5

  1. [18] 与えられた節点 (なければ現在節点) について考えます。
  2. [19] 里親付けが有効になっていて、かつ >>18節点table, thead, tbody, tfoot, tr のいずれかなら、
    1. [22] 開いている要素のスタック上に >>18 より前にある節点から 直近の templatetable を探します。
    2. [23] template があれば、その雛形内容の末尾とします。
    3. [24] そうでなく table があれば、
      1. [26] table親節点を持てば、 親節点における table の直前とします。
      2. [27] なければ、開いている要素のスタック上で >>18 の直前にある要素の末尾とします。
    4. [25] どちらもなければ、開いている要素のスタックの最古の要素の末尾とします。
  3. [20] それ以外で >>18節点template なら、その雛形内容の末尾とします。
  4. [21] それ以外なら、 >>18節点の末尾とします。

[29] スクリプトによって table が移動されている場合には、 里親付けされる節点table が元あった位置ではなく、現に存在する位置の前に挿入されます。 ただし table 要素親節点がない場合には、 元あった位置近くに挿入されます。

[28] innerHTMLtemplatetableが存在していない場合には、 里親付けされない場合と同じように末尾に節点が挿入されます。

[30] table親要素文書になっている場合、 根要素の前にテキスト要素を挿入することになりますが、 これは DOM の制約で禁止されていますから、どこにも挿入されないことになります。

[32] この「節点を挿入する適切な場所」の定義は、 HTML構文解析器の仕様上節点が挿入されるほとんどすべての場所で参照されています。

[33] AAA で既存の節点を移動する位置の決定では参照されていません。 AAA でも新しい節点の挿入は節点を挿入する適切な場所に行われます。

[35] 節点を挿入する適切な場所の決定は、ほとんどは定型の手順 (insert a character, insert a comment, insert a foreign element) に含まれています。それ以外のやや特殊な参照のされ方をするのは、 AAA での新しい節点の挿入 (子供挿入先が特殊) と HTML script 開始タグの処理 (通常の挿入処理に加え、要素に特殊なフラグを設定する) の2箇所だけです。

歴史

[4] (X)HTML5 Tracking ( 版) <http://html5.org/tools/web-apps-tracker?from=2731&to=2732>

parentNode を直接見ない形に改められました。閉じられていない a 要素があって表の内外で入れ子になっている場合や、 スクリプトによって要素構造が操作された場合の動作に影響が出ます。

[2] (X)HTML5 Tracking ( 版) <http://html5.org/tools/web-apps-tracker?from=2987&to=2988>

stylescript<input type=hidden> に関して里親付けが行われなくなりました。

[1] (X)HTML5 Tracking ( 版) <http://html5.org/tools/web-apps-tracker?from=3381&to=3382>

空白文字里親付けを行うかどうかの決定方法が変更されました。

[6] IRC logs: freenode / #whatwg / 20090709 ( 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20090709#l-210>

[10] 次の2つの補助的な用語は仕様の改訂で使われなくなっています。

[8] 挿入先の要素里親要素 (foster parent element) といいます。

[9] ある節点里親要素に挿入されることを、節点里親付けされる (foster parented) といいます。

[7] Web Applications 1.0 r8665 PARSER: Add a parse error for non-space characters in <table> elements ( ( 版)) <http://html5.org/r/8665>