<!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>[38091] trunk/src/wp-admin: Plugins: Use the correct admin screen when searching for plugins via Ajax.</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/38091">38091</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/38091","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-18 13:59:17 +0000 (Mon, 18 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: Use the correct admin screen when searching for plugins via Ajax.

Both list tables provide different actions based on where they are loaded, regular admin or network admin. Since there is only one Ajax handler for both screens we have to set the current screen before using the list tables.

Props swissspidy, ocean90.
Fixes <a href="https://core.trac.wordpress.org/ticket/37373">#37373</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesajaxactionsphp">trunk/src/wp-admin/includes/ajax-actions.php</a></li>
<li><a href="#trunksrcwpadminjsupdatesjs">trunk/src/wp-admin/js/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-18 12:38:46 UTC (rev 38090)
+++ trunk/src/wp-admin/includes/ajax-actions.php        2016-07-18 13:59:17 UTC (rev 38091)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3781,20 +3781,23 @@
</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">- * @global WP_List_Table $wp_list_table Current list table instance.
- * @global string        $hook_suffix   Current admin page.
- * @global string        $s             Search term.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @global string $s Search term.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_ajax_search_plugins() {
</span><span class="cx" style="display: block; padding: 0 10px">        check_ajax_referer( 'updates' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        global $wp_list_table, $hook_suffix, $s;
-       $hook_suffix = 'plugins.php';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';
+       if ( 'plugins-network' === $pagenow || 'plugins' === $pagenow ) {
+               set_current_screen( $pagenow );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /** @var WP_Plugins_List_Table $wp_list_table */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
-       $status        = array();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $wp_list_table = _get_list_table( 'WP_Plugins_List_Table', array(
+               'screen' => get_current_screen(),
+       ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $status = array();
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! $wp_list_table->ajax_user_can() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' );
</span><span class="cx" style="display: block; padding: 0 10px">                wp_send_json_error( $status );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3806,7 +3809,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'action'      => null,
</span><span class="cx" style="display: block; padding: 0 10px">        ) ), network_admin_url( 'plugins.php', 'relative' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $s = sanitize_text_field( $_POST['s'] );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $GLOBALS['s'] = wp_unslash( $_POST['s'] );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $wp_list_table->prepare_items();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3822,20 +3825,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * Ajax handler for searching plugins to install.
</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><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- *
- * @global WP_List_Table $wp_list_table Current list table instance.
- * @global string        $hook_suffix   Current admin page.
</del><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_ajax_search_install_plugins() {
</span><span class="cx" style="display: block; padding: 0 10px">        check_ajax_referer( 'updates' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        global $wp_list_table, $hook_suffix;
-       $hook_suffix = 'plugin-install.php';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';
+       if ( 'plugin-install-network' === $pagenow || 'plugin-install' === $pagenow ) {
+               set_current_screen( $pagenow );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /** @var WP_Plugin_Install_List_Table $wp_list_table */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $wp_list_table = _get_list_table( 'WP_Plugin_Install_List_Table' );
-       $status        = array();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $wp_list_table = _get_list_table( 'WP_Plugin_Install_List_Table', array(
+               'screen' => get_current_screen(),
+       ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $status = array();
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! $wp_list_table->ajax_user_can() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' );
</span><span class="cx" style="display: block; padding: 0 10px">                wp_send_json_error( $status );
</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-18 12:38:46 UTC (rev 38090)
+++ trunk/src/wp-admin/js/updates.js    2016-07-18 13:59:17 UTC (rev 38091)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2031,9 +2031,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        var $form = $( '#plugin-filter' ).empty(),
</span><span class="cx" style="display: block; padding: 0 10px">                                data  = _.extend( {
</span><span class="cx" style="display: block; padding: 0 10px">                                        _ajax_nonce: wp.updates.ajaxNonce,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        s:           $( '<p />' ).html( $( this ).val() ).text(),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 s:           $( this ).val(),
</ins><span class="cx" style="display: block; padding: 0 10px">                                         tab:         'search',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        type:        $( '#typeselector' ).val()
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 type:        $( '#typeselector' ).val(),
+                                       pagenow:     pagenow
</ins><span class="cx" style="display: block; padding: 0 10px">                                 }, { type: 'term' } );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( wp.updates.searchTerm === data.s ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2043,7 +2044,7 @@
</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">                        if ( history.pushState ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                history.pushState( null, '', location.href.split( '?' )[ 0 ] + '?' + $.param( _.omit( data, '_ajax_nonce' ) ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         history.pushState( null, '', location.href.split( '?' )[ 0 ] + '?' + $.param( _.omit( data, [ '_ajax_nonce', 'pagenow' ] ) ) );
</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">@@ -2071,7 +2072,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $pluginSearch.on( 'keyup input', _.debounce( function( event ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        var data = {
</span><span class="cx" style="display: block; padding: 0 10px">                                _ajax_nonce: wp.updates.ajaxNonce,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                s:           event.target.value
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         s:           event.target.value,
+                               pagenow:     pagenow
</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">                        // Clear on escape.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2099,7 +2101,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        wp.updates.searchRequest = wp.ajax.post( 'search-plugins', data ).done( function( response ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                // Can we just ditch this whole subtitle business?
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                var $subTitle    = $( '<span />' ).addClass( 'subtitle' ).html( wp.updates.l10n.searchResults.replace( '%s', data.s ) ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         var $subTitle    = $( '<span />' ).addClass( 'subtitle' ).html( wp.updates.l10n.searchResults.replace( '%s', _.escape( data.s ) ) ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $oldSubTitle = $( '.wrap .subtitle' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( ! data.s.length ) {
</span></span></pre>
</div>
</div>

</body>
</html>