Make WordPress Core

Changeset 55662


Ignore:
Timestamp:
04/20/2023 09:11:06 AM (3 years ago)
Author:
Bernhard Reiter
Message:

HTML API: Ensure attribute updates happen only once for case variants.

When setting a new value for an attribute multiple times and providing
multiple case variations of the attribute name the Tag Processor has
been appending multiple copies of the attribute into the updated HTML.

This means that only the first attribute set determines the value in
the final output, plus the output will appear wrong.

In this patch we're adding a test to catch the situation and resolving it
by using the appropriate comparable attribute name as a key for storing
the updates as we go. Previously we stored updates to the attribute by
its given $name, but when a new update of the same name with a
case variant was queued, it would not override the previously-enqueued
value as it out to have.

Props dmsnell, zieladam.
Merges [55659] to the 6.2 branch.
Fixes #58146.

Location:
branches/6.2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/6.2/src/wp-includes/html-api/class-wp-html-tag-processor.php

    r55477 r55662  
    17761776     *
    17771777     * @since 6.2.0
     1778     * @since 6.2.1 Fix: Only create a single update for multiple calls with case-variant attribute names.
    17781779     *
    17791780     * @param string      $name  The attribute name to target.
     
    18681869             *    Result: <div id="new"/>
    18691870             */
    1870             $existing_attribute             = $this->attributes[ $comparable_name ];
    1871             $this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement(
     1871            $existing_attribute = $this->attributes[ $comparable_name ];
     1872            $this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement(
    18721873                $existing_attribute->start,
    18731874                $existing_attribute->end,
  • branches/6.2/tests/phpunit/tests/html-api/wpHtmlTagProcessor.php

    r55469 r55662  
    911911            'Existing attribute was not updated'
    912912        );
     913    }
     914
     915    /**
     916     * Ensures that when setting an attribute multiple times that only
     917     * one update flushes out into the updated HTML.
     918     *
     919     * @ticket 58146
     920     *
     921     * @covers WP_HTML_Tag_Processor::set_attribute
     922     */
     923    public function test_set_attribute_with_case_variants_updates_only_the_original_first_copy() {
     924        $p = new WP_HTML_Tag_Processor( '<div data-enabled="5">' );
     925        $p->next_tag();
     926        $p->set_attribute( 'DATA-ENABLED', 'canary' );
     927        $p->set_attribute( 'Data-Enabled', 'canary' );
     928        $p->set_attribute( 'dATa-EnABled', 'canary' );
     929
     930        $this->assertSame( '<div data-enabled="canary">', strtolower( $p->get_updated_html() ) );
    913931    }
    914932
Note: See TracChangeset for help on using the changeset viewer.