HTML API: Visit implied body at EOF after head#46
Conversation
[P2] Mark EOF-implied BODY nodes as virtual — src/wp-includes/html-api/class-wp-html-processor.php:1072-1072 When EOF is processed after the last real token was an ignored BODY token, such as a full document ending with <template><body> or <noscript></body>, this branch leaves state->current_token pointing at that stale BODY. The implied BODY inserted at EOF is then classified by the stack push handler as the same real token, so next_token() exposes a null token and serialization emits </body> without a matching <body>. Please ensure EOF-created nodes are always treated as virtual, or clear/use a synthetic EOF token before implied nodes are inserted.
|
The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the Core Committers: Use this line as a base for the props when committing in SVN: To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. |
Code reviewFound 1 issue:
wordpress-develop/src/wp-includes/html-api/class-wp-html-processor.php Lines 231 to 238 in 58dab55 wordpress-develop/src/wp-includes/html-api/class-wp-html-processor.php Lines 5264 to 5271 in 58dab55 Also verified (no action needed): the EOF reprocess chains terminate (each 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
# Conflicts: # src/wp-includes/html-api/class-wp-html-processor.php
What changed
This updates the HTML Processor EOF path so full-document parsing continues through the selected insertion mode once at EOF. That allows the parser to visit the implied
<body>and the virtual EOF closers after documents that end inin head/after headstates.It also marks EOF-driven stack events as virtual even when the last concrete token was ignored, avoiding stale real-token provenance on implied EOF nodes.
Why
When a full document ended after the head, the processor could complete before
after headinserted the impliedBODY. Serialization then omitted<body></body>even though the HTML tree includes that element.Validation
codex review --base 095fab550244b7e68541a95c5262a00089a45cc4(only finding was an out-of-scope media CSS issue from the stale base; the PR compare is scoped to the HTML API files)WP_TESTS_SKIP_INSTALL=1 ./vendor/bin/phpunit --group html-api,html-api-html5lib-tests./vendor/bin/phpcs src/wp-includes/html-api/class-wp-html-processor.php tests/phpunit/tests/html-api/wpHtmlProcessor-serialize.php