Make WordPress Core

Changeset 57507

Timestamp:
02/01/2024 12:41:40 AM (6 months ago)
Author:
dmsnell
Message:

HTML API: Fix void tag nesting with next_token

When next_token() was introduced, it introduced a regression in the HTML
Processor whereby void tags remain on the stack of open elements when they
shouldn't. This led to invalid values returned from get_breadcrumbs().

The reason was that calling next_token() works through a different code path
than the HTML Processor runs everything else. To solve this, its sub-classed
next_token() called step( self::REPROCESS_CURRENT_TOKEN ) so that the proper
HTML accounting takes place.

Unfortunately that same reprocessing code path skipped the step whereby void
and self-closing elements are popped from the stack of open elements.

In this patch, that step is run with a third mode for step(), which is the
new self::PROCESS_CURRENT_TOKEN. This mode acts as if self::PROCESS_NEXT_NODE
were called, except it doesn't advance the parser.

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

Follow-up to [57348]

Props dmsnell, jonsurrell
Fixes #60382

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/html-api/class-wp-html-processor.php

    r57348 r57507  
    432432
    433433        if ( '#tag' === $this->get_token_type() ) {
    434             $this->step( self::REPROCESS_CURRENT_NODE );
     434            $this->step( self::PROCESS_CURRENT_NODE );
    435435        }
    436436
     
    514514        }
    515515
    516         if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
     516        if ( self::== $node_to_process ) {
    517517            /*
    518518             * Void elements still hop onto the stack of open elements even though
     
    533533                $this->state->stack_of_open_elements->pop();
    534534            }
    535 
     535        }
     536
     537        if ( self::PROCESS_NEXT_NODE === $node_to_process ) {
    536538            while ( parent::next_token() && '#tag' !== $this->get_token_type() ) {
    537539                continue;
     
    17831785
    17841786    /**
     1787
     1788
     1789
     1790
     1791
     1792
     1793
     1794
     1795
    17851796     * Indicates that the parser encountered unsupported markup and has bailed.
    17861797     *
  • trunk/tests/phpunit/tests/html-api/wpHtmlProcessor.php

    r57343 r57507  
    179179        $this->assertTrue(
    180180            $processor->next_tag(),
     181
     182
     183
     184
     185
     186
     187
     188
     189
     190
     191
     192
     193
     194
     195
     196
     197
     198
     199
     200
     201
     202
     203
     204
     205
     206
     207
     208
     209
     210
     211
     212
     213
     214
     215
     216
     217
     218
     219
     220
     221
     222
     223
     224
     225
     226
     227
     228
     229
     230
     231
     232
     233
    181234            'Should have found the DIV as the second tag.'
    182235        );
Note: See TracChangeset for help on using the changeset viewer.