WordPress.org

Make WordPress Core

Ticket #36638: 36638.1.patch

File 36638.1.patch, 7.6 KB (added by azaozz, 3 years ago)
  • src/wp-admin/admin-ajax.php

     
    6262        'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs',
    6363        'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail',
    6464        'parse-media-shortcode', 'destroy-sessions', 'install-plugin', 'update-plugin', 'press-this-save-post',
    65         'press-this-add-category', 'crop-image', 'generate-password', 'save-wporg-username',
     65        'press-this-add-category', 'crop-image', 'generate-password', 'save-wporg-username', 'test_url',
    6666);
    6767
    6868// Deprecated
  • src/wp-admin/includes/ajax-actions.php

     
    33333333
    33343334        wp_send_json_success( update_user_meta( get_current_user_id(), 'wporg_favorites', $username ) );
    33353335}
     3336
     3337/**
     3338 * Ajax handler for testing if an URL exists. Used in the editor.
     3339 *
     3340 * @since 4.6.0
     3341 */
     3342function wp_ajax_test_url() {
     3343        if ( ! current_user_can( 'edit_posts' ) || ! wp_verify_nonce( $_POST['nonce'], 'wp-test-url' ) ) {
     3344                wp_send_json_error();
     3345        }
     3346
     3347        $href = esc_url_raw( $_POST['href'] );
     3348
     3349        // Relative URL
     3350        if ( strpos( $href, '//' ) !== 0 && in_array( $href[0], array( '/', '#', '?' ), true ) ) {
     3351                $href = get_bloginfo( 'url' ) . $href;
     3352        }
     3353
     3354        $response = wp_safe_remote_get( $href, array(
     3355                'timeout' => 15,
     3356                // Use an explicit user-agent
     3357                'user-agent' => 'WordPress URL Test',
     3358        ) );
     3359
     3360        $message = null;
     3361
     3362        if ( is_wp_error( $response ) ) {
     3363                $error = $response->get_error_message();
     3364
     3365                if ( strpos( $message, 'resolve host' ) !== false ) {
     3366                        $message = array( 'error' => __( 'Invalid host name.' ) );
     3367                }
     3368
     3369                wp_send_json_error( $message );
     3370        }
     3371
     3372        if ( wp_remote_retrieve_response_code( $response ) === 404 ) {
     3373                wp_send_json_error( array( 'error' => __( 'Not found, HTTP error 404.' ) ) );
     3374        }
     3375
     3376        wp_send_json_success();
     3377}
  • src/wp-includes/class-wp-editor.php

     
    10631063                        'Ctrl + letter:' => __( 'Ctrl + letter:' ),
    10641064                        'Letter' => __( 'Letter' ),
    10651065                        'Action' => __( 'Action' ),
     1066                        'Invalid host name.' => __( 'Invalid host name.' ),
    10661067                        'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' =>
    10671068                                __( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ),
    10681069                        'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' =>
     
    12831284                </script>
    12841285                <?php
    12851286
    1286                 if ( in_array( 'wplink', self::$plugins, true ) || in_array( 'link', self::$qt_buttons, true ) )
     1287                $has_wplink = in_array( 'wplink', self::$plugins, true );
     1288
     1289                if ( $has_wplink ) {
     1290                        echo '<input type="hidden" id="_wplink_urltest_nonce" value="' . wp_create_nonce( 'wp-test-url' ) . '" />';
     1291                }
     1292
     1293                if ( $has_wplink || in_array( 'link', self::$qt_buttons, true ) ) {
    12871294                        self::wp_link_dialog();
     1295                }
    12881296
    12891297                /**
    12901298                 * Fires after any core TinyMCE editor instances are created.
  • src/wp-includes/css/editor.css

     
    17571757        cursor: pointer;
    17581758}
    17591759
     1760div.wp-link-preview a.wplink-url-error {
     1761        color: #a00;
     1762}
     1763
     1764div.wp-link-preview a.wplink-url-error:hover {
     1765        color: #f00;
     1766}
     1767
    17601768div.wp-link-input {
    17611769        float: left;
    17621770        margin: 2px;
  • src/wp-includes/js/tinymce/plugins/wplink/plugin.js

     
    9393                var doingUndoRedo;
    9494                var doingUndoRedoTimer;
    9595                var $ = window.jQuery;
     96                var urlErrors = {};
    9697
    9798                function getSelectedLink() {
    9899                        var href, html,
     
    131132                }
    132133
    133134                function removePlaceholderStrings( content, dataAttr ) {
    134                         if ( dataAttr ) {
    135                                 content = content.replace( / data-wplink-edit="true"/g, '' );
     135                        return content.replace( /(<a [^>]+>)([\s\S]*?)<\/a>/g, function( all, tag, text ) {
     136                                if ( tag.indexOf( ' href="_wp_link_placeholder"' ) > -1 ) {
     137                                        return text;
     138                                }
     139
     140                                if ( dataAttr ) {
     141                                        tag = tag.replace( / data-wplink-edit="true"/g, '' );
     142                                }
     143
     144                                tag = tag.replace( / data-wplink-url-error="true"/g, '' );
     145
     146                                return tag + text + '</a>';
     147                        });
     148                }
     149
     150                function checkLink( node ) {
     151                        var $link = editor.$( node );
     152                        var href = $link.attr( 'href' );
     153
     154                        if ( ! href || typeof $ === 'undefined' ) {
     155                                return;
    136156                        }
    137157
    138                         return content.replace( /<a [^>]*?href="_wp_link_placeholder"[^>]*>([\s\S]+)<\/a>/g, '$1' );
     158                        // Early check
     159                        if ( /^http/i.test( href ) && ! /\.[a-z]{2,63}(\/|$)/i.test( href ) ) {
     160                                urlErrors[href] = tinymce.translate( 'Invalid host name.' );
     161                        }
     162
     163                        if ( urlErrors.hasOwnProperty( href ) ) {
     164                                $link.attr( 'data-wplink-url-error', 'true' );
     165                                return;
     166                        } else {
     167                                $link.removeAttr( 'data-wplink-url-error' );
     168                        }
     169
     170                        $.post(
     171                                window.ajaxurl, {
     172                                        action: 'test_url',
     173                                        nonce: $( '#_wplink_urltest_nonce' ).val(),
     174                                        href: href
     175                                },
     176                                'json'
     177                        ).done( function( response ) {
     178                                if ( response.success ) {
     179                                        return;
     180                                }
     181
     182                                if ( response.data && response.data.error ) {
     183                                        urlErrors[href] = response.data.error;
     184                                        $link.attr( 'data-wplink-url-error', 'true' );
     185
     186                                        if ( toolbar && toolbar.visible() ) {
     187                                                toolbar.$el.find( '.wp-link-preview a' ).addClass( 'wplink-url-error' ).attr( 'title', editor.dom.encode( response.data.error ) );
     188                                        }
     189                                }
     190                        });
    139191                }
    140192
    141193                editor.on( 'preinit', function() {
     
    231283                                if ( ! tinymce.trim( linkNode.innerHTML ) ) {
    232284                                        editor.$( linkNode ).text( text || href );
    233285                                }
     286
     287                                checkLink( linkNode );
    234288                        }
    235289
    236290                        inputInstance.reset();
     
    473527
    474528                editor.on( 'wptoolbar', function( event ) {
    475529                        var linkNode = editor.dom.getParent( event.element, 'a' ),
    476                                 $linkNode, href, edit;
     530                                $linkNode, href, edit, title;
    477531
    478532                        if ( typeof window.wpLink !== 'undefined' && window.wpLink.modalOpen ) {
    479533                                editToolbar.tempHide = true;
     
    498552                                        previewInstance.setURL( href );
    499553                                        event.element = linkNode;
    500554                                        event.toolbar = toolbar;
     555                                        title = urlErrors.hasOwnProperty( href ) ? editor.dom.encode( urlErrors[ href ] ) : null;
     556
     557                                        if ( $linkNode.attr( 'data-wplink-url-error' ) === 'true' ) {
     558                                                toolbar.$el.find( '.wp-link-preview a' ).addClass( 'wplink-url-error' ).attr( 'title', title );
     559                                        } else {
     560                                                toolbar.$el.find( '.wp-link-preview a' ).removeClass( 'wplink-url-error' ).attr( 'title', null );
     561                                        }
    501562                                }
    502563                        }
    503564                } );
  • src/wp-includes/js/tinymce/skins/wordpress/wp-content.css

     
    205205        visibility: hidden;
    206206}
    207207
     208a[data-wplink-url-error] {
     209        color: #fff;
     210        outline: 4px solid #b00;
     211    background: #b00;
     212}
     213
    208214/**
    209215 * WP Views
    210216 */