/** * File: setup-guide.js * * JavaScript for the Setup Guide page. * * @since 2.0.0 * * @global W3TC-setup-guide Localized array variable. */ var w3tc_enable_ga = ( 'accept' === W3TC_SetupGuide.tos_choice && W3TC_SetupGuide.track_usage && window.w3tc_ga ); jQuery(function() { var $container = jQuery( '#w3tc-wizard-container'), $nextButton = $container.find( '#w3tc-wizard-next '), $tosNotice = $container.find( '#w3tc-licensing-terms' ); // GA. if ( w3tc_enable_ga ) { w3tc_ga( 'create', W3TC_SetupGuide.ga_profile, 'auto' ); w3tc_ga( 'send', 'event', 'button', 'w3tc_setup_guide', 'w3tc-wizard-step-welcome' ); } // Handle the terms of service notice. if ( $tosNotice.length ) { $nextButton.prop( 'disabled', true ); $container.find( '.dashicons-yes' ).hide(); $tosNotice.find( '.button' ).on( 'click', function() { var $this = jQuery( this ), choice = $this.data( 'choice' ); jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: $container.find( '[name="_wpnonce"]' ).val(), action: "w3tc_tos_choice", choice: choice } }) .done(function( response ) { $tosNotice.hide(); $nextButton.prop( 'disabled', false ); $container.find( '#w3tc-welcome' ).show(); $container.find( '.dashicons-yes' ).show(); }) .fail(function() { $this.text( 'Error with Ajax; reloading page...' ); location.reload(); }); if ( 'accept' === choice ) { W3TC_SetupGuide.tos_choice = choice; (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://api.w3-edge.com/v1/analytics','w3tc_ga'); if (window.w3tc_ga) { w3tc_ga( 'create', W3TC_SetupGuide.ga_profile, 'auto' ); w3tc_ga( 'set', { 'dimension1': 'w3-total-cache', 'dimension2': W3TC_SetupGuide.w3tc_version, 'dimension3': W3TC_SetupGuide.wp_version, 'dimension4': W3TC_SetupGuide.php_version, 'dimension5': W3TC_SetupGuide.server_software, 'dimension6': W3TC_SetupGuide.db_version, 'dimension7': W3TC_SetupGuide.home_url_host, 'dimension9': W3TC_SetupGuide.install_version, 'dimension10': W3TC_SetupGuide.w3tc_edition, 'dimension11': W3TC_SetupGuide.list_widgets, 'page': W3TC_SetupGuide.page }); w3tc_ga( 'send', 'pageview' ); } } }); } }); jQuery( '#w3tc-wizard-step-welcome' ) .addClass( 'is-active' ) .append( '' ); /** * Wizard actions. * * @since 2.0.0 * * @param object $slide The div of the slide displayed. */ function w3tc_wizard_actions( $slide ) { var configSuccess = false, pgcacheSettings = { enabled: null, engine: null }, dbcacheSettings = { enabled: null, engine: null }, objcacheSettings = { enabled: null, engine: null }, browsercacheSettings = { enabled: null }, lazyloadSettings = { enabled: null }, slideId = $slide.prop( 'id' ), $container = jQuery( '#w3tc-wizard-container' ), nonce = $container.find( '[name="_wpnonce"]' ).val(), $nextButton = $container.find( '#w3tc-wizard-next' ), $prevButton = $container.find( '#w3tc-wizard-previous' ), $skipButton = $container.find( '#w3tc-wizard-skip' ), $dashboardButton = $container.find( '#w3tc-wizard-dashboard' ); /** * Configure Page Cache. * * @since 2.0.0 * * @param int enable Enable Page Cache. * @param string engine Page Cache storage engine. * @return jqXHR */ function configPgcache( enable, engine = '' ) { var $jqXHR = jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_config_pgcache', enable: enable, engine: engine } }); configSuccess = null; $jqXHR.done(function( response ) { configSuccess = response.data.success; }); return $jqXHR; } /** * Get Page Cache settings. * * @since 2.0.0 * * @return jqXHR */ function getPgcacheSettings() { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_get_pgcache_settings' } }) .done(function( response ) { pgcacheSettings = response.data; }); } /** * Configure Database Cache. * * @since 2.0.0 * * @param int enable Enable database cache. * @param string engine Database cache storage engine. * @return jqXHR */ function configDbcache( enable, engine = '' ) { var $jqXHR = jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_config_dbcache', enable: enable, engine: engine } }); configSuccess = null; $jqXHR.done(function( response ) { configSuccess = response.data.success; }); return $jqXHR; } /** * Get Database Cache settings. * * @since 2.0.0 * * @return jqXHR */ function getDbcacheSettings() { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_get_dbcache_settings' } }) .done(function( response ) { dbcacheSettings = response.data; }); } /** * Configure Object Cache. * * @since 2.0.0 * * @param int enable Enable cache. * @param string engine Cache storage engine. * @return jqXHR */ function configObjcache( enable, engine = '' ) { var $jqXHR = jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_config_objcache', enable: enable, engine: engine } }); configSuccess = null; $jqXHR.done(function( response ) { configSuccess = response.data.success; }); return $jqXHR; } /** * Get Object Cache settings. * * @since 2.0.0 * * @return jqXHR */ function getObjcacheSettings() { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_get_objcache_settings' } }) .done(function( response ) { objcacheSettings = response.data; }); } /** * Configure Browser Cache. * * @since 2.0.0 * * @param int enable Enable browser cache. * @return jqXHR */ function configBrowsercache( enable ) { configSuccess = null; return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_config_browsercache', enable: enable } }) .done(function( response ) { configSuccess = response.data.success; }); } /** * Get Browser Cache settings. * * @since 2.0.0 * * @return jqXHR */ function getBrowsercacheSettings() { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_get_browsercache_settings' } }) .done(function( response ) { browsercacheSettings = response.data; }); } /** * Configure Lazy Load. * * @since 2.0.0 * * @param int enable Enable lazyload. * @return jqXHR */ function configLazyload( enable ) { configSuccess = null; return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_config_lazyload', enable: enable } }) .done(function( response ) { configSuccess = response.data.success; }); } /** * Get Lazt Load settings. * * @since 2.0.0 * * @return jqXHR */ function getLazyloadSettings() { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_get_lazyload_settings' } }) .done(function( response ) { lazyloadSettings = response.data; }); } /** * Configuration failed. * * @since 2.0.0 */ function configFailed() { $slide.append( '

' + W3TC_SetupGuide.config_error_msg + '

' ); $nextButton.closest( 'span' ).hide(); $prevButton.closest( 'span' ).hide(); $skipButton.closest( 'span' ).show(); } /** * Test failed. * * @since 2.0.0 */ function testFailed() { $slide.append( '

' + W3TC_SetupGuide.config_error_msg + '

' ); $nextButton.closest( 'span' ).hide(); $prevButton.closest( 'span' ).hide(); $skipButton.closest( 'span' ).show(); } // GA. if ( w3tc_enable_ga ) { w3tc_ga( 'send', 'event', 'button', 'w3tc_setup_guide', slideId ); } switch ( slideId ) { case 'w3tc-wizard-slide-welcome': $container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' ); $container.find( '#w3tc-wizard-step-welcome' ).addClass( 'is-active' ); break; case 'w3tc-wizard-slide-pc1': // Test Page Cache. $container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' ); $container.find( '#w3tc-wizard-step-pgcache' ).addClass( 'is-active' ); if ( ! $container.find( '#test-results' ).data( 'pgcache-none' ) ) { $nextButton.prop( 'disabled', 'disabled' ); } $slide.find( '#w3tc-test-pgcache' ).off('click').on('click', function () { var $spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(), $this = jQuery( this ); $this.prop( 'disabled', 'disabled' ); $slide.find( '.notice-error' ).remove(); $container.find( '#w3tc-pgcache-table tbody' ).empty(); $prevButton.prop( 'disabled', 'disabled' ); $nextButton.prop( 'disabled', 'disabled' ); $spinnerParent.show(); /** * Add a test result table row. * * @since 2.0.0 * * @param object testResponse Data. * @param string engine Cache storage engine. * @param string label Text label for the engine. */ function addResultRow( testResponse, engine, label ) { var baseline, results = '' + label + ''; if ( testResponse.success ) { results += ( testResponse.data.ttfb * 1000 ).toFixed( 2 ); if ( 'none' !== engine ) { baseline = $container.find( '#test-results' ).data( 'pgcache-none' ).ttfb; percentChange = ( ( testResponse.data.ttfb - baseline ) / baseline * 100 ).toFixed( 2 ); changeLabelType = percentChange < 0 ? 'w3tc-label-success' : 'w3tc-label-danger'; changeLabel = '' + percentChange + '%'; $container.find( '#test-results' ).data( 'pgcacheDiffPercent-' + engine, percentChange ); results += ' ' + changeLabel; } } else { results += W3TC_SetupGuide.unavailable_text; } results += ''; $container.find( '#w3tc-pgcache-table tbody' ).append( results ); $container.find( '#w3tc-pgcache-table' ).show(); } /** * Test Page Cache. * * @since 2.0.0 * * @param string engine Cache storage engine. * @param string label Text label for the engine. * @return jqXHR */ function testPgcache( engine, label ) { if ( configSuccess ) { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_test_pgcache' } }) .done(function( testResponse ) { $container.find( '#test-results' ).data( 'pgcache-' + engine, testResponse.data ); addResultRow( testResponse, engine, label ); }); } else { addResultRow( [ success => false ], engine, label ); } } // Run config and tests. getPgcacheSettings() .then( function() { return configPgcache( 0 ); }, configFailed ) .then( function() { return testPgcache( 'none', W3TC_SetupGuide.none ); }, configFailed ) .then( function() { return configPgcache( 1, 'file' ); } , testFailed ) .then( function() { return testPgcache( 'file', W3TC_SetupGuide.disk_basic ); }, configFailed ) .then( function() { return configPgcache( 1, 'file_generic' ); } , testFailed ) .then( function() { return testPgcache( 'file_generic', W3TC_SetupGuide.disk_enhanced ); }, configFailed ) .then( function() { return configPgcache( 1, 'redis' ); }, testFailed ) .then( function() { return testPgcache( 'redis', 'Redis' ); }, configFailed ) .then( function() { return configPgcache( 1, 'memcached' ); }, testFailed ) .then( function() { return testPgcache( 'memcached', 'Memcached' ); }, configFailed ) .then( function() { return configPgcache( 1, 'apc' ); }, testFailed ) .then( function() { return testPgcache( 'apc', 'APC' ); }, configFailed ) .then( function() { return configPgcache( 1, 'eaccelerator' ); }, testFailed ) .then( function() { return testPgcache( 'eaccelerator', 'eAccelerator' ); }, configFailed ) .then( function() { return configPgcache( 1, 'xcache' ); }, testFailed ) .then( function() { return testPgcache( 'xcache', 'XCache' ); }, configFailed ) .then( function() { return configPgcache( 1, 'wincache' ); }, testFailed ) .then( function() { return testPgcache( 'wincache', 'WinCache' ); }, configFailed ) .then(function() { $spinnerParent.hide(); $this.prop( 'disabled', false ); $prevButton.prop( 'disabled', false ); $nextButton.prop( 'disabled', false ); return true; }, testFailed ) // Restore the original database cache settings. .then( function() { return configPgcache( ( pgcacheSettings.enabled ? 1 : 0 ), pgcacheSettings.engine ); }, function() { $spinnerParent.hide(); return configFailed(); }); }); break; case 'w3tc-wizard-slide-dbc1': // Save the page cache engine setting from the previous slide. var pgcacheEngine = $container.find( 'input:checked[name="pgcache_engine"]' ).val(); configPgcache( ( 'none' === pgcacheEngine ? 0 : 1 ), 'none' === pgcacheEngine ? '' : pgcacheEngine ) .fail( function() { $slide.append( '

' + W3TC_SetupGuide.config_error_msg + '

' ); }); if ( ! jQuery( '#w3tc-wizard-step-pgcache .dashicons-yes' ).length ) { jQuery( '#w3tc-wizard-step-pgcache' ).append( '' ); } // Present the Database Cache slide. $container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' ); $container.find( '#w3tc-wizard-step-dbcache' ).addClass( 'is-active' ); if ( ! $container.find( '#test-results' ).data( 'dbc-none' ) ) { $nextButton.prop( 'disabled', 'disabled' ); } $slide.find( '#w3tc-test-dbcache' ).off('click').on('click', function () { var $spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(), $this = jQuery( this ); $this.prop( 'disabled', 'disabled' ); $slide.find( '.notice-error' ).remove(); $container.find( '#w3tc-dbc-table tbody' ).empty(); $container.find( '#w3tc-dbcache-recommended' ).hide(); $prevButton.prop( 'disabled', 'disabled' ); $nextButton.prop( 'disabled', 'disabled' ); $spinnerParent.show(); /** * Add a test result table row. * * @since 2.0.0 * * @param object testResponse Data. * @param string engine Cache storage engine. * @param string label Text label for the engine. */ function addResultRow( testResponse, engine, label ) { var baseline, results = '' + label + ''; if ( testResponse.success ) { results += ( testResponse.data.elapsed * 1000 ).toFixed( 2 ); if ( 'none' !== engine ) { baseline = $container.find( '#test-results' ).data( 'dbc-none' ).elapsed; percentChange = ( ( testResponse.data.elapsed - baseline ) / baseline * 100 ).toFixed( 2 ); changeLabelType = percentChange < 0 ? 'w3tc-label-success' : 'w3tc-label-danger'; changeLabel = ''+ percentChange + '%'; results += ' ' + changeLabel; } } else { results += W3TC_SetupGuide.unavailable_text; } results += ''; $container.find( '#w3tc-dbc-table tbody' ).append( results ); $container.find( '#w3tc-dbc-table' ).show(); } /** * Test database cache. * * @since 2.0.0 * * @param string engine Cache storage engine. * @param string label Text label for the engine. * @return jqXHR */ function testDbcache( engine, label ) { if ( configSuccess ) { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_test_dbcache' } }) .done(function( testResponse ) { $container.find( '#test-results' ).data( 'dbc-' + engine, testResponse.data ); addResultRow( testResponse, engine, label ); }); } else { addResultRow( [ success => false ], engine, label ); } } // Run config and tests. getDbcacheSettings() .then( function() { return configDbcache( 0 ); }, configFailed ) .then( function() { return testDbcache( 'none', W3TC_SetupGuide.none ); }, configFailed ) .then( function() { return configDbcache( 1, 'file' ); } , testFailed ) .then( function() { return testDbcache( 'file', W3TC_SetupGuide.disk ); }, configFailed ) .then( function() { return configDbcache( 1, 'redis' ); }, testFailed ) .then( function() { return testDbcache( 'redis', 'Redis' ); }, configFailed ) .then( function() { return configDbcache( 1, 'memcached' ); }, testFailed ) .then( function() { return testDbcache( 'memcached', 'Memcached' ); }, configFailed ) .then( function() { return configDbcache( 1, 'apc' ); }, testFailed ) .then( function() { return testDbcache( 'apc', 'APC' ); }, configFailed ) .then( function() { return configDbcache( 1, 'eaccelerator' ); }, testFailed ) .then( function() { return testDbcache( 'eaccelerator', 'eAccelerator' ); }, configFailed ) .then( function() { return configDbcache( 1, 'xcache' ); }, testFailed ) .then( function() { return testDbcache( 'xcache', 'XCache' ); }, configFailed ) .then( function() { return configDbcache( 1, 'wincache' ); }, testFailed ) .then( function() { return testDbcache( 'wincache', 'WinCache' ); }, configFailed ) .then(function() { $spinnerParent.hide(); $this.prop( 'disabled', false ); $prevButton.prop( 'disabled', false ); $nextButton.prop( 'disabled', false ); return true; }, testFailed ) .then( function() { $container.find( '#w3tc-dbcache-recommended' ).show(); // Restore the original database cache settings. return configDbcache( ( dbcacheSettings.enabled ? 1 : 0 ), dbcacheSettings.engine ); }, function() { $spinnerParent.hide(); return configFailed(); }); }); break; case 'w3tc-wizard-slide-oc1': // Save the database cache engine setting from the previous slide. var dbcEngine = $container.find( 'input:checked[name="dbcache_engine"]' ).val(); configDbcache( ( 'none' === dbcEngine ? 0 : 1 ), 'none' === dbcEngine ? '' : dbcEngine ) .fail( function() { $slide.append( '

' + W3TC_SetupGuide.config_error_msg + '

' ); }); if ( ! jQuery( '#w3tc-wizard-step-dbcache .dashicons-yes' ).length ) { jQuery( '#w3tc-wizard-step-dbcache' ).append( '' ); } // Present the Object Cache slide. $container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' ); $container.find( '#w3tc-wizard-step-objectcache' ).addClass( 'is-active' ); if ( ! $container.find( '#test-results' ).data( 'oc-none' ) ) { $nextButton.prop( 'disabled', 'disabled' ); } $slide.find( '#w3tc-test-objcache' ).off('click').on('click', function () { var $spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(), $this = jQuery( this ); $this.prop( 'disabled', 'disabled' ); $slide.find( '.notice-error' ).remove(); $container.find( '#w3tc-objcache-table tbody' ).empty(); $prevButton.prop( 'disabled', 'disabled' ); $nextButton.prop( 'disabled', 'disabled' ); $spinnerParent.show(); /** * Add a test result table row. * * @since 2.0.0 * * @param object testResponse Data. * @param string engine Cache storage engine. * @param string label Text label for the engine. */ function addResultRow( testResponse, engine, label ) { var baseline, results = '' + label + ''; if ( testResponse.success ) { results += ( testResponse.data.elapsed * 1000 ).toFixed( 2 ); if ( 'none' !== engine ) { baseline = $container.find( '#test-results' ).data( 'oc-none' ).elapsed; percentChange = ( ( testResponse.data.elapsed - baseline ) / baseline * 100 ).toFixed( 2 ); changeLabelType = percentChange < 0 ? 'w3tc-label-success' : 'w3tc-label-danger'; changeLabel = '' + percentChange + '%'; results += ' ' + changeLabel; } } else { results += W3TC_SetupGuide.unavailable_text; } results += ''; $container.find( '#w3tc-objcache-table tbody' ).append( results ); $container.find( '#w3tc-objcache-table' ).show(); } /** * Test object cache cache. * * @since 2.0.0 * * @param string engine Cache storage engine. * @param string label Text label for the engine. * @return jqXHR */ function testObjcache( engine, label ) { if ( configSuccess ) { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_test_objcache' } }) .done(function( testResponse ) { $container.find( '#test-results' ).data( 'oc-' + engine, testResponse.data ); addResultRow( testResponse, engine, label ); }); } else { addResultRow( [ success => false ], engine, label ); } } // Run config and tests. getObjcacheSettings() .then( function() { return configObjcache( 0 ); }, configFailed ) .then( function() { return testObjcache( 'none', W3TC_SetupGuide.none ); }, configFailed ) .then( function() { return configObjcache( 1, 'file' ); } , testFailed ) .then( function() { return testObjcache( 'file', W3TC_SetupGuide.disk ); }, configFailed ) .then( function() { return configObjcache( 1, 'redis' ); }, testFailed ) .then( function() { return testObjcache( 'redis', 'Redis' ); }, configFailed ) .then( function() { return configObjcache( 1, 'memcached' ); }, testFailed ) .then( function() { return testObjcache( 'memcached', 'Memcached' ); }, configFailed ) .then( function() { return configObjcache( 1, 'apc' ); }, testFailed ) .then( function() { return testObjcache( 'apc', 'APC' ); }, configFailed ) .then( function() { return configObjcache( 1, 'eaccelerator' ); }, testFailed ) .then( function() { return testObjcache( 'eaccelerator', 'eAccelerator' ); }, configFailed ) .then( function() { return configObjcache( 1, 'xcache' ); }, testFailed ) .then( function() { return testObjcache( 'xcache', 'XCache' ); }, configFailed ) .then( function() { return configObjcache( 1, 'wincache' ); }, testFailed ) .then( function() { return testObjcache( 'wincache', 'WinCache' ); }, configFailed ) .then(function() { $spinnerParent.hide(); $this.prop( 'disabled', false ); $prevButton.prop( 'disabled', false ); $nextButton.prop( 'disabled', false ); return true; }, testFailed ) // Restore the original object cache settings. .then( function() { return configObjcache( ( objcacheSettings.enabled ? 1 : 0 ), objcacheSettings.engine ); }, function() { $spinnerParent.hide(); return configFailed(); }); }); break; case 'w3tc-wizard-slide-bc1': // Save the object cache engine setting from the previous slide. var objcacheEngine = $container.find( 'input:checked[name="objcache_engine"]' ).val(); configObjcache( ( 'none' === objcacheEngine ? 0 : 1 ), 'none' === objcacheEngine ? '' : objcacheEngine ) .fail( function() { $slide.append( '

' + W3TC_SetupGuide.config_error_msg + '

' ); }); if ( ! jQuery( '#w3tc-wizard-step-objectcache .dashicons-yes' ).length ) { jQuery( '#w3tc-wizard-step-objectcache' ).append( '' ); } // Present the Browser Cache slide. $container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' ); $container.find( '#w3tc-wizard-step-browsercache' ).addClass( 'is-active' ); if ( ! $container.find( '#test-results' ).data( 'bc-off' ) ) { $nextButton.prop( 'disabled', 'disabled' ); } $slide.find( '#w3tc-test-browsercache' ).off('click').on('click', function () { var bcEnabled, $spinnerParent = $slide.find( '.spinner' ).addClass( 'is-active' ).parent(), $this = jQuery( this ); $this.prop( 'disabled', 'disabled' ); $slide.find( '.notice-error' ).remove(); $container.find( '#w3tc-browsercache-table tbody' ).empty(); $prevButton.prop( 'disabled', 'disabled' ); $nextButton.prop( 'disabled', 'disabled' ); $spinnerParent.show(); /** * Add a Browser Cache test result table row. * * @since 2.0.0 * * @param object testResponse An object (success, data) containing a data array of objects * (url, filename, header, headers). */ function addResultRow( testResponse ) { var label = bcEnabled ? W3TC_SetupGuide.enabled : W3TC_SetupGuide.notEnabled, results = '' + label + ''; if ( isCurrentSetting ) { results += ' '; } results += ''; if ( testResponse.success ) { results += ''; testResponse.data.forEach( function( item, index ) { results += '' + item.filename + '' + item.header + ''; // If not the last entry, then start the next row. if ( index !== ( testResponse.data.length - 1 ) ) { results += ''; } } ); } else { results = '' + W3TC_SetupGuide.test_error_msg + ''; } $container.find( '#w3tc-browsercache-table > tbody' ).append( results ); $container.find( '#w3tc-browsercache-table' ).show(); } /** * Test browser cache. * * @since 2.0.0 * * @return jqXHR */ function testBrowsercache() { if ( configSuccess ) { return jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: 'w3tc_test_browsercache' } }) .done(function( testResponse ) { var enabled = bcEnabled ? 'on' : 'off'; $container.find( '#test-results' ).data( 'bc-' + enabled, testResponse.data ); addResultRow( testResponse ); }); } else { addResultRow( [ success => false ] ); } } // Run config and tests. getBrowsercacheSettings() .then( function() { bcEnabled = 0; return configBrowsercache( bcEnabled ); }, configFailed ) .then( testBrowsercache, configFailed ) .then( function() { bcEnabled = 1; return configBrowsercache( bcEnabled ); } , testFailed ) .then( testBrowsercache, configFailed ) .then(function() { $spinnerParent.hide(); $this.prop( 'disabled', false ); $prevButton.prop( 'disabled', false ); $nextButton.prop( 'disabled', false ); return true; }, testFailed ) // Restore the original browser cache settings. .then( function() { return configBrowsercache( ( browsercacheSettings.enabled ? 1 : 0 ) ); }, function() { $spinnerParent.hide(); return configFailed(); }); }); break; case 'w3tc-wizard-slide-ll1': // Save the browser cache setting from the previous slide. var browsercacheEnabled = $container.find( 'input:checked[name="browsercache_enable"]' ).val(); configBrowsercache( ( '1' === browsercacheEnabled ? 1 : 0 ) ) .fail( function() { $slide.append( '

' + W3TC_SetupGuide.config_error_msg + '

' ); }); if ( ! jQuery( '#w3tc-wizard-step-browsercache .dashicons-yes' ).length ) { jQuery( '#w3tc-wizard-step-browsercache' ).append( '' ); } // Present the Lazy Load slide. $container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' ); $container.find( '#w3tc-wizard-step-lazyload' ).addClass( 'is-active' ); $dashboardButton.closest( 'span' ).hide(); $nextButton.closest( 'span' ).show(); $nextButton.prop( 'disabled', 'disabled' ); // Update the lazy load enable chackbox from saved config. getLazyloadSettings() .then( function() { $container.find( 'input#lazyload-enable' ).prop( 'checked', lazyloadSettings.enabled ); $nextButton.prop( 'disabled', false ); }, configFailed ); break; case 'w3tc-wizard-slide-complete': var html, pgcacheEngine = $container.find( 'input:checked[name="pgcache_engine"]' ).val(), pgcacheEngineLabel = $container.find( 'input:checked[name="pgcache_engine"]' ) .closest('td').next('td').text(), pgcacheDiffPercent = $container.find( '#test-results' ) .data( 'pgcacheDiffPercent-' + pgcacheEngine ), dbcacheEngine = $container.find( 'input:checked[name="dbcache_engine"]' ).val(), dbcacheEngineLabel = $container.find( 'input:checked[name="dbcache_engine"]' ) .closest('td').next('td').text(), objcacheEngine = $container.find( 'input:checked[name="objcache_engine"]' ).val(), objcacheEngineLabel = $container.find( 'input:checked[name="objcache_engine"]' ) .closest('td').next('td').text(), browsercacheEnabled = $container.find( 'input:checked[name="browsercache_enable"]' ).val(), lazyloadEnabled = $container.find( 'input:checked#lazyload-enable' ).val(); // Save the lazyload setting from the previous slide. configLazyload( ( '1' === lazyloadEnabled ? 1 : 0 ) ) .fail( function() { $slide.append( '

' + W3TC_SetupGuide.config_error_msg + '

' ); }); if ( ! jQuery( '#w3tc-wizard-step-lazyload .dashicons-yes' ).length ) { jQuery( '#w3tc-wizard-step-lazyload' ).append( '' ); } // Prevent leave page alert. jQuery( window ).off( 'beforeunload' ); // Present the Setup Complete slide. $container.find( '#w3tc-options-menu li' ).removeClass( 'is-active' ); $container.find( '#w3tc-options-menu li' ).last().addClass( 'is-active' ); html = pgcacheDiffPercent !== undefined ? ( pgcacheDiffPercent > 0 ? '+' : '' ) + parseFloat( pgcacheDiffPercent ).toFixed( 2 ) + '%' : '0.00%'; $container.find( '#w3tc-ttfb-diff' ).html( html ); $container.find( '#w3tc-pgcache-engine' ).html( pgcacheEngineLabel ); $container.find( '#w3tc-dbcache-engine' ).html( dbcacheEngineLabel ); $container.find( '#w3tc-objcache-engine' ).html( objcacheEngineLabel ); $container.find( '#w3tc-browsercache-setting' ).html( browsercacheEnabled ? W3TC_SetupGuide.enabled : W3TC_SetupGuide.none ); $container.find( '#w3tc-lazyload-setting' ).html( lazyloadEnabled ? W3TC_SetupGuide.enabled : W3TC_SetupGuide.none ); if ( ! jQuery( '#test-results' ).data( 'completed' ) ) { jQuery.ajax({ method: 'POST', url: ajaxurl, data: { _wpnonce: nonce, action: "w3tc_wizard_skip" } }) .done(function () { $container.find( '#test-results' ).data( 'completed', true ); }); } $nextButton.closest( 'span' ).hide(); $dashboardButton.closest( 'span' ).show(); break; default: break; } };