Ticket #40919: 40919.3.diff
File 40919.3.diff, 13.8 KB (added by , 6 years ago) |
---|
-
src/wp-admin/js/widgets/media-video-widget.js
diff --git a/src/wp-admin/js/widgets/media-video-widget.js b/src/wp-admin/js/widgets/media-video-widget.js index 07b203f..9eb532c 100644
a b 110 110 control.fetchEmbedDfd.abort(); 111 111 } 112 112 113 control.fetchEmbedDfd = jQuery.ajax({113 control.fetchEmbedDfd = wp.apiRequest({ 114 114 url: wp.media.view.settings.oEmbedProxyUrl, 115 115 data: { 116 116 url: control.model.get( 'url' ), 117 117 maxwidth: control.model.get( 'width' ), 118 118 maxheight: control.model.get( 'height' ), 119 _wpnonce: wp.media.view.settings.nonce.wpRestApi,120 119 discover: false 121 120 }, 122 121 type: 'GET', -
src/wp-admin/js/widgets/media-widgets.js
diff --git a/src/wp-admin/js/widgets/media-widgets.js b/src/wp-admin/js/widgets/media-widgets.js index 598d94d..7308109 100644
a b wp.mediaWidgets = ( function( $ ) { 190 190 return; 191 191 } 192 192 193 embedLinkView.dfd = $.ajax({193 embedLinkView.dfd = wp.apiRequest({ 194 194 url: wp.media.view.settings.oEmbedProxyUrl, 195 195 data: { 196 196 url: embedLinkView.model.get( 'url' ), 197 197 maxwidth: embedLinkView.model.get( 'width' ), 198 198 maxheight: embedLinkView.model.get( 'height' ), 199 _wpnonce: wp.media.view.settings.nonce.wpRestApi,200 199 discover: false 201 200 }, 202 201 type: 'GET', -
new file src/wp-includes/js/api-request.js
diff --git a/src/wp-includes/js/api-request.js b/src/wp-includes/js/api-request.js new file mode 100644 index 0000000..464ddfa
- + 1 /** 2 * Thin jQuery.ajax wrapper for REST API requests that do not use the 3 * `wp-api.js` Backbone client library. Serves several purposes: 4 * 5 * - Allows overriding these requests as needed by customized WP installations. 6 * - Sends the REST API nonce as a request header. 7 * - Allows specifying only an endpoint namespace/path instead of a full URL. 8 * 9 * @summary Wrapper around jQuery.ajax, intended for use with the WP REST API. 10 * 11 * @namespace wp.apiRequest 12 * @since 4.8.1 13 */ 14 15 ( function( $ ) { 16 var wpApiSettings = window.wpApiSettings; 17 18 function apiRequest( options ) { 19 options = apiRequest.buildAjaxOptions( options ); 20 return apiRequest.transport( options ); 21 }; 22 23 apiRequest.buildAjaxOptions = function( options ) { 24 var url = options.url; 25 var path = options.path; 26 var namespaceTrimmed, endpointTrimmed; 27 28 if ( 29 typeof options.namespace === 'string' && 30 typeof options.endpoint === 'string' 31 ) { 32 namespaceTrimmed = options.namespace.replace( /^\/|\/$/g, '' ); 33 endpointTrimmed = options.endpoint.replace( /^\//, '' ); 34 if ( endpointTrimmed ) { 35 path = namespaceTrimmed + '/' + endpointTrimmed; 36 } else { 37 path = namespaceTrimmed; 38 } 39 } 40 if ( typeof path === 'string' ) { 41 url = wpApiSettings.root + path.replace( /^\//, '' ); 42 } 43 44 // Create a new object with modified properties, but do not modify any 45 // of the original objects. 46 47 var headers = $.extend( { 48 'X-WP-Nonce': wpApiSettings.nonce 49 }, options.headers || {} ); 50 51 options = $.extend( {}, options, { 52 headers: headers, 53 url: url 54 } ); 55 56 delete options.path; 57 delete options.namespace; 58 delete options.endpoint; 59 60 return options; 61 }; 62 63 apiRequest.transport = $.ajax; 64 65 window.wp = window.wp || {}; 66 window.wp.apiRequest = apiRequest; 67 } )( jQuery ); -
src/wp-includes/js/media-views.js
diff --git a/src/wp-includes/js/media-views.js b/src/wp-includes/js/media-views.js index 29b56c6..8f84c81 100644
a b EmbedLink = wp.media.view.Settings.extend({ 4634 4634 this.dfd.abort(); 4635 4635 } 4636 4636 4637 this.dfd = $.ajax({4637 this.dfd = wp.apiRequest({ 4638 4638 url: wp.media.view.settings.oEmbedProxyUrl, 4639 4639 data: { 4640 4640 url: this.model.get( 'url' ), 4641 4641 maxwidth: this.model.get( 'width' ), 4642 maxheight: this.model.get( 'height' ), 4643 _wpnonce: wp.media.view.settings.nonce.wpRestApi 4642 maxheight: this.model.get( 'height' ) 4644 4643 }, 4645 4644 type: 'GET', 4646 4645 dataType: 'json', -
src/wp-includes/js/media/views/embed/link.js
diff --git a/src/wp-includes/js/media/views/embed/link.js b/src/wp-includes/js/media/views/embed/link.js index 1af96cf..d00be5c 100644
a b EmbedLink = wp.media.view.Settings.extend({ 45 45 this.dfd.abort(); 46 46 } 47 47 48 this.dfd = $.ajax({48 this.dfd = wp.apiRequest({ 49 49 url: wp.media.view.settings.oEmbedProxyUrl, 50 50 data: { 51 51 url: this.model.get( 'url' ), 52 52 maxwidth: this.model.get( 'width' ), 53 maxheight: this.model.get( 'height' ), 54 _wpnonce: wp.media.view.settings.nonce.wpRestApi 53 maxheight: this.model.get( 'height' ) 55 54 }, 56 55 type: 'GET', 57 56 dataType: 'json', -
src/wp-includes/media.php
diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 76cc0c1..30066b1 100644
a b function wp_enqueue_media( $args = array() ) { 3436 3436 'captions' => ! apply_filters( 'disable_captions', '' ), 3437 3437 'nonce' => array( 3438 3438 'sendToEditor' => wp_create_nonce( 'media-send-to-editor' ), 3439 'wpRestApi' => wp_create_nonce( 'wp_rest' ),3440 3439 ), 3441 3440 'post' => array( 3442 3441 'id' => 0, -
src/wp-includes/script-loader.php
diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 7562e28..96dda97 100644
a b function wp_default_scripts( &$scripts ) { 133 133 'broken' => __('An unidentified error has occurred.') 134 134 ) ); 135 135 136 $scripts->add( 'wp-api-request', "/wp-includes/js/api-request$suffix.js", array( 'jquery' ), false, 1 ); 137 // `wpApiSettings` is also used by `wp-api`, which depends on this script. 138 did_action( 'init' ) && $scripts->localize( 'wp-api-request', 'wpApiSettings', array( 139 'root' => esc_url_raw( get_rest_url() ), 140 'nonce' => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ), 141 'versionString' => 'wp/v2/', 142 ) ); 143 136 144 $scripts->add( 'wp-pointer', "/wp-includes/js/wp-pointer$suffix.js", array( 'jquery-ui-widget', 'jquery-ui-position' ), '20111129a', 1 ); 137 145 did_action( 'init' ) && $scripts->localize( 'wp-pointer', 'wpPointerL10n', array( 138 146 'dismiss' => __('Dismiss'), … … function wp_default_scripts( &$scripts ) { 499 507 500 508 // To enqueue media-views or media-editor, call wp_enqueue_media(). 501 509 // Both rely on numerous settings, styles, and templates to operate correctly. 502 $scripts->add( 'media-views', "/wp-includes/js/media-views$suffix.js", array( 'utils', 'media-models', 'wp-plupload', 'jquery-ui-sortable', 'wp-mediaelement' ), false, 1 );510 $scripts->add( 'media-views', "/wp-includes/js/media-views$suffix.js", array( 'utils', 'media-models', 'wp-plupload', 'jquery-ui-sortable', 'wp-mediaelement', 'wp-api-request' ), false, 1 ); 503 511 $scripts->add( 'media-editor', "/wp-includes/js/media-editor$suffix.js", array( 'shortcode', 'media-views' ), false, 1 ); 504 512 $scripts->add( 'media-audiovideo', "/wp-includes/js/media-audiovideo$suffix.js", array( 'media-editor' ), false, 1 ); 505 513 $scripts->add( 'mce-view', "/wp-includes/js/mce-view$suffix.js", array( 'shortcode', 'jquery', 'media-views', 'media-audiovideo' ), false, 1 ); 506 514 507 $scripts->add( 'wp-api', "/wp-includes/js/wp-api$suffix.js", array( 'jquery', 'backbone', 'underscore' ), false, 1 ); 508 did_action( 'init' ) && $scripts->localize( 'wp-api', 'wpApiSettings', array( 509 'root' => esc_url_raw( get_rest_url() ), 510 'nonce' => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ), 511 'versionString' => 'wp/v2/', 512 ) ); 515 $scripts->add( 'wp-api', "/wp-includes/js/wp-api$suffix.js", array( 'jquery', 'backbone', 'underscore', 'wp-api-request' ), false, 1 ); 513 516 514 517 if ( is_admin() ) { 515 518 $scripts->add( 'admin-tags', "/wp-admin/js/tags$suffix.js", array( 'jquery', 'wp-ajax-response' ), false, 1 ); … … function wp_default_scripts( &$scripts ) { 602 605 $scripts->add( 'admin-gallery', "/wp-admin/js/gallery$suffix.js", array( 'jquery-ui-sortable' ) ); 603 606 604 607 $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), false, 1 ); 605 $scripts->add( 'media-widgets', "/wp-admin/js/widgets/media-widgets$suffix.js", array( 'jquery', 'media-models', 'media-views' ) );608 $scripts->add( 'media-widgets', "/wp-admin/js/widgets/media-widgets$suffix.js", array( 'jquery', 'media-models', 'media-views', 'wp-api-request' ) ); 606 609 $scripts->add_inline_script( 'media-widgets', 'wp.mediaWidgets.init();', 'after' ); 607 610 608 611 $scripts->add( 'media-audio-widget', "/wp-admin/js/widgets/media-audio-widget$suffix.js", array( 'media-widgets', 'media-audiovideo' ) ); 609 612 $scripts->add( 'media-image-widget', "/wp-admin/js/widgets/media-image-widget$suffix.js", array( 'media-widgets' ) ); 610 $scripts->add( 'media-video-widget', "/wp-admin/js/widgets/media-video-widget$suffix.js", array( 'media-widgets', 'media-audiovideo' ) );613 $scripts->add( 'media-video-widget', "/wp-admin/js/widgets/media-video-widget$suffix.js", array( 'media-widgets', 'media-audiovideo', 'wp-api-request' ) ); 611 614 $scripts->add( 'text-widgets', "/wp-admin/js/widgets/text-widgets$suffix.js", array( 'jquery', 'backbone', 'editor', 'wp-util' ) ); 612 615 $scripts->add_inline_script( 'text-widgets', 'wp.textWidgets.init();', 'after' ); 613 616 -
tests/qunit/index.html
diff --git a/tests/qunit/index.html b/tests/qunit/index.html index c41fffe..29dfe79 100644
a b 19 19 </script> 20 20 <script> 21 21 var wpApiSettings = { 22 'root': 'http://localhost/wp-json/' 22 root: 'http://localhost/wp-json/', 23 nonce: 'not_a_nonce' 23 24 }; 24 25 </script> 25 26 <script src="../../src/wp-includes/js/wp-util.js"></script> … … 77 78 <script src="../../src/wp-includes/js/customize-models.js"></script> 78 79 <script src="../../src/wp-includes/js/shortcode.js"></script> 79 80 <script src="../../src/wp-admin/js/customize-controls.js"></script> 81 <script src="../../src/wp-includes/js/api-request.js"></script> 80 82 <script src="../../src/wp-includes/js/wp-api.js"></script> 81 83 82 84 <script type='text/javascript' src='../../src/wp-includes/js/jquery/ui/core.js'></script> … … 122 124 <script src="wp-admin/js/customize-base.js"></script> 123 125 <script src="wp-admin/js/customize-header.js"></script> 124 126 <script src="wp-includes/js/shortcode.js"></script> 127 <script src="wp-includes/js/api-request.js"></script> 125 128 <script src="wp-includes/js/wp-api.js"></script> 126 129 <script src="wp-admin/js/customize-controls.js"></script> 127 130 <script src="wp-admin/js/customize-controls-utils.js"></script> -
new file tests/qunit/wp-includes/js/api-request.js
diff --git a/tests/qunit/wp-includes/js/api-request.js b/tests/qunit/wp-includes/js/api-request.js new file mode 100644 index 0000000..c52cf0a
- + 1 /* global wp, wpApiSettings */ 2 ( function( QUnit ) { 3 var originalRootUrl = window.wpApiSettings.root; 4 5 var nonceHeader = { 'X-WP-Nonce': 'not_a_nonce' }; 6 7 QUnit.module( 'wp-api-request', { 8 afterEach: function() { 9 window.wpApiSettings.root = originalRootUrl; 10 } 11 } ); 12 13 QUnit.test( 'does not mutate original object', function( assert ) { 14 var settingsOriginal = { 15 url: 'aaaaa', 16 path: 'wp/v2/posts', 17 headers: { 18 'Header-Name': 'value' 19 }, 20 data: { 21 orderby: 'something' 22 } 23 }; 24 25 var settings = wp.apiRequest.buildAjaxOptions( settingsOriginal ); 26 27 assert.notStrictEqual( settings, settingsOriginal ); 28 assert.notStrictEqual( settings.headers, settingsOriginal.headers ); 29 assert.strictEqual( settings.data, settingsOriginal.data ); 30 31 assert.deepEqual( settings, { 32 url: 'http://localhost/wp-json/wp/v2/posts', 33 headers: { 34 'X-WP-Nonce': 'not_a_nonce', 35 'Header-Name': 'value' 36 }, 37 data: { 38 orderby: 'something' 39 } 40 } ); 41 42 assert.deepEqual( settingsOriginal, { 43 url: 'aaaaa', 44 path: 'wp/v2/posts', 45 headers: { 46 'Header-Name': 'value' 47 }, 48 data: { 49 orderby: 'something' 50 } 51 } ); 52 } ); 53 54 QUnit.test( 'accepts namespace and endpoint', function( assert ) { 55 assert.deepEqual( wp.apiRequest.buildAjaxOptions( { 56 namespace: 'wp/v2', 57 endpoint: 'posts' 58 } ), { 59 url: 'http://localhost/wp-json/wp/v2/posts', 60 headers: nonceHeader 61 } ); 62 } ); 63 64 QUnit.test( 'accepts namespace and endpoint with slashes', function( assert ) { 65 assert.deepEqual( wp.apiRequest.buildAjaxOptions( { 66 namespace: '/wp/v2/', 67 endpoint: '/posts' 68 } ), { 69 url: 'http://localhost/wp-json/wp/v2/posts', 70 headers: nonceHeader 71 } ); 72 } ); 73 74 QUnit.test( 'accepts namespace and empty endpoint', function( assert ) { 75 assert.deepEqual( wp.apiRequest.buildAjaxOptions( { 76 namespace: 'wp/v2', 77 endpoint: '' 78 } ), { 79 url: 'http://localhost/wp-json/wp/v2', 80 headers: nonceHeader 81 } ); 82 } ); 83 84 QUnit.test( 'accepts empty namespace and empty endpoint', function( assert ) { 85 assert.deepEqual( wp.apiRequest.buildAjaxOptions( { 86 namespace: '', 87 endpoint: '' 88 } ), { 89 url: 'http://localhost/wp-json/', 90 headers: nonceHeader 91 } ); 92 } ); 93 94 QUnit.test( 95 'accepts namespace and endpoint with slashes (plain permalinks)', 96 function( assert ) { 97 window.wpApiSettings.root = 'http://localhost/?rest_route=/'; 98 assert.deepEqual( wp.apiRequest.buildAjaxOptions( { 99 namespace: '/wp/v2/', 100 endpoint: '/posts' 101 } ), { 102 url: 'http://localhost/?rest_route=/wp/v2/posts', 103 headers: nonceHeader 104 } ); 105 } 106 ); 107 108 QUnit.test( 109 'accepts empty namespace and empty endpoint (plain permalinks)', 110 function( assert ) { 111 window.wpApiSettings.root = 'http://localhost/?rest_route=/'; 112 assert.deepEqual( wp.apiRequest.buildAjaxOptions( { 113 namespace: '', 114 endpoint: '' 115 } ), { 116 url: 'http://localhost/?rest_route=/', 117 headers: nonceHeader 118 } ); 119 } 120 ); 121 } )( window.QUnit );