構文解析停止

stops parsing (構文解析器)

[2] stops parsing は、構文解析が完了して文書の準備が完了した際に実行される手順 (仕様書上のアルゴリズム) です。 文書を構文解析モードから通常モードへと切り替える働きがあります。 DOMContentLoadedloadイベントは、この手順から発火されます。

仕様書

文脈

[43] 次の場面で呼び出されます。

[46] つまり navigate の結果閲覧文脈文書が更新された時には必ず実行されます。

[45] navigate は、

... を (必要なら) stops parsing より前に行っておく必要があります (navigate 参照)。 これらはどちらもネットワーク処理タスク源タスクなので、 fetchprocess response end-of-filestops parsing を呼び出すことになるタスクタスクキューに追加するよりも前の段階でこれらのタスクを追加しておく必要があることになります。

通常はそれよりもかなり前の段階で行われます。レンダリングの開始も参照。

処理

[4] 構文解析器構文解析器stops parsing は、まず次のようにしなければなりません

  1. [5] 構文解析器文書現在文書準備度を、 interactive に設定します >>1
  2. [72] 単純イベントを発火します。 >>69
    単純イベント
    イベント型
    readystatechange
    対象
    構文解析器文書
  3. [6] 構文解析器挿入点を、 null に設定します >>1
  4. [7] 構文解析器開いている要素のスタック節点をすべて pop します >>1
  5. [10] 構文解析器について構文解析終了後のスクリプト実行の処理 (script 参照。) を実行します。続きの処理>>15 とします。 >>1
    • [76] これは、 defer 属性(相当)が適用される script 要素の実行です。
    • [12] 続きの処理が同期的に呼び出されることもあれば、 別のタスクとなることもあります。

[15] 更なる処理が構文解析器について呼び出されたら、 次のようにしなければなりません >>1

  1. [13] 新しいタスクタスクキューに追加します。
    タスク
    タスク源
    DOM操作タスク源
    処理
    1. [16] 単純イベントを発火します。
      単純イベント
      イベント型
      DOMContentLoaded
      対象
      構文解析器文書
    2. [82] サービスワーカークライアント構文解析器文書設定群オブジェクトであるような ServiceWorkerContainerクライアントメッセージキューを有効化します。

[17] 現在のタスクはこれで終了します。更に、

... のすべての条件が満たされたら、現在のタスクと同じタスク源の新たなタスクタスクキューに追加しなければなりません >>1

[34] つまり、残りのスクリプトの実行完了と埋め込まれた資源の読み込み完了を待ちます。

[21] 新たなタスクは、次のようにしなければなりません >>1

  1. [22] タスクタスクキューに追加します。
    タスク
    タスク源
    DOM操作タスク源
    処理
    1. [23] 現在文書準備度を、 complete に設定します。
    2. [71] 単純イベントを発火します。 >>69
      単純イベント
      イベント型
      readystatechange
      対象
      文書
  2. [24] 文書閲覧文脈中にあるなら、単純イベントを発火します。
    単純イベント
    イベント型
    load
    対象
    文書Window
    対象上書き
    文書
  3. [25] 文書閲覧文脈中にあるなら、タスクタスクキューに追加します。
    タスク
    タスク源
    DOM操作タスク源
    処理
    1. [26] 文書page showing flagなら、
      1. [27] 文書page showing flag を、に設定します。
      2. [28] イベントを発火します。
        イベント
        イベントインターフェイス
        PageTransitionEvent
        イベント型
        pageshow
        対象
        文書Window
        対象上書き
        文書
        trusted
        bubbles
        取消可能
        persisted
        既定動作
        なし
  4. [29] 文書pending application cache download process tasksタスクがあれば、 そのままの順序で、ネットワーク処理タスク源タスクキューに追加します。リストは空にします。
  5. [30] 文書print when loaded flag が設定されていれば、 printing steps を実行します。
  6. [31] 文書を、 ready for post-load tasks とします。
  7. [25] タスクタスクキューに追加します。
    タスク
    タスク源
    DOM操作タスク源
    処理
    1. [32] 文書completely loaded を設定します。

[60] page showing flagの状態でここに到達することがあるのかどうか謎です。
[42] printing stepsイベントループ一時停止を呼び出すことがあります。 イベントを同期的に発火することもあります。
[11] HTML Standardstops parsingイベントループのスピンを使って記述していますが、 次の性質から、 stop parsing 中 (構文解析終了後のスクリプト実行の処理 >>10 を含む。) のスピンは、スピンを使わないで説明できます。

[35] 閲覧文脈外にある文書 (XHR などの文書や、 Webブラウザー以外の構文解析器文書) の場合は、 (ブラウザー拡張等独自の機能で特別な扱いがなければ、) スクリプトや埋め込み資源がなく、 stop parsing の完了後までイベントリスナーを登録することもできませんから、次の通り簡略化できます。

  1. [36] 開いている要素のスタックを空にします。
  2. [37] (本タスクを終えて新しいタスクで続きを実行します。)
  3. [38] 現在文書準備度complete に設定します。

[39] 仕様通り解釈すると >>37スピンは必ず発生することになりますが、 実際には必要ないはずです。

副作用

[48] stops parsing構文解析器の処理を終える作業であり、 構文解析器の動作中と動作後で異なる動きをする処理の分岐フラグが立てられるタイミングです。

[47] stops parsing 開始 (= readyStateinteractive となった) 段階:

[8] DOMContentLoaded 段階:

[83] readyStatecomplete となった段階:

  • [84] WebDriver で読み込み完了とみなされる場合があります。

[57] load 段階:

