diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php
index 967d616129647..2fd51db80a7bc 100644
--- a/src/wp-includes/html-api/class-wp-html-processor.php
+++ b/src/wp-includes/html-api/class-wp-html-processor.php
@@ -3256,38 +3256,60 @@ private function step_in_body(): bool {
/*
* > Any other end tag
*/
+ return $this->step_in_body_any_other_end_tag();
+ }
- /*
- * Find the corresponding tag opener in the stack of open elements, if
- * it exists before reaching a special element, which provides a kind
- * of boundary in the stack. For example, a `` should not
- * close anything beyond its containing `P` or `DIV` element.
- */
- foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
- if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
- break;
- }
+ $this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
+ // This unnecessary return prevents tools from inaccurately reporting type errors.
+ return false;
+ }
- if ( self::is_special( $node ) ) {
- // This is a parse error, ignore the token.
- return $this->step();
- }
+ /**
+ * Applies the "any other end tag" parsing instructions for the IN BODY insertion mode.
+ *
+ * @since 7.1.0
+ * @ignore
+ *
+ * @throws WP_HTML_Unsupported_Exception When encountering unsupported HTML input.
+ *
+ * @see https://html.spec.whatwg.org/#parsing-main-inbody
+ * @see WP_HTML_Processor::step_in_body
+ *
+ * @return bool Whether an element was found.
+ */
+ private function step_in_body_any_other_end_tag(): bool {
+ $token_name = $this->get_token_name();
+
+ /*
+ * Find the corresponding tag opener in the stack of open elements, if
+ * it exists before reaching a special element, which provides a kind
+ * of boundary in the stack. For example, a `` should not
+ * close anything beyond its containing `P` or `DIV` element.
+ */
+ foreach ( $this->state->stack_of_open_elements->walk_up() as $node ) {
+ if ( 'html' === $node->namespace && $token_name === $node->node_name ) {
+ break;
}
- $this->generate_implied_end_tags( $token_name );
- if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
- // @todo Record parse error: this error doesn't impact parsing.
+ if ( self::is_special( $node ) ) {
+ // This is a parse error, ignore the token.
+ return $this->step();
}
+ }
- foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
- $this->state->stack_of_open_elements->pop();
- if ( $node === $item ) {
- return true;
- }
+ $this->generate_implied_end_tags( $token_name );
+ if ( $node !== $this->state->stack_of_open_elements->current_node() ) {
+ // @todo Record parse error: this error doesn't impact parsing.
+ }
+
+ foreach ( $this->state->stack_of_open_elements->walk_up() as $item ) {
+ $this->state->stack_of_open_elements->pop();
+ if ( $node === $item ) {
+ return true;
}
}
- $this->bail( 'Should not have been able to reach end of IN BODY processing. Check HTML API code.' );
+ $this->bail( 'Should not have been able to reach end of "any other end tag" IN BODY processing. Check HTML API code.' );
// This unnecessary return prevents tools from inaccurately reporting type errors.
return false;
}