Skip to content
Closed
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
11e758e
Fix typo in comment
sirreal Jan 20, 2026
84c65af
Do not trim leading text node whitespace
sirreal Jan 20, 2026
d483c8d
Update test without leading whitespace, use nowdoc
sirreal Jan 20, 2026
72e7c40
Add test for https://core.trac.wordpress.org/ticket/64531
sirreal Jan 20, 2026
9f672ba
Add whitespace inside block delimiters
sirreal Jan 20, 2026
19ed504
Merge branch 'trunk' into 64531/ensure-whitespace-check-assertEqualHTML
sirreal Jan 20, 2026
1e9b067
Correct whitespace in scripts HTML tests
sirreal Jan 20, 2026
76ec5b1
lint
sirreal Jan 20, 2026
79d0a66
Cleanup debug code
sirreal Jan 20, 2026
e90bfbf
Fix script modules tests
sirreal Jan 20, 2026
e205a2c
Remove redundant "snapshots" from assertEqualHTML test assertion mess…
sirreal Jan 20, 2026
2493b26
Fix archives tests
sirreal Jan 20, 2026
b2cca85
Use nowdoc without indentation for block_markup
sirreal Jan 20, 2026
1bfbe89
Remove redundant snapshot from assertion message
sirreal Jan 20, 2026
1580d3b
Fix simple test, remove extra whitespace
sirreal Jan 20, 2026
e44a2ad
Add nested blocks text nodes test
sirreal Jan 20, 2026
951307e
Fix whitespace in blocks tests
sirreal Jan 20, 2026
23e18f7
Debugging code with invis chars
sirreal Jan 20, 2026
d2a2977
Revert "Debugging code with invis chars"
sirreal Jan 20, 2026
29faaf5
remove block indentation
sirreal Jan 20, 2026
236267a
Fix block-template-utils HTML whitespace in tests
sirreal Jan 20, 2026
f670eb8
Improve comment language
sirreal Jan 21, 2026
6e9877b
Merge branch 'trunk' into 64531/ensure-whitespace-check-assertEqualHTML
sirreal Jan 21, 2026
6dd1ee6
Merge branch 'trunk' into 64531/ensure-whitespace-check-assertEqualHTML
sirreal Jan 22, 2026
96e63f6
Remove redundant trim()
sirreal Jan 22, 2026
fd4f95f
Add ticket annotation to modified test
sirreal Jan 23, 2026
a1ca3f0
Merge branch 'trunk' into 64531/ensure-whitespace-check-assertEqualHTML
sirreal Jan 23, 2026
f9110f9
Merge branch 'trunk' into 64531/ensure-whitespace-check-assertEqualHTML
sirreal Jan 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions tests/phpunit/includes/build-visual-html-tree.php
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ static function ( $a, $b ) {
case '#cdata-section':
case '#text':
$text_content = $processor->get_modifiable_text();
if ( '' === trim( $text_content, " \f\t\r\n" ) ) {
if ( '' === $text_content ) {
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was the main problem, it effectively eliminated whitespace text completely, and leading whitespace from existing text nodes.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was this added in the first place? The trim() here occurs after decoding, meaning that any raw markup would have already been processed and whitespace normalized.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was introduced as part of block delimiters appearing in the HTML tree. That change is not open source, this was largely developed in another project before being proposed for Core.

break;
}
$was_text = true;
Expand Down Expand Up @@ -237,7 +237,7 @@ static function ( $a, $b ) {
++$indent_level;
}

// If they're no attributes, we're done here.
// If there are no attributes, we're done here.
Comment thread
sirreal marked this conversation as resolved.
Outdated
if ( empty( $block_attrs ) ) {
break;
}
Expand Down
55 changes: 48 additions & 7 deletions tests/phpunit/tests/build-visual-html-tree.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
*/
class Tests_Build_Equivalent_HTML_Semantic_Tree extends WP_UnitTestCase {
public function data_build_equivalent_html_semantic_tree() {
$block_markup = <<<END
<!-- wp:separator {"className":"is-style-default has-custom-classname","style":{"spacing":{"margin":{"top":"50px","bottom":"50px"}}},"backgroundColor":"accent-1"} -->
<hr class="wp-block-separator is-style-default has-custom-classname" style="margin-top: 50px; margin-bottom: 50px" />
<!-- /wp:separator -->
END;
$block_markup = <<<'HTML'
<!-- wp:separator {"className":"is-style-default has-custom-classname","style":{"spacing":{"margin":{"top":"50px","bottom":"50px"}}},"backgroundColor":"accent-1"} -->
<hr class="wp-block-separator is-style-default has-custom-classname" style="margin-top: 50px; margin-bottom: 50px" />
<!-- /wp:separator -->
HTML;

$tree_structure = <<<END
$tree_structure = <<<'TREE'
BLOCK["core/separator"]
{
"backgroundColor": "accent-1",
Expand All @@ -29,11 +29,15 @@ public function data_build_equivalent_html_semantic_tree() {
}
}
}
"
"
<hr>
class="has-custom-classname is-style-default wp-block-separator"
style="margin-top:50px;margin-bottom:50px;"
"
"

END;
TREE;

return array(
'Block delimiter' => array( $block_markup, $tree_structure ),
Expand Down Expand Up @@ -141,4 +145,41 @@ public function test_build_equivalent_html_semantic_tree_with_non_equivalent_htm

$this->assertNotSame( $tree_expected, $tree_actual );
}

/**
* @ticket 64531
*
* @covers ::build_visual_html_tree
*/
public function test_spacing() {
$html = <<<'HTML'
<p> space-surrounded&#x20;</p>
<p>&nbsp;nbsp-surrounded&#xA0;</p>
<p>
newline-surrounded&#xA;</p>
<p>&#x9;tab-surrounded </p>
<p>ok</p>
HTML;

$expected = <<<TREE
<p>
" space-surrounded "
"\n"
<p>
"\u{00A0}nbsp-surrounded\u{00A0}"
"\n"
<p>
"\nnewline-surrounded\n"
"\n"
<p>
"\ttab-surrounded\t"
"\n"
<p>
"ok"

TREE;

$tree_result = build_visual_html_tree( $html, '<body>' );
$this->assertSame( $expected, $tree_result );
}
}
138 changes: 67 additions & 71 deletions tests/phpunit/tests/dependencies/scripts.php
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ public function test_delayed_dependent_with_blocking_dependency( $strategy ) {
wp_enqueue_script( 'main-script-a2', '/main-script-a2.js', array( 'dependency-script-a2' ), null, compact( 'strategy' ) );
$output = get_echo( 'wp_print_scripts' );
$expected = "<script id='dependency-script-a2-js' src='/dependency-script-a2.js'></script>\n";
$expected .= "<script src='/main-script-a2.js' id='main-script-a2-js' {$strategy} data-wp-strategy='{$strategy}'></script>";
$expected .= "<script src='/main-script-a2.js' id='main-script-a2-js' {$strategy} data-wp-strategy='{$strategy}'></script>\n";
$this->assertEqualHTML( $expected, $output, '<body>', 'Dependents of a blocking dependency are free to have any strategy.' );
}

Expand All @@ -309,8 +309,9 @@ public function test_blocking_dependent_with_delayed_dependency( $strategy ) {
wp_enqueue_script( 'dependent-script-a3', '/dependent-script-a3.js', array( 'main-script-a3' ), null );
$output = get_echo( 'wp_print_scripts' );
$expected = <<<JS
<script src='/main-script-a3.js' id='main-script-a3-js' data-wp-strategy='{$strategy}'></script>
<script id="dependent-script-a3-js" src="/dependent-script-a3.js"></script>
<script src='/main-script-a3.js' id='main-script-a3-js' data-wp-strategy='{$strategy}'></script>
<script id="dependent-script-a3-js" src="/dependent-script-a3.js"></script>

JS;
$this->assertEqualHTML( $expected, $output, '<body>', 'Blocking dependents must force delayed dependencies to become blocking.' );
}
Expand Down Expand Up @@ -1076,7 +1077,7 @@ public function test_various_strategy_dependency_chains( $set_up, $expected_mark
public function test_loading_strategy_with_defer_having_no_dependents_nor_dependencies() {
wp_enqueue_script( 'main-script-d1', 'http://example.com/main-script-d1.js', array(), null, array( 'strategy' => 'defer' ) );
$output = get_echo( 'wp_print_scripts' );
$expected = "<script src='http://example.com/main-script-d1.js' id='main-script-d1-js' defer data-wp-strategy='defer'></script>\n";
$expected = "<script src='http://example.com/main-script-d1.js' id='main-script-d1-js' defer data-wp-strategy='defer'></script>";
$this->assertEqualHTMLScriptTagById( $expected, $output, 'Expected defer, as there is no dependent or dependency' );
}

Expand Down Expand Up @@ -1285,22 +1286,20 @@ public function data_provider_to_test_fetchpriority_bumping(): array {
return array(
'enqueue_bajo' => array(
'enqueues' => array( 'bajo' ),
'expected' => '<script fetchpriority="low" id="bajo-js" src="/bajo.js"></script>',
'expected' => "<script fetchpriority='low' id='bajo-js' src='/bajo.js'></script>\n",
),
'enqueue_auto' => array(
'enqueues' => array( 'auto' ),
'expected' => '
<script src="/bajo.js" id="bajo-js" data-wp-fetchpriority="low"></script>
<script src="/auto.js" id="auto-js"></script>
',
'expected' =>
"<script src='/bajo.js' id='bajo-js' data-wp-fetchpriority='low'></script>\n" .
"<script src='/auto.js' id='auto-js'></script>\n",
),
'enqueue_alto' => array(
'enqueues' => array( 'alto' ),
'expected' => '
<script src="/bajo.js" id="bajo-js" fetchpriority="high" data-wp-fetchpriority="low"></script>
<script src="/auto.js" id="auto-js" fetchpriority="high" data-wp-fetchpriority="auto"></script>
<script src="/alto.js" id="alto-js" fetchpriority="high"></script>
',
'expected' =>
"<script src='/bajo.js' id='bajo-js' fetchpriority='high' data-wp-fetchpriority='low'></script>\n" .
"<script src='/auto.js' id='auto-js' fetchpriority='high' data-wp-fetchpriority='auto'></script>\n" .
"<script src='/alto.js' id='alto-js' fetchpriority='high'></script>\n",
),
);
}
Expand Down Expand Up @@ -1354,16 +1353,17 @@ public function test_fetchpriority_bumping_a_to_z() {
wp_enqueue_script( 'x' );

$actual = get_echo( 'wp_print_scripts' );
$expected = '
<script src="/z.js" id="z-js" fetchpriority="high" data-wp-fetchpriority="auto"></script>
<script src="/d.js" id="d-js" fetchpriority="high"></script>
<script src="/e.js" id="e-js"></script>
<script src="/c.js" id="c-js"></script>
<script src="/b.js" id="b-js"></script>
<script src="/a.js" id="a-js" fetchpriority="low"></script>
<script src="/y.js" id="y-js" fetchpriority="high" data-wp-fetchpriority="auto"></script>
<script src="/x.js" id="x-js" fetchpriority="high"></script>
';
$expected = <<<'HTML'
<script src="/z.js" id="z-js" fetchpriority="high" data-wp-fetchpriority="auto"></script>
<script src="/d.js" id="d-js" fetchpriority="high"></script>
<script src="/e.js" id="e-js"></script>
<script src="/c.js" id="c-js"></script>
<script src="/b.js" id="b-js"></script>
<script src="/a.js" id="a-js" fetchpriority="low"></script>
<script src="/y.js" id="y-js" fetchpriority="high" data-wp-fetchpriority="auto"></script>
<script src="/x.js" id="x-js" fetchpriority="high"></script>

HTML;
$this->assertEqualHTML( $expected, $actual, '<body>', "Snapshot:\n$actual" );
}

Expand Down Expand Up @@ -1419,7 +1419,7 @@ public function test_priority_of_dependency_for_non_enqueued_dependent() {

$actual = $this->normalize_markup_for_snapshot( get_echo( array( $wp_scripts, 'print_scripts' ) ) );
$this->assertEqualHTML(
'<script src="/wp-includes/js/comment-reply.js" id="comment-reply-js" async data-wp-strategy="async" fetchpriority="low"></script>',
"<script src='/wp-includes/js/comment-reply.js' id='comment-reply-js' async data-wp-strategy='async' fetchpriority='low'></script>\n",
$actual,
'<body>',
"Snapshot:\n$actual"
Expand Down Expand Up @@ -1456,7 +1456,7 @@ public function test_printing_default_script_comment_reply_enqueued_or_not_enque

$this->assertEqualHTML(
sprintf(
'<script src="%s" id="comment-reply-js" async data-wp-strategy="async" fetchpriority="low"></script>',
"<script src='%s' id='comment-reply-js' async data-wp-strategy='async' fetchpriority='low'></script>\n",
includes_url( 'js/comment-reply.js' )
),
$markup
Expand Down Expand Up @@ -1497,7 +1497,7 @@ public function test_loading_strategy_with_invalid_defer_registration() {
wp_enqueue_script( 'dependent-script-d4-3', '/dependent-script-d4-3.js', array( 'dependent-script-d4-2' ), null, array( 'strategy' => 'defer' ) );

$output = get_echo( 'wp_print_scripts' );
$expected = "<script src='/main-script-d4.js' id='main-script-d4-js' data-wp-strategy='defer'></script>\n";
$expected = "<script src='/main-script-d4.js' id='main-script-d4-js' data-wp-strategy='defer'></script>";
$this->assertEqualHTMLScriptTagById( $expected, $output, 'Scripts registered as defer but that have all dependents with no strategy, should become blocking (no strategy).' );
Comment on lines +1500 to 1501
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may seem surprising that this assertion removes a trailing newline. This is using assertEqualHTMLScriptTagById() which matches the script tag, so a trailing newline will never be expected.

assertEqualHTMLScriptTagById() could probably trim its input, but it seems fine to just clean things up.

}

Expand Down Expand Up @@ -2210,6 +2210,7 @@ public function test_wp_add_inline_script_before() {
console.log("before");
//# sourceURL=test-example-js-before
</script>

HTML;
$expected .= "<script src='http://example.com' id='test-example-js'></script>\n";

Expand All @@ -2229,6 +2230,7 @@ public function test_wp_add_inline_script_after() {
console.log("after");
//# sourceURL=test-example-js-after
</script>

HTML;

$this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
Expand Down Expand Up @@ -2574,13 +2576,13 @@ public function test_wp_add_inline_script_customize_dependency() {
_print_scripts();
$print_scripts = $this->getActualOutput();

$expected = "<script src='/customize-dependency.js' id='customize-dependency-js'></script>\n";
$expected = "<script src='/customize-dependency.js' id='customize-dependency-js'></script>";
$this->assertEqualHTMLScriptTagById( $expected, $print_scripts );

$expected = "<script id='customize-dependency-js-after'>\n";
$expected .= "tryCustomizeDependency()\n";
$expected .= "//# sourceURL=customize-dependency-js-after\n";
$expected .= "</script>\n";
$expected .= '</script>';
$this->assertEqualHTMLScriptTagById( $expected, $print_scripts );
}

Expand Down Expand Up @@ -3518,6 +3520,9 @@ public function test_wp_scripts_move_to_footer( $set_up, $expected_header, $expe
wp_scripts()->do_footer_items();
$footer = ob_get_clean();

// $expected_footer = trim( $expected_footer, "\n\t" );
// $expected_header = trim( $expected_header, "\n\t" );

$this->assertEqualHTML( $expected_header, $header, '<body>', 'Expected header script markup to match.' );
$this->assertEqualHTML( $expected_footer, $footer, '<body>', 'Expected footer script markup to match.' );
$this->assertEqualSets( $expected_in_footer, wp_scripts()->in_footer, 'Expected to have the same handles for in_footer.' );
Expand Down Expand Up @@ -3567,10 +3572,9 @@ public function data_provider_script_move_to_footer() {
wp_enqueue_script( 'script-b', 'https://example.com/script-b.js', array( 'script-a' ), null, array( 'in_footer' => true ) );
},
'expected_header' => '',
'expected_footer' => '
<script src="https://example.com/script-a.js" id="script-a-js" data-wp-strategy="defer"></script>
<script src="https://example.com/script-b.js" id="script-b-js"></script>
',
'expected_footer' =>
"<script src='https://example.com/script-a.js' id='script-a-js' data-wp-strategy='defer'></script>\n" .
"<script src='https://example.com/script-b.js' id='script-b-js'></script>\n",
'expected_in_footer' => array(
'script-a',
'script-b',
Expand All @@ -3588,10 +3592,9 @@ public function data_provider_script_move_to_footer() {
wp_enqueue_script( 'script-b', 'https://example.com/script-b.js', array( 'script-a' ), null, array( 'in_footer' => true ) );
},
'expected_header' => '',
'expected_footer' => '
<script src="https://example.com/script-a.js" id="script-a-js" data-wp-strategy="async"></script>
<script src="https://example.com/script-b.js" id="script-b-js"></script>
',
'expected_footer' =>
"<script src='https://example.com/script-a.js' id='script-a-js' data-wp-strategy='async'></script>\n" .
"<script src='https://example.com/script-b.js' id='script-b-js'></script>\n",
'expected_in_footer' => array(
'script-a',
'script-b',
Expand All @@ -3608,10 +3611,9 @@ public function data_provider_script_move_to_footer() {
wp_enqueue_script( 'script-a', 'https://example.com/script-a.js', array(), null, array( 'strategy' => 'defer' ) );
wp_enqueue_script( 'script-b', 'https://example.com/script-b.js', array( 'script-a' ), null, array( 'in_footer' => false ) );
},
'expected_header' => '
<script src="https://example.com/script-a.js" id="script-a-js" data-wp-strategy="defer"></script>
<script src="https://example.com/script-b.js" id="script-b-js"></script>
',
'expected_header' =>
"<script src='https://example.com/script-a.js' id='script-a-js' data-wp-strategy='defer'></script>\n" .
"<script src='https://example.com/script-b.js' id='script-b-js'></script>\n",
'expected_footer' => '',
'expected_in_footer' => array(),
'expected_groups' => array(
Expand All @@ -3635,12 +3637,10 @@ public function data_provider_script_move_to_footer() {
)
);
},
'expected_header' => '
<script src="https://example.com/script-a.js" id="script-a-js" defer data-wp-strategy="defer"></script>
',
'expected_footer' => '
<script src="https://example.com/script-b.js" id="script-b-js" defer data-wp-strategy="defer"></script>
',
'expected_header' =>
"<script src='https://example.com/script-a.js' id='script-a-js' defer data-wp-strategy='defer'></script>\n",
'expected_footer' =>
"<script src='https://example.com/script-b.js' id='script-b-js' defer data-wp-strategy='defer'></script>\n",
'expected_in_footer' => array(
'script-b',
),
Expand Down Expand Up @@ -3685,14 +3685,12 @@ public function data_provider_script_move_to_footer() {
)
);
},
'expected_header' => '
<script src="https://example.com/script-a.js" id="script-a-js" defer data-wp-strategy="defer"></script>
<script src="https://example.com/script-b.js" id="script-b-js" defer data-wp-strategy="defer"></script>
',
'expected_footer' => '
<script src="https://example.com/script-c.js" id="script-c-js" defer data-wp-strategy="defer"></script>
<script src="https://example.com/script-d.js" id="script-d-js" defer data-wp-strategy="defer"></script>
',
'expected_header' =>
"<script src='https://example.com/script-a.js' id='script-a-js' defer data-wp-strategy='defer'></script>\n" .
"<script src='https://example.com/script-b.js' id='script-b-js' defer data-wp-strategy='defer'></script>\n",
'expected_footer' =>
"<script src='https://example.com/script-c.js' id='script-c-js' defer data-wp-strategy='defer'></script>\n" .
"<script src='https://example.com/script-d.js' id='script-d-js' defer data-wp-strategy='defer'></script>\n",
'expected_in_footer' => array(
'script-c',
'script-d',
Expand Down Expand Up @@ -3732,12 +3730,11 @@ public function data_provider_script_move_to_footer() {
);
},
'expected_header' => '',
'expected_footer' => '
<script src="https://example.com/script-a.js" id="script-a-js" data-wp-strategy="defer"></script>
<script src="https://example.com/script-b.js" id="script-b-js" defer data-wp-strategy="defer"></script>
<script src="https://example.com/script-c.js" id="script-c-js"></script>
<script src="https://example.com/script-d.js" id="script-d-js" defer data-wp-strategy="defer"></script>
',
'expected_footer' =>
"<script src='https://example.com/script-a.js' id='script-a-js' data-wp-strategy='defer'></script>\n" .
"<script src='https://example.com/script-b.js' id='script-b-js' defer data-wp-strategy='defer'></script>\n" .
"<script src='https://example.com/script-c.js' id='script-c-js'></script>\n" .
"<script src='https://example.com/script-d.js' id='script-d-js' defer data-wp-strategy='defer'></script>\n",
'expected_in_footer' => array(
'script-a',
'script-b',
Expand Down Expand Up @@ -3779,14 +3776,12 @@ public function data_provider_script_move_to_footer() {
)
);
},
'expected_header' => '
<script src="https://example.com/script-a.js" id="script-a-js" data-wp-strategy="defer"></script>
<script src="https://example.com/script-b.js" id="script-b-js" defer data-wp-strategy="defer"></script>
',
'expected_footer' => '
<script src="https://example.com/script-c.js" id="script-c-js"></script>
<script src="https://example.com/script-d.js" id="script-d-js" defer data-wp-strategy="defer"></script>
',
'expected_header' =>
"<script src='https://example.com/script-a.js' id='script-a-js' data-wp-strategy='defer'></script>\n" .
"<script src='https://example.com/script-b.js' id='script-b-js' defer data-wp-strategy='defer'></script>\n",
'expected_footer' =>
"<script src='https://example.com/script-c.js' id='script-c-js'></script>\n" .
"<script src='https://example.com/script-d.js' id='script-d-js' defer data-wp-strategy='defer'></script>\n",
'expected_in_footer' => array(
'script-c',
'script-d',
Expand Down Expand Up @@ -3997,6 +3992,7 @@ public function test_source_url_with_concat() {
$print_scripts = get_echo( '_print_scripts' );

$expected = <<<HTML

<script>
var one = {"key":"val"};var two = {"key":"val"};
//# sourceURL=js-inline-concat-one%2Ctwo
Expand Down Expand Up @@ -4070,7 +4066,7 @@ public function test_varying_versions_added_to_handle_args_enqueued_scripts( $ve
wp_enqueue_script( 'test-script?qs1=q1&qs2=q2', '/test-script.js', array(), $version );
$markup = get_echo( 'wp_print_scripts' );

$expected = "<script src='/test-script.js?{$expected_query_string}' id='test-script-js'></script>";
$expected = "<script src='/test-script.js?{$expected_query_string}' id='test-script-js'></script>\n";
$this->assertEqualHTML( $expected, $markup, '<body>', 'Expected equal snapshot for wp_print_scripts() with version ' . var_export( $version, true ) . ":\n$markup" );
}

Expand All @@ -4091,7 +4087,7 @@ public function test_varying_versions_added_to_handle_args_registered_then_enque
wp_enqueue_script( 'test-script?qs1=q1&qs2=q2' );
$markup = get_echo( 'wp_print_scripts' );

$expected = "<script src='/test-script.js?{$expected_query_string}' id='test-script-js'></script>";
$expected = "<script src='/test-script.js?{$expected_query_string}' id='test-script-js'></script>\n";
$this->assertEqualHTML( $expected, $markup, '<body>', 'Expected equal snapshot for wp_print_scripts() with version ' . var_export( $version, true ) . ":\n$markup" );
}

Expand Down
Loading
Loading