[50] ready for post-load tasks (stops parsing 自体の実行完了):

[51] completely loaded (stops parsing により追加されたDOM操作タスク源タスクの実行完了):

[77] embed 要素SVG を埋め込む場合の処理で 「資源を完全に読み込んだ」タイミングを参照しており、 completely loaded の意味と思われます。

[44] 更に「活性構文解析器」が stops parsing されていないこと(など)を定義としています。 stops parsing のどの段階まで完了したことを指すのかは不明瞭です。 活性構文解析器が参照されるのは document.openabort a document で、前者はどの段階と解釈しても結果は変わりません。 後者は bfcache に影響します。 completely loaded と解釈するのが自然でしょうか。

[80] webNavigation API の onCompleted は完了後とされており、 completely loaded のタイミングでしょうか。現在時刻と共に呼び出します。 ただし非文書表示ネットワークエラー等を表示している場合は、かわりに onErrorOccurred をエラーの説明の文字列と現在時刻と共に実行します。

[75] busy indicator も参照。

load イベントの遅延

[61] load イベントは、埋め込み資源などの読み込みが終わってから発火されます。

[62] 仕様書上はこれは delays the load event >>1 として記述されています。 各操作がいつからいつまで delay the load event するかが規定されており、 delay the load event するものがなくなった時、 load発火できるようになります。 delay the load event文書ごとの状態です。

[63] 次のものがあります。

element
要素
start
遅延開始
end
遅延終了
element
link HTML Standard
start
obtain the resource の開始 (>>79 も参照)
end
当該資源とその critical subresource の処理の完了
element
xml-stylesheet
start
処理開始
end
処理完了
element
style HTML Standard, SVG style
start
critical subresource の処理の開始
end
critical subresource の処理の完了
element
script HTML Standard, SVG script
start
fetch 開始
end
スクリプトの準備完了
element
img HTML Standard
start
fetch 開始
end
process response end-of-file タスク実行
element
<input type=image> HTML Standard
start
fetch 開始
end
process response end-of-file タスク実行
element
iframe HTML Standard, frame HTML Standard, embed HTML Standard, object HTML Standard
start
>>64 のいずれかが発生した時:
end
>>64すべて満たさなくなった時
element
embed HTML Standard
start
fetch 開始
end
完了
element
object HTML Standard
start
fetch 開始
end
処理タスク完了
element
object HTML Standard
start
処理タスクを追加
end
process response end-of-file タスク実行
element
video poster HTML Standard
start
fetch 開始
end
処理タスク完了
element
媒体要素 HTML Standard
start
delaying-the-load-event flag
end
delaying-the-load-event flag

[64] 入れ子閲覧文脈は、次の条件が満たされるとき、 delay the load event します。

[65] 閲覧文脈delaying load events mode >>66 は、 navigate 中に設定され、 navigate が終わるときに除去されるフラグです。

[67] 文書delay the load event フラグに対して、 navigate では文書が変化するため、こちらのフラグが使われるようです。

[68] 入れ子閲覧文脈内の文書の場合、自身の load イベント発火された後でも、親閲覧文脈側の文書load イベントを遅延させる可能性がなお残ります。

[79] preconnect, prefetch, prerender は遅延させません >>78dns-prefetch も対象外です。

歴史

[59] loadDOMContentLoadedpageshow も参照。

関連

[3] stops parsing のかわりに abort a parser が実行される場合もあります。

[81] Service workers: enable the client message queue (jungkees著, ) https://github.com/whatwg/html/commit/d61594754338b16bbc1b9e7233600f4f6667d834

[86] Editorial: fix internal cross-reference errors (annevk著, ) https://github.com/whatwg/html/commit/2e7e672927046932883c92c016299f651c866b5f

[74] Update <link>'s processing model to work well for preload (domenic著, ) https://github.com/whatwg/html/commit/eb5d1cc61cdfe7d946618cc39a1f7c3e5904a03b

[87] 23508 – Browsers want to know when a page's scripts have finished 'loading', even if the scripts aren't delaying the 'load' event any more (e.g. they do computation on startup) () https://www.w3.org/Bugs/Public/show_bug.cgi?id=23508

[88] Remove <applet> (zcorpan著, ) https://github.com/whatwg/html/commit/b9b9d60f9451c05f8e8d542e4094f987ae1a5fb8

[89] Regression fix: run iframe load event steps immediately (annevk著, ) https://github.com/whatwg/html/commit/3784c5375a36e19373982984ff761b491125a5da

[90] Make <frame> fire load synchronously with "completely loaded" (annevk著, ) https://github.com/whatwg/html/commit/16de123059bd4b3660677fb4fdc03e2053815482

[91] frame and iframe have different load-event-firing behaviors · Issue #3492 · whatwg/html () https://github.com/whatwg/html/issues/3492

[92] Make <frame> fire load synchronously with "completely loaded" by annevk · Pull Request #3495 · whatwg/html () https://github.com/whatwg/html/pull/3495

[93] document.open() simplifications, part 2 (TimothyGu著, ) https://github.com/whatwg/html/commit/ae7cf0cc1936c6c309d7279c822dffc3af147851

[94] Remove overridden reload concept (TimothyGu著, ) https://github.com/whatwg/html/commit/6440ccae7340ea41d3eb5bf8ff0b3b27363eda85

[95] Give browsing context an explicit container (annevk, , ) https://github.com/whatwg/html/commit/7b4964ad0a953b05738afc66600fa47a4dc8045d

[96] Editorial: nested browsing context is a member, not a type (annevk, , ) https://github.com/whatwg/html/commit/6b737bbc428facf34ec3728c0912cf9e172d0ea4