Make WordPress Core

Ticket #41596: 41596.1.diff

File 41596.1.diff, 8.1 KB (added by westonruter, 7 years ago)

https://github.com/xwp/wordpress-develop/pull/247

  • src/wp-admin/js/widgets/text-widgets.js

    diff --git src/wp-admin/js/widgets/text-widgets.js src/wp-admin/js/widgets/text-widgets.js
    index 692a0642c9..899677c584 100644
    wp.textWidgets = ( function( $ ) { 
    8080                        // Sync input fields to hidden sync fields which actually get sent to the server.
    8181                        _.each( control.fields, function( fieldInput, fieldName ) {
    8282                                fieldInput.on( 'input change', function updateSyncField() {
    83                                         var syncInput = control.syncContainer.find( 'input[type=hidden].' + fieldName );
     83                                        var syncInput = control.syncContainer.find( '.sync-input.' + fieldName );
    8484                                        if ( syncInput.val() !== fieldInput.val() ) {
    8585                                                syncInput.val( fieldInput.val() );
    8686                                                syncInput.trigger( 'change' );
    wp.textWidgets = ( function( $ ) { 
    8888                                });
    8989
    9090                                // Note that syncInput cannot be re-used because it will be destroyed with each widget-updated event.
    91                                 fieldInput.val( control.syncContainer.find( 'input[type=hidden].' + fieldName ).val() );
     91                                fieldInput.val( control.syncContainer.find( '.sync-input.' + fieldName ).val() );
    9292                        });
    9393                },
    9494
    wp.textWidgets = ( function( $ ) { 
    144144                        var control = this, syncInput;
    145145
    146146                        if ( ! control.fields.title.is( document.activeElement ) ) {
    147                                 syncInput = control.syncContainer.find( 'input[type=hidden].title' );
     147                                syncInput = control.syncContainer.find( '.sync-input.title' );
    148148                                control.fields.title.val( syncInput.val() );
    149149                        }
    150150
    151                         syncInput = control.syncContainer.find( 'input[type=hidden].text' );
     151                        syncInput = control.syncContainer.find( '.sync-input.text' );
    152152                        if ( control.fields.text.is( ':visible' ) ) {
    153153                                if ( ! control.fields.text.is( document.activeElement ) ) {
    154154                                        control.fields.text.val( syncInput.val() );
  • src/wp-includes/widgets/class-wp-widget-text.php

    diff --git src/wp-includes/widgets/class-wp-widget-text.php src/wp-includes/widgets/class-wp-widget-text.php
    index c28ed1f317..27e3b1d58f 100644
    class WP_Widget_Text extends WP_Widget { 
    330330         * @since 4.8.0 Form only contains hidden inputs which are synced with JS template.
    331331         * @since 4.8.1 Restored original form to be displayed when in legacy mode.
    332332         * @see WP_Widget_Visual_Text::render_control_template_scripts()
     333         * @see _WP_Editors::editor()
    333334         *
    334335         * @param array $instance Current settings.
    335336         * @return void
    class WP_Widget_Text extends WP_Widget { 
    344345                );
    345346                ?>
    346347                <?php if ( ! $this->is_legacy_instance( $instance ) ) : ?>
    347                         <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" class="title" type="hidden" value="<?php echo esc_attr( $instance['title'] ); ?>">
    348                         <input id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>" class="text" type="hidden" value="<?php echo esc_attr( $instance['text'] ); ?>">
    349                         <input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" class="filter" type="hidden" value="on">
    350                         <input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual" type="hidden" value="on">
     348                        <?php
     349
     350                        if ( user_can_richedit() ) {
     351                                add_filter( 'the_editor_content', 'format_for_editor', 10, 2 );
     352                                $default_editor = 'tinymce';
     353                        } else {
     354                                $default_editor = 'html';
     355                        }
     356
     357                        /** This filter is documented in wp-includes/class-wp-editor.php */
     358                        $text = apply_filters( 'the_editor_content', $instance['text'], $default_editor );
     359
     360                        // Reset filter addition.
     361                        if ( user_can_richedit() ) {
     362                                remove_filter( 'the_editor_content', 'format_for_editor' );
     363                        }
     364
     365                        // Prevent premature closing of textarea in case format_for_editor() didn't apply or the_editor_content filter did a wrong thing.
     366                        $escaped_text = preg_replace( '#</textarea#i', '&lt;/textarea', $text );
     367
     368                        ?>
     369                        <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" class="title sync-input" type="hidden" value="<?php echo esc_attr( $instance['title'] ); ?>">
     370                        <textarea id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>" class="text sync-input" hidden><?php echo $escaped_text; ?></textarea>
     371                        <input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" class="filter sync-input" type="hidden" value="on">
     372                        <input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual sync-input" type="hidden" value="on">
    351373                <?php else : ?>
    352374                        <input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual" type="hidden" value="">
    353375                        <p>
  • tests/phpunit/tests/widgets/text-widget.php

    diff --git tests/phpunit/tests/widgets/text-widget.php tests/phpunit/tests/widgets/text-widget.php
    index 41aadb6af7..640b69d846 100644
    class Test_WP_Widget_Text extends WP_UnitTestCase { 
    445445         * @covers WP_Widget_Text::form
    446446         */
    447447        function test_form() {
     448                add_filter( 'user_can_richedit', '__return_true' );
    448449                $widget = new WP_Widget_Text();
     450                $widget->_set( 2 );
    449451                $instance = array(
    450452                        'title' => 'Title',
    451453                        'text' => 'Text',
    class Test_WP_Widget_Text extends WP_UnitTestCase { 
    457459                $widget->form( $instance );
    458460                $form = ob_get_clean();
    459461                $this->assertContains( 'class="visual" type="hidden" value=""', $form );
    460                 $this->assertNotContains( 'class="visual" type="hidden" value="on"', $form );
     462                $this->assertNotContains( 'class="visual sync-input" type="hidden" value="on"', $form );
    461463
    462464                $instance = array(
    463465                        'title' => 'Title',
    class Test_WP_Widget_Text extends WP_UnitTestCase { 
    468470                ob_start();
    469471                $widget->form( $instance );
    470472                $form = ob_get_clean();
    471                 $this->assertContains( 'class="visual" type="hidden" value="on"', $form );
    472                 $this->assertNotContains( 'class="visual" type="hidden" value=""', $form );
     473                $this->assertContains( 'class="visual sync-input" type="hidden" value="on"', $form );
     474                $this->assertNotContains( 'class="visual sync-input" type="hidden" value=""', $form );
    473475
    474476                $instance = array(
    475477                        'title' => 'Title',
    class Test_WP_Widget_Text extends WP_UnitTestCase { 
    480482                ob_start();
    481483                $widget->form( $instance );
    482484                $form = ob_get_clean();
    483                 $this->assertContains( 'class="visual" type="hidden" value="on"', $form );
    484                 $this->assertNotContains( 'class="visual" type="hidden" value=""', $form );
     485                $this->assertContains( 'class="visual sync-input" type="hidden" value="on"', $form );
     486                $this->assertNotContains( 'class="visual sync-input" type="hidden" value=""', $form );
    485487
    486488                $instance = array(
    487489                        'title' => 'Title',
    488                         'text' => 'Text',
     490                        'text' => 'This is some HTML Code: <code>&lt;strong&gt;BOLD!&lt;/strong&gt;</code>',
     491                        'filter' => true,
     492                        'visual' => true,
     493                );
     494                $this->assertFalse( $widget->is_legacy_instance( $instance ) );
     495                ob_start();
     496                $widget->form( $instance );
     497                $form = ob_get_clean();
     498                $this->assertContains( 'class="visual sync-input" type="hidden" value="on"', $form );
     499                $this->assertContains( '&lt;code&gt;&amp;lt;strong&amp;gt;BOLD!', $form );
     500                $this->assertNotContains( 'class="visual sync-input" type="hidden" value=""', $form );
     501
     502                remove_filter( 'user_can_richedit', '__return_true' );
     503                add_filter( 'user_can_richedit', '__return_false' );
     504                $instance = array(
     505                        'title' => 'Title',
     506                        'text' => 'Evil:</textarea><script>alert("XSS")</script>',
    489507                        'filter' => true,
    490508                        'visual' => true,
    491509                );
    class Test_WP_Widget_Text extends WP_UnitTestCase { 
    493511                ob_start();
    494512                $widget->form( $instance );
    495513                $form = ob_get_clean();
    496                 $this->assertContains( 'class="visual" type="hidden" value="on"', $form );
    497                 $this->assertNotContains( 'class="visual" type="hidden" value=""', $form );
     514                $this->assertNotContains( 'Evil:</textarea>', $form );
     515                $this->assertContains( 'Evil:&lt;/textarea>', $form );
    498516        }
    499517
    500518        /**