Make WordPress Core

Changeset 41933


Ignore:
Timestamp:
10/19/2017 12:06:25 AM (7 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.