Changeset 60834
- Timestamp:
- 09/30/2025 05:05:21 PM (8 weeks ago)
- Location:
- branches/5.2
- Files:
-
- 13 edited
-
. (modified) (1 prop)
-
src/js/_enqueues/lib/nav-menu.js (modified) (2 diffs)
-
src/js/_enqueues/wp/customize/nav-menus.js (modified) (2 diffs)
-
src/wp-includes/class-wp-customize-nav-menus.php (modified) (3 diffs)
-
src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php (modified) (12 diffs)
-
src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php (modified) (1 diff)
-
src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php (modified) (1 diff)
-
src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php (modified) (4 diffs)
-
tests/phpunit/tests/customize/nav-menu-item-setting.php (modified) (15 diffs)
-
tests/phpunit/tests/customize/nav-menus.php (modified) (7 diffs)
-
tests/phpunit/tests/rest-api/rest-posts-controller.php (modified) (1 diff)
-
tests/phpunit/tests/rest-api/rest-tags-controller.php (modified) (1 diff)
-
tests/phpunit/tests/rest-api/rest-users-controller.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/5.2
- Property svn:mergeinfo changed
/trunk merged: 60814-60816
- Property svn:mergeinfo changed
-
branches/5.2/src/js/_enqueues/lib/nav-menu.js
r45870 r60834 1177 1177 1178 1178 eventOnClickMenuSave : function() { 1179 var locs = '',1180 menuName = $('#menu-name'),1181 menuNameVal = menuName.val(); 1182 // Cancel and warn if invalid menu name 1179 var menuName = $('#menu-name'), 1180 menuNameVal = menuName.val(); 1181 1182 // Cancel and warn if invalid menu name. 1183 1183 if ( ! menuNameVal || ! menuNameVal.replace( /\s+/, '' ) ) { 1184 1184 menuName.parent().addClass( 'form-invalid' ); 1185 1185 return false; 1186 1186 } 1187 // Copy menu theme locations 1187 // Copy menu theme locations. 1188 // Note: This appears to be dead code since #nav-menu-theme-locations no longer exists, perhaps removed in r32842. 1189 var $updateNavMenu = $('#update-nav-menu'); 1188 1190 $('#nav-menu-theme-locations select').each(function() { 1189 locs += '<input type="hidden" name="' + this.name + '" value="' + $(this).val() + '" />'; 1190 }); 1191 $('#update-nav-menu').append( locs ); 1192 // Update menu item position data 1191 $updateNavMenu.append( 1192 $( '<input>', { 1193 type: 'hidden', 1194 name: this.name, 1195 value: $( this ).val() 1196 } ) 1197 ); 1198 }); 1199 // Update menu item position data. 1193 1200 api.menuList.find('.menu-item-data-position').val( function(index) { return index + 1; } ); 1194 1201 window.onbeforeunload = null; … … 1230 1237 1231 1238 if( ! $items.length ) { 1232 $('.categorychecklist', panel).html( '<li><p>' + navMenuL10n.noResultsFound + '</p></li>' ); 1239 var li = $( '<li>' ); 1240 var p = $( '<p>', { text: navMenuL10n.noResultsFound } ); 1241 li.append( p ); 1242 $('.categorychecklist', panel).empty().append( li ); 1233 1243 $( '.spinner', panel ).removeClass( 'is-active' ); 1234 1244 wrapper.addClass( 'has-no-menu-item' ); -
branches/5.2/src/js/_enqueues/wp/customize/nav-menus.js
r45989 r60834 525 525 } 526 526 527 this.currentMenuControl.addItemToMenu( menu_item.attributes ); 527 // Leave the title as empty to reuse the original title as a placeholder if set. 528 var nav_menu_item = Object.assign( {}, menu_item.attributes ); 529 if ( nav_menu_item.title === nav_menu_item.original_title ) { 530 nav_menu_item.title = ''; 531 } 532 533 this.currentMenuControl.addItemToMenu( nav_menu_item ); 528 534 529 535 $( menuitemTpl ).find( '.menu-item-handle' ).addClass( 'item-added' ); … … 2979 2985 { 2980 2986 nav_menu_term_id: menuControl.params.menu_id, 2981 original_title: item.title,2982 2987 position: position 2983 2988 } -
branches/5.2/src/wp-includes/class-wp-customize-nav-menus.php
r44328 r60834 159 159 } elseif ( 'post' !== $object && 0 === $page && $post_type->has_archive ) { 160 160 // Add a post type archive link. 161 $title = $post_type->labels->archives; 161 162 $items[] = array( 162 'id' => $object . '-archive', 163 'title' => $post_type->labels->archives, 164 'type' => 'post_type_archive', 165 'type_label' => __( 'Post Type Archive' ), 166 'object' => $object, 167 'url' => get_post_type_archive_link( $object ), 163 'id' => $object_name . '-archive', 164 'title' => $title, 165 'original_title' => $title, 166 'type' => 'post_type_archive', 167 'type_label' => __( 'Post Type Archive' ), 168 'object' => $object_name, 169 'url' => get_post_type_archive_link( $object_name ), 168 170 ); 169 171 } … … 199 201 $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); 200 202 } 203 204 $title = html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ); 201 205 $items[] = array( 202 'id' => "post-{$post->ID}", 203 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), 204 'type' => 'post_type', 205 'type_label' => get_post_type_object( $post->post_type )->labels->singular_name, 206 'object' => $post->post_type, 207 'object_id' => intval( $post->ID ), 208 'url' => get_permalink( intval( $post->ID ) ), 206 'id' => "post-{$post->ID}", 207 'title' => $title, 208 'original_title' => $title, 209 'type' => 'post_type', 210 'type_label' => get_post_type_object( $post->post_type )->labels->singular_name, 211 'object' => $post->post_type, 212 'object_id' => (int) $post->ID, 213 'url' => get_permalink( (int) $post->ID ), 209 214 ); 210 215 } … … 230 235 231 236 foreach ( $terms as $term ) { 237 $title = html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ); 232 238 $items[] = array( 233 'id' => "term-{$term->term_id}", 234 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), 235 'type' => 'taxonomy', 236 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, 237 'object' => $term->taxonomy, 238 'object_id' => intval( $term->term_id ), 239 'url' => get_term_link( intval( $term->term_id ), $term->taxonomy ), 239 'id' => "term-{$term->term_id}", 240 'title' => $title, 241 'original_title' => $title, 242 'type' => 'taxonomy', 243 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, 244 'object' => $term->taxonomy, 245 'object_id' => (int) $term->term_id, 246 'url' => get_term_link( (int) $term->term_id, $term->taxonomy ), 240 247 ); 241 248 } -
branches/5.2/src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php
r43571 r60834 57 57 'xfn' => '', 58 58 'status' => 'publish', 59 'original_title' => '',60 59 'nav_menu_term_id' => 0, // This will be supplied as the $menu_id arg for wp_update_nav_menu_item(). 61 60 '_invalid' => false, … … 212 211 */ 213 212 public function value() { 214 if ( $this->is_previewed && $this->_previewed_blog_id === get_current_blog_id() ) { 213 $type_label = null; 214 if ( $this->is_previewed && get_current_blog_id() === $this->_previewed_blog_id ) { 215 215 $undefined = new stdClass(); // Symbol. 216 216 $post_value = $this->post_value( $undefined ); … … 220 220 } else { 221 221 $value = $post_value; 222 }223 if ( ! empty( $value ) && empty( $value['original_title'] ) ) {224 $value['original_title'] = $this->get_original_title( (object) $value );225 222 } 226 223 } elseif ( isset( $this->value ) ) { … … 235 232 $is_title_empty = empty( $post->post_title ); 236 233 $value = (array) wp_setup_nav_menu_item( $post ); 234 if ( isset( $value['type_label'] ) ) { 235 $type_label = $value['type_label']; 236 } 237 237 if ( $is_title_empty ) { 238 238 $value['title'] = ''; … … 251 251 } 252 252 253 if ( ! empty( $value ) && empty( $value['type_label'] ) ) { 254 $value['type_label'] = $this->get_type_label( (object) $value ); 253 // These properties are read-only and are part of the setting for use in the Customizer UI. 254 if ( is_array( $value ) ) { 255 $value_obj = (object) $value; 256 $value['type_label'] = isset( $type_label ) ? $type_label : $this->get_type_label( $value_obj ); 257 $value['original_title'] = $this->get_original_title( $value_obj ); 255 258 } 256 259 … … 259 262 260 263 /** 264 * Prepares the value for editing on the client. 265 * 266 * @since 6.8.3 267 * 268 * @return array|false Value prepared for the client. 269 */ 270 public function js_value() { 271 $value = parent::js_value(); 272 if ( is_array( $value ) && isset( $value['original_title'] ) ) { 273 // Decode entities for the sake of displaying the original title as a placeholder. 274 $value['original_title'] = html_entity_decode( $value['original_title'], ENT_QUOTES, get_bloginfo( 'charset' ) ); 275 } 276 return $value; 277 } 278 279 /** 261 280 * Get original title. 262 281 * … … 264 283 * 265 284 * @param object $item Nav menu item. 266 * @return string The original title .285 * @return string The original title, without entity decoding. 267 286 */ 268 287 protected function get_original_title( $item ) { … … 290 309 } 291 310 } 292 $original_title = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) );293 311 return $original_title; 294 312 } … … 346 364 $this->value['status'] = $this->value['post_status']; 347 365 unset( $this->value['post_status'] ); 348 }349 350 if ( ! isset( $this->value['original_title'] ) ) {351 $this->value['original_title'] = $this->get_original_title( (object) $this->value );352 366 } 353 367 … … 593 607 unset( $item->position ); 594 608 595 if ( empty( $item->original_title ) ) {596 $item->original_title = $this->get_original_title( $item );597 }598 609 if ( empty( $item->title ) && ! empty( $item->original_title ) ) { 599 $item->title = $item->original_title; 610 $item->title = $item->original_title; // This is NOT entity-decoded. It comes from self::get_original_title(). 600 611 } 601 612 if ( $item->title ) { … … 647 658 * @since 4.3.0 648 659 * 649 * @param array $menu_item_value Thevalue to sanitize.660 * @param array|false $value The menu item value to sanitize. 650 661 * @return array|false|null|WP_Error Null or WP_Error if an input isn't valid. False if it is marked for deletion. 651 662 * Otherwise the sanitized value. … … 701 712 } 702 713 703 $menu_item_value['original_title'] = sanitize_text_field( $menu_item_value['original_title'] );704 705 714 // Apply the same filters as when calling wp_insert_post(). 706 715 -
branches/5.2/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
r50729 r60834 347 347 348 348 foreach ( $query_result as $post ) { 349 if ( ! $this->check_read_permission( $post ) ) { 349 if ( 'edit' === $request['context'] ) { 350 $permission = $this->check_update_permission( $post ); 351 } else { 352 $permission = $this->check_read_permission( $post ); 353 } 354 355 if ( ! $permission ) { 350 356 continue; 351 357 } -
branches/5.2/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php
r54563 r60834 327 327 328 328 foreach ( $query_result as $term ) { 329 if ( 'edit' === $request['context'] && ! current_user_can( 'edit_term', $term->term_id ) ) { 330 continue; 331 } 332 329 333 $data = $this->prepare_item_for_response( $term, $request ); 330 334 $response[] = $this->prepare_response_for_collection( $data ); -
branches/5.2/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php
r56876 r60834 192 192 193 193 if ( 'edit' === $request['context'] && ! current_user_can( 'list_users' ) ) { 194 return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to list users.' ), array( 'status' => rest_authorization_required_code() ) );194 return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit users.' ), array( 'status' => rest_authorization_required_code() ) ); 195 195 } 196 196 … … 306 306 307 307 foreach ( $query->results as $user ) { 308 if ( 'edit' === $request['context'] && ! current_user_can( 'edit_user', $user->ID ) ) { 309 continue; 310 } 311 308 312 $data = $this->prepare_item_for_response( $user, $request ); 309 313 $users[] = $this->prepare_response_for_collection( $data ); … … 400 404 } 401 405 402 if ( 'edit' === $request['context'] && ! current_user_can( 'list_users' ) ) { 403 return new WP_Error( 'rest_user_cannot_view', __( 'Sorry, you are not allowed to list users.' ), array( 'status' => rest_authorization_required_code() ) ); 404 } elseif ( ! count_user_posts( $user->ID, $types ) && ! current_user_can( 'edit_user', $user->ID ) && ! current_user_can( 'list_users' ) ) { 406 if ( 'edit' === $request['context'] && ! current_user_can( 'edit_user', $user->ID ) ) { 407 return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit this user.' ), array( 'status' => rest_authorization_required_code() ) ); 408 } 409 410 if ( ! current_user_can( 'edit_user', $user->ID ) && ! current_user_can( 'list_users' ) && ! count_user_posts( $user->ID, $types ) ) { 405 411 return new WP_Error( 'rest_user_cannot_view', __( 'Sorry, you are not allowed to list users.' ), array( 'status' => rest_authorization_required_code() ) ); 406 412 } … … 923 929 } 924 930 925 if ( in_array( 'roles', $fields, true ) ) {931 if ( in_array( 'roles', $fields, true ) && ( current_user_can( 'list_users' ) || current_user_can( 'edit_user', $user->ID ) ) ) { 926 932 // Defensively call array_values() to ensure an array is returned. 927 933 $data['roles'] = array_values( $user->roles ); -
branches/5.2/tests/phpunit/tests/customize/nav-menu-item-setting.php
r43571 r60834 90 90 'xfn' => '', 91 91 'status' => 'publish', 92 'original_title' => '',93 92 'nav_menu_term_id' => 0, 94 93 '_invalid' => false, … … 146 145 * 147 146 * @see WP_Customize_Nav_Menu_Item_Setting::value() 147 * @see WP_Customize_Nav_Menu_Item_Setting::js_value() 148 148 */ 149 149 function test_value_type_post_type() { 150 150 do_action( 'customize_register', $this->wp_customize ); 151 151 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>' ) ); 153 153 154 154 $menu_id = wp_create_nav_menu( 'Menu' ); 155 155 $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 ); 156 163 $item_id = wp_update_nav_menu_item( 157 164 $menu_id, 158 165 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 166 167 ); 167 168 … … 173 174 $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id ); 174 175 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'] ); 178 180 $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'] ) ) ); 181 185 182 186 $other_menu_id = wp_create_nav_menu( 'Menu2' ); … … 184 188 $other_menu_id, 185 189 $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 <em>Mundo</em>', 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 <em>Mundo</em>', $value['title'] ); 201 $this->assertSame( 'Hello <em>World</em>', $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'] ) ) ); 193 205 } 194 206 … … 197 209 * 198 210 * @see WP_Customize_Nav_Menu_Item_Setting::value() 211 * @see WP_Customize_Nav_Menu_Item_Setting::js_value() 199 212 */ 200 213 function test_value_type_post_type_without_label() { 201 214 do_action( 'customize_register', $this->wp_customize ); 202 215 203 $original_title = 'Hello World';216 $original_title = 'Hello <i>World</i>'; 204 217 $post_id = self::factory()->post->create( array( 'post_title' => $original_title ) ); 205 218 … … 220 233 $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id ); 221 234 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'] ); 225 240 } 226 241 … … 233 248 do_action( 'customize_register', $this->wp_customize ); 234 249 235 $tax_id = self::factory()->category->create( array( 'name' => ' Salutations' ) );250 $tax_id = self::factory()->category->create( array( 'name' => '¡Salutations!' ) ); 236 251 237 252 $menu_id = wp_create_nav_menu( 'Menu' ); 238 $item_title = ' Greetings';253 $item_title = '¡Greetings!'; 239 254 $item_id = wp_update_nav_menu_item( 240 255 $menu_id, … … 256 271 $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id ); 257 272 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'] ); 261 277 $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( '¡Salutations!', $value['original_title'] ); 280 $this->assertSame( '¡Salutations!', $js_value['original_title'] ); 264 281 } 265 282 … … 268 285 * 269 286 * @see WP_Customize_Nav_Menu_Item_Setting::value() 287 * @see WP_Customize_Nav_Menu_Item_Setting::js_value() 270 288 */ 271 289 function test_custom_type_label() { … … 291 309 $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id ); 292 310 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'] ); 296 317 } 297 318 … … 394 415 $this->assertEquals( $value, $updated_item->$key, "Key $key mismatch" ); 395 416 } 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' => '¡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( '¡Hello World!', $value['original_title'] ); 464 $this->assertSame( '¡Hello World!', $js_value['original_title'] ); 396 465 } 397 466 … … 459 528 * 460 529 * @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() 461 532 */ 462 533 function test_preview_deleted() { … … 493 564 $this->assertNotEquals( count( $current_items ), count( $preview_items ) ); 494 565 $this->assertContains( $delete_item_id, wp_list_pluck( $current_items, 'db_id' ) ); 566 567 $this->assertFalse( $setting->value() ); 568 $this->assertFalse( $setting->js_value() ); 495 569 } 496 570 … … 561 635 'xfn' => 'hello " inject="', 562 636 'status' => 'forbidden', 563 'original_title' => ' Hi<script>unfilteredHtml()</script>',637 'original_title' => 'Possibly authored by an admin: <script>unfilteredHtml()</script>', 564 638 'nav_menu_term_id' => 'heilo', 565 639 '_invalid' => false, … … 580 654 'xfn' => 'hello inject', 581 655 'status' => 'draft', 582 'original_title' => ' Hi',656 'original_title' => 'Possibly authored by an admin: <script>unfilteredHtml()</script>', 583 657 'nav_menu_term_id' => 0, 584 658 ); -
branches/5.2/tests/phpunit/tests/customize/nav-menus.php
r43571 r60834 145 145 // Home is included in menu items when page is zero. 146 146 $items = $menus->load_available_items_query( 'post_type', 'page', 0 ); 147 $this->assertContains( $expected, $items );147 $this->assertContains( $expected, $items, "Items:\n" . var_export( $items, true ) ); 148 148 149 149 // Home is not included in menu items when page is larger than zero. 150 150 $items = $menus->load_available_items_query( 'post_type', 'page', 1 ); 151 151 $this->assertNotEmpty( $items ); 152 $this->assertNotContains( $expected, $items );152 $this->assertNotContains( $expected, $items, "Items:\n" . var_export( $items, true ) ); 153 153 } 154 154 … … 162 162 163 163 // Create page. 164 $post_id = self::factory()->post->create( array( 'post_title' => 'Post Title' ) );164 $post_id = self::factory()->post->create( array( 'post_title' => 'Post <strong>Strong</strong> Title' ) ); 165 165 166 166 // Create pages. … … 169 169 // Expected menu item array. 170 170 $expected = array( 171 'id' => "post-{$post_id}", 172 'title' => 'Post Title', 173 'type' => 'post_type', 174 'type_label' => 'Post', 175 'object' => 'post', 176 'object_id' => intval( $post_id ), 177 'url' => get_permalink( intval( $post_id ) ), 171 'id' => "post-{$post_id}", 172 'title' => 'Post <strong>Strong</strong> Title', 173 'original_title' => 'Post <strong>Strong</strong> Title', 174 'type' => 'post_type', 175 'type_label' => 'Post', 176 'object' => 'post', 177 'object_id' => (int) $post_id, 178 'url' => get_permalink( (int) $post_id ), 178 179 ); 179 180 180 181 // Offset the query and get the second page of menu items. 181 182 $items = $menus->load_available_items_query( 'post_type', 'post', 1 ); 182 $this->assertContains( $expected, $items );183 $this->assertContains( $expected, $items, "Items:\n" . var_export( $items, true ) ); 183 184 } 184 185 … … 201 202 // Expected menu item array. 202 203 $expected = array( 203 'id' => "post-{$page_id}", 204 'title' => 'Page Title', 205 'type' => 'post_type', 206 'type_label' => 'Page', 207 'object' => 'page', 208 'object_id' => intval( $page_id ), 209 'url' => get_permalink( intval( $page_id ) ), 204 'id' => "post-{$page_id}", 205 'title' => 'Page Title', 206 'original_title' => 'Page Title', 207 'type' => 'post_type', 208 'type_label' => 'Page', 209 'object' => 'page', 210 'object_id' => (int) $page_id, 211 'url' => get_permalink( (int) $page_id ), 210 212 ); 211 213 212 214 $items = $menus->load_available_items_query( 'post_type', 'page', 0 ); 213 $this->assertContains( $expected, $items );215 $this->assertContains( $expected, $items, "Items:\n" . var_export( $items, true ) ); 214 216 } 215 217 … … 227 229 // Expected menu item array. 228 230 $expected = array( 229 'id' => "post-{$post_id}", 230 'title' => 'Post Title', 231 'type' => 'post_type', 232 'type_label' => 'Post', 233 'object' => 'post', 234 'object_id' => intval( $post_id ), 235 'url' => get_permalink( intval( $post_id ) ), 231 'id' => "post-{$post_id}", 232 'title' => 'Post Title', 233 'original_title' => 'Post Title', 234 'type' => 'post_type', 235 'type_label' => 'Post', 236 'object' => 'post', 237 'object_id' => (int) $post_id, 238 'url' => get_permalink( (int) $post_id ), 236 239 ); 237 240 238 241 $items = $menus->load_available_items_query( 'post_type', 'post', 0 ); 239 $this->assertContains( $expected, $items );242 $this->assertContains( $expected, $items, "Items:\n" . var_export( $items, true ) ); 240 243 } 241 244 … … 253 256 // Expected menu item array. 254 257 $expected = array( 255 'id' => "term-{$term_id}", 256 'title' => 'Term Title', 257 'type' => 'taxonomy', 258 'type_label' => 'Category', 259 'object' => 'category', 260 'object_id' => intval( $term_id ), 261 'url' => get_term_link( intval( $term_id ), 'category' ), 258 'id' => "term-{$term_id}", 259 'title' => 'Term Title', 260 'original_title' => 'Term Title', 261 'type' => 'taxonomy', 262 'type_label' => 'Category', 263 'object' => 'category', 264 'object_id' => (int) $term_id, 265 'url' => get_term_link( (int) $term_id, 'category' ), 262 266 ); 263 267 264 268 $items = $menus->load_available_items_query( 'taxonomy', 'category', 0 ); 265 $this->assertContains( $expected, $items );269 $this->assertContains( $expected, $items, "Items:\n" . var_export( $items, true ) ); 266 270 } 267 271 … … 288 292 289 293 $items = $menus->load_available_items_query( 'custom_type', 'custom_object', 0 ); 290 $this->assertContains( $expected, $items );294 $this->assertContains( $expected, $items, "Items:\n" . var_export( $items, true ) ); 291 295 } 292 296 -
branches/5.2/tests/phpunit/tests/rest-api/rest-posts-controller.php
r50729 r60834 4314 4314 4315 4315 /** 4316 * @group 1018470 4317 */ 4318 public function test_cannot_get_other_users_single_post_with_edit_context_if_disallowed() { 4319 $author_post = self::factory()->post->create( 4320 array( 4321 'post_password' => 'test', 4322 'post_author' => self::$author_id, 4323 ) 4324 ); 4325 4326 wp_set_current_user( self::$contributor_id ); 4327 4328 $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . $author_post ); 4329 $request->set_query_params( array( 'context' => 'edit' ) ); 4330 $response = rest_do_request( $request ); 4331 4332 $this->assertErrorResponse( 'rest_forbidden_context', $response, 403, 'Contributor should not be able to access Author post with edit context' ); 4333 } 4334 4335 /** 4336 * @group 1018470 4337 */ 4338 public function test_cannot_see_other_users_post_in_collection_with_edit_context_if_disallowed() { 4339 $author_post = self::factory()->post->create( 4340 array( 4341 'post_password' => 'test', 4342 'post_author' => self::$author_id, 4343 ) 4344 ); 4345 4346 wp_set_current_user( self::$contributor_id ); 4347 4348 $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); 4349 $request->set_query_params( 4350 array( 4351 'context' => 'edit', 4352 'include' => $author_post, 4353 ) 4354 ); 4355 $response = rest_do_request( $request ); 4356 $data = $response->get_data(); 4357 4358 $this->assertIsArray( $data ); 4359 $this->assertEmpty( $data ); 4360 } 4361 4362 /** 4316 4363 * Internal function used to disable an insert query which 4317 4364 * will trigger a wpdb error for testing purposes. -
branches/5.2/tests/phpunit/tests/rest-api/rest-tags-controller.php
r44510 r60834 1270 1270 } 1271 1271 1272 /** 1273 * @group 1018470 1274 */ 1275 public function test_cannot_get_single_term_with_edit_context_if_disallowed() { 1276 add_filter( 1277 'map_meta_cap', 1278 static function ( $caps, $cap ) { 1279 if ( 'edit_term' === $cap ) { 1280 return array( 'do_not_allow' ); 1281 } 1282 1283 return $caps; 1284 }, 1285 10, 1286 2 1287 ); 1288 1289 $term = self::factory()->term->create(); 1290 1291 wp_set_current_user( self::$editor ); 1292 1293 $request = new WP_REST_Request( 'GET', '/wp/v2/tags/' . $term ); 1294 $request->set_query_params( array( 'context' => 'edit' ) ); 1295 $response = rest_do_request( $request ); 1296 $this->assertErrorResponse( 'rest_forbidden_context', $response, 403 ); 1297 } 1298 1299 /** 1300 * @group 1018470 1301 */ 1302 public function test_cannot_see_single_term_in_collection_with_edit_context_if_disallowed() { 1303 add_filter( 1304 'map_meta_cap', 1305 static function ( $caps, $cap ) { 1306 if ( 'edit_term' === $cap ) { 1307 return array( 'do_not_allow' ); 1308 } 1309 1310 return $caps; 1311 }, 1312 10, 1313 2 1314 ); 1315 1316 $term = self::factory()->term->create(); 1317 1318 wp_set_current_user( self::$editor ); 1319 1320 $request = new WP_REST_Request( 'GET', '/wp/v2/tags' ); 1321 $request->set_query_params( 1322 array( 1323 'context' => 'edit', 1324 'include' => $term, 1325 ) 1326 ); 1327 $response = rest_do_request( $request ); 1328 $data = $response->get_data(); 1329 1330 $this->assertIsArray( $data ); 1331 $this->assertEmpty( $data ); 1332 } 1333 1272 1334 public function additional_field_get_callback( $object, $request ) { 1273 1335 return 123; -
branches/5.2/tests/phpunit/tests/rest-api/rest-users-controller.php
r44642 r60834 1050 1050 $request->set_param( 'context', 'edit' ); 1051 1051 $response = rest_get_server()->dispatch( $request ); 1052 $this->assertErrorResponse( 'rest_ user_cannot_view', $response, 401 );1052 $this->assertErrorResponse( 'rest_forbidden_context', $response, 401 ); 1053 1053 } 1054 1054 … … 2744 2744 2745 2745 /** 2746 * @group 1018470 2747 */ 2748 public function test_cannot_get_single_user_with_edit_context_if_disallowed() { 2749 $privileged_contributor = self::factory()->user->create_and_get( array( 'role' => 'subscriber' ) ); 2750 $privileged_contributor->add_cap( 'list_users' ); 2751 2752 wp_set_current_user( $privileged_contributor->ID ); 2753 2754 // Single request for a disallowed user returns an error. 2755 $request = new WP_REST_Request( 'GET', '/wp/v2/users/1' ); 2756 $request->set_query_params( array( 'context' => 'edit' ) ); 2757 $response = rest_do_request( $request ); 2758 $this->assertErrorResponse( 'rest_forbidden_context', $response, 403 ); 2759 } 2760 2761 /** 2762 * @group 1018470 2763 */ 2764 public function test_cannot_see_user_in_collection_with_edit_context_if_disallowed() { 2765 $privileged_contributor = self::factory()->user->create_and_get( array( 'role' => 'subscriber' ) ); 2766 $privileged_contributor->add_cap( 'list_users' ); 2767 2768 wp_set_current_user( $privileged_contributor->ID ); 2769 2770 // Collection request including a disallowed user omits that user. 2771 $request = new WP_REST_Request( 'GET', '/wp/v2/users' ); 2772 $request->set_query_params( 2773 array( 2774 'context' => 'edit', 2775 'include' => array( 1 ), 2776 ) 2777 ); 2778 $response = rest_do_request( $request ); 2779 $data = $response->get_data(); 2780 2781 $this->assertIsArray( $data ); 2782 $this->assertEmpty( $data ); 2783 } 2784 2785 /** 2786 * @group 1018470 2787 */ 2788 public function test_cannot_see_other_user_in_collection_with_edit_context_if_specifically_disallowed() { 2789 wp_set_current_user( self::$user ); 2790 2791 add_filter( 2792 'map_meta_cap', 2793 static function ( $caps, $cap ) { 2794 if ( 'edit_user' === $cap ) { 2795 return array( 'do_not_allow' ); 2796 } 2797 2798 return $caps; 2799 }, 2800 10, 2801 2 2802 ); 2803 2804 $request = new WP_REST_Request( 'GET', '/wp/v2/users' ); 2805 $request->set_query_params( 2806 array( 2807 'context' => 'edit', 2808 'include' => array( 1 ), 2809 ) 2810 ); 2811 $response = rest_do_request( $request ); 2812 $data = $response->get_data(); 2813 2814 $this->assertIsArray( $data ); 2815 $this->assertEmpty( $data ); 2816 } 2817 2818 /** 2819 * @group 1018470 2820 */ 2821 public function test_can_get_user_if_specifically_allowed() { 2822 wp_set_current_user( self::$subscriber ); 2823 2824 add_filter( 2825 'map_meta_cap', 2826 static function ( $caps, $cap ) { 2827 if ( 'edit_user' === $cap ) { 2828 return array(); 2829 } 2830 2831 return $caps; 2832 }, 2833 10, 2834 2 2835 ); 2836 2837 $request = new WP_REST_Request( 'GET', '/wp/v2/users/' . self::$user ); 2838 $request->set_query_params( array( 'context' => 'edit' ) ); 2839 $response = rest_do_request( $request ); 2840 $this->check_user_data( get_userdata( self::$user ), $response->get_data(), 'edit', $response->get_links() ); 2841 } 2842 2843 /** 2746 2844 * @ticket 39701 2747 2845 * @group ms-required
Note: See TracChangeset
for help on using the changeset viewer.