<!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>[38221] trunk: Updates: Improve experience for Bulk Actions when FTP is dismissed.</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/38221">38221</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/38221","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>jorbin</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-08-09 01:13:08 +0000 (Tue, 09 Aug 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'>Updates: Improve experience for Bulk Actions when FTP is dismissed.

Before this change, when a bulk update was canceled due dismissing the FTP credentials modal, part of the actions didn't get canceled.  This meant the "There is a new version of?\226?\128?\166?\226?\128?\157 notices become blank and the updates you had checked became unchecked.  Now, the notices remain and you are essentially returned to the screen you had before. Strings are also updated to improve ARIA usage.

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesclasswpplugininstalllisttablephp">trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php</a></li>
<li><a href="#trunksrcwpadminjsupdatesjs">trunk/src/wp-admin/js/updates.js</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="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-08-09 00:12:08 UTC (rev 38220)
+++ trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php  2016-08-09 01:13:08 UTC (rev 38221)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -476,6 +476,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                                        $action_links[] = '<button type="button" class="button button-disabled" disabled="disabled">' . _x( 'Active', 'plugin' ) . '</button>';
</span><span class="cx" style="display: block; padding: 0 10px">                                                } elseif ( current_user_can( 'activate_plugins' ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                                        $button_text  = __( 'Activate' );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                        /* translators: %s: Plugin name */
+                                                       $button_label = _x( 'Activate %s', 'plugin' );
</ins><span class="cx" style="display: block; padding: 0 10px">                                                         $activate_url = add_query_arg( array(
</span><span class="cx" style="display: block; padding: 0 10px">                                                                '_wpnonce'    => wp_create_nonce( 'activate-plugin_' . $status['file'] ),
</span><span class="cx" style="display: block; padding: 0 10px">                                                                'action'      => 'activate',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -484,14 +486,15 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                                        if ( is_network_admin() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                                                $button_text  = __( 'Network Activate' );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                                /* translators: %s: Plugin name */
+                                                               $button_label = _x( 'Network Activate %s', 'plugin' );
</ins><span class="cx" style="display: block; padding: 0 10px">                                                                 $activate_url = add_query_arg( array( 'networkwide' => 1 ), $activate_url );
</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">                                                        $action_links[] = sprintf(
</span><span class="cx" style="display: block; padding: 0 10px">                                                                '<a href="%1$s" class="button activate-now button-secondary" aria-label="%2$s">%3$s</a>',
</span><span class="cx" style="display: block; padding: 0 10px">                                                                esc_url( $activate_url ),
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                                                /* translators: %s: Plugin name */
-                                                               esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin['name'] ) ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                         esc_attr( sprintf( $button_label, $plugin['name'] ) ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                                                 $button_text
</span><span class="cx" style="display: block; padding: 0 10px">                                                        );
</span><span class="cx" style="display: block; padding: 0 10px">                                                } else {
</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-08-09 00:12:08 UTC (rev 38220)
+++ trunk/src/wp-admin/js/updates.js    2016-08-09 01:13:08 UTC (rev 38221)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -523,11 +523,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $message = $( '[data-slug="' + args.slug + '"]' );
</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">-                $message.text( wp.updates.l10n.installing );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $message.html() !== wp.updates.l10n.installing ) {
+                       $message.data( 'originaltext', $message.html() );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $message
</span><span class="cx" style="display: block; padding: 0 10px">                        .addClass( 'updating-message' )
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        .attr( 'aria-label', wp.updates.l10n.pluginInstallingLabel.replace( '%s', $message.data( 'name' ) ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 .attr( 'aria-label', wp.updates.l10n.pluginInstallingLabel.replace( '%s', $message.data( 'name' ) ) )
+                       .text( wp.updates.l10n.installing );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                wp.a11y.speak( wp.updates.l10n.installingMsg, 'polite' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1505,7 +1508,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                // Restore callbacks.
</span><span class="cx" style="display: block; padding: 0 10px">                response = wp.updates._addCallbacks( response, action );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp.updates.queue.push( {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp.updates.queue.unshift( {
</ins><span class="cx" style="display: block; padding: 0 10px">                         action: action,
</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">@@ -1708,13 +1711,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                $updatingMessage.removeClass( 'updating-message' );
</span><span class="cx" style="display: block; padding: 0 10px">                        } else if ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $message = $( 'tr[data-plugin="' + job.data.plugin + '"]' ).find( '.update-message' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        } else if ( 'plugin-install' === pagenow || 'plugin-install-network' === pagenow ) {
-                               $message = $( '.update-now.updating-message' );
</del><span class="cx" style="display: block; padding: 0 10px">                         } else {
</span><span class="cx" style="display: block; padding: 0 10px">                                $message = $updatingMessage;
</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 ( $message ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( $message && $message.hasClass( 'updating-message' ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 originalText = $message.data( 'originaltext' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( 'undefined' === typeof originalText ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1724,6 +1725,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                $message
</span><span class="cx" style="display: block; padding: 0 10px">                                        .removeClass( 'updating-message' )
</span><span class="cx" style="display: block; padding: 0 10px">                                        .html( originalText );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+                               if ( 'plugin-install' === pagenow || 'plugin-install-network' === pagenow ) {
+                                       if ( 'update-plugin' === job.action ) {
+                                               $message.attr( 'aria-label', wp.updates.l10n.updateNowLabel.replace( '%s', $message.data( 'name' ) ) );
+                                       } else if ( 'install-plugin' === job.action ) {
+                                               $message.attr( 'aria-label', wp.updates.l10n.installNowLabel.replace( '%s', $message.data( 'name' ) ) );
+                                       }
+                               }
</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">                        wp.a11y.speak( wp.updates.l10n.updateCancel, 'polite' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1999,14 +2008,14 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Find all the checkboxes which have been checked.
</span><span class="cx" style="display: block; padding: 0 10px">                        itemsSelected.each( function( index, element ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                var $checkbox  = $( element ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         var $checkbox = $( element ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $itemRow = $checkbox.parents( 'tr' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                // Un-check the box.
-                               $checkbox.prop( 'checked', false );
-
</del><span class="cx" style="display: block; padding: 0 10px">                                 // Only add update-able items to the update queue.
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( 'update-selected' === bulkAction && ( ! $itemRow.hasClass( 'update' ) || $itemRow.find( 'notice-error' ).length ) ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+                                       // Un-check the box.
+                                       $checkbox.prop( 'checked', false );
</ins><span class="cx" style="display: block; padding: 0 10px">                                         return;
</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">@@ -2022,17 +2031,20 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Display bulk notification for updates of any kind.
</span><span class="cx" style="display: block; padding: 0 10px">                        $document.on( 'wp-plugin-update-success wp-plugin-update-error wp-theme-update-success wp-theme-update-error', function( event, response ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                var $bulkActionNotice, itemName;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         var $itemRow = $( '[data-slug="' + response.slug + '"]' ),
+                                       $bulkActionNotice, itemName;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( 'wp-' + response.update + '-update-success' === event.type ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        success++;
</span><span class="cx" style="display: block; padding: 0 10px">                                } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        itemName = response.pluginName ? response.pluginName : $( '[data-slug="' + response.slug + '"]' ).find( '.column-primary strong' ).text();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 itemName = response.pluginName ? response.pluginName : $itemRow.find( '.column-primary strong' ).text();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                        error++;
</span><span class="cx" style="display: block; padding: 0 10px">                                        errorMessages.push( itemName + ': ' + response.errorMessage );
</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">+                                $itemRow.find( 'input[name="checked[]"]:checked' ).prop( 'checked', false );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                                 wp.updates.adminNotice = wp.template( 'wp-bulk-updates-admin-notice' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                wp.updates.addAdminNotice( {
</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-08-09 00:12:08 UTC (rev 38220)
+++ trunk/src/wp-includes/script-loader.php     2016-08-09 01:13:08 UTC (rev 38221)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -616,6 +616,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'updated'                    => __( 'Updated!' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'update'                     => __( 'Update' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'updateNow'                  => __( 'Update Now' ),
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                /* translators: %s: Plugin name and version */
+                               'updateNowLabel'             => __( 'Update %s now' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'updateFailedShort'          => __( 'Update Failed!' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                /* translators: %s: Error string for a failed update */
</span><span class="cx" style="display: block; padding: 0 10px">                                'updateFailed'               => __( 'Update Failed: %s' ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -634,7 +636,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'beforeunload'               => __( 'Updates may not complete if you navigate away from this page.' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'installNow'                 => __( 'Install Now' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                /* translators: %s: Plugin name */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'installNowLabel'            => __( 'Install %s' ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'installNowLabel'            => __( 'Install %s now' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'installing'                 => __( 'Installing...' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'installed'                  => __( 'Installed!' ),
</span><span class="cx" style="display: block; padding: 0 10px">                                'installFailedShort'         => __( 'Install Failed!' ),
</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-08-09 00:12:08 UTC (rev 38220)
+++ trunk/tests/qunit/fixtures/updates.js       2016-08-09 01:13:08 UTC (rev 38221)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -9,6 +9,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'updated': 'Updated!',
</span><span class="cx" style="display: block; padding: 0 10px">                'update': 'Update',
</span><span class="cx" style="display: block; padding: 0 10px">                'updateNow': 'Update Now',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'updateNowLabel': 'Update %s now',
</ins><span class="cx" style="display: block; padding: 0 10px">                 'updateFailedShort': 'Update Failed!',
</span><span class="cx" style="display: block; padding: 0 10px">                'updateFailed': 'Update Failed: %s',
</span><span class="cx" style="display: block; padding: 0 10px">                'updatingLabel': 'Updating %s...',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -19,6 +20,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'updateCancel': 'Update canceled.',
</span><span class="cx" style="display: block; padding: 0 10px">                'beforeunload': 'Updates may not complete if you navigate away from this page.',
</span><span class="cx" style="display: block; padding: 0 10px">                'installNow': 'Install Now',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'installNowLabel': 'Install %s now',
</ins><span class="cx" style="display: block; padding: 0 10px">                 'installing': 'Installing...',
</span><span class="cx" style="display: block; padding: 0 10px">                'installed': 'Installed!',
</span><span class="cx" style="display: block; padding: 0 10px">                'installFailedShort': 'Install Failed!',
</span></span></pre>
</div>
</div>

</body>
</html>