[2] stops parsing は、構文解析が完了して文書の準備が完了した際に実行される手順
(仕様書上のアルゴリズム) です。
文書を構文解析モードから通常モードへと切り替える働きがあります。
DOMContentLoaded
や load
のイベントは、この手順から発火されます。
[43] 次の場面で呼び出されます。
[45] navigate は、... を (必要なら) stops parsing より前に行っておく必要があります (navigate 参照)。 これらはどちらもネットワーク処理タスク源のタスクなので、 fetch が process response end-of-file で stops parsing を呼び出すことになるタスクをタスクキューに追加するよりも前の段階でこれらのタスクを追加しておく必要があることになります。
[4] 構文解析器構文解析器の stops parsing は、まず次のようにしなければなりません。
[15] 更なる処理が構文解析器について呼び出されたら、
次のようにしなければなりません >>1。
[17] 現在のタスクはこれで終了します。更に、
[21] 新たなタスクは、次のようにしなければなりません >>1。
<meta http-equiv=Set-Cookie>
を処理する場合、ストレージミューテックスを取得した状態になります。スピンの場合とスピンを使わない説明とでは、解放のタイミングが変わってきます。ただし実際の Webブラウザーはストレージミューテックスを使っていません。使っていたとしても、ストレージミューテックスをイベントループが所有していることにより動作が違うことを観測するのは著者にとっても利用者にとっても困難と思われます。[35] 閲覧文脈外にある文書 (XHR などの文書や、 Webブラウザー以外の構文解析器の文書) の場合は、
(ブラウザー拡張等独自の機能で特別な扱いがなければ、)
スクリプトや埋め込み資源がなく、 stop parsing の完了後までイベントリスナーを登録することもできませんから、次の通り簡略化できます。
[48] stops parsing は構文解析器の処理を終える作業であり、 構文解析器の動作中と動作後で異なる動きをする処理の分岐フラグが立てられるタイミングです。
[47] stops parsing 開始 (= readyState
が interactive
となった) 段階:document.write
/document.writeln
は以後 document.open
を伴うようになります。
[8] DOMContentLoaded
段階:webNavigation
API の onDOMContentLoaded
を、現在時刻と共に呼び出します。
[83] readyState
が complete
となった段階:
[50] ready for post-load tasks (stops parsing 自体の実行完了):iframe
/object
/embed
/frame
の delay the load event が終わります。window.print
が遅延されていたのが解除されます。document.open
が新しいソースコードを使うものだとみなされるようになります。
[51] completely loaded (stops parsing により追加されたDOM操作タスク源のタスクの実行完了):
[77] embed
要素が SVG を埋め込む場合の処理で
「資源を完全に読み込んだ」タイミングを参照しており、 completely loaded
の意味と思われます。
[44] 更に「活性構文解析器」が stops parsing されていないこと(など)を定義としています。
stops parsing のどの段階まで完了したことを指すのかは不明瞭です。
活性構文解析器が参照されるのは document.open
と abort 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] 次のものがあります。link
HTML Standardxml-stylesheet
style
HTML Standard,
SVG style
script
HTML Standard,
SVG script
img
HTML Standard<input type=image>
HTML Standardiframe
HTML Standard,
frame
HTML Standard,
embed
HTML Standard,
object
HTML Standardembed
HTML Standardobject
HTML Standardobject
HTML Standardvideo
poster
HTML Standard
[64] 入れ子閲覧文脈は、次の条件が満たされるとき、 delay the load event
します。
[65] 閲覧文脈の delaying load
events mode >>66
は、 navigate 中に設定され、 navigate が終わるときに除去されるフラグです。
[68] 入れ子閲覧文脈内の文書の場合、自身の load
イベントが発火された後でも、親閲覧文脈側の文書の
load
イベントを遅延させる可能性がなお残ります。
[79] preconnect
, prefetch
, prerender
は遅延させません >>78。 dns-prefetch
も対象外です。
[59] load
、DOMContentLoaded
、
pageshow
も参照。
[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