diff --git a/admin/server-timing.php b/admin/server-timing.php index aaead0d989..9c2c7b8e58 100644 --- a/admin/server-timing.php +++ b/admin/server-timing.php @@ -43,6 +43,34 @@ function perflab_add_server_timing_page() { * @since n.e.x.t */ function perflab_load_server_timing_page() { + /* + * This settings section technically includes a field, however it is directly rendered as part of the section + * callback due to requiring custom markup. + */ + add_settings_section( + 'output-buffering', + __( 'Output Buffering', 'performance-lab' ), + 'perflab_render_server_timing_page_output_buffering_section', + PERFLAB_SERVER_TIMING_SCREEN + ); + + // Minor style tweaks to improve appearance similar to other core settings screen instances. + add_action( + 'admin_print_styles', + static function () { + ?> + + array() ) ); - ?> -
- cumulative duration between all callbacks attached to the hook is measured, in milliseconds.', 'performance-lab' ), array( 'strong' => array() ) ); - if ( ! perflab_server_timing_use_output_buffer() ) { - ?> -
+ ?> +

+ +

Output Buffering to measure hooks during template rendering.', 'performance-lab' ), 'Server-Timing', - 'template_include' + 'template_include', + esc_url( '#server_timing_output_buffering' ) ), - array( 'code' => array() ) + array( + 'code' => array(), + 'a' => array( 'href' => true ), + ) ); - } - ?> + ?> +

` elements, it needs to be hard-coded to achieve the same appearance as e.g. the UI control for the + * `uploads_use_yearmonth_folders` option in the _Settings > Media_ screen, which is hard-coded as well. + */ + ?> + + + + + + true, 'benchmarking_filters' => true, + 'output_buffering' => true, ); if ( ! is_array( $value ) ) { @@ -175,7 +176,7 @@ function perflab_sanitize_server_timing_setting( $value ) { * Ensure that every element is an indexed array of hook names. * Any duplicates across a group of hooks are removed. */ - foreach ( $value as $key => $hooks ) { + foreach ( wp_array_slice_assoc( $value, array( 'benchmarking_actions', 'benchmarking_filters' ) ) as $key => $hooks ) { if ( ! is_array( $hooks ) ) { $hooks = explode( "\n", $hooks ); } @@ -203,5 +204,7 @@ static function( $hookname ) { ); } + $value['output_buffering'] = ! empty( $value['output_buffering'] ); + return $value; } diff --git a/tests/admin/server-timing-tests.php b/tests/admin/server-timing-tests.php index c764f9dda0..0684ff8409 100644 --- a/tests/admin/server-timing-tests.php +++ b/tests/admin/server-timing-tests.php @@ -49,7 +49,7 @@ public function test_perflab_load_server_timing_page() { perflab_load_server_timing_page(); $this->assertArrayHasKey( PERFLAB_SERVER_TIMING_SCREEN, $wp_settings_sections ); $this->assertEqualSets( - array( 'benchmarking' ), + array( 'output-buffering', 'benchmarking' ), array_keys( $wp_settings_sections[ PERFLAB_SERVER_TIMING_SCREEN ] ) ); $this->assertEqualSets( @@ -75,7 +75,7 @@ public function test_perflab_render_server_timing_page_field() { $slug = 'benchmarking_actions'; ob_start(); - perflab_render_server_timing_page_field( $slug ); + perflab_render_server_timing_page_hooks_field( $slug ); $output = ob_get_clean(); $this->assertStringContainsString( 'assertStringContainsString( '>', $output ); @@ -100,7 +100,7 @@ public function test_perflab_render_server_timing_page_field_populated_option() ); ob_start(); - perflab_render_server_timing_page_field( 'benchmarking_actions' ); + perflab_render_server_timing_page_hooks_field( 'benchmarking_actions' ); $output = ob_get_clean(); // Array is formatted/imploded as strings, one per line. diff --git a/tests/server-timing/load-tests.php b/tests/server-timing/load-tests.php index b695bdc64d..7d6fd3e2c7 100644 --- a/tests/server-timing/load-tests.php +++ b/tests/server-timing/load-tests.php @@ -103,39 +103,43 @@ public function data_perflab_sanitize_server_timing_setting() { ), 'empty list, array' => array( array( 'benchmarking_actions' => array() ), - array( 'benchmarking_actions' => array() ), + array( 'benchmarking_actions' => array(), 'output_buffering' => false ), ), 'empty list, string' => array( array( 'benchmarking_actions' => '' ), - array( 'benchmarking_actions' => array() ), + array( 'benchmarking_actions' => array(), 'output_buffering' => false ), ), 'empty list, string with whitespace' => array( array( 'benchmarking_actions' => ' ' ), - array( 'benchmarking_actions' => array() ), + array( 'benchmarking_actions' => array(), 'output_buffering' => false ), ), 'regular list, array' => array( array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ), - array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ), + array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ), 'output_buffering' => false ), ), 'regular list, string' => array( array( 'benchmarking_actions' => "after_setup_theme\ninit\nwp_loaded" ), - array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ), + array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ), 'output_buffering' => false ), ), 'regular list, string with whitespace' => array( array( 'benchmarking_actions' => "after_setup_ theme \ninit \n\nwp_loaded\n" ), - array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ), + array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ), 'output_buffering' => false ), ), 'regular list, array with duplicates' => array( array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded', 'init' ) ), - array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ), + array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ), 'output_buffering' => false ), ), 'regular list, array with special hook chars' => array( array( 'benchmarking_actions' => array( 'namespace/hookname', 'namespace.hookname' ) ), - array( 'benchmarking_actions' => array( 'namespace/hookname', 'namespace.hookname' ) ), + array( 'benchmarking_actions' => array( 'namespace/hookname', 'namespace.hookname' ), 'output_buffering' => false ), + ), + 'output buffering enabled' => array( + array( 'output_buffering' => 'on' ), + array( 'output_buffering' => true ), ), 'regular list, disallowed key' => array( array( 'not_allowed' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ), - array(), + array( 'output_buffering' => false ), ), ); } diff --git a/tests/server-timing/perflab-server-timing-tests.php b/tests/server-timing/perflab-server-timing-tests.php index cc9aa57157..360d4547b1 100644 --- a/tests/server-timing/perflab-server-timing-tests.php +++ b/tests/server-timing/perflab-server-timing-tests.php @@ -187,10 +187,58 @@ public function data_get_header() { ); } - public function test_use_output_buffer() { - $this->assertFalse( $this->server_timing->use_output_buffer() ); + public function get_data_to_test_use_output_buffer() { + $enable_option = static function () { + $option = (array) get_option( PERFLAB_SERVER_TIMING_SETTING ); + $option['output_buffering'] = true; + update_option( PERFLAB_SERVER_TIMING_SETTING, $option ); + }; + $disable_option = static function () { + $option = (array) get_option( PERFLAB_SERVER_TIMING_SETTING ); + $option['output_buffering'] = false; + update_option( PERFLAB_SERVER_TIMING_SETTING, $option ); + }; - add_filter( 'perflab_server_timing_use_output_buffer', '__return_true' ); - $this->assertTrue( $this->server_timing->use_output_buffer() ); + return array( + 'default' => array( + 'set_up' => static function () {}, + 'expected' => false, + ), + 'option-enabled' => array( + 'set_up' => $enable_option, + 'expected' => true, + ), + 'option-disabled' => array( + 'set_up' => $disable_option, + 'expected' => false, + ), + 'filter-enabled' => array( + 'set_up' => static function () use ( $disable_option ) { + $disable_option(); + add_filter( 'perflab_server_timing_use_output_buffer', '__return_true' ); + }, + 'expected' => true, + ), + 'filter-disabled' => array( + 'set_up' => static function () use ( $enable_option ) { + $enable_option(); + add_filter( 'perflab_server_timing_use_output_buffer', '__return_false' ); + }, + 'expected' => false, + ), + ); + } + + /** + * @covers Perflab_Server_Timing::use_output_buffer + * + * @dataProvider get_data_to_test_use_output_buffer + * + * @param callable $set_up Set up. + * @param bool $expected Expected value. + */ + public function test_use_output_buffer( callable $set_up, $expected ) { + $set_up(); + $this->assertSame( $expected, $this->server_timing->use_output_buffer() ); } }