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( '', $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() );
}
}