Make WordPress Core

Changeset 59056


Ignore:
Timestamp:
09/18/2024 06:02:43 PM (9 months ago)
Author:
hellofromTonya
Message:

Code Modernization: Remove xml_set_object() in IXR_Message::parse().

The XML Parser extension still supports a quite dated mechanism for method based callbacks, where the object is first set via xml_set_object() and the callbacks are then set by passing only the name of the method to the relevant parameters on any of the xml_set_*_handler() functions.

xml_set_object( $parser, $my_obj );
xml_set_character_data_handler( $parser, 'method_name_on_my_obj' );

Passing proper callables to the xml_set_*_handler() functions has been supported for the longest time and is cross-version compatible. So the above code is 100% equivalent to:

xml_set_character_data_handler( $parser, [$my_obj, 'method_name_on_my_obj'] );

The mechanism of setting the callbacks with xml_set_object() has now been deprecated as of PHP 8.4, in favour of passing proper callables to the xml_set_*_handler() functions. This is also means that calling the xml_set_object() function is deprecated as well.

This commit fixes this deprecation for the IXR_Message::parse() method.

This change is safeguarded via the newTests_XMLRPC_Message::test_parse_sets_handlers() test method.

Note: Though this is "officially" an external library, this package is no longer externally maintained. The code style of the fix in the source file is in line with the existing code style for the file.

Refs:

Follow-up to [15612], [1346].

Props jrf, hellofromTonya.
See #62061.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/IXR/class-IXR-message.php

    r55105 r59056  
    9494        xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
    9595        // Set XML parser callback functions
    96         xml_set_object($this->_parser, $this);
    97         xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
    98         xml_set_character_data_handler($this->_parser, 'cdata');
     96        xml_set_element_handler($this->_parser, array($this, 'tag_open'), array($this, 'tag_close'));
     97        xml_set_character_data_handler($this->_parser, array($this, 'cdata'));
    9998
    10099        // 256Kb, parse in chunks to avoid the RAM usage on very large messages
  • trunk/tests/phpunit/tests/xmlrpc/message.php

    r56547 r59056  
    3131        $this->assertSame( array( '1' ), $message->params );
    3232    }
     33
     34    /**
     35     * Test that the `IXR_Message::parse()` method correctly sets callback functions to handle certain parts of the XML.
     36     *
     37     * Safeguards handling of the PHP 8.4 deprecation of `xml_set_object()`.
     38     *
     39     * @covers IXR_Message::parse
     40     */
     41    public function test_parse_sets_handlers() {
     42        $xml     = '<methodResponse><params><param><value>1</value></param></params></methodResponse>';
     43        $message = new class( $xml ) extends IXR_Message {
     44            public $tag_open_call_counter  = 0;
     45            public $tag_close_call_counter = 0;
     46            public $cdata_call_counter     = 0;
     47
     48            public function tag_open( $parser, $tag, $attr ) {
     49                ++$this->tag_open_call_counter;
     50            }
     51            public function cdata( $parser, $cdata ) {
     52                ++$this->cdata_call_counter;
     53            }
     54            public function tag_close( $parser, $tag ) {
     55                ++$this->tag_close_call_counter;
     56            }
     57        };
     58
     59        $this->assertTrue( $message->parse(), 'XML parsing failed' );
     60
     61        $msg = '%s() handler did not get called expected nr of times';
     62        $this->assertSame( 4, $message->tag_open_call_counter, sprintf( $msg, 'tag_open' ) );
     63        $this->assertSame( 4, $message->tag_close_call_counter, sprintf( $msg, 'tag_close' ) );
     64        $this->assertSame( 1, $message->cdata_call_counter, sprintf( $msg, 'cdata' ) );
     65    }
    3366}
Note: See TracChangeset for help on using the changeset viewer.