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 338f3e0187a45..e438434bb312a 100644
--- a/src/wp-includes/html-api/class-wp-html-processor.php
+++ b/src/wp-includes/html-api/class-wp-html-processor.php
@@ -2700,7 +2700,6 @@ private function step_in_body(): bool {
*
* These ought to be handled in the attribute methods.
*/
- $this->state->current_token->namespace = 'math';
$this->insert_foreign_element( $this->state->current_token, false );
if ( $this->state->current_token->has_self_closing_flag ) {
$this->state->stack_of_open_elements->pop();
@@ -2719,7 +2718,6 @@ private function step_in_body(): bool {
*
* These ought to be handled in the attribute methods.
*/
- $this->state->current_token->namespace = 'svg';
$this->insert_foreign_element( $this->state->current_token, false );
if ( $this->state->current_token->has_self_closing_flag ) {
$this->state->stack_of_open_elements->pop();
@@ -4131,7 +4129,6 @@ private function step_in_foreign_content(): bool {
$this->state->frameset_ok = false;
}
- $this->state->current_token->namespace = $adjusted_current_node->namespace;
$this->insert_foreign_element( $this->state->current_token, false );
return true;
@@ -4141,7 +4138,6 @@ private function step_in_foreign_content(): bool {
case '#cdata-section':
case '#comment':
case '#funky_comment':
- $this->state->current_token->namespace = $adjusted_current_node->namespace;
$this->insert_foreign_element( $this->state->current_token, false );
return true;
@@ -4231,17 +4227,7 @@ private function step_in_foreign_content(): bool {
* > Any other start tag
*/
if ( ! $this->is_tag_closer() ) {
- // @todo Adjust foreign attributes; this probably should be done in get_attribute().
-
- $adjusted_current_node = $this->get_adjusted_current_node();
-
- $this->state->current_token->namespace = $adjusted_current_node->namespace;
- if ( $this->is_mathml_integration_point() ) {
- $this->state->current_token->integration_node_type = 'math';
- } elseif ( $this->is_html_integration_point() ) {
- $this->state->current_token->integration_node_type = 'html';
- }
- $this->insert_foreign_element( $this->state->current_token, $this->state->current_token->namespace, false );
+ $this->insert_foreign_element( $this->state->current_token, false );
if ( $this->state->current_token->has_self_closing_flag ) {
if ( 'SCRIPT' === $this->state->current_token->node_name && 'svg' === $this->state->current_token->namespace ) {
@@ -5459,13 +5445,31 @@ private function insert_html_element( WP_HTML_Token $token ): void {
*
* @see https://html.spec.whatwg.org/#insert-a-foreign-element
*
- * @param WP_HTML_Token $token Insert this token.
- * @param string $element_namespace Either 'math' or 'svg'.
- * @param bool $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
- * insertion location" algorithm when adding this element.
+ * @param WP_HTML_Token &$token Insert this token. The token will be
+ * modified to update its namespace and
+ * insertion point correctly.
+ * @param bool $only_add_to_element_stack Whether to skip the "insert an element at the adjusted
+ * insertion location" algorithm when adding this element.
*/
- private function insert_foreign_element( WP_HTML_Token $token, bool $only_add_to_element_stack ): void {
- // @todo Let the adjusted insertion location be the appropriate place for inserting a node.
+ private function insert_foreign_element( WP_HTML_Token &$token, bool $only_add_to_element_stack ): void {
+ $adjusted_current_node = $this->get_adjusted_current_node();
+
+ $namespace = $adjusted_current_node ? $adjusted_current_node->namespace : $this->get_namespace();
+
+ if (
+ 'html' === $namespace &&
+ ( 'SVG' === $token->node_name || 'MATH' === $token->node_name )
+ ) {
+ $token->namespace = strtolower( $token->node_name );
+ } else {
+ $token->namespace = $namespace;
+ }
+
+ if ( $this->is_mathml_integration_point() ) {
+ $token->integration_node_type = 'math';
+ } elseif ( $this->is_html_integration_point() ) {
+ $token->integration_node_type = 'html';
+ }
if ( false === $only_add_to_element_stack ) {
/*