Make WordPress Core

Changeset 60295


Ignore:
Timestamp:
06/10/2025 10:23:38 AM (6 months ago)
Author:
Bernhard Reiter
Message:

Tests: Add new assertEqualHTML assertion.

Add a new assertEqualHTML method to WP_UnitTestClass for tests comparing HTML (potentially including block markup).

Internally, the assertion builds a deterministic tree string representation of the markup (using the HTML API) and compares the results. The format of the tree is inspired by the HTML5lib-tests tree format. It is extended with a special representation of block delimiters and their attributes. This format also makes it easier to visually spot the differences between the two strings if the assertion fails.

Finally, this changeset updates Tests_Dependencies_Scripts to remove its assertEqualMarkup and parse_markup_fragment methods, and to use the newly introduced assertEqualHTML instead.

Props bernhard-reiter, jonsurrell, dmsnell, jorbin, gziolo.
Fixes #63527.

Location:
trunk/tests/phpunit
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/includes/abstract-testcase.php

    r59896 r60295  
    11<?php
    22
     3require_once __DIR__ . '/build-visual-html-tree.php';
    34require_once __DIR__ . '/factory.php';
    45require_once __DIR__ . '/trac.php';
     
    1415 */
    1516abstract class WP_UnitTestCase_Base extends PHPUnit_Adapter_TestCase {
    16 
    1717    protected static $forced_tickets   = array();
    1818    protected $expected_deprecated     = array();
     
    11821182
    11831183    /**
     1184     * Check HTML markup (including blocks) for semantic equivalence.
     1185     *
     1186     * Given two markup strings, assert that they translate to the same semantic HTML tree,
     1187     * normalizing tag names, attribute names, and attribute order. Furthermore, attributes
     1188     * and class names are sorted and deduplicated, and whitespace in style attributes
     1189     * is normalized. Finally, block delimiter comments are recognized and normalized,
     1190     * applying the same principles.
     1191     *
     1192     * @since 6.9.0
     1193     *
     1194     * @param string      $expected         The expected HTML.
     1195     * @param string      $actual           The actual HTML.
     1196     * @param string|null $fragment_context Optional. The fragment context, for example "<td>" expected HTML
     1197     *                                      must occur within "<table><tr>" fragment context. Default "<body>".
     1198     *                                      Only "<body>" or `null` are supported at this time.
     1199     *                                      Set to `null` to parse a full HTML document.
     1200     * @param string|null $message          Optional. The assertion error message.
     1201     */
     1202    public function assertEqualHTML( string $expected, string $actual, ?string $fragment_context = '<body>', $message = 'HTML markup was not equivalent.' ): void {
     1203        try {
     1204            $tree_expected = build_visual_html_tree( $expected, $fragment_context );
     1205            $tree_actual   = build_visual_html_tree( $actual, $fragment_context );
     1206        } catch ( Exception $e ) {
     1207            // For PHP 8.4+, we can retry, using the built-in DOM\HTMLDocument parser.
     1208            if ( class_exists( 'DOM\HtmlDocument' ) ) {
     1209                $dom_expected  = DOM\HtmlDocument::createFromString( $expected, LIBXML_NOERROR );
     1210                $tree_expected = build_visual_html_tree( $dom_expected->saveHtml(), $fragment_context );
     1211                $dom_actual    = DOM\HtmlDocument::createFromString( $actual, LIBXML_NOERROR );
     1212                $tree_actual   = build_visual_html_tree( $dom_actual->saveHtml(), $fragment_context );
     1213            } else {
     1214                throw $e;
     1215            }
     1216        }
     1217
     1218        $this->assertSame( $tree_expected, $tree_actual, $message );
     1219    }
     1220
     1221    /**
    11841222     * Helper function to convert a single-level array containing text strings to a named data provider.
    11851223     *
  • trunk/tests/phpunit/tests/dependencies/scripts.php

    r59906 r60295  
    8080        $expected .= "<script type='text/javascript' src='http://example.com' id='empty-deps-null-version-js'></script>\n";
    8181
    82         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     82        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    8383
    8484        // No scripts left to print.
     
    126126            )
    127127        );
    128         $this->assertEqualMarkup( $expected, $output, 'Inline scripts in the "after" position, that are attached to a deferred main script, are failing to print/execute.' );
     128        $this->assertEqualHTML( $expected, $output, '<body>', 'Inline scripts in the "after" position, that are attached to a deferred main script, are failing to print/execute.' );
    129129    }
    130130
     
    155155        );
    156156
    157         $this->assertEqualMarkup( $expected, $output, 'Inline scripts in the "after" position, that are attached to a blocking main script, are failing to print/execute.' );
     157        $this->assertEqualHTML( $expected, $output, '<body>', 'Inline scripts in the "after" position, that are attached to a blocking main script, are failing to print/execute.' );
    158158    }
    159159
     
    188188            )
    189189        );
    190         $expected .= "<script type='text/javascript' src='http://example.org/ds-i1-1.js' id='ds-i1-1-js' $strategy data-wp-strategy='{$strategy}'></script>\n";
    191         $expected .= "<script type='text/javascript' src='http://example.org/ds-i1-2.js' id='ds-i1-2-js' $strategy data-wp-strategy='{$strategy}'></script>\n";
    192         $expected .= "<script type='text/javascript' src='http://example.org/ds-i1-3.js' id='ds-i1-3-js' $strategy data-wp-strategy='{$strategy}'></script>\n";
     190        $expected .= "<script type='text/javascript' src='http://example.org/ds-i1-1.js' id='ds-i1-1-js' {$strategy}='{$strategy}' data-wp-strategy='{$strategy}'></script>\n";
     191        $expected .= "<script type='text/javascript' src='http://example.org/ds-i1-2.js' id='ds-i1-2-js' {$strategy}='{$strategy}' data-wp-strategy='{$strategy}'></script>\n";
     192        $expected .= "<script type='text/javascript' src='http://example.org/ds-i1-3.js' id='ds-i1-3-js' {$strategy}='{$strategy}' data-wp-strategy='{$strategy}'></script>\n";
    193193        $expected .= wp_get_inline_script_tag(
    194194            'console.log("before last");',
     
    198198            )
    199199        );
    200         $expected .= "<script type='text/javascript' src='http://example.org/ms-i1-1.js' id='ms-i1-1-js' {$strategy} data-wp-strategy='{$strategy}'></script>\n";
    201 
    202         $this->assertEqualMarkup( $expected, $output, 'Inline scripts in the "before" position, that are attached to a deferred main script, are failing to print/execute.' );
     200        $expected .= "<script type='text/javascript' src='http://example.org/ms-i1-1.js' id='ms-i1-1-js' {$strategy}='{$strategy}' data-wp-strategy='{$strategy}'></script>\n";
     201
     202        $this->assertEqualHTML( $expected, $output, '<body>', 'Inline scripts in the "before" position, that are attached to a deferred main script, are failing to print/execute.' );
    203203    }
    204204
     
    217217        wp_enqueue_script( 'main-script-a1', '/main-script-a1.js', array(), null, array( 'strategy' => 'async' ) );
    218218        $output   = get_echo( 'wp_print_scripts' );
    219         $expected = "<script type='text/javascript' src='/main-script-a1.js' id='main-script-a1-js' async data-wp-strategy='async'></script>\n";
    220         $this->assertEqualMarkup( $expected, $output, 'Scripts enqueued with an async loading strategy are failing to have the async attribute applied to the script handle when being printed.' );
     219        $expected = "<script type='text/javascript' src='/main-script-a1.js' id='main-script-a1-js' async='async' data-wp-strategy='async'></script>\n";
     220        $this->assertEqualHTML( $expected, $output, '<body>', 'Scripts enqueued with an async loading strategy are failing to have the async attribute applied to the script handle when being printed.' );
    221221    }
    222222
     
    239239        wp_enqueue_script( 'main-script-a2', '/main-script-a2.js', array( 'dependency-script-a2' ), null, compact( 'strategy' ) );
    240240        $output    = get_echo( 'wp_print_scripts' );
    241         $expected  = "<script id='dependency-script-a2-js' src='/dependency-script-a2.js'></script>\n";
    242         $expected .= "<script type='text/javascript' src='/main-script-a2.js' id='main-script-a2-js' {$strategy} data-wp-strategy='{$strategy}'></script>";
    243         $this->assertEqualMarkup( $expected, $output, 'Dependents of a blocking dependency are free to have any strategy.' );
     241        $expected  = "<script id='dependency-script-a2-js' src='/dependency-script-a2.js' type='text/javascript'></script>\n";
     242        $expected .= "<script type='text/javascript' src='/main-script-a2.js' id='main-script-a2-js' {$strategy}='{$strategy}' data-wp-strategy='{$strategy}'></script>";
     243        $this->assertEqualHTML( $expected, $output, '<body>', 'Dependents of a blocking dependency are free to have any strategy.' );
    244244    }
    245245
     
    265265            <script id="dependent-script-a3-js" src="/dependent-script-a3.js" type="text/javascript"></script>
    266266JS;
    267         $this->assertEqualMarkup( $expected, $output, 'Blocking dependents must force delayed dependencies to become blocking.' );
     267        $this->assertEqualHTML( $expected, $output, '<body>', 'Blocking dependents must force delayed dependencies to become blocking.' );
    268268    }
    269269
     
    512512                'expected_markup' => <<<HTML
    513513<script id="blocking-not-async-without-dependency-js-before" type="text/javascript">
     514/* <![CDATA[ */
    514515scriptEventLog.push( "blocking-not-async-without-dependency: before inline" )
     516/* ]]> */
    515517</script>
    516518<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-not-async-without-dependency:%20script' id='blocking-not-async-without-dependency-js'></script>
    517519<script id="blocking-not-async-without-dependency-js-after" type="text/javascript">
     520/* <![CDATA[ */
    518521scriptEventLog.push( "blocking-not-async-without-dependency: after inline" )
     522/* ]]> */
    519523</script>
    520524<script id="async-with-blocking-dependency-js-before" type="text/javascript">
     525/* <![CDATA[ */
    521526scriptEventLog.push( "async-with-blocking-dependency: before inline" )
     527/* ]]> */
    522528</script>
    523529<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-blocking-dependency:%20script' id='async-with-blocking-dependency-js' data-wp-strategy='async'></script>
    524530<script id="async-with-blocking-dependency-js-after" type="text/javascript">
     531/* <![CDATA[ */
    525532scriptEventLog.push( "async-with-blocking-dependency: after inline" )
     533/* ]]> */
    526534</script>
    527535HTML
     
    549557                'expected_markup' => <<<HTML
    550558<script id="async-no-dependency-js-before" type="text/javascript">
     559/* <![CDATA[ */
    551560scriptEventLog.push( "async-no-dependency: before inline" )
     561/* ]]> */
    552562</script>
    553563<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-no-dependency:%20script' id='async-no-dependency-js' data-wp-strategy='async'></script>
    554564<script id="async-no-dependency-js-after" type="text/javascript">
     565/* <![CDATA[ */
    555566scriptEventLog.push( "async-no-dependency: after inline" )
     567/* ]]> */
    556568</script>
    557569<script id="async-one-async-dependency-js-before" type="text/javascript">
     570/* <![CDATA[ */
    558571scriptEventLog.push( "async-one-async-dependency: before inline" )
     572/* ]]> */
    559573</script>
    560574<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-one-async-dependency:%20script' id='async-one-async-dependency-js' data-wp-strategy='async'></script>
    561575<script id="async-one-async-dependency-js-after" type="text/javascript">
     576/* <![CDATA[ */
    562577scriptEventLog.push( "async-one-async-dependency: after inline" )
     578/* ]]> */
    563579</script>
    564580<script id="async-two-async-dependencies-js-before" type="text/javascript">
     581/* <![CDATA[ */
    565582scriptEventLog.push( "async-two-async-dependencies: before inline" )
     583/* ]]> */
    566584</script>
    567585<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-two-async-dependencies:%20script' id='async-two-async-dependencies-js' data-wp-strategy='async'></script>
    568586<script id="async-two-async-dependencies-js-after" type="text/javascript">
     587/* <![CDATA[ */
    569588scriptEventLog.push( "async-two-async-dependencies: after inline" )
     589/* ]]> */
    570590</script>
    571591HTML
     
    585605                'expected_markup' => <<<HTML
    586606<script id="async-with-blocking-dependent-js-before" type="text/javascript">
     607/* <![CDATA[ */
    587608scriptEventLog.push( "async-with-blocking-dependent: before inline" )
     609/* ]]> */
    588610</script>
    589611<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-blocking-dependent:%20script' id='async-with-blocking-dependent-js' data-wp-strategy='async'></script>
    590612<script id="async-with-blocking-dependent-js-after" type="text/javascript">
     613/* <![CDATA[ */
    591614scriptEventLog.push( "async-with-blocking-dependent: after inline" )
     615/* ]]> */
    592616</script>
    593617<script id="blocking-dependent-of-async-js-before" type="text/javascript">
     618/* <![CDATA[ */
    594619scriptEventLog.push( "blocking-dependent-of-async: before inline" )
     620/* ]]> */
    595621</script>
    596622<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependent-of-async:%20script' id='blocking-dependent-of-async-js'></script>
    597623<script id="blocking-dependent-of-async-js-after" type="text/javascript">
     624/* <![CDATA[ */
    598625scriptEventLog.push( "blocking-dependent-of-async: after inline" )
     626/* ]]> */
    599627</script>
    600628HTML
     
    614642                'expected_markup' => <<<HTML
    615643<script id="async-with-defer-dependent-js-before" type="text/javascript">
     644/* <![CDATA[ */
    616645scriptEventLog.push( "async-with-defer-dependent: before inline" )
     646/* ]]> */
    617647</script>
    618648<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-with-defer-dependent:%20script' id='async-with-defer-dependent-js' data-wp-strategy='async'></script>
    619649<script id="async-with-defer-dependent-js-after" type="text/javascript">
     650/* <![CDATA[ */
    620651scriptEventLog.push( "async-with-defer-dependent: after inline" )
     652/* ]]> */
    621653</script>
    622654<script id="defer-dependent-of-async-js-before" type="text/javascript">
     655/* <![CDATA[ */
    623656scriptEventLog.push( "defer-dependent-of-async: before inline" )
     657/* ]]> */
    624658</script>
    625659<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-async:%20script' id='defer-dependent-of-async-js' data-wp-strategy='defer'></script>
    626660<script id="defer-dependent-of-async-js-after" type="text/javascript">
     661/* <![CDATA[ */
    627662scriptEventLog.push( "defer-dependent-of-async: after inline" )
     663/* ]]> */
    628664</script>
    629665HTML
     
    646682                'expected_markup' => <<<HTML
    647683<script id="blocking-bundle-of-none-js-before" type="text/javascript">
     684/* <![CDATA[ */
    648685scriptEventLog.push( "blocking-bundle-of-none: before inline" )
     686/* ]]> */
    649687</script>
    650688<script id="blocking-bundle-of-none-js-after" type="text/javascript">
     689/* <![CDATA[ */
    651690scriptEventLog.push( "blocking-bundle-of-none: after inline" )
     691/* ]]> */
    652692</script>
    653693<script id="defer-dependent-of-blocking-bundle-of-none-js-before" type="text/javascript">
     694/* <![CDATA[ */
    654695scriptEventLog.push( "defer-dependent-of-blocking-bundle-of-none: before inline" )
     696/* ]]> */
    655697</script>
    656698<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-bundle-of-none:%20script' id='defer-dependent-of-blocking-bundle-of-none-js' data-wp-strategy='defer'></script>
    657699<script id="defer-dependent-of-blocking-bundle-of-none-js-after" type="text/javascript">
     700/* <![CDATA[ */
    658701scriptEventLog.push( "defer-dependent-of-blocking-bundle-of-none: after inline" )
     702/* ]]> */
    659703</script>
    660704HTML
     
    680724                'expected_markup' => <<<HTML
    681725<script id="blocking-bundle-member-one-js-before" type="text/javascript">
     726/* <![CDATA[ */
    682727scriptEventLog.push( "blocking-bundle-member-one: before inline" )
     728/* ]]> */
    683729</script>
    684730<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-bundle-member-one:%20script' id='blocking-bundle-member-one-js'></script>
    685731<script id="blocking-bundle-member-one-js-after" type="text/javascript">
     732/* <![CDATA[ */
    686733scriptEventLog.push( "blocking-bundle-member-one: after inline" )
     734/* ]]> */
    687735</script>
    688736<script id="blocking-bundle-member-two-js-before" type="text/javascript">
     737/* <![CDATA[ */
    689738scriptEventLog.push( "blocking-bundle-member-two: before inline" )
     739/* ]]> */
    690740</script>
    691741<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-bundle-member-two:%20script' id='blocking-bundle-member-two-js'></script>
    692742<script id="blocking-bundle-member-two-js-after" type="text/javascript">
     743/* <![CDATA[ */
    693744scriptEventLog.push( "blocking-bundle-member-two: after inline" )
     745/* ]]> */
    694746</script>
    695747<script id="defer-dependent-of-blocking-bundle-of-two-js-before" type="text/javascript">
     748/* <![CDATA[ */
    696749scriptEventLog.push( "defer-dependent-of-blocking-bundle-of-two: before inline" )
     750/* ]]> */
    697751</script>
    698752<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-bundle-of-two:%20script' id='defer-dependent-of-blocking-bundle-of-two-js' data-wp-strategy='defer'></script>
    699753<script id="defer-dependent-of-blocking-bundle-of-two-js-after" type="text/javascript">
     754/* <![CDATA[ */
    700755scriptEventLog.push( "defer-dependent-of-blocking-bundle-of-two: after inline" )
     756/* ]]> */
    701757</script>
    702758HTML
     
    721777                'expected_markup' => <<<HTML
    722778<script id="defer-bundle-of-none-js-before" type="text/javascript">
     779/* <![CDATA[ */
    723780scriptEventLog.push( "defer-bundle-of-none: before inline" )
     781/* ]]> */
    724782</script>
    725783<script id="defer-bundle-of-none-js-after" type="text/javascript">
     784/* <![CDATA[ */
    726785scriptEventLog.push( "defer-bundle-of-none: after inline" )
     786/* ]]> */
    727787</script>
    728788<script id="defer-dependent-of-defer-bundle-of-none-js-before" type="text/javascript">
     789/* <![CDATA[ */
    729790scriptEventLog.push( "defer-dependent-of-defer-bundle-of-none: before inline" )
     791/* ]]> */
    730792</script>
    731793<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-defer-bundle-of-none:%20script' id='defer-dependent-of-defer-bundle-of-none-js' data-wp-strategy='defer'></script>
    732794<script id="defer-dependent-of-defer-bundle-of-none-js-after" type="text/javascript">
     795/* <![CDATA[ */
    733796scriptEventLog.push( "defer-dependent-of-defer-bundle-of-none: after inline" )
     797/* ]]> */
    734798</script>
    735799HTML
     
    752816                'expected_markup' => <<<HTML
    753817<script id="blocking-dependency-with-defer-following-dependency-js-before" type="text/javascript">
     818/* <![CDATA[ */
    754819scriptEventLog.push( "blocking-dependency-with-defer-following-dependency: before inline" )
     820/* ]]> */
    755821</script>
    756822<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependency-with-defer-following-dependency:%20script' id='blocking-dependency-with-defer-following-dependency-js'></script>
    757823<script id="blocking-dependency-with-defer-following-dependency-js-after" type="text/javascript">
     824/* <![CDATA[ */
    758825scriptEventLog.push( "blocking-dependency-with-defer-following-dependency: after inline" )
     826/* ]]> */
    759827</script>
    760828<script id="defer-dependency-with-blocking-preceding-dependency-js-before" type="text/javascript">
     829/* <![CDATA[ */
    761830scriptEventLog.push( "defer-dependency-with-blocking-preceding-dependency: before inline" )
     831/* ]]> */
    762832</script>
    763833<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependency-with-blocking-preceding-dependency:%20script' id='defer-dependency-with-blocking-preceding-dependency-js' data-wp-strategy='defer'></script>
    764834<script id="defer-dependency-with-blocking-preceding-dependency-js-after" type="text/javascript">
     835/* <![CDATA[ */
    765836scriptEventLog.push( "defer-dependency-with-blocking-preceding-dependency: after inline" )
     837/* ]]> */
    766838</script>
    767839<script id="defer-dependent-of-blocking-and-defer-dependencies-js-before" type="text/javascript">
     840/* <![CDATA[ */
    768841scriptEventLog.push( "defer-dependent-of-blocking-and-defer-dependencies: before inline" )
     842/* ]]> */
    769843</script>
    770844<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-blocking-and-defer-dependencies:%20script' id='defer-dependent-of-blocking-and-defer-dependencies-js' data-wp-strategy='defer'></script>
    771845<script id="defer-dependent-of-blocking-and-defer-dependencies-js-after" type="text/javascript">
     846/* <![CDATA[ */
    772847scriptEventLog.push( "defer-dependent-of-blocking-and-defer-dependencies: after inline" )
     848/* ]]> */
    773849</script>
    774850HTML
     
    791867                'expected_markup' => <<<HTML
    792868<script id="defer-dependency-with-blocking-following-dependency-js-before" type="text/javascript">
     869/* <![CDATA[ */
    793870scriptEventLog.push( "defer-dependency-with-blocking-following-dependency: before inline" )
     871/* ]]> */
    794872</script>
    795873<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependency-with-blocking-following-dependency:%20script' id='defer-dependency-with-blocking-following-dependency-js' data-wp-strategy='defer'></script>
    796874<script id="defer-dependency-with-blocking-following-dependency-js-after" type="text/javascript">
     875/* <![CDATA[ */
    797876scriptEventLog.push( "defer-dependency-with-blocking-following-dependency: after inline" )
     877/* ]]> */
    798878</script>
    799879<script id="blocking-dependency-with-defer-preceding-dependency-js-before" type="text/javascript">
     880/* <![CDATA[ */
    800881scriptEventLog.push( "blocking-dependency-with-defer-preceding-dependency: before inline" )
     882/* ]]> */
    801883</script>
    802884<script type='text/javascript' src='https://example.com/external.js?script_event_log=blocking-dependency-with-defer-preceding-dependency:%20script' id='blocking-dependency-with-defer-preceding-dependency-js'></script>
    803885<script id="blocking-dependency-with-defer-preceding-dependency-js-after" type="text/javascript">
     886/* <![CDATA[ */
    804887scriptEventLog.push( "blocking-dependency-with-defer-preceding-dependency: after inline" )
     888/* ]]> */
    805889</script>
    806890<script id="defer-dependent-of-defer-and-blocking-dependencies-js-before" type="text/javascript">
     891/* <![CDATA[ */
    807892scriptEventLog.push( "defer-dependent-of-defer-and-blocking-dependencies: before inline" )
     893/* ]]> */
    808894</script>
    809895<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-defer-and-blocking-dependencies:%20script' id='defer-dependent-of-defer-and-blocking-dependencies-js' data-wp-strategy='defer'></script>
    810896<script id="defer-dependent-of-defer-and-blocking-dependencies-js-after" type="text/javascript">
     897/* <![CDATA[ */
    811898scriptEventLog.push( "defer-dependent-of-defer-and-blocking-dependencies: after inline" )
     899/* ]]> */
    812900</script>
    813901HTML
     
    827915                'expected_markup' => <<<HTML
    828916<script id="defer-with-async-dependent-js-before" type="text/javascript">
     917/* <![CDATA[ */
    829918scriptEventLog.push( "defer-with-async-dependent: before inline" )
     919/* ]]> */
    830920</script>
    831921<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-async-dependent:%20script' id='defer-with-async-dependent-js' data-wp-strategy='defer'></script>
    832922<script id="defer-with-async-dependent-js-after" type="text/javascript">
     923/* <![CDATA[ */
    833924scriptEventLog.push( "defer-with-async-dependent: after inline" )
     925/* ]]> */
    834926</script>
    835927<script id="async-dependent-of-defer-js-before" type="text/javascript">
     928/* <![CDATA[ */
    836929scriptEventLog.push( "async-dependent-of-defer: before inline" )
     930/* ]]> */
    837931</script>
    838932<script type='text/javascript' src='https://example.com/external.js?script_event_log=async-dependent-of-defer:%20script' id='async-dependent-of-defer-js' data-wp-strategy='async'></script>
    839933<script id="async-dependent-of-defer-js-after" type="text/javascript">
     934/* <![CDATA[ */
    840935scriptEventLog.push( "async-dependent-of-defer: after inline" )
     936/* ]]> */
    841937</script>
    842938HTML
     
    852948                'expected_markup' => <<<HTML
    853949<script id="defer-with-before-inline-js-before" type="text/javascript">
     950/* <![CDATA[ */
    854951scriptEventLog.push( "defer-with-before-inline: before inline" )
    855 </script>
    856 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-before-inline:%20script' id='defer-with-before-inline-js' defer data-wp-strategy='defer'></script>
     952/* ]]> */
     953</script>
     954<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-before-inline:%20script' id='defer-with-before-inline-js' defer='defer' data-wp-strategy='defer'></script>
    857955HTML
    858956                ,
     
    868966<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-with-after-inline:%20script' id='defer-with-after-inline-js' data-wp-strategy='defer'></script>
    869967<script id="defer-with-after-inline-js-after" type="text/javascript">
     968/* <![CDATA[ */
    870969scriptEventLog.push( "defer-with-after-inline: after inline" )
     970/* ]]> */
    871971</script>
    872972HTML
     
    884984                },
    885985                'expected_markup' => <<<HTML
    886 <script type='text/javascript' src='http://$wp_tests_domain/wp-includes/js/jquery/jquery.js' id='jquery-core-js' defer data-wp-strategy='defer'></script>
    887 <script type='text/javascript' src='http://$wp_tests_domain/wp-includes/js/jquery/jquery-migrate.js' id='jquery-migrate-js' defer data-wp-strategy='defer'></script>
    888 <script type='text/javascript' src='https://example.com/theme-functions.js' id='theme-functions-js' defer data-wp-strategy='defer'></script>
     986<script type='text/javascript' src='http://$wp_tests_domain/wp-includes/js/jquery/jquery.js' id='jquery-core-js' defer='defer' data-wp-strategy='defer'></script>
     987<script type='text/javascript' src='http://$wp_tests_domain/wp-includes/js/jquery/jquery-migrate.js' id='jquery-migrate-js' defer='defer' data-wp-strategy='defer'></script>
     988<script type='text/javascript' src='https://example.com/theme-functions.js' id='theme-functions-js' defer='defer' data-wp-strategy='defer'></script>
    889989HTML
    890990                ,
     
    9131013<script type='text/javascript' src='https://example.com/external.js?script_event_log=outer-bundle-leaf-member:%20script' id='outer-bundle-leaf-member-js'></script>
    9141014<script id="defer-dependent-of-nested-aliases-js-before" type="text/javascript">
     1015/* <![CDATA[ */
    9151016scriptEventLog.push( "defer-dependent-of-nested-aliases: before inline" )
     1017/* ]]> */
    9161018</script>
    9171019<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-nested-aliases:%20script' id='defer-dependent-of-nested-aliases-js' data-wp-strategy='defer'></script>
    9181020<script id="defer-dependent-of-nested-aliases-js-after" type="text/javascript">
     1021/* <![CDATA[ */
    9191022scriptEventLog.push( "defer-dependent-of-nested-aliases: after inline" )
     1023/* ]]> */
    9201024</script>
    9211025HTML
     
    9361040                },
    9371041                'expected_markup' => <<<HTML
    938 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async1:%20script' id='async1-js' defer data-wp-strategy='async'></script>
    939 <script type='text/javascript' src='https://example.com/external.js?script_event_log=async2:%20script' id='async2-js' defer data-wp-strategy='async'></script>
    940 <script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-async-aliases:%20script' id='defer-dependent-of-async-aliases-js' defer data-wp-strategy='defer'></script>
     1042<script type='text/javascript' src='https://example.com/external.js?script_event_log=async1:%20script' id='async1-js' defer='defer' data-wp-strategy='async'></script>
     1043<script type='text/javascript' src='https://example.com/external.js?script_event_log=async2:%20script' id='async2-js' defer='defer' data-wp-strategy='async'></script>
     1044<script type='text/javascript' src='https://example.com/external.js?script_event_log=defer-dependent-of-async-aliases:%20script' id='defer-dependent-of-async-aliases-js' defer='defer' data-wp-strategy='defer'></script>
    9411045HTML
    9421046                ,
     
    9611065        $set_up();
    9621066        $actual_markup = get_echo( 'wp_print_scripts' );
    963         $this->assertEqualMarkup( trim( $expected_markup ), trim( $actual_markup ), "Actual markup:\n{$actual_markup}" );
     1067        $this->assertEqualHTML( trim( $expected_markup ), trim( $actual_markup ), '<body>', "Actual markup:\n{$actual_markup}" );
    9641068    }
    9651069
     
    10371141        wp_enqueue_script( 'dependent-script-d4-3', '/dependent-script-d4-3.js', array( 'dependent-script-d4-2' ), null, array( 'strategy' => 'defer' ) );
    10381142        $output    = get_echo( 'wp_print_scripts' );
    1039         $expected  = "<script type='text/javascript' src='/main-script-d4.js' id='main-script-d4-js' defer data-wp-strategy='defer'></script>\n";
    1040         $expected .= "<script type='text/javascript' src='/dependent-script-d4-1.js' id='dependent-script-d4-1-js' defer data-wp-strategy='defer'></script>\n";
    1041         $expected .= "<script type='text/javascript' src='/dependent-script-d4-2.js' id='dependent-script-d4-2-js' defer data-wp-strategy='async'></script>\n";
    1042         $expected .= "<script type='text/javascript' src='/dependent-script-d4-3.js' id='dependent-script-d4-3-js' defer data-wp-strategy='defer'></script>\n";
    1043 
    1044         $this->assertEqualMarkup( $expected, $output, 'Scripts registered as defer but that have dependents that are async are expected to have said dependents deferred.' );
     1143        $expected  = "<script type='text/javascript' src='/main-script-d4.js' id='main-script-d4-js' defer='defer' data-wp-strategy='defer'></script>\n";
     1144        $expected .= "<script type='text/javascript' src='/dependent-script-d4-1.js' id='dependent-script-d4-1-js' defer='defer' data-wp-strategy='defer'></script>\n";
     1145        $expected .= "<script type='text/javascript' src='/dependent-script-d4-2.js' id='dependent-script-d4-2-js' defer='defer' data-wp-strategy='async'></script>\n";
     1146        $expected .= "<script type='text/javascript' src='/dependent-script-d4-3.js' id='dependent-script-d4-3-js' defer='defer' data-wp-strategy='defer'></script>\n";
     1147
     1148        $this->assertEqualHTML( $expected, $output, '<body>', 'Scripts registered as defer but that have dependents that are async are expected to have said dependents deferred.' );
    10451149    }
    10461150
     
    11141218        $expected_header .= "<script type='text/javascript' src='/enqueue-header-new.js' id='enqueue-header-new-js'></script>\n";
    11151219
    1116         $this->assertEqualMarkup( $expected_header, $actual_header, 'Scripts registered/enqueued using the older $in_footer parameter or the newer $args parameter should have the same outcome.' );
     1220        $this->assertEqualHTML( $expected_header, $actual_header, '<body>', 'Scripts registered/enqueued using the older $in_footer parameter or the newer $args parameter should have the same outcome.' );
    11171221        $this->assertEmpty( $actual_footer, 'Expected footer to be empty since all scripts were for head.' );
    11181222    }
     
    11421246
    11431247        $this->assertEmpty( $actual_header, 'Expected header to be empty since all scripts targeted footer.' );
    1144         $this->assertEqualMarkup( $expected_footer, $actual_footer, 'Scripts registered/enqueued using the older $in_footer parameter or the newer $args parameter should have the same outcome.' );
     1248        $this->assertEqualHTML( $expected_footer, $actual_footer, '<body>', 'Scripts registered/enqueued using the older $in_footer parameter or the newer $args parameter should have the same outcome.' );
    11451249    }
    11461250
     
    12611365        wp_enqueue_script( 'invalid-strategy' );
    12621366
    1263         $this->assertEqualMarkup(
     1367        $this->assertEqualHTML(
    12641368            "<script type='text/javascript' src='/defaults.js' id='invalid-strategy-js'></script>\n",
    12651369            get_echo( 'wp_print_scripts' )
     
    12861390        wp_enqueue_script( 'invalid-strategy' );
    12871391
    1288         $this->assertEqualMarkup(
     1392        $this->assertEqualHTML(
    12891393            "<script type='text/javascript' src='/defaults.js' id='invalid-strategy-js'></script>\n",
    12901394            get_echo( 'wp_print_scripts' )
     
    13071411        wp_enqueue_script( 'invalid-strategy', '/defaults.js', array(), null, array( 'strategy' => 'random-strategy' ) );
    13081412
    1309         $this->assertEqualMarkup(
     1413        $this->assertEqualHTML(
    13101414            "<script type='text/javascript' src='/defaults.js' id='invalid-strategy-js'></script>\n",
    13111415            get_echo( 'wp_print_scripts' )
     
    13431447
    13441448        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=one-concat-dep,two-concat-dep,three-concat-dep&amp;ver={$wp_version}'></script>\n";
    1345         $expected .= "<script type='text/javascript' src='/main-script.js' id='main-defer-script-js' defer data-wp-strategy='defer'></script>\n";
    1346 
    1347         $this->assertEqualMarkup( $expected, $print_scripts, 'Scripts are being incorrectly concatenated when a main script is registered with a "defer" loading strategy. Deferred scripts should not be part of the script concat loading query.' );
     1449        $expected .= "<script type='text/javascript' src='/main-script.js' id='main-defer-script-js' defer='defer' data-wp-strategy='defer'></script>\n";
     1450
     1451        $this->assertEqualHTML( $expected, $print_scripts, '<body>', 'Scripts are being incorrectly concatenated when a main script is registered with a "defer" loading strategy. Deferred scripts should not be part of the script concat loading query.' );
    13481452    }
    13491453
     
    13781482
    13791483        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=one-concat-dep-1,two-concat-dep-1,three-concat-dep-1&amp;ver={$wp_version}'></script>\n";
    1380         $expected .= "<script type='text/javascript' src='/main-script.js' id='main-async-script-1-js' async data-wp-strategy='async'></script>\n";
    1381 
    1382         $this->assertEqualMarkup( $expected, $print_scripts, 'Scripts are being incorrectly concatenated when a main script is registered with an "async" loading strategy. Async scripts should not be part of the script concat loading query.' );
     1484        $expected .= "<script type='text/javascript' src='/main-script.js' id='main-async-script-1-js' async='async' data-wp-strategy='async'></script>\n";
     1485
     1486        $this->assertEqualHTML( $expected, $print_scripts, '<body>', 'Scripts are being incorrectly concatenated when a main script is registered with an "async" loading strategy. Async scripts should not be part of the script concat loading query.' );
    13831487    }
    13841488
     
    14171521
    14181522        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=one-concat-dep-2,two-concat-dep-2,three-concat-dep-2,four-concat-dep-2,five-concat-dep-2,six-concat-dep-2&amp;ver={$wp_version}'></script>\n";
    1419         $expected .= "<script type='text/javascript' src='/main-script.js' id='deferred-script-2-js' defer data-wp-strategy='defer'></script>\n";
    1420 
    1421         $this->assertEqualMarkup( $expected, $print_scripts, 'Scripts are being incorrectly concatenated when a main script is registered as deferred after other blocking scripts are registered. Deferred scripts should not be part of the script concat loader query string. ' );
     1523        $expected .= "<script type='text/javascript' src='/main-script.js' id='deferred-script-2-js' defer='defer' data-wp-strategy='defer'></script>\n";
     1524
     1525        $this->assertEqualHTML( $expected, $print_scripts, '<body>', 'Scripts are being incorrectly concatenated when a main script is registered as deferred after other blocking scripts are registered. Deferred scripts should not be part of the script concat loader query string. ' );
    14221526    }
    14231527
     
    14281532        global $wp_version;
    14291533
     1534        $this->add_html5_script_theme_support();
     1535
    14301536        $GLOBALS['wp_scripts']                  = new WP_Scripts();
    14311537        $GLOBALS['wp_scripts']->default_version = get_bloginfo( 'version' );
     
    14351541        $expected = "<script src='http://example.com?ver={$wp_version}' id='empty-deps-no-version-js'></script>\n";
    14361542
    1437         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1543        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    14381544    }
    14391545
     
    14741580
    14751581        // Go!
    1476         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1582        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    14771583
    14781584        // No scripts left to print.
     
    15171623
    15181624        // Go!
    1519         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1625        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    15201626
    15211627        // No scripts left to print.
     
    15321638        wp_enqueue_script( 'test-only-conditional', 'example.com', array(), null );
    15331639        wp_script_add_data( 'test-only-conditional', 'conditional', 'gt IE 7' );
    1534         $expected = "<!--[if gt IE 7]>\n<script type='text/javascript' src='http://example.com' id='test-only-conditional-js'></script>\n<![endif]-->\n";
     1640        $expected = "<!--[if gt IE 7]>\n<script type=\"text/javascript\" src=\"http://example.com\" id=\"test-only-conditional-js\"></script>\n<![endif]-->\n";
    15351641
    15361642        // Go!
    1537         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1643        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    15381644
    15391645        // No scripts left to print.
     
    15561662
    15571663        // Go!
    1558         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1664        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    15591665
    15601666        // No scripts left to print.
     
    15741680
    15751681        // Go!
    1576         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1682        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    15771683
    15781684        // No scripts left to print.
    1579         $this->assertEqualMarkup( '', get_echo( 'wp_print_scripts' ) );
     1685        $this->assertEqualHTML( '', get_echo( 'wp_print_scripts' ) );
    15801686    }
    15811687
     
    16031709        wp_enqueue_script( 'handle-three' );
    16041710
    1605         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1711        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    16061712    }
    16071713
     
    16911797        $expected_footer  = "<script type='text/javascript' src='/parent.js' id='parent-js'></script>\n";
    16921798
    1693         $this->assertEqualMarkup( $expected_header, $header, 'Expected same header markup.' );
    1694         $this->assertEqualMarkup( $expected_footer, $footer, 'Expected same footer markup.' );
     1799        $this->assertEqualHTML( $expected_header, $header, '<body>', 'Expected same header markup.' );
     1800        $this->assertEqualHTML( $expected_footer, $footer, '<body>', 'Expected same footer markup.' );
    16951801    }
    16961802
     
    17121818        $expected_footer .= "<script type='text/javascript' src='/parent.js' id='parent-js'></script>\n";
    17131819
    1714         $this->assertEqualMarkup( $expected_header, $header, 'Expected same header markup.' );
    1715         $this->assertEqualMarkup( $expected_footer, $footer, 'Expected same footer markup.' );
     1820        $this->assertEqualHTML( $expected_header, $header, '<body>', 'Expected same header markup.' );
     1821        $this->assertEqualHTML( $expected_footer, $footer, '<body>', 'Expected same footer markup.' );
    17161822    }
    17171823
     
    17431849        $expected_footer .= "<script type='text/javascript' src='/parent-footer.js' id='parent-footer-js'></script>\n";
    17441850
    1745         $this->assertEqualMarkup( $expected_header, $header, 'Expected same header markup.' );
    1746         $this->assertEqualMarkup( $expected_footer, $footer, 'Expected same footer markup.' );
     1851        $this->assertEqualHTML( $expected_header, $header, '<body>', 'Expected same header markup.' );
     1852        $this->assertEqualHTML( $expected_footer, $footer, '<body>', 'Expected same footer markup.' );
    17471853    }
    17481854
     
    17711877        wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
    17721878
    1773         $expected  = "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
     1879        $expected  = <<<HTML
     1880<script type='text/javascript' id='test-example-js-before'>
     1881/* <![CDATA[ */
     1882console.log("before");
     1883/* ]]> */
     1884</script>
     1885HTML;
    17741886        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    17751887
    1776         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1888        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    17771889    }
    17781890
     
    17851897
    17861898        $expected  = "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    1787         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
    1788 
    1789         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1899        $expected .= <<<HTML
     1900<script type='text/javascript' id='test-example-js-after'>
     1901/* <![CDATA[ */
     1902console.log("after");
     1903/* ]]> */
     1904</script>
     1905HTML;
     1906
     1907        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    17901908    }
    17911909
     
    17981916        wp_add_inline_script( 'test-example', 'console.log("after");' );
    17991917
    1800         $expected  = "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
     1918        $expected  = "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
    18011919        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    1802         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
    1803 
    1804         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1920        $expected .= "<script type='text/javascript' id='test-example-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
     1921
     1922        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    18051923    }
    18061924
     
    18131931        wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
    18141932
    1815         $expected = "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
    1816 
    1817         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1933        $expected = "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
     1934
     1935        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    18181936    }
    18191937
     
    18261944        wp_add_inline_script( 'test-example', 'console.log("after");' );
    18271945
    1828         $expected = "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
    1829 
    1830         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1946        $expected = "<script type='text/javascript' id='test-example-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
     1947
     1948        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    18311949    }
    18321950
     
    18401958        wp_add_inline_script( 'test-example', 'console.log("after");' );
    18411959
    1842         $expected  = "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
    1843         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
    1844 
    1845         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1960        $expected  = "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
     1961        $expected .= "<script type='text/javascript' id='test-example-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
     1962
     1963        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    18461964    }
    18471965
     
    18561974        wp_add_inline_script( 'test-example', 'console.log("after");' );
    18571975
    1858         $expected  = "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\nconsole.log(\"before\");\n</script>\n";
     1976        $expected  = "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
    18591977        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    1860         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\nconsole.log(\"after\");\n</script>\n";
    1861 
    1862         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1978        $expected .= "<script type='text/javascript' id='test-example-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
     1979
     1980        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    18631981    }
    18641982
     
    18731991
    18741992        $expected  = "<script type='text/javascript' id='test-example-js-extra'>\n/* <![CDATA[ */\nvar testExample = {\"foo\":\"bar\"};\n/* ]]> */\n</script>\n";
    1875         $expected .= "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
     1993        $expected .= "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
    18761994        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    1877         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
    1878 
    1879         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     1995        $expected .= "<script type='text/javascript' id='test-example-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
     1996
     1997        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    18801998    }
    18811999
     
    18962014        wp_add_inline_script( 'two', 'console.log("before two");', 'before' );
    18972015
    1898         $expected  = "<script type='text/javascript' id='one-js-before'>\nconsole.log(\"before one\");\n</script>\n";
     2016        $expected  = "<script type='text/javascript' id='one-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before one\");\n/* ]]> */\n</script>\n";
    18992017        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}one.js?ver={$wp_version}' id='one-js'></script>\n";
    1900         $expected .= "<script type='text/javascript' id='two-js-before'>\nconsole.log(\"before two\");\n</script>\n";
     2018        $expected .= "<script type='text/javascript' id='two-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before two\");\n/* ]]> */\n</script>\n";
    19012019        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}two.js?ver={$wp_version}' id='two-js'></script>\n";
    19022020        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}three.js?ver={$wp_version}' id='three-js'></script>\n";
    19032021
    1904         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2022        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    19052023    }
    19062024
     
    19202038        wp_add_inline_script( 'one', 'console.log("before one");', 'before' );
    19212039
    1922         $expected  = "<script type='text/javascript' id='one-js-before'>\nconsole.log(\"before one\");\n</script>\n";
     2040        $expected  = "<script type='text/javascript' id='one-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before one\");\n/* ]]> */\n</script>\n";
    19232041        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}one.js?ver={$wp_version}' id='one-js'></script>\n";
    19242042        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}two.js?ver={$wp_version}' id='two-js'></script>\n";
    19252043        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}three.js?ver={$wp_version}' id='three-js'></script>\n";
    19262044
    1927         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2045        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    19282046    }
    19292047
     
    19472065        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=one&amp;ver={$wp_version}'></script>\n";
    19482066        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}two.js?ver={$wp_version}' id='two-js'></script>\n";
    1949         $expected .= "<script type='text/javascript' id='two-js-after'>\nconsole.log(\"after two\");\n</script>\n";
     2067        $expected .= "<script type='text/javascript' id='two-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after two\");\n/* ]]> */\n</script>\n";
    19502068        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}three.js?ver={$wp_version}' id='three-js'></script>\n";
    1951         $expected .= "<script type='text/javascript' id='three-js-after'>\nconsole.log(\"after three\");\n</script>\n";
     2069        $expected .= "<script type='text/javascript' id='three-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after three\");\n/* ]]> */\n</script>\n";
    19522070        $expected .= "<script type='text/javascript' src='{$this->default_scripts_dir}four.js?ver={$wp_version}' id='four-js'></script>\n";
    19532071
    1954         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2072        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    19552073    }
    19562074
     
    19702088
    19712089        $expected  = "<!--[if gte IE 9]>\n";
    1972         $expected .= "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
     2090        $expected .= "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
    19732091        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    1974         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
     2092        $expected .= "<script type='text/javascript' id='test-example-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
    19752093        $expected .= "<![endif]-->\n";
    19762094        $expected  = str_replace( "'", '"', $expected );
     
    19832101
    19842102        $this->assertSame( $expected_localized, get_echo( 'wp_print_scripts' ) );
    1985         $this->assertEqualMarkup( $expected, $wp_scripts->print_html );
     2103        $this->assertEqualHTML( $expected, $wp_scripts->print_html );
    19862104        $this->assertTrue( $wp_scripts->do_concat );
    19872105    }
     
    20002118        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=jquery-core,jquery-migrate&amp;ver={$wp_version}'></script>\n";
    20012119        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    2002         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
     2120        $expected .= "<script type='text/javascript' id='test-example-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
    20032121
    20042122        wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null );
     
    20082126        $print_scripts = get_echo( '_print_scripts' );
    20092127
    2010         $this->assertEqualMarkup( $expected, $print_scripts );
     2128        $this->assertEqualHTML( $expected, $print_scripts );
    20112129    }
    20122130
     
    20242142        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=jquery-core,jquery-migrate&amp;ver={$wp_version}'></script>\n";
    20252143        $expected .= "<!--[if gte IE 9]>\n";
    2026         $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    2027         $expected .= "<script type='text/javascript' id='test-example-js-after'>\nconsole.log(\"after\");\n</script>\n";
     2144        $expected .= "<script type=\"text/javascript\" src=\"http://example.com\" id=\"test-example-js\"></script>\n";
     2145        $expected .= "<script type=\"text/javascript\" id=\"test-example-js-after\">\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
    20282146        $expected .= "<![endif]-->\n";
    20292147
     
    20352153        $print_scripts = get_echo( '_print_scripts' );
    20362154
    2037         $this->assertEqualMarkup( $expected, $print_scripts );
     2155        $this->assertEqualHTML( $expected, $print_scripts );
    20382156    }
    20392157
     
    20512169
    20522170        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=jquery-core,jquery-migrate&amp;ver={$wp_version}'></script>\n";
    2053         $expected .= "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
     2171        $expected .= "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
    20542172        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    20552173
     
    20602178        $print_scripts = get_echo( '_print_scripts' );
    20612179
    2062         $this->assertEqualMarkup( $expected, $print_scripts );
     2180        $this->assertEqualHTML( $expected, $print_scripts );
    20632181    }
    20642182
     
    20762194
    20772195        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=jquery-core,jquery-migrate,wp-dom-ready,wp-hooks&amp;ver={$wp_version}'></script>\n";
    2078         $expected .= "<script type='text/javascript' id='test-example-js-before'>\nconsole.log(\"before\");\n</script>\n";
     2196        $expected .= "<script type='text/javascript' id='test-example-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before\");\n/* ]]> */\n</script>\n";
    20792197        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    20802198        $expected .= "<script type='text/javascript' src='/wp-includes/js/dist/i18n.min.js' id='wp-i18n-js'></script>\n";
    20812199        $expected .= "<script type='text/javascript' id='wp-i18n-js-after'>\n";
     2200        $expected .= "/* <![CDATA[ */\n";
    20822201        $expected .= "wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );\n";
     2202        $expected .= "/* ]]> */\n";
    20832203        $expected .= "</script>\n";
    20842204        $expected .= "<script type='text/javascript' src='/wp-includes/js/dist/a11y.min.js' id='wp-a11y-js'></script>\n";
    20852205        $expected .= "<script type='text/javascript' src='http://example2.com' id='test-example2-js'></script>\n";
    2086         $expected .= "<script type='text/javascript' id='test-example2-js-after'>\nconsole.log(\"after\");\n</script>\n";
     2206        $expected .= "<script type='text/javascript' id='test-example2-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after\");\n/* ]]> */\n</script>\n";
    20872207
    20882208        wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null );
     
    21102230        );
    21112231
    2112         $this->assertEqualMarkup( $expected, $print_scripts );
     2232        $this->assertEqualHTML( $expected, $print_scripts );
    21132233    }
    21142234
     
    21272247        $expected_tail  = "<script type='text/javascript' src='/customize-dependency.js' id='customize-dependency-js'></script>\n";
    21282248        $expected_tail .= "<script type='text/javascript' id='customize-dependency-js-after'>\n";
     2249        $expected_tail .= "/* <![CDATA[ */\n";
    21292250        $expected_tail .= "tryCustomizeDependency()\n";
     2251        $expected_tail .= "/* ]]> */\n";
    21302252        $expected_tail .= "</script>\n";
    21312253
     
    21432265        $tail = substr( $print_scripts, strrpos( $print_scripts, '<script type="text/javascript" src="/customize-dependency.js" id="customize-dependency-js">' ) );
    21442266
    2145         $this->assertEqualMarkup( $expected_tail, $tail );
     2267        $this->assertEqualHTML( $expected_tail, $tail );
    21462268    }
    21472269
     
    21622284
    21632285        $expected  = "<script type='text/javascript' src='/wp-includes/js/script.js?ver={$wp_version}' id='one-js'></script>\n";
    2164         $expected .= "<script type='text/javascript' id='one-js-after'>\nconsole.log(\"after one\");\n</script>\n";
     2286        $expected .= "<script type='text/javascript' id='one-js-after'>\n/* <![CDATA[ */\nconsole.log(\"after one\");\n/* ]]> */\n</script>\n";
    21652287        $expected .= "<script type='text/javascript' src='/wp-includes/js/script2.js?ver={$wp_version}' id='two-js'></script>\n";
    21662288        $expected .= "<script type='text/javascript' src='/wp-includes/js/script3.js?ver={$wp_version}' id='three-js'></script>\n";
    21672289        $expected .= "<script type='text/javascript' src='/wp-includes/js/script4.js?ver={$wp_version}' id='four-js'></script>\n";
    21682290
    2169         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2291        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    21702292    }
    21712293
     
    21862308
    21872309        $expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5Bchunk_0%5D=one,two&amp;ver={$wp_version}'></script>\n";
    2188         $expected .= "<script type='text/javascript' id='three-js-before'>\nconsole.log(\"before three\");\n</script>\n";
     2310        $expected .= "<script type='text/javascript' id='three-js-before'>\n/* <![CDATA[ */\nconsole.log(\"before three\");\n/* ]]> */\n</script>\n";
    21892311        $expected .= "<script type='text/javascript' src='/wp-includes/js/script3.js?ver={$wp_version}' id='three-js'></script>\n";
    21902312        $expected .= "<script type='text/javascript' src='/wp-includes/js/script4.js?ver={$wp_version}' id='four-js'></script>\n";
    21912313
    2192         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2314        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    21932315    }
    21942316
     
    22072329                'delayed'        => false,
    22082330                'expected_data'  => '/*before foo 1*/',
    2209                 'expected_tag'   => "<script id='foo-js-before' type='text/javascript'>\n/*before foo 1*/\n</script>\n",
     2331                'expected_tag'   => "<script id='foo-js-before' type='text/javascript'>\n/* <![CDATA[ */\n/*before foo 1*/\n/* ]]> */\n</script>\n",
    22102332            ),
    22112333            'after-blocking'  => array(
     
    22172339                'delayed'        => false,
    22182340                'expected_data'  => "/*after foo 1*/\n/*after foo 2*/",
    2219                 'expected_tag'   => "<script id='foo-js-after' type='text/javascript'>\n/*after foo 1*/\n/*after foo 2*/\n</script>\n",
     2341                'expected_tag'   => "<script id='foo-js-after' type='text/javascript'>\n/* <![CDATA[ */\n/*after foo 1*/\n/*after foo 2*/\n/* ]]> */\n</script>\n",
    22202342            ),
    22212343            'before-delayed'  => array(
     
    22262348                'delayed'        => true,
    22272349                'expected_data'  => '/*before foo 1*/',
    2228                 'expected_tag'   => "<script id='foo-js-before' type='text/javascript'>\n/*before foo 1*/\n</script>\n",
     2350                'expected_tag'   => "<script id='foo-js-before' type='text/javascript'>\n/* <![CDATA[ */\n/*before foo 1*/\n/* ]]> */\n</script>\n",
    22292351            ),
    22302352            'after-delayed'   => array(
     
    22362358                'delayed'        => true,
    22372359                'expected_data'  => "/*after foo 1*/\n/*after foo 2*/",
    2238                 'expected_tag'   => "<script id='foo-js-after' type='text/javascript'>\n/*after foo 1*/\n/*after foo 2*/\n</script>\n",
     2360                'expected_tag'   => "<script id='foo-js-after' type='text/javascript'>\n/* <![CDATA[ */\n/*after foo 1*/\n/*after foo 2*/\n/* ]]> */\n</script>\n",
    22392361            ),
    22402362        );
     
    22882410        $this->assertSame( $expected_data, $wp_scripts->get_inline_script_data( $handle, $position ) );
    22892411        $this->assertSame( $expected_data, $wp_scripts->print_inline_script( $handle, $position, false ) );
    2290         $this->assertEqualMarkup(
     2412        $this->assertEqualHTML(
    22912413            $expected_tag,
    22922414            $wp_scripts->get_inline_script_tag( $handle, $position )
     
    22942416        ob_start();
    22952417        $output = $wp_scripts->print_inline_script( $handle, $position, true );
    2296         $this->assertEqualMarkup( $expected_tag, ob_get_clean() );
     2418        $this->assertEqualHTML( $expected_tag, ob_get_clean() );
    22972419        $this->assertEquals( $expected_data, $output );
    22982420    }
     
    23222444        $expected .= "<script type='text/javascript' src='/wp-includes/js/script.js' id='test-example-js'></script>\n";
    23232445
    2324         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2446        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    23252447    }
    23262448
     
    23492471        $expected .= "<script type='text/javascript' src='/wp-content/plugins/my-plugin/js/script.js' id='plugin-example-js'></script>\n";
    23502472
    2351         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2473        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    23522474    }
    23532475
     
    23762498        $expected .= "<script type='text/javascript' src='/wp-content/themes/my-theme/js/script.js' id='theme-example-js'></script>\n";
    23772499
    2378         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2500        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    23792501    }
    23802502
     
    24032525        $expected .= "<script type='text/javascript' src='/wp-admin/js/script.js' id='script-handle-js'></script>\n";
    24042526
    2405         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2527        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    24062528    }
    24072529
     
    24332555        $expected .= "<script type='text/javascript' src='/wp-admin/js/script.js' id='test-example-js'></script>\n";
    24342556
    2435         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2557        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    24362558    }
    24372559
     
    24622584        $expected .= "<script type='text/javascript' src='/wp-includes/js/script.js' id='test-example-js'></script>\n";
    24632585
    2464         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2586        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    24652587    }
    24662588
     
    24922614        $expected .= "<script type='text/javascript' src='/wp-includes/js/script2.js' id='test-example-js'></script>\n";
    24932615
    2494         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     2616        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    24952617    }
    24962618
     
    28813003        $expected .= "<script type='text/javascript' src='http://example.com' id='test-example-js'></script>\n";
    28823004
    2883         $this->assertEqualMarkup( $expected, get_echo( 'wp_print_scripts' ) );
     3005        $this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
    28843006    }
    28853007
     
    29463068        $expected .= "<script type='text/javascript' src='/default/common.js' id='common-js'></script>\n";
    29473069
    2948         $this->assertEqualMarkup( $expected, $print_scripts );
     3070        $this->assertEqualHTML( $expected, $print_scripts );
    29493071    }
    29503072
     
    29793101
    29803102        $this->assertStringContainsString( $strategy, $actual );
    2981     }
    2982 
    2983     /**
    2984      * Parse an HTML markup fragment.
    2985      *
    2986      * @param string $markup Markup.
    2987      * @return DOMDocument Document containing the normalized markup fragment.
    2988      */
    2989     protected function parse_markup_fragment( $markup ) {
    2990         $dom = new DOMDocument();
    2991         $dom->loadHTML(
    2992             "<!DOCTYPE html><html><head><meta charset=utf8></head><body>{$markup}</body></html>"
    2993         );
    2994 
    2995         /** @var DOMElement $body */
    2996         $body = $dom->getElementsByTagName( 'body' )->item( 0 );
    2997 
    2998         // Trim whitespace nodes added before/after which can be added when parsing.
    2999         foreach ( array( $body->firstChild, $body->lastChild ) as $node ) {
    3000             if ( $node instanceof DOMText && '' === trim( $node->data ) ) {
    3001                 $body->removeChild( $node );
    3002             }
    3003         }
    3004 
    3005         // Normalize other whitespace nodes.
    3006         $xpath = new DOMXPath( $dom );
    3007         foreach ( $xpath->query( '//text()' ) as $node ) {
    3008             /** @var DOMText $node */
    3009             if ( preg_match( '/^\s+$/', $node->nodeValue ) ) {
    3010                 $node->nodeValue = ' ';
    3011             }
    3012         }
    3013 
    3014         return $dom;
    3015     }
    3016 
    3017     /**
    3018      * Assert markup is equal after normalizing script tags.
    3019      *
    3020      * @param string $expected Expected markup.
    3021      * @param string $actual   Actual markup.
    3022      * @param string $message  Message.
    3023      */
    3024     protected function assertEqualMarkup( $expected, $actual, $message = '' ) {
    3025         $expected_dom = $this->parse_markup_fragment( $expected );
    3026         $actual_dom   = $this->parse_markup_fragment( $actual );
    3027         foreach ( array( $expected_dom, $actual_dom ) as $dom ) {
    3028             $xpath = new DOMXPath( $dom );
    3029             /** @var DOMElement $script */
    3030 
    3031             // Normalize type attribute. When missing, it defaults to text/javascript.
    3032             foreach ( $xpath->query( '//script[ not( @type ) ]' ) as $script ) {
    3033                 $script->setAttribute( 'type', 'text/javascript' );
    3034             }
    3035 
    3036             // Normalize script contents to remove CDATA wrapper.
    3037             foreach ( $xpath->query( '//script[ contains( text(), "<![CDATA[" ) ]' ) as $script ) {
    3038                 $script->textContent = str_replace(
    3039                     array(
    3040                         "/* <![CDATA[ */\n",
    3041                         "\n/* ]]> */",
    3042                     ),
    3043                     '',
    3044                     $script->textContent
    3045                 );
    3046             }
    3047 
    3048             // Normalize XHTML-compatible boolean attributes to HTML5 ones.
    3049             foreach ( array( 'async', 'defer' ) as $attribute ) {
    3050                 foreach ( iterator_to_array( $xpath->query( "//script[ @{$attribute} = '{$attribute}' ]" ) ) as $script ) {
    3051                     $script->removeAttribute( $attribute );
    3052                     $script->setAttributeNode( $dom->createAttribute( $attribute ) );
    3053                 }
    3054             }
    3055         }
    3056 
    3057         $this->assertEquals(
    3058             $expected_dom->getElementsByTagName( 'body' )->item( 0 ),
    3059             $actual_dom->getElementsByTagName( 'body' )->item( 0 ),
    3060             $message
    3061         );
    30623103    }
    30633104
     
    31013142        $footer = ob_get_clean();
    31023143
    3103         $this->assertEqualMarkup( $expected_header, $header, 'Expected header script markup to match.' );
    3104         $this->assertEqualMarkup( $expected_footer, $footer, 'Expected footer script markup to match.' );
     3144        $this->assertEqualHTML( $expected_header, $header, '<body>', 'Expected header script markup to match.' );
     3145        $this->assertEqualHTML( $expected_footer, $footer, '<body>', 'Expected footer script markup to match.' );
    31053146        $this->assertEqualSets( $expected_in_footer, wp_scripts()->in_footer, 'Expected to have the same handles for in_footer.' );
    31063147        $this->assertEquals( $expected_groups, wp_scripts()->groups, 'Expected groups to match.' );
Note: See TracChangeset for help on using the changeset viewer.