Make WordPress Core

Ticket #17780: miqro-17780.5.patch

File miqro-17780.5.patch, 6.4 KB (added by miqrogroove, 11 years ago)

Fixes post editor bug

  • src/wp-admin/edit-form-advanced.php

     
    494494        $title_placeholder = apply_filters( 'enter_title_here', __( 'Enter title here' ), $post );
    495495        ?>
    496496        <label class="screen-reader-text" id="title-prompt-text" for="title"><?php echo $title_placeholder; ?></label>
    497         <input type="text" name="post_title" size="30" value="<?php echo esc_attr( htmlspecialchars( $post->post_title ) ); ?>" id="title" spellcheck="true" autocomplete="off" />
     497        <input type="text" name="post_title" size="30" value="<?php echo esc_attr( $post->post_title ); ?>" id="title" spellcheck="true" autocomplete="off" />
    498498</div>
    499499<?php
    500500/**
  • src/wp-includes/formatting.php

     
    751751                $quote_style = ENT_NOQUOTES;
    752752        }
    753753
    754         // Handle double encoding ourselves
    755         if ( $double_encode ) {
    756                 $string = @htmlspecialchars( $string, $quote_style, $charset );
    757         } else {
    758                 // Decode &amp; into &
    759                 $string = wp_specialchars_decode( $string, $_quote_style );
    760 
    761                 // Guarantee every &entity; is valid or re-encode the &
     754        if ( ! $double_encode ) {
     755                // Guarantee every &entity; is valid, convert &garbage; into &amp;garbage;
     756                // This is required for PHP < 5.4.0 because ENT_HTML401 flag is unavailable.
    762757                $string = wp_kses_normalize_entities( $string );
     758        }
    763759
    764                 // Now re-encode everything except &entity;
    765                 $string = preg_split( '/(&#?x?[0-9a-z]+;)/i', $string, -1, PREG_SPLIT_DELIM_CAPTURE );
     760        $string = @htmlspecialchars( $string, $quote_style, $charset, $double_encode );
    766761
    767                 for ( $i = 0, $c = count( $string ); $i < $c; $i += 2 ) {
    768                         $string[$i] = @htmlspecialchars( $string[$i], $quote_style, $charset );
    769                 }
    770                 $string = implode( '', $string );
    771         }
    772 
    773762        // Backwards compatibility
    774763        if ( 'single' === $_quote_style )
    775764                $string = str_replace( "'", '&#039;', $string );
  • tests/phpunit/tests/formatting/EscAttr.php

     
    2626        }
    2727
    2828        function test_esc_attr_amp() {
    29                 $out = esc_attr( 'foo & bar &baz; &apos;' );
    30                 $this->assertEquals( "foo &amp; bar &amp;baz; &apos;", $out );
     29                $out = esc_attr( 'foo & bar &baz; &nbsp;' );
     30                $this->assertEquals( "foo &amp; bar &amp;baz; &nbsp;", $out );
    3131        }
    3232}
  • tests/phpunit/tests/formatting/EscHtml.php

     
    3434
    3535        function test_ignores_existing_entities() {
    3636                $source = '&#038; &#x00A3; &#x22; &amp;';
    37                 $res = '&amp; &#xA3; &quot; &amp;';
     37                $res = '&#038; &#xA3; &#x22; &amp;';
    3838                $this->assertEquals( $res, esc_html($source) );
    3939        }
    4040}
  • tests/phpunit/tests/formatting/JSEscape.php

     
    2323        }
    2424
    2525        function test_js_escape_amp() {
    26                 $out = esc_js('foo & bar &baz; &apos;');
    27                 $this->assertEquals("foo &amp; bar &amp;baz; &apos;", $out);
     26                $out = esc_js('foo & bar &baz; &nbsp;');
     27                $this->assertEquals("foo &amp; bar &amp;baz; &nbsp;", $out);
    2828        }
    2929
    3030        function test_js_escape_quote_entity() {
    3131                $out = esc_js('foo &#x27; bar &#39; baz &#x26;');
    32                 $this->assertEquals("foo \\' bar \\' baz &amp;", $out);
     32                $this->assertEquals("foo \\' bar \\' baz &#x26;", $out);
    3333        }
    3434
    3535        function test_js_no_carriage_return() {
  • tests/phpunit/tests/formatting/WPSpecialchars.php

     
    1717
    1818                // Allowed entities should be unchanged
    1919                foreach ( $allowedentitynames as $ent ) {
     20                        if ( 'apos' == $ent ) {
     21                                // But for some reason, PHP doesn't allow &apos;
     22                                continue;
     23                        }
    2024                        $ent = '&' . $ent . ';';
    2125                        $this->assertEquals( $ent, _wp_specialchars( $ent ) );
    2226                }
     
    3943                $this->assertEquals( '&quot;&#039;hello!&#039;&quot;', _wp_specialchars($source, true) );
    4044                $this->assertEquals( $source, _wp_specialchars($source) );
    4145        }
     46
     47        /**
     48         * Check some of the double-encoding features for entity references.
     49         *
     50         * @ticket 17780
     51         * @dataProvider data_double_encoding
     52         */
     53        function test_double_encoding( $input, $output ) {
     54                return $this->assertEquals( $output, _wp_specialchars( $input, ENT_NOQUOTES, false, true ) );
     55        }
     56
     57        function data_double_encoding() {
     58                return array(
     59                        array(
     60                                'This & that, this &amp; that, &#8212; &quot; &QUOT; &Uacute; &nbsp; &#34; &#034; &#0034; &#x00022; &#x22; &dollar; &times;',
     61                                'This &amp; that, this &amp;amp; that, &amp;#8212; &amp;quot; &amp;QUOT; &amp;Uacute; &amp;nbsp; &amp;#34; &amp;#034; &amp;#0034; &amp;#x00022; &amp;#x22; &amp;dollar; &amp;times;',
     62                        ),
     63                        array(
     64                                '&& &&amp; &amp;&amp; &amp;;',
     65                                '&amp;&amp; &amp;&amp;amp; &amp;amp;&amp;amp; &amp;amp;;',
     66                        ),
     67                        array(
     68                                '&garbage; &***; &aaaa; &0000; &####; &;;',
     69                                '&amp;garbage; &amp;***; &amp;aaaa; &amp;0000; &amp;####; &amp;;;',
     70                        ),
     71                );
     72        }
     73
     74        /**
     75         * Check some of the double-encoding features for entity references.
     76         *
     77         * @ticket 17780
     78         * @dataProvider data_no_double_encoding
     79         */
     80        function test_no_double_encoding( $input, $output ) {
     81                return $this->assertEquals( $output, _wp_specialchars( $input, ENT_NOQUOTES, false, false ) );
     82        }
     83
     84        function data_no_double_encoding() {
     85                return array(
     86                        array(
     87                                'This & that, this &amp; that, &#8212; &quot; &QUOT; &Uacute; &nbsp; &#34; &#034; &#0034; &#x00022; &#x22; &dollar; &times;',
     88                                'This &amp; that, this &amp; that, &#8212; &quot; &amp;QUOT; &Uacute; &nbsp; &#034; &#034; &#034; &#x22; &#x22; &amp;dollar; &times;',
     89                        ),
     90                        array(
     91                                '&& &&amp; &amp;&amp; &amp;;',
     92                                '&amp;&amp; &amp;&amp; &amp;&amp; &amp;;',
     93                        ),
     94                        array(
     95                                '&garbage; &***; &aaaa; &0000; &####; &;;',
     96                                '&amp;garbage; &amp;***; &amp;aaaa; &amp;0000; &amp;####; &amp;;;',
     97                        ),
     98                );
     99        }
    42100}