<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[58072] trunk/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php: HTML API: Fix context reset in html5lib test suite.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/58072">58072</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/58072","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>dmsnell</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2024-05-01 23:43:11 +0000 (Wed, 01 May 2024)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>HTML API: Fix context reset in html5lib test suite.

The html5lib-tests suite parses tests from a number of files with a specific
data format. It uses a dataProvider in a loop that yields test information.
This relies on some variables being reset on each iteration. The context
element has not properly reset on each iteration.

The test specification describes the context element as follows:
https://github.com/html5lib/html5lib-tests/blob/a9f44960a9fedf265093d22b2aa3c7ca123727b9/tree-construction/README.md

> Then there *may* be a line that says "#document-fragment", which must be
> followed by a newline (LF), followed by a string of characters that indicates
> the context element, followed by a newline (LF). If the string of characters
> starts with "svg ", the context element is in the SVG namespace and the
> substring after "svg " is the local name. If the string of characters starts
> with "math ", the context element is in the MathML namespace and the
> substring after "math " is the local name. Otherwise, the context element is
> in the HTML namespace and the string is the local name. If this line is
> present the "#data" must be parsed using the HTML fragment parsing algorithm
> with the context element as context.

Without the proper reset of this value, a single context element would change
subsequent tests, breaking the test suite.

This patch adds the reset to ensure that the test suite works properly.

Developed in https://github.com/WordPress/wordpress-develop/pull/6464
Discussed in https://core.trac.wordpress.org/ticket/61102

Fixes <a href="https://core.trac.wordpress.org/ticket/61102">#61102</a>.
Props costdev, dmsnell, jonsurrell.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunktestsphpunittestshtmlapiwpHtmlProcessorHtml5libphp">trunk/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunktestsphpunittestshtmlapiwpHtmlProcessorHtml5libphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php    2024-05-01 23:42:24 UTC (rev 58071)
+++ trunk/tests/phpunit/tests/html-api/wpHtmlProcessorHtml5lib.php      2024-05-01 23:43:11 UTC (rev 58072)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -60,6 +60,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'tests23/line0101'           => 'Unimplemented: Reconstruction of active formatting elements.',
</span><span class="cx" style="display: block; padding: 0 10px">                'tests25/line0169'           => 'Bug.',
</span><span class="cx" style="display: block; padding: 0 10px">                'tests26/line0263'           => 'Bug: An active formatting element should be created for a trailing text node.',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'tests7/line0354'            => 'Bug.',
</ins><span class="cx" style="display: block; padding: 0 10px">                 'tests8/line0001'            => 'Bug.',
</span><span class="cx" style="display: block; padding: 0 10px">                'tests8/line0020'            => 'Bug.',
</span><span class="cx" style="display: block; padding: 0 10px">                'tests8/line0037'            => 'Bug.',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -155,12 +156,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Generates the tree-like structure represented in the Html5lib tests.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param string $fragment_context Context element in which to parse HTML, such as BODY or SVG.
-        * @param string $html             Given test HTML.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param string|null $fragment_context Context element in which to parse HTML, such as BODY or SVG.
+        * @param string      $html             Given test HTML.
</ins><span class="cx" style="display: block; padding: 0 10px">          * @return string|null Tree structure of parsed HTML, if supported, else null.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        private static function build_tree_representation( $fragment_context, $html ) {
-               $processor = WP_HTML_Processor::create_fragment( $html, "<{$fragment_context}>" );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ private static function build_tree_representation( ?string $fragment_context, string $html ) {
+               $processor = $fragment_context
+                       ? WP_HTML_Processor::create_fragment( $html, "<{$fragment_context}>" )
+                       : WP_HTML_Processor::create_fragment( $html );
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( null === $processor ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        return null;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -273,7 +276,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $line_number          = 0;
</span><span class="cx" style="display: block; padding: 0 10px">                $test_html            = '';
</span><span class="cx" style="display: block; padding: 0 10px">                $test_dom             = '';
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $test_context_element = 'body';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $test_context_element = null;
</ins><span class="cx" style="display: block; padding: 0 10px">                 $test_line_number     = 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                while ( false !== ( $line = fgets( $handle ) ) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -294,9 +297,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                        // Finish previous test.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        $test_line_number = $line_number;
-                                       $test_html        = '';
-                                       $test_dom         = '';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 $test_line_number     = $line_number;
+                                       $test_html            = '';
+                                       $test_dom             = '';
+                                       $test_context_element = null;
</ins><span class="cx" style="display: block; padding: 0 10px">                                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                $state = trim( substr( $line, 1 ) );
</span></span></pre>
</div>
</div>

</body>
</html>