Make WordPress Core

Changeset 41933


Ignore:
Timestamp:
10/19/2017 12:06:25 AM (9 years ago)
Author:
westonruter
Message:

Widgets: Harden logic for checking for valid media URLs.

  • Update deprecated isHostedVideo method to always return true since all oEmbeds are now supported.
  • Disable scanImage for non-image media widgets.
  • Ensure embed URL field element is matched from current media frame instance due to bug where media frames are not destroyed upon closing.
  • Update error message for invalid video URLs to ask user to check the URL for validity.

Props gk.loveweb, octalmage, westonruter.
See #42039, #40935.
Fixes #41052.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/js/widgets/media-video-widget.js

    r41764 r41933  
    139139                 * @deprecated since 4.9.
    140140                 *
    141                  * @param {String} url - Video url.
    142141                 * @returns {boolean} Whether url is a supported video host.
    143142                 */
    144143                isHostedVideo: function isHostedVideo() {
    145                         return false;
     144                        return true;
    146145                },
    147146
  • trunk/src/wp-admin/js/widgets/media-widgets.js

    r41759 r41933  
    8484         */
    8585        component.MediaEmbedView = wp.media.view.Embed.extend({
     86
     87                /**
     88                 * Initialize.
     89                 *
     90                 * @since 4.9.0
     91                 *
     92                 * @param {object} options - Options.
     93                 * @returns {void}
     94                 */
     95                initialize: function( options ) {
     96                        var view = this, embedController; // eslint-disable-line consistent-thi
     97                        wp.media.view.Embed.prototype.initialize.call( view, options );
     98                        if ( 'image' !== view.controller.options.mimeType ) {
     99                                embedController = view.controller.states.get( 'embed' );
     100                                embedController.off( 'scan', embedController.scanImage, embedController );
     101                        }
     102                },
    86103
    87104                /**
    … …  
    141158
    142159                                        /**
     160                                         * Update oEmbed.
     161                                         *
     162                                         * @since 4.9.0
     163                                         *
     164                                         * @returns {void}
     165                                         */
     166                                        updateoEmbed: function() {
     167                                                var embedLinkView = this, url; // eslint-disable-line consistent-this
     168
     169                                                url = embedLinkView.model.get( 'url' );
     170
     171                                                // Abort if the URL field was emptied out.
     172                                                if ( ! url ) {
     173                                                        embedLinkView.setErrorNotice( '' );
     174                                                        embedLinkView.setAddToWidgetButtonDisabled( true );
     175                                                        return;
     176                                                }
     177
     178                                                if ( ! url.match( /^(http|https):\/\/.+\// ) ) {
     179                                                        embedLinkView.controller.$el.find( '#embed-url-field' ).addClass( 'invalid' );
     180                                                        embedLinkView.setAddToWidgetButtonDisabled( true );
     181                                                }
     182
     183                                                wp.media.view.EmbedLink.prototype.updateoEmbed.call( embedLinkView );
     184                                        },
     185
     186                                        /**
    143187                                         * Fetch media.
    144188                                         *
    … …  
    147191                                        fetch: function() {
    148192                                                var embedLinkView = this, fetchSuccess, matches, fileExt, urlParser, url, re, youTubeEmbedMatch; // eslint-disable-line consistent-this
     193                                                url = embedLinkView.model.get( 'url' );
    149194
    150195                                                if ( embedLinkView.dfd && 'pending' === embedLinkView.dfd.state() ) {
    151196                                                        embedLinkView.dfd.abort();
    152                                                 }
    153 
    154                                                 // Abort if the URL field was emptied out.
    155                                                 if ( ! embedLinkView.model.get( 'url' ) ) {
    156                                                         embedLinkView.setErrorNotice( '' );
    157                                                         return;
    158197                                                }
    159198
    … …  
    165204                                                        });
    166205
    167                                                         $( '#embed-url-field' ).removeClass( 'invalid' );
     206                                                        embedLinkView.controller.$el.find( '#embed-url-field' ).removeClass( 'invalid' );
    168207                                                        embedLinkView.setErrorNotice( '' );
    169208                                                        embedLinkView.setAddToWidgetButtonDisabled( false );
    … …  
    171210
    172211                                                urlParser = document.createElement( 'a' );
    173                                                 urlParser.href = embedLinkView.model.get( 'url' );
     212                                                urlParser.href = url;
    174213                                                matches = urlParser.pathname.toLowerCase().match( /\.(\w+)$/ );
    175214                                                if ( matches ) {
    … …  
    186225
    187226                                                // Support YouTube embed links.
    188                                                 url = embedLinkView.model.get( 'url' );
    189227                                                re = /https?:\/\/www\.youtube\.com\/embed\/([^/]+)/;
    190228                                                youTubeEmbedMatch = re.exec( url );
    … …  
    229267                                        renderFail: function renderFail() {
    230268                                                var embedLinkView = this; // eslint-disable-line consistent-this
    231                                                 $( '#embed-url-field' ).addClass( 'invalid' );
     269                                                embedLinkView.controller.$el.find( '#embed-url-field' ).addClass( 'invalid' );
    232270                                                embedLinkView.setErrorNotice( embedLinkView.controller.options.invalidEmbedTypeError || 'ERROR' );
    233271                                                embedLinkView.setAddToWidgetButtonDisabled( true );
  • trunk/src/wp-includes/widgets/class-wp-widget-media-video.php

    r41827 r41933  
    4242                        'media_library_state_single' => __( 'Video Widget' ),
    4343                        /* translators: %s: a list of valid video file extensions */
    44                         'unsupported_file_type' => sprintf( __( 'Sorry, we can&#8217;t display the video file type selected. Please select a supported video file (%s) or stream (e.g. YouTube and Vimeo) instead.' ), '<code>.' . implode( '</code>, <code>.', wp_get_video_extensions() ) . '</code>' ),
     44                        'unsupported_file_type' => sprintf( __( 'Sorry, we can&#8217;t load the video at the supplied URL. Please check that the URL is for a supported video file (%s) or stream (e.g. YouTube and Vimeo).' ), '<code>.' . implode( '</code>, <code>.', wp_get_video_extensions() ) . '</code>' ),
    4545                ) );
    4646        }
Note: See TracChangeset for help on using the changeset viewer.