Make WordPress Core


Ignore:
Timestamp:
02/01/2024 12:41:40 AM (8 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

File:
1 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::REPROCESS_CURRENT_NODE !== $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     * Indicates that the current HTML token should be processed without advancing the parser.
     1788     *
     1789     * @since 6.5.0
     1790     *
     1791     * @var string
     1792     */
     1793    const PROCESS_CURRENT_NODE = 'process-current-node';
     1794
     1795    /**
    17851796     * Indicates that the parser encountered unsupported markup and has bailed.
    17861797     *
Note: See TracChangeset for help on using the changeset viewer.