diff --git a/composer.json b/composer.json
index f21bf25..20d350c 100644
--- a/composer.json
+++ b/composer.json
@@ -8,7 +8,6 @@
"authors" : [
{
"name" : "Andrey Savchenko",
- "email" : "contact@rarst.net",
"homepage": "http://www.Rarst.net/"
}
],
@@ -16,7 +15,9 @@
"issues": "https://github.com/Rarst/laps/issues"
},
"autoload" : {
- "classmap": ["src/"]
+ "psr-4": {
+ "Rarst\\Laps\\" : "src/"
+ }
},
"require" : {
"composer/installers": "~1.0",
diff --git a/src/class-core-events.php b/src/Core_Events.php
similarity index 95%
rename from src/class-core-events.php
rename to src/Core_Events.php
index d02238e..7aaaa29 100644
--- a/src/class-core-events.php
+++ b/src/Core_Events.php
@@ -1,106 +1,106 @@
- 'stop',
- 'event' => 'Plugins Load',
- 'category' => 'plugin',
- );
-
- $stops['plugins_loaded'][ - 1 ] = array(
- 'event' => 'Plugins Loaded Hook',
- 'category' => 'plugin',
- );
-
- $stops['plugins_loaded'][20] = array(
- 'action' => 'stop',
- 'event' => 'Plugins Loaded Hook',
- 'category' => 'plugin',
- );
-
- $stops['setup_theme'][0] = array(
- 'event' => 'Themes Load',
- 'category' => 'theme',
- );
-
- $stops['after_setup_theme'][20] = array(
- 'action' => 'stop',
- 'event' => 'Themes Load',
- 'category' => 'theme',
- );
-
- $stops['init'][- 1] = array(
- 'event' => 'Core Init',
- 'category' => 'core',
- );
-
- $stops['wp_loaded'][20] = array(
- 'action' => 'stop',
- 'event' => 'Core Init',
- 'category' => 'core',
- );
-
- $stops['admin_init'][- 1] = array(
- 'event' => 'Core Admin Init',
- 'category' => 'core',
- );
-
- $stops['admin_init'][ PHP_INT_MAX -1 ] = array(
- 'action' => 'stop',
- 'event' => 'Core Admin Init',
- 'category' => 'core',
- );
-
- $stops['_admin_menu'][- 1] = array(
- 'event' => 'Admin Menu',
- 'category' => 'core',
- );
- $stops['admin_menu'][ PHP_INT_MAX -1 ] = array(
- 'action' => 'stop',
- 'event' => 'Admin Menu',
- 'category' => 'core',
- );
-
- $stops['admin_bar_menu'][-1] = array(
- 'event' => 'Toolbar',
- 'category' => 'core',
- );
-
- $stops['loop_start'][10] = array(
- 'event' => 'Main Loop',
- 'category' => 'theme',
- );
-
- $stops['loop_end'][10] = array(
- 'action' => 'stop',
- 'event' => 'Main Loop',
- 'category' => 'theme',
- );
-
- $stops['admin_enqueue_scripts'][10] = array(
- 'event' => 'Admin Print Scripts',
- 'category' => 'core',
- );
-
- $stops['admin_print_scripts'][10] = array(
- 'action' => 'stop',
- 'event' => 'Admin Print Scripts',
- 'category' => 'core',
- );
-
- return $stops;
- }
-}
+ 'stop',
+ 'event' => 'Plugins Load',
+ 'category' => 'plugin',
+ );
+
+ $stops['plugins_loaded'][ - 1 ] = array(
+ 'event' => 'Plugins Loaded Hook',
+ 'category' => 'plugin',
+ );
+
+ $stops['plugins_loaded'][20] = array(
+ 'action' => 'stop',
+ 'event' => 'Plugins Loaded Hook',
+ 'category' => 'plugin',
+ );
+
+ $stops['setup_theme'][0] = array(
+ 'event' => 'Themes Load',
+ 'category' => 'theme',
+ );
+
+ $stops['after_setup_theme'][20] = array(
+ 'action' => 'stop',
+ 'event' => 'Themes Load',
+ 'category' => 'theme',
+ );
+
+ $stops['init'][- 1] = array(
+ 'event' => 'Core Init',
+ 'category' => 'core',
+ );
+
+ $stops['wp_loaded'][20] = array(
+ 'action' => 'stop',
+ 'event' => 'Core Init',
+ 'category' => 'core',
+ );
+
+ $stops['admin_init'][- 1] = array(
+ 'event' => 'Core Admin Init',
+ 'category' => 'core',
+ );
+
+ $stops['admin_init'][ PHP_INT_MAX -1 ] = array(
+ 'action' => 'stop',
+ 'event' => 'Core Admin Init',
+ 'category' => 'core',
+ );
+
+ $stops['_admin_menu'][- 1] = array(
+ 'event' => 'Admin Menu',
+ 'category' => 'core',
+ );
+ $stops['admin_menu'][ PHP_INT_MAX -1 ] = array(
+ 'action' => 'stop',
+ 'event' => 'Admin Menu',
+ 'category' => 'core',
+ );
+
+ $stops['admin_bar_menu'][-1] = array(
+ 'event' => 'Toolbar',
+ 'category' => 'core',
+ );
+
+ $stops['loop_start'][10] = array(
+ 'event' => 'Main Loop',
+ 'category' => 'theme',
+ );
+
+ $stops['loop_end'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Main Loop',
+ 'category' => 'theme',
+ );
+
+ $stops['admin_enqueue_scripts'][10] = array(
+ 'event' => 'Admin Print Scripts',
+ 'category' => 'core',
+ );
+
+ $stops['admin_print_scripts'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Admin Print Scripts',
+ 'category' => 'core',
+ );
+
+ return $stops;
+ }
+}
diff --git a/src/class-genesis-events.php b/src/Genesis_Events.php
similarity index 95%
rename from src/class-genesis-events.php
rename to src/Genesis_Events.php
index c5c7de1..c3f9470 100644
--- a/src/class-genesis-events.php
+++ b/src/Genesis_Events.php
@@ -1,62 +1,62 @@
- 'Header',
- 'category' => 'theme',
- );
-
- $events['genesis_after_header'][10] = array(
- 'action' => 'stop',
- 'event' => 'Header',
- 'category' => 'theme',
- );
-
- $events['genesis_before_sidebar_widget_area'][10] = array(
- 'event' => 'Sidebar',
- 'category' => 'theme',
- );
-
- $events['genesis_after_sidebar_widget_area'][10] = array(
- 'action' => 'stop',
- 'event' => 'Sidebar',
- 'category' => 'theme',
- );
-
- $events['genesis_before_sidebar_alt_widget_area'][10] = array(
- 'event' => 'Sidebar (alternate)',
- 'category' => 'theme',
- );
-
- $events['genesis_after_sidebar_alt_widget_area'][10] = array(
- 'action' => 'stop',
- 'event' => 'Sidebar (alternate)',
- 'category' => 'theme',
- );
-
- return $events;
- }
-}
+ 'Header',
+ 'category' => 'theme',
+ );
+
+ $events['genesis_after_header'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Header',
+ 'category' => 'theme',
+ );
+
+ $events['genesis_before_sidebar_widget_area'][10] = array(
+ 'event' => 'Sidebar',
+ 'category' => 'theme',
+ );
+
+ $events['genesis_after_sidebar_widget_area'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Sidebar',
+ 'category' => 'theme',
+ );
+
+ $events['genesis_before_sidebar_alt_widget_area'][10] = array(
+ 'event' => 'Sidebar (alternate)',
+ 'category' => 'theme',
+ );
+
+ $events['genesis_after_sidebar_alt_widget_area'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Sidebar (alternate)',
+ 'category' => 'theme',
+ );
+
+ return $events;
+ }
+}
diff --git a/src/class-hybrid-events.php b/src/Hybrid_Events.php
similarity index 95%
rename from src/class-hybrid-events.php
rename to src/Hybrid_Events.php
index 9ba339f..cb82b3b 100644
--- a/src/class-hybrid-events.php
+++ b/src/Hybrid_Events.php
@@ -1,59 +1,59 @@
- 'Header',
- 'category' => 'theme',
- );
-
- $events["{$prefix}_after_header"][10] = array(
- 'action' => 'stop',
- 'event' => 'Header',
- 'category' => 'theme',
- );
-
- $sidebars = get_theme_support( 'hybrid-core-sidebars' );
-
- if ( ! empty( $sidebars[0] ) ) {
- foreach ( $sidebars[0] as $sidebar ) {
-
- $events["{$prefix}_before_{$sidebar}"][10] = array(
- 'event' => "Sidebar ({$sidebar})",
- 'category' => 'theme',
- );
-
- $events["{$prefix}_after_{$sidebar}"][10] = array(
- 'action' => 'stop',
- 'event' => "Sidebar ({$sidebar})",
- 'category' => 'theme',
- );
- }
- }
-
- return $events;
- }
-}
+ 'Header',
+ 'category' => 'theme',
+ );
+
+ $events["{$prefix}_after_header"][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Header',
+ 'category' => 'theme',
+ );
+
+ $sidebars = get_theme_support( 'hybrid-core-sidebars' );
+
+ if ( ! empty( $sidebars[0] ) ) {
+ foreach ( $sidebars[0] as $sidebar ) {
+
+ $events["{$prefix}_before_{$sidebar}"][10] = array(
+ 'event' => "Sidebar ({$sidebar})",
+ 'category' => 'theme',
+ );
+
+ $events["{$prefix}_after_{$sidebar}"][10] = array(
+ 'action' => 'stop',
+ 'event' => "Sidebar ({$sidebar})",
+ 'category' => 'theme',
+ );
+ }
+ }
+
+ return $events;
+ }
+}
diff --git a/src/class-laps.php b/src/Laps.php
similarity index 96%
rename from src/class-laps.php
rename to src/Laps.php
index 6d38caf..bb5ec34 100644
--- a/src/class-laps.php
+++ b/src/Laps.php
@@ -1,318 +1,318 @@
-start( 'Plugins Load', 'plugin' );
- $events = new Core_Events();
- self::add_events( $events->get() );
-
- add_action( 'pre_update_option_active_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) );
- add_action( 'pre_update_site_option_active_sitewide_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) );
- add_action( 'pre_http_request', array( __CLASS__, 'pre_http_request' ), 10, 3 );
- add_action( 'http_api_debug', array( __CLASS__, 'http_api_debug' ), 10, 5 );
- add_action( 'after_setup_theme', array( __CLASS__, 'after_setup_theme' ), 15 );
- add_action( 'init', array( __CLASS__, 'init' ) );
-
- if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {
- add_filter( 'query', array( __CLASS__, 'query' ), 20 );
- }
- }
-
- /**
- * Hook events by name and priority from array.
- *
- * @param array $stops
- */
- public static function add_events( $stops ) {
-
- self::$events = array_merge( self::$events, $stops );
-
- foreach ( $stops as $hook_name => $data ) {
-
- foreach ( array_keys( $data ) as $priority ) {
-
- add_action( $hook_name, array( __CLASS__, 'tick' ), $priority );
- }
- }
- }
-
- /**
- * Reorder active plugins so Laps is first and starts timing load early.
- *
- * @param array $plugins
- *
- * @return array
- */
- public static function pre_update_option_active_plugins( $plugins ) {
-
- $plugin = plugin_basename( dirname( __DIR__ ) . '/laps.php' );
- $key = array_search( $plugin, $plugins );
-
- if ( false !== $key && $key > 0 ) {
-
- unset( $plugins[ $key ] );
- array_unshift( $plugins, $plugin );
- $plugins = array_values( $plugins );
- }
-
- return $plugins;
- }
-
- /**
- * Mark action for the event on Stopwatch.
- *
- * @param mixed $input pass through if added to filter
- *
- * @return mixed
- */
- public static function tick( $input = null ) {
-
- global $wp_filter;
-
- $filter_name = current_filter();
- $filter_instance = $wp_filter[ $filter_name ];
- $priority = $filter_instance instanceof \WP_Hook ? $filter_instance->current_priority() : key( $filter_instance );
-
- // See https://core.trac.wordpress.org/ticket/41185 on broken priority, but more general sanity check.
- if ( empty( self::$events[ $filter_name ][ $priority ] ) ) {
- return $input;
- }
-
- $event = wp_parse_args(
- self::$events[ $filter_name ][ $priority ],
- array(
- 'action' => 'start',
- 'category' => null,
- )
- );
-
- if ( 'stop' === $event['action'] && ! self::$stopwatch->isStarted( $event['event'] ) ) {
- return $input;
- }
-
- self::$stopwatch->{$event['action']}( $event['event'], $event['category'] );
-
- return $input;
- }
-
- /**
- * Capture SQL queries start times
- *
- * @param string $query
- *
- * @return string
- */
- public static function query( $query ) {
-
- global $wpdb;
-
- if ( empty( self::$query_starts ) && ! empty( $wpdb->queries ) ) {
- self::$query_starts[ count( $wpdb->queries ) ] = microtime( true ) * 1000;
- } else {
- self::$query_starts[] = microtime( true ) * 1000;
- }
-
- return $query;
- }
-
- /**
- * Capture start time of HTTP request
- *
- * @param boolean $false
- * @param array $args
- * @param string $url
- *
- * @return boolean
- */
- public static function pre_http_request( $false, $args, $url ) {
-
- self::$stopwatch->start( $url, 'http' );
-
- return $false;
- }
-
- /**
- * Capture end time of HTTP request
- *
- * @param array|\WP_Error $response
- * @param string $type
- * @param object $class
- * @param array $args
- * @param string $url
- *
- * @return mixed
- */
- public static function http_api_debug( $response, $type, $class, $args, $url ) {
-
- self::$stopwatch->stop( $url );
-
- return $response;
- }
-
- /**
- * When theme is done possibly add vendor-specific events.
- */
- public static function after_setup_theme() {
-
- foreach ( array( 'THA', 'Hybrid', 'Genesis', 'Thematic', 'Yoast' ) as $vendor ) {
-
- $class = "Rarst\\Laps\\{$vendor}_Events";
- /** @var Laps_Events $events */
- $events = new $class;
- self::add_events( $events->get() );
- }
- }
-
- public static function init() {
-
- add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
- add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
- add_action( 'admin_bar_menu', array( __CLASS__, 'admin_bar_menu' ), 100 );
- }
-
- public static function enqueue_scripts() {
-
- $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
- wp_register_script( 'laps', plugins_url( "js/laps{$suffix}.js", __DIR__ ), array( 'jquery' ), '3.3.1', true );
- wp_register_style( 'laps', plugins_url( "css/laps{$suffix}.css", __DIR__ ) );
-
- if ( is_admin_bar_showing() ) {
- wp_enqueue_script( 'laps' );
- wp_enqueue_style( 'laps' );
- }
- }
-
- /**
- * Render interface and add to the toolbar.
- *
- * @param \WP_Admin_Bar $wp_admin_bar
- */
- public static function admin_bar_menu( $wp_admin_bar ) {
-
- if ( ! apply_filters( 'laps_can_see', current_user_can( 'manage_options' ) ) ) {
- return;
- }
-
- global $timestart, $wpdb;
-
- $mustache = new \Mustache_Engine(
- array(
- 'loader' => new \Mustache_Loader_FilesystemLoader( dirname( __DIR__ ) . '/views' ),
- 'cache' => new Mustache_Cache_FrozenCache( dirname( __DIR__ ) . '/views/cache' ),
- )
- );
-
- if ( self::$stopwatch->isStarted( 'Toolbar' ) ) {
- self::$stopwatch->stop( 'Toolbar' );
- }
-
- $events = self::$stopwatch->getSectionEvents( '__root__' );
- $start = $timestart * 1000;
- $end = microtime( true ) * 1000;
- $total = $end - $start;
- $event_data = array();
- $http_data = array();
-
- foreach ( $events as $name => $event ) {
-
- $offset = round( ( $event->getOrigin() - $start ) / $total * 100, 2 );
- $duration = $event->getDuration();
- $width = round( $duration / $total * 100, 2 );
- $category = $event->getCategory();
-
- if ( 'http' === $category ) {
- $http_data[] = compact( 'name', 'offset', 'duration', 'width', 'category' );
- continue;
- }
-
- $memory = $event->getMemory() / 1024 / 1024;
-
- $event_data[] = compact( 'name', 'offset', 'duration', 'width', 'category', 'memory' );
- }
-
- $query_data = array();
- $last_query_end = 0;
- $last_offset = 0;
- $last_duration = 0;
-
- if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {
-
- foreach ( $wpdb->queries as $key => $query ) {
- $query_start = isset( self::$query_starts[ $key ] ) ? self::$query_starts[ $key ] : $last_query_end;
- list( $sql, $duration, $trace ) = $query;
- $sql = trim( $sql );
- $category = 'query-read';
-
- if ( 0 === stripos( $sql, 'INSERT' ) || 0 === stripos( $sql, 'UPDATE' ) ) {
- $category = 'query-write';
- }
-
- $duration *= 1000;
- $last_query_end = $query_start + $duration;
- $offset = round( ( $query_start - $start ) / $total * 100, 2 );
-
- // if query is indistinguishably close to previous then stack it
- if ( $offset === $last_offset ) {
- $key = count( $query_data ) - 1;
- $query_data[ $key ]['sql'] .= '
' . $sql;
-
- $last_duration += $duration;
- $width = round( $last_duration / $total * 100, 2 );
- $query_data[ $key ]['width'] = $width;
-
- continue;
- }
-
- $width = round( $duration / $total * 100, 2 );
- $last_offset = $offset;
- $last_duration = $duration;
-
- $query_data[] = compact( 'sql', 'duration', 'offset', 'width', 'category' );
- }
- }
-
- $html = $mustache->render(
- 'laps',
- array(
- 'events' => $event_data,
- 'queries' => $query_data,
- 'savequeries' => defined( 'SAVEQUERIES' ) && SAVEQUERIES,
- 'http' => $http_data,
- 'savehttp' => ! empty( $http_data ),
- )
- );
-
- $wp_admin_bar->add_node( array(
- 'id' => 'laps',
- 'title' => sprintf( 'Lap: %ss', round( $total / 1000, 3 ) ),
- ) );
-
- $wp_admin_bar->add_node( array(
- 'id' => 'laps_output',
- 'parent' => 'laps',
- 'meta' => array( 'html' => $html ),
- ) );
- }
-}
+start( 'Plugins Load', 'plugin' );
+ $events = new Core_Events();
+ self::add_events( $events->get() );
+
+ add_action( 'pre_update_option_active_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) );
+ add_action( 'pre_update_site_option_active_sitewide_plugins', array( __CLASS__, 'pre_update_option_active_plugins' ) );
+ add_action( 'pre_http_request', array( __CLASS__, 'pre_http_request' ), 10, 3 );
+ add_action( 'http_api_debug', array( __CLASS__, 'http_api_debug' ), 10, 5 );
+ add_action( 'after_setup_theme', array( __CLASS__, 'after_setup_theme' ), 15 );
+ add_action( 'init', array( __CLASS__, 'init' ) );
+
+ if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {
+ add_filter( 'query', array( __CLASS__, 'query' ), 20 );
+ }
+ }
+
+ /**
+ * Hook events by name and priority from array.
+ *
+ * @param array $stops
+ */
+ public static function add_events( $stops ) {
+
+ self::$events = array_merge( self::$events, $stops );
+
+ foreach ( $stops as $hook_name => $data ) {
+
+ foreach ( array_keys( $data ) as $priority ) {
+
+ add_action( $hook_name, array( __CLASS__, 'tick' ), $priority );
+ }
+ }
+ }
+
+ /**
+ * Reorder active plugins so Laps is first and starts timing load early.
+ *
+ * @param array $plugins
+ *
+ * @return array
+ */
+ public static function pre_update_option_active_plugins( $plugins ) {
+
+ $plugin = plugin_basename( dirname( __DIR__ ) . '/laps.php' );
+ $key = array_search( $plugin, $plugins );
+
+ if ( false !== $key && $key > 0 ) {
+
+ unset( $plugins[ $key ] );
+ array_unshift( $plugins, $plugin );
+ $plugins = array_values( $plugins );
+ }
+
+ return $plugins;
+ }
+
+ /**
+ * Mark action for the event on Stopwatch.
+ *
+ * @param mixed $input pass through if added to filter
+ *
+ * @return mixed
+ */
+ public static function tick( $input = null ) {
+
+ global $wp_filter;
+
+ $filter_name = current_filter();
+ $filter_instance = $wp_filter[ $filter_name ];
+ $priority = $filter_instance instanceof \WP_Hook ? $filter_instance->current_priority() : key( $filter_instance );
+
+ // See https://core.trac.wordpress.org/ticket/41185 on broken priority, but more general sanity check.
+ if ( empty( self::$events[ $filter_name ][ $priority ] ) ) {
+ return $input;
+ }
+
+ $event = wp_parse_args(
+ self::$events[ $filter_name ][ $priority ],
+ array(
+ 'action' => 'start',
+ 'category' => null,
+ )
+ );
+
+ if ( 'stop' === $event['action'] && ! self::$stopwatch->isStarted( $event['event'] ) ) {
+ return $input;
+ }
+
+ self::$stopwatch->{$event['action']}( $event['event'], $event['category'] );
+
+ return $input;
+ }
+
+ /**
+ * Capture SQL queries start times
+ *
+ * @param string $query
+ *
+ * @return string
+ */
+ public static function query( $query ) {
+
+ global $wpdb;
+
+ if ( empty( self::$query_starts ) && ! empty( $wpdb->queries ) ) {
+ self::$query_starts[ count( $wpdb->queries ) ] = microtime( true ) * 1000;
+ } else {
+ self::$query_starts[] = microtime( true ) * 1000;
+ }
+
+ return $query;
+ }
+
+ /**
+ * Capture start time of HTTP request
+ *
+ * @param boolean $false
+ * @param array $args
+ * @param string $url
+ *
+ * @return boolean
+ */
+ public static function pre_http_request( $false, $args, $url ) {
+
+ self::$stopwatch->start( $url, 'http' );
+
+ return $false;
+ }
+
+ /**
+ * Capture end time of HTTP request
+ *
+ * @param array|\WP_Error $response
+ * @param string $type
+ * @param object $class
+ * @param array $args
+ * @param string $url
+ *
+ * @return mixed
+ */
+ public static function http_api_debug( $response, $type, $class, $args, $url ) {
+
+ self::$stopwatch->stop( $url );
+
+ return $response;
+ }
+
+ /**
+ * When theme is done possibly add vendor-specific events.
+ */
+ public static function after_setup_theme() {
+
+ foreach ( array( 'THA', 'Hybrid', 'Genesis', 'Thematic', 'Yoast' ) as $vendor ) {
+
+ $class = "Rarst\\Laps\\{$vendor}_Events";
+ /** @var Laps_Events $events */
+ $events = new $class;
+ self::add_events( $events->get() );
+ }
+ }
+
+ public static function init() {
+
+ add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
+ add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
+ add_action( 'admin_bar_menu', array( __CLASS__, 'admin_bar_menu' ), 100 );
+ }
+
+ public static function enqueue_scripts() {
+
+ $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
+ wp_register_script( 'laps', plugins_url( "js/laps{$suffix}.js", __DIR__ ), array( 'jquery' ), '3.3.1', true );
+ wp_register_style( 'laps', plugins_url( "css/laps{$suffix}.css", __DIR__ ) );
+
+ if ( is_admin_bar_showing() ) {
+ wp_enqueue_script( 'laps' );
+ wp_enqueue_style( 'laps' );
+ }
+ }
+
+ /**
+ * Render interface and add to the toolbar.
+ *
+ * @param \WP_Admin_Bar $wp_admin_bar
+ */
+ public static function admin_bar_menu( $wp_admin_bar ) {
+
+ if ( ! apply_filters( 'laps_can_see', current_user_can( 'manage_options' ) ) ) {
+ return;
+ }
+
+ global $timestart, $wpdb;
+
+ $mustache = new \Mustache_Engine(
+ array(
+ 'loader' => new \Mustache_Loader_FilesystemLoader( dirname( __DIR__ ) . '/views' ),
+ 'cache' => new Mustache_Cache_FrozenCache( dirname( __DIR__ ) . '/views/cache' ),
+ )
+ );
+
+ if ( self::$stopwatch->isStarted( 'Toolbar' ) ) {
+ self::$stopwatch->stop( 'Toolbar' );
+ }
+
+ $events = self::$stopwatch->getSectionEvents( '__root__' );
+ $start = $timestart * 1000;
+ $end = microtime( true ) * 1000;
+ $total = $end - $start;
+ $event_data = array();
+ $http_data = array();
+
+ foreach ( $events as $name => $event ) {
+
+ $offset = round( ( $event->getOrigin() - $start ) / $total * 100, 2 );
+ $duration = $event->getDuration();
+ $width = round( $duration / $total * 100, 2 );
+ $category = $event->getCategory();
+
+ if ( 'http' === $category ) {
+ $http_data[] = compact( 'name', 'offset', 'duration', 'width', 'category' );
+ continue;
+ }
+
+ $memory = $event->getMemory() / 1024 / 1024;
+
+ $event_data[] = compact( 'name', 'offset', 'duration', 'width', 'category', 'memory' );
+ }
+
+ $query_data = array();
+ $last_query_end = 0;
+ $last_offset = 0;
+ $last_duration = 0;
+
+ if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {
+
+ foreach ( $wpdb->queries as $key => $query ) {
+ $query_start = isset( self::$query_starts[ $key ] ) ? self::$query_starts[ $key ] : $last_query_end;
+ list( $sql, $duration, $trace ) = $query;
+ $sql = trim( $sql );
+ $category = 'query-read';
+
+ if ( 0 === stripos( $sql, 'INSERT' ) || 0 === stripos( $sql, 'UPDATE' ) ) {
+ $category = 'query-write';
+ }
+
+ $duration *= 1000;
+ $last_query_end = $query_start + $duration;
+ $offset = round( ( $query_start - $start ) / $total * 100, 2 );
+
+ // if query is indistinguishably close to previous then stack it
+ if ( $offset === $last_offset ) {
+ $key = count( $query_data ) - 1;
+ $query_data[ $key ]['sql'] .= '
' . $sql;
+
+ $last_duration += $duration;
+ $width = round( $last_duration / $total * 100, 2 );
+ $query_data[ $key ]['width'] = $width;
+
+ continue;
+ }
+
+ $width = round( $duration / $total * 100, 2 );
+ $last_offset = $offset;
+ $last_duration = $duration;
+
+ $query_data[] = compact( 'sql', 'duration', 'offset', 'width', 'category' );
+ }
+ }
+
+ $html = $mustache->render(
+ 'laps',
+ array(
+ 'events' => $event_data,
+ 'queries' => $query_data,
+ 'savequeries' => defined( 'SAVEQUERIES' ) && SAVEQUERIES,
+ 'http' => $http_data,
+ 'savehttp' => ! empty( $http_data ),
+ )
+ );
+
+ $wp_admin_bar->add_node( array(
+ 'id' => 'laps',
+ 'title' => sprintf( 'Lap: %ss', round( $total / 1000, 3 ) ),
+ ) );
+
+ $wp_admin_bar->add_node( array(
+ 'id' => 'laps_output',
+ 'parent' => 'laps',
+ 'meta' => array( 'html' => $html ),
+ ) );
+ }
+}
diff --git a/src/class-events.php b/src/Laps_Events.php
similarity index 93%
rename from src/class-events.php
rename to src/Laps_Events.php
index 26efcee..50ad0e3 100644
--- a/src/class-events.php
+++ b/src/Laps_Events.php
@@ -1,40 +1,40 @@
-is_applicable() ) {
- return $this->get_events();
- }
-
- return array();
- }
-
- /**
- * Is event pack relevant to current runtime
- *
- * @return bool
- */
- protected function is_applicable() {
-
- return true;
- }
-
- /**
- * Inherit with internal events compiling and return
- *
- * @return array
- */
- abstract protected function get_events();
-}
+is_applicable() ) {
+ return $this->get_events();
+ }
+
+ return array();
+ }
+
+ /**
+ * Is event pack relevant to current runtime
+ *
+ * @return bool
+ */
+ protected function is_applicable() {
+
+ return true;
+ }
+
+ /**
+ * Inherit with internal events compiling and return
+ *
+ * @return array
+ */
+ abstract protected function get_events();
+}
diff --git a/src/class-mustache-cache-frozencache.php b/src/Mustache_Cache_FrozenCache.php
similarity index 100%
rename from src/class-mustache-cache-frozencache.php
rename to src/Mustache_Cache_FrozenCache.php
diff --git a/src/class-tha-events.php b/src/THA_Events.php
similarity index 94%
rename from src/class-tha-events.php
rename to src/THA_Events.php
index b09364c..a43d746 100644
--- a/src/class-tha-events.php
+++ b/src/THA_Events.php
@@ -1,51 +1,51 @@
- 'Header',
- 'category' => 'theme',
- );
-
- $events['tha_header_after'][10] = array(
- 'action' => 'stop',
- 'event' => 'Header',
- 'category' => 'theme',
- );
-
- $events['tha_sidebars_before'][10] = array(
- 'event' => 'Sidebars',
- 'category' => 'theme',
- );
-
- $events['tha_sidebars_after'][10] = array(
- 'action' => 'stop',
- 'event' => 'Sidebars',
- 'category' => 'theme',
- );
-
- return $events;
- }
-}
+ 'Header',
+ 'category' => 'theme',
+ );
+
+ $events['tha_header_after'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Header',
+ 'category' => 'theme',
+ );
+
+ $events['tha_sidebars_before'][10] = array(
+ 'event' => 'Sidebars',
+ 'category' => 'theme',
+ );
+
+ $events['tha_sidebars_after'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Sidebars',
+ 'category' => 'theme',
+ );
+
+ return $events;
+ }
+}
diff --git a/src/class-thematic-events.php b/src/Thematic_Events.php
similarity index 95%
rename from src/class-thematic-events.php
rename to src/Thematic_Events.php
index dc94a33..c1e18d6 100644
--- a/src/class-thematic-events.php
+++ b/src/Thematic_Events.php
@@ -1,62 +1,62 @@
- 'Header',
- 'category' => 'theme',
- );
-
- $events['thematic_belowheader'][10] = array(
- 'action' => 'stop',
- 'event' => 'Header',
- 'category' => 'theme',
- );
-
- $events['widget_area_primary_aside'][10] = array(
- 'event' => 'Sidebar (primary aside)',
- 'category' => 'theme',
- );
-
- $events['thematic_betweenmainasides'][10] = array(
- 'action' => 'stop',
- 'event' => 'Sidebar (primary aside)',
- 'category' => 'theme',
- );
-
- $events['widget_area_secondary_aside'][10] = array(
- 'event' => 'Sidebar (secondary aside)',
- 'category' => 'theme',
- );
-
- $events['thematic_belowmainasides'][10] = array(
- 'action' => 'stop',
- 'event' => 'Sidebar (secondary aside)',
- 'category' => 'theme',
- );
-
- return $events;
- }
-}
+ 'Header',
+ 'category' => 'theme',
+ );
+
+ $events['thematic_belowheader'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Header',
+ 'category' => 'theme',
+ );
+
+ $events['widget_area_primary_aside'][10] = array(
+ 'event' => 'Sidebar (primary aside)',
+ 'category' => 'theme',
+ );
+
+ $events['thematic_betweenmainasides'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Sidebar (primary aside)',
+ 'category' => 'theme',
+ );
+
+ $events['widget_area_secondary_aside'][10] = array(
+ 'event' => 'Sidebar (secondary aside)',
+ 'category' => 'theme',
+ );
+
+ $events['thematic_belowmainasides'][10] = array(
+ 'action' => 'stop',
+ 'event' => 'Sidebar (secondary aside)',
+ 'category' => 'theme',
+ );
+
+ return $events;
+ }
+}
diff --git a/src/class-yoast-events.php b/src/Yoast_Events.php
similarity index 100%
rename from src/class-yoast-events.php
rename to src/Yoast_Events.php