<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[38119] trunk: Plugins: Improve Ajax search of new plugins.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/38119">38119</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/38119","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>ocean90</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-07-20 16:31:50 +0000 (Wed, 20 Jul 2016)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Plugins: Improve Ajax search of new plugins.

Fixes a few accessibility issues, restores the "Search Results" tab and the search type selector, and improves compatibility with older browsers.

Props rahulsprajapati, swissspidy, adamsilverstein, ocean90
See <a href="https://core.trac.wordpress.org/ticket/37233">#37233</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesajaxactionsphp">trunk/src/wp-admin/includes/ajax-actions.php</a></li>
<li><a href="#trunksrcwpadminincludesclasswpplugininstalllisttablephp">trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php</a></li>
<li><a href="#trunksrcwpadminincludesplugininstallphp">trunk/src/wp-admin/includes/plugin-install.php</a></li>
<li><a href="#trunksrcwpadminjsupdatesjs">trunk/src/wp-admin/js/updates.js</a></li>
<li><a href="#trunksrcwpadminplugininstallphp">trunk/src/wp-admin/plugin-install.php</a></li>
<li><a href="#trunksrcwpincludesscriptloaderphp">trunk/src/wp-includes/script-loader.php</a></li>
<li><a href="#trunktestsqunitfixturesupdatesjs">trunk/tests/qunit/fixtures/updates.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesajaxactionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/ajax-actions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/ajax-actions.php      2016-07-20 16:23:36 UTC (rev 38118)
+++ trunk/src/wp-admin/includes/ajax-actions.php        2016-07-20 16:31:50 UTC (rev 38119)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3881,6 +3881,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        ob_start();
</span><span class="cx" style="display: block; padding: 0 10px">        $wp_list_table->display();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $status['count'] = (int) $wp_list_table->get_pagination_arg( 'total_items' );
</ins><span class="cx" style="display: block; padding: 0 10px">         $status['items'] = ob_get_clean();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        wp_send_json_success( $status );
</span></span></pre></div>
<a id="trunksrcwpadminincludesclasswpplugininstalllisttablephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php        2016-07-20 16:23:36 UTC (rev 38118)
+++ trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php  2016-07-20 16:31:50 UTC (rev 38119)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -285,7 +285,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                ?>
</span><span class="cx" style="display: block; padding: 0 10px">        </ul>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        <?php install_search_form( isset( $views['plugin-install-search'] ) ); ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <?php install_search_form(); ?>
</ins><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span></span></pre></div>
<a id="trunksrcwpadminincludesplugininstallphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/plugin-install.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/plugin-install.php    2016-07-20 16:23:36 UTC (rev 38118)
+++ trunk/src/wp-admin/includes/plugin-install.php      2016-07-20 16:31:50 UTC (rev 38119)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -214,6 +214,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        <?php display_plugins_table(); ?>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        <div class="plugins-popular-tags-wrapper">
</ins><span class="cx" style="display: block; padding: 0 10px">         <h2><?php _e( 'Popular tags' ) ?></h2>
</span><span class="cx" style="display: block; padding: 0 10px">        <p><?php _e( 'You may also browse based on the most popular tags in the Plugin Directory:' ) ?></p>
</span><span class="cx" style="display: block; padding: 0 10px">        <?php
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -239,40 +240,32 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">                echo wp_generate_tag_cloud($tags, array( 'single_text' => __('%s plugin'), 'multiple_text' => __('%s plugins') ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        echo '</p><br class="clear" />';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ echo '</p><br class="clear" /></div>';
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Display search form for searching plugins.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Displays a search form for searching plugins.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.7.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 4.6.0 The `$type_selector` parameter was deprecated.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param bool $type_selector
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param bool $deprecated Not used.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function install_search_form( $type_selector = true ) {
-       $type = isset($_REQUEST['type']) ? wp_unslash( $_REQUEST['type'] ) : 'term';
-       $term = isset($_REQUEST['s']) ? wp_unslash( $_REQUEST['s'] ) : '';
-       $input_attrs = '';
-       $button_type = 'button screen-reader-text';
-
-       // assume no $type_selector means it's a simplified search form
-       if ( ! $type_selector ) {
-               $input_attrs = 'class="wp-filter-search" placeholder="' . esc_attr__( 'Search Plugins' ) . '" ';
-       }
-
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function install_search_form( $deprecated = true ) {
+       $type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';
+       $term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : '';
</ins><span class="cx" style="display: block; padding: 0 10px">         ?><form class="search-form search-plugins" method="get">
</span><span class="cx" style="display: block; padding: 0 10px">                <input type="hidden" name="tab" value="search" />
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <?php if ( $type_selector ) : ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         <label class="screen-reader-text" for="typeselector"><?php _e( 'Search plugins by:' ); ?></label>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <select name="type" id="typeselector">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        <option value="term"<?php selected('term', $type) ?>><?php _e('Keyword'); ?></option>
-                       <option value="author"<?php selected('author', $type) ?>><?php _e('Author'); ?></option>
-                       <option value="tag"<?php selected('tag', $type) ?>><?php _ex('Tag', 'Plugin Installer'); ?></option>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 <option value="term"<?php selected( 'term', $type ); ?>><?php _e( 'Keyword' ); ?></option>
+                       <option value="author"<?php selected( 'author', $type ); ?>><?php _e( 'Author' ); ?></option>
+                       <option value="tag"<?php selected( 'tag', $type ); ?>><?php _ex( 'Tag', 'Plugin Installer' ); ?></option>
</ins><span class="cx" style="display: block; padding: 0 10px">                 </select>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <?php endif; ?>
-               <label><span class="screen-reader-text"><?php _e('Search Plugins'); ?></span>
-                       <input type="search" name="s" value="<?php echo esc_attr($term) ?>" <?php echo $input_attrs; ?>/>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         <label><span class="screen-reader-text"><?php _e( 'Search Plugins' ); ?></span>
+                       <input type="search" name="s" value="<?php echo esc_attr( $term ) ?>" class="wp-filter-search" placeholder="<?php esc_attr_e( 'Search Plugins' ); ?>" />
</ins><span class="cx" style="display: block; padding: 0 10px">                 </label>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <?php submit_button( __( 'Search Plugins' ), $button_type, false, false, array( 'id' => 'search-submit' ) ); ?>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         <?php submit_button( __( 'Search Plugins' ), 'button hide-if-js', false, false, array( 'id' => 'search-submit' ) ); ?>
</ins><span class="cx" style="display: block; padding: 0 10px">         </form><?php
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpadminjsupdatesjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/js/updates.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/js/updates.js  2016-07-20 16:23:36 UTC (rev 38118)
+++ trunk/src/wp-admin/js/updates.js    2016-07-20 16:31:50 UTC (rev 38119)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1598,10 +1598,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">        };
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $( function() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                var $pluginFilter    = $( '#plugin-filter' ),
-                       $bulkActionForm  = $( '#bulk-action-form' ),
-                       $filesystemModal = $( '#request-filesystem-credentials-dialog' ),
-                       $pluginSearch    = $( '.plugins-php .wp-filter-search' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         var $pluginFilter        = $( '#plugin-filter' ),
+                       $bulkActionForm      = $( '#bulk-action-form' ),
+                       $filesystemModal     = $( '#request-filesystem-credentials-dialog' ),
+                       $pluginSearch        = $( '.plugins-php .wp-filter-search' ),
+                       $pluginInstallSearch = $( '.plugin-install-php .wp-filter-search' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /*
</span><span class="cx" style="display: block; padding: 0 10px">                 * Whether a user needs to submit filesystem credentials.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2021,32 +2022,61 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        wp.updates.queueChecker();
</span><span class="cx" style="display: block; padding: 0 10px">                } );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                if ( $pluginInstallSearch.length ) {
+                       $pluginInstallSearch.attr( 'aria-describedby', 'live-search-desc' );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 /**
</span><span class="cx" style="display: block; padding: 0 10px">                 * Handles changes to the plugin search box on the new-plugin page,
</span><span class="cx" style="display: block; padding: 0 10px">                 * searching the repository dynamically.
</span><span class="cx" style="display: block; padding: 0 10px">                 *
</span><span class="cx" style="display: block; padding: 0 10px">                 * @since 4.6.0
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $( '.plugin-install-php .wp-filter-search' ).on( 'keyup search', _.debounce( function() {
-                       var $form = $( '#plugin-filter' ).empty(),
-                               data  = _.extend( {
-                                       _ajax_nonce: wp.updates.ajaxNonce,
-                                       s:           $( this ).val(),
-                                       tab:         'search',
-                                       type:        $( '#typeselector' ).val(),
-                                       pagenow:     pagenow
-                               }, { type: 'term' } );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $pluginInstallSearch.on( 'keyup input', _.debounce( function( event, eventtype ) {
+                       var $searchTab = $( '.plugin-install-search' ), data, searchLocation;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( wp.updates.searchTerm === data.s ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 data = {
+                               _ajax_nonce: wp.updates.ajaxNonce,
+                               s:           event.target.value,
+                               tab:         'search',
+                               type:        $( '#typeselector' ).val(),
+                               pagenow:     pagenow
+                       };
+                       searchLocation = location.href.split( '?' )[ 0 ] + '?' + $.param( _.omit( data, [ '_ajax_nonce', 'pagenow' ] ) );
+
+                       // Clear on escape.
+                       if ( 'keyup' === event.type && 27 === event.which ) {
+                               event.target.value = '';
+                       }
+
+                       if ( wp.updates.searchTerm === data.s && 'typechange' !== eventtype ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 return;
</span><span class="cx" style="display: block; padding: 0 10px">                        } else {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                $pluginFilter.empty();
</ins><span class="cx" style="display: block; padding: 0 10px">                                 wp.updates.searchTerm = data.s;
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( history.pushState ) {
-                               history.pushState( null, '', location.href.split( '?' )[ 0 ] + '?' + $.param( _.omit( data, [ '_ajax_nonce', 'pagenow' ] ) ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( window.history && window.history.pushState ) {
+                               window.history.pushState( null, '', searchLocation );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        if ( ! $searchTab.length ) {
+                               $searchTab = $( '<li class="plugin-install-search" />' )
+                                       .append( $( '<a />', {
+                                               'class': 'current',
+                                               'href': searchLocation,
+                                               'text': wp.updates.l10n.searchResultsLabel
+                                       } ) );
+
+                               $( '.wp-filter .filter-links .current' )
+                                       .removeClass( 'current' )
+                                       .parents( '.filter-links' )
+                                       .prepend( $searchTab );
+
+                               $pluginFilter.prev( 'p' ).remove();
+                               $( '.plugins-popular-tags-wrapper' ).remove();
+                       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         if ( 'undefined' !== typeof wp.updates.searchRequest ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                wp.updates.searchRequest.abort();
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2054,12 +2084,18 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        wp.updates.searchRequest = wp.ajax.post( 'search-install-plugins', data ).done( function( response ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $( 'body' ).removeClass( 'loading-content' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $form.append( response.items );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $pluginFilter.append( response.items );
</ins><span class="cx" style="display: block; padding: 0 10px">                                 delete wp.updates.searchRequest;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+                               if ( 0 === response.count ) {
+                                       wp.a11y.speak( wp.updates.l10n.noPluginsFound );
+                               } else {
+                                       wp.a11y.speak( wp.updates.l10n.pluginsFound.replace( '%d', response.count ) );
+                               }
</ins><span class="cx" style="display: block; padding: 0 10px">                         } );
</span><span class="cx" style="display: block; padding: 0 10px">                }, 500 ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $pluginSearch.length > 0 ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $pluginSearch.length ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $pluginSearch.attr( 'aria-describedby', 'live-search-desc' );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2087,8 +2123,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                wp.updates.searchTerm = data.s;
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( history.pushState ) {
-                               history.pushState( null, '', location.href.split( '?' )[ 0 ] + '?s=' + data.s );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( window.history && window.history.pushState ) {
+                               window.history.pushState( null, '', location.href.split( '?' )[ 0 ] + '?s=' + data.s );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( 'undefined' !== typeof wp.updates.searchRequest ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2132,7 +2168,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $document.on( 'submit', '.search-plugins', function( event ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        event.preventDefault();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $( 'input.wp-filter-search' ).trigger( 'search' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $( 'input.wp-filter-search' ).trigger( 'input' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 } );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2141,7 +2177,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 * @since 4.6.0
</span><span class="cx" style="display: block; padding: 0 10px">                 */
</span><span class="cx" style="display: block; padding: 0 10px">                $( '#typeselector' ).on( 'change', function() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $( 'input[name="s"]' ).trigger( 'search' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 var $search = $( 'input[name="s"]' );
+
+                       if ( $search.val().length ) {
+                               $search.trigger( 'input', 'typechange' );
+                       }
</ins><span class="cx" style="display: block; padding: 0 10px">                 } );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /**
</span></span></pre></div>
<a id="trunksrcwpadminplugininstallphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/plugin-install.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/plugin-install.php     2016-07-20 16:23:36 UTC (rev 38118)
+++ trunk/src/wp-admin/plugin-install.php       2016-07-20 16:31:50 UTC (rev 38119)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -70,7 +70,9 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 'id'           => 'overview',
</span><span class="cx" style="display: block; padding: 0 10px"> 'title'                => __('Overview'),
</span><span class="cx" style="display: block; padding: 0 10px"> 'content'      =>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        '<p>' . sprintf(__('Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official <a href="%s" target="_blank">WordPress Plugin Directory</a> are compatible with the license WordPress uses. You can find new plugins to install by searching or browsing the Directory right here in your own Plugins section.'), 'https://wordpress.org/plugins/') . '</p>'
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ '<p>' . sprintf( __('Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official <a href="%s" target="_blank">WordPress Plugin Directory</a> are compatible with the license WordPress uses.' ), 'https://wordpress.org/plugins/' ) . '</p>' .
+       '<p>' . __( 'You can find new plugins to install by searching or browsing the directory right here in your own Plugins section.' ) . ' <span id="live-search-desc" class="hide-if-no-js">' . __( 'The search results will be updated as you type.' ) . '</span></p>'
+
</ins><span class="cx" style="display: block; padding: 0 10px"> ) );
</span><span class="cx" style="display: block; padding: 0 10px"> get_current_screen()->add_help_tab( array(
</span><span class="cx" style="display: block; padding: 0 10px"> 'id'           => 'adding-plugins',
</span></span></pre></div>
<a id="trunksrcwpincludesscriptloaderphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/script-loader.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/script-loader.php   2016-07-20 16:23:36 UTC (rev 38118)
+++ trunk/src/wp-includes/script-loader.php     2016-07-20 16:31:50 UTC (rev 38119)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -609,6 +609,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'l10n'       => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                /* translators: %s: Search string */
</span><span class="cx" style="display: block; padding: 0 10px">                                'searchResults'              => __( 'Search results for &#8220;%s&#8221;' ),
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                'searchResultsLabel'         => __( 'Search Results' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'noPlugins'                  => __( 'You do not appear to have any plugins available at this time.' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'noItemsSelected'            => __( 'Please select at least one item to perform this action on.' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'updating'                   => __( 'Updating...' ), // No ellipsis.
</span></span></pre></div>
<a id="trunktestsqunitfixturesupdatesjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/qunit/fixtures/updates.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/qunit/fixtures/updates.js     2016-07-20 16:23:36 UTC (rev 38118)
+++ trunk/tests/qunit/fixtures/updates.js       2016-07-20 16:31:50 UTC (rev 38119)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2,6 +2,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        'ajax_nonce': '719b10f05d',
</span><span class="cx" style="display: block; padding: 0 10px">        'l10n': {
</span><span class="cx" style="display: block; padding: 0 10px">                'searchResults': 'Search results for &#8220;%s&#8221;',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'searchResultsLabel': 'Search Results',
</ins><span class="cx" style="display: block; padding: 0 10px">                 'noPlugins': 'You do not appear to have any plugins available at this time.',
</span><span class="cx" style="display: block; padding: 0 10px">                'noItemsSelected': 'Please select at least one item to perform this action on.',
</span><span class="cx" style="display: block; padding: 0 10px">                'updating': 'Updating...',
</span></span></pre>
</div>
</div>

</body>
</html>