Make WordPress Core


Ignore:
Timestamp:
09/30/2025 05:05:21 PM (11 months ago)
Author:
desrosj
Message:

Grouped backports for the 5.2 branch.

  • REST API: Increase the specificity of capability checks for collections when the edit context is in use.
  • Menus: Prevent HTML in menu item titles from being rendered unexpectedly.

Merges [60814], [60815], [60816] to the 5.2 branch.

Props andraganescu, desrosj, ehti, hurayraiit, iandunn, joehoyle, johnbillion, jorbin, mnelson4, noisysocks, peterwilsoncc, phillsav, rmccue, timothyblynjacobs, vortfu, westonruter , whyisjake, zieladam.

Location:
branches/5.2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/5.2

  • branches/5.2/tests/phpunit/tests/customize/nav-menu-item-setting.php

    r43571 r60834  
    9090                        'xfn'              => '',
    9191                        'status'           => 'publish',
    92                         'original_title'   => '',
    9392                        'nav_menu_term_id' => 0,
    9493                        '_invalid'         => false,
     
    146145         *
    147146         * @see WP_Customize_Nav_Menu_Item_Setting::value()
     147         * @see WP_Customize_Nav_Menu_Item_Setting::js_value()
    148148         */
    149149        function test_value_type_post_type() {
    150150                do_action( 'customize_register', $this->wp_customize );
    151151
    152                 $post_id = self::factory()->post->create( array( 'post_title' => 'Hello World' ) );
     152                $post_id = self::factory()->post->create( array( 'post_title' => 'Hello <em>World</em>' ) );
    153153
    154154                $menu_id    = wp_create_nav_menu( 'Menu' );
    155155                $item_title = 'Greetings';
     156                $item_props = array(
     157                        'menu-item-type'      => 'post_type',
     158                        'menu-item-object'    => 'post',
     159                        'menu-item-object-id' => $post_id,
     160                        'menu-item-title'     => $item_title,
     161                        'menu-item-status'    => 'publish',
     162                );
    156163                $item_id    = wp_update_nav_menu_item(
    157164                        $menu_id,
    158165                        0,
    159                         array(
    160                                 'menu-item-type'      => 'post_type',
    161                                 'menu-item-object'    => 'post',
    162                                 'menu-item-object-id' => $post_id,
    163                                 'menu-item-title'     => $item_title,
    164                                 'menu-item-status'    => 'publish',
    165                         )
     166                        $item_props
    166167                );
    167168
     
    173174                $setting    = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
    174175
    175                 $value = $setting->value();
    176                 $this->assertEquals( $menu_item->title, $value['title'] );
    177                 $this->assertEquals( $menu_item->type, $value['type'] );
     176                $value    = $setting->value();
     177                $js_value = $setting->js_value();
     178                $this->assertSame( $menu_item->title, $value['title'] );
     179                $this->assertSame( $menu_item->type, $value['type'] );
    178180                $this->assertEquals( $menu_item->object_id, $value['object_id'] );
    179                 $this->assertEquals( $menu_id, $value['nav_menu_term_id'] );
    180                 $this->assertEquals( 'Hello World', $value['original_title'] );
     181                $this->assertSame( $menu_id, $value['nav_menu_term_id'] );
     182                $this->assertSame( 'Hello <em>World</em>', $value['original_title'] );
     183                $this->assertSame( 'Hello <em>World</em>', $js_value['original_title'] );
     184                $this->assertSame( $value, array_merge( $js_value, array( 'original_title' => $value['original_title'] ) ) );
    181185
    182186                $other_menu_id = wp_create_nav_menu( 'Menu2' );
     
    184188                        $other_menu_id,
    185189                        $item_id,
    186                         array(
    187                                 'menu-item-title' => 'Hola',
    188                         )
    189                 );
    190                 $value = $setting->value();
    191                 $this->assertEquals( 'Hola', $value['title'] );
    192                 $this->assertEquals( $other_menu_id, $value['nav_menu_term_id'] );
     190                        array_merge(
     191                                $item_props,
     192                                array(
     193                                        'menu-item-title' => 'Hola &lt;em&gt;Mundo&lt;/em&gt;',
     194                                )
     195                        )
     196                );
     197                $value    = $setting->value();
     198                $js_value = $setting->js_value();
     199                $this->assertSame( $menu_item->type, $value['type'] );
     200                $this->assertSame( 'Hola &lt;em&gt;Mundo&lt;/em&gt;', $value['title'] );
     201                $this->assertSame( 'Hello &lt;em&gt;World&lt;/em&gt;', $value['original_title'] );
     202                $this->assertSame( 'Hello <em>World</em>', $js_value['original_title'] );
     203                $this->assertSame( $other_menu_id, $value['nav_menu_term_id'] );
     204                $this->assertSame( $value, array_merge( $js_value, array( 'original_title' => $value['original_title'] ) ) );
    193205        }
    194206
     
    197209         *
    198210         * @see WP_Customize_Nav_Menu_Item_Setting::value()
     211         * @see WP_Customize_Nav_Menu_Item_Setting::js_value()
    199212         */
    200213        function test_value_type_post_type_without_label() {
    201214                do_action( 'customize_register', $this->wp_customize );
    202215
    203                 $original_title = 'Hello World';
     216                $original_title = 'Hello &lt;i&gt;World&lt;/i&gt;';
    204217                $post_id        = self::factory()->post->create( array( 'post_title' => $original_title ) );
    205218
     
    220233                $setting    = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
    221234
    222                 $value = $setting->value();
    223                 $this->assertEquals( '', $value['title'] );
    224                 $this->assertEquals( $original_title, $value['original_title'] );
     235                $value    = $setting->value();
     236                $js_value = $setting->js_value();
     237                $this->assertSame( '', $value['title'] );
     238                $this->assertSame( $original_title, $value['original_title'] );
     239                $this->assertSame( 'Hello <i>World</i>', $js_value['original_title'] );
    225240        }
    226241
     
    233248                do_action( 'customize_register', $this->wp_customize );
    234249
    235                 $tax_id = self::factory()->category->create( array( 'name' => 'Salutations' ) );
     250                $tax_id = self::factory()->category->create( array( 'name' => '&iexcl;Salutations!' ) );
    236251
    237252                $menu_id    = wp_create_nav_menu( 'Menu' );
    238                 $item_title = 'Greetings';
     253                $item_title = '&iexcl;Greetings!';
    239254                $item_id    = wp_update_nav_menu_item(
    240255                        $menu_id,
     
    256271                $setting    = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
    257272
    258                 $value = $setting->value();
    259                 $this->assertEquals( $menu_item->title, $value['title'] );
    260                 $this->assertEquals( $menu_item->type, $value['type'] );
     273                $value    = $setting->value();
     274                $js_value = $setting->js_value();
     275                $this->assertSame( $menu_item->title, $value['title'] );
     276                $this->assertSame( $menu_item->type, $value['type'] );
    261277                $this->assertEquals( $menu_item->object_id, $value['object_id'] );
    262                 $this->assertEquals( $menu_id, $value['nav_menu_term_id'] );
    263                 $this->assertEquals( 'Salutations', $value['original_title'] );
     278                $this->assertSame( $menu_id, $value['nav_menu_term_id'] );
     279                $this->assertSame( '&iexcl;Salutations!', $value['original_title'] );
     280                $this->assertSame( '¡Salutations!', $js_value['original_title'] );
    264281        }
    265282
     
    268285         *
    269286         * @see WP_Customize_Nav_Menu_Item_Setting::value()
     287         * @see WP_Customize_Nav_Menu_Item_Setting::js_value()
    270288         */
    271289        function test_custom_type_label() {
     
    291309                $setting    = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
    292310
    293                 $value = $setting->value();
    294                 $this->assertEquals( $menu_item->type_label, 'Custom Label' );
    295                 $this->assertEquals( $menu_item->type_label, $value['type_label'] );
     311                $value    = $setting->value();
     312                $js_value = $setting->js_value();
     313                $this->assertSame( 'Custom Label', $value['type_label'] );
     314                $this->assertSame( 'custom_type', $value['type'] );
     315                $this->assertSame( '', $value['original_title'] );
     316                $this->assertSame( '', $js_value['original_title'] );
    296317        }
    297318
     
    394415                        $this->assertEquals( $value, $updated_item->$key, "Key $key mismatch" );
    395416                }
     417        }
     418
     419        /**
     420         * Test preview method for updated menu with readonly properties.
     421         *
     422         * @see WP_Customize_Nav_Menu_Item_Setting::preview()
     423         */
     424        public function test_preview_readonly_properties() {
     425                do_action( 'customize_register', $this->wp_customize );
     426
     427                $post_id    = self::factory()->post->create( array( 'post_title' => '&iexcl;Hello World!' ) );
     428                $menu_id    = wp_create_nav_menu( 'Primary' );
     429                $item_title = 'Greetings';
     430                $item_id    = wp_update_nav_menu_item(
     431                        $menu_id,
     432                        0,
     433                        array(
     434                                'menu-item-type'      => 'post_type',
     435                                'menu-item-object'    => 'post',
     436                                'menu-item-object-id' => $post_id,
     437                                'menu-item-title'     => $item_title,
     438                                'menu-item-status'    => 'publish',
     439                        )
     440                );
     441
     442                $post_value = array(
     443                        'type'             => 'post_type',
     444                        'object'           => 'post',
     445                        'object_id'        => $post_id,
     446                        'title'            => 'Saludos',
     447                        'status'           => 'publish',
     448                        'nav_menu_term_id' => $menu_id,
     449                        'type_label'       => 'Override Label',
     450                        'original_title'   => 'Not Original!',
     451                );
     452                $setting_id = "nav_menu_item[$item_id]";
     453                $setting    = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
     454                $this->wp_customize->set_post_value( $setting_id, $post_value );
     455                $setting->preview();
     456
     457                $value    = $setting->value();
     458                $js_value = $setting->js_value();
     459                $this->assertSame( 'Saludos', $value['title'] );
     460                $this->assertSame( 'Saludos', $js_value['title'] );
     461                $this->assertSame( 'Post', $value['type_label'] );
     462                $this->assertSame( 'Post', $js_value['type_label'] );
     463                $this->assertSame( '&iexcl;Hello World!', $value['original_title'] );
     464                $this->assertSame( '¡Hello World!', $js_value['original_title'] );
    396465        }
    397466
     
    459528         *
    460529         * @see WP_Customize_Nav_Menu_Item_Setting::preview()
     530         * @see WP_Customize_Nav_Menu_Item_Setting::value()
     531         * @see WP_Customize_Nav_Menu_Item_Setting::js_value()
    461532         */
    462533        function test_preview_deleted() {
     
    493564                $this->assertNotEquals( count( $current_items ), count( $preview_items ) );
    494565                $this->assertContains( $delete_item_id, wp_list_pluck( $current_items, 'db_id' ) );
     566
     567                $this->assertFalse( $setting->value() );
     568                $this->assertFalse( $setting->js_value() );
    495569        }
    496570
     
    561635                        'xfn'              => 'hello " inject="',
    562636                        'status'           => 'forbidden',
    563                         'original_title'   => 'Hi<script>unfilteredHtml()</script>',
     637                        'original_title'   => 'Possibly authored by an admin: <script>unfilteredHtml()</script>',
    564638                        'nav_menu_term_id' => 'heilo',
    565639                        '_invalid'         => false,
     
    580654                        'xfn'              => 'hello  inject',
    581655                        'status'           => 'draft',
    582                         'original_title'   => 'Hi',
     656                        'original_title'   => 'Possibly authored by an admin: <script>unfilteredHtml()</script>',
    583657                        'nav_menu_term_id' => 0,
    584658                );
Note: See TracChangeset for help on using the changeset viewer.