WordPress.org

Make WordPress Core

Ticket #45447: 45447.2.diff

File 45447.2.diff, 3.0 KB (added by swissspidy, 3 years ago)
  • src/wp-includes/class-wp-oembed-controller.php

    diff --git src/wp-includes/class-wp-oembed-controller.php src/wp-includes/class-wp-oembed-controller.php
    index 2b08516894..750101a77f 100644
    final class WP_oEmbed_Controller { 
    191191                $data = _wp_oembed_get_object()->get_data( $url, $args );
    192192
    193193                if ( false === $data ) {
     194                        // Try using a classic embed, instead.
     195                        global $wp_embed;
     196
     197                        /* @var WP_Embed $wp_embed */
     198                        $wp_embed->return_false_on_fail = true;
     199                        $html = $wp_embed->shortcode( $args, $url );
     200                        $wp_embed->return_false_on_fail = false;
     201
     202                        if ( $html ) {
     203                                global $wp_scripts;
     204                                // Check if any scripts were enqueued by the shortcode, and include them in the response.
     205                                $enqueued_scripts = array();
     206
     207                                foreach ( $wp_scripts->queue as $script ) {
     208                                        $enqueued_scripts[] = $wp_scripts->registered[ $script ]->src;
     209                                }
     210
     211                                return (object) array(
     212                                        'provider_name' => __( 'Embed Handler' ),
     213                                        'html'          => $html,
     214                                        'scripts'       => $enqueued_scripts,
     215                                );
     216                        }
     217
    194218                        return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) );
    195219                }
    196220
  • tests/phpunit/tests/oembed/controller.php

    diff --git tests/phpunit/tests/oembed/controller.php tests/phpunit/tests/oembed/controller.php
    index 2852eda2de..c03f662ff9 100644
    class Test_oEmbed_Controller extends WP_UnitTestCase { 
    9797                $this->request_count += 1;
    9898
    9999                // Mock request to YouTube Embed.
    100                 if ( ! empty( $query_params['url'] ) && false !== strpos( $query_params['url'], self::YOUTUBE_VIDEO_ID ) ) {
     100                if ( ! empty( $query_params['url'] ) && false !== strpos( $query_params['url'], '?v=' . self::YOUTUBE_VIDEO_ID ) ) {
    101101                        return array(
    102102                                'response' => array(
    103103                                        'code' => 200,
    class Test_oEmbed_Controller extends WP_UnitTestCase { 
    609609                $this->assertEquals( $data->height, $request['maxheight'] );
    610610        }
    611611
     612        /**
     613         * @ticket 45447
     614         *
     615         * @see wp_maybe_load_embeds()
     616         */
     617        public function test_proxy_with_classic_embed_provider() {
     618                wp_set_current_user( self::$editor );
     619                $request = new WP_REST_Request( 'GET', '/oembed/1.0/proxy' );
     620                $request->set_param( 'url', 'https://www.youtube.com/embed/' . self::YOUTUBE_VIDEO_ID );
     621                $request->set_param( 'maxwidth', 456 );
     622                $request->set_param( 'maxheight', 789 );
     623                $request->set_param( '_wpnonce', wp_create_nonce( 'wp_rest' ) );
     624                $response = rest_get_server()->dispatch( $request );
     625                $this->assertEquals( 200, $response->get_status() );
     626                $this->assertEquals( 2, $this->request_count );
     627
     628                // Test data object.
     629                $data = $response->get_data();
     630
     631                $this->assertNotEmpty( $data );
     632                $this->assertInternalType( 'object', $data );
     633                $this->assertInternalType( 'string', $data->html );
     634                $this->assertInternalType( 'array', $data->scripts );
     635        }
     636
    612637        public function test_proxy_with_invalid_oembed_provider_no_discovery() {
    613638                wp_set_current_user( self::$editor );
    614639