From bf18d7986d10c59bd68766bdc84e81634e223240 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Sat, 7 Sep 2019 23:17:17 -0700 Subject: [PATCH 1/7] Add initial support for AMP dev mode --- includes/Core/Admin_Bar/Admin_Bar.php | 16 ++++++++- includes/Core/Assets/Assets.php | 47 +++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/includes/Core/Admin_Bar/Admin_Bar.php b/includes/Core/Admin_Bar/Admin_Bar.php index a7f340e1daa..2e59e949af5 100644 --- a/includes/Core/Admin_Bar/Admin_Bar.php +++ b/includes/Core/Admin_Bar/Admin_Bar.php @@ -82,7 +82,7 @@ function( $wp_admin_bar ) { $this->assets->enqueue_asset( 'googlesitekit_adminbar_css' ); if ( $this->context->is_amp() ) { - return; + add_filter( 'amp_dev_mode_element_xpaths', [ $this, 'add_amp_dev_mode' ] ); } // Enqueue scripts. @@ -92,6 +92,20 @@ function( $wp_admin_bar ) { add_action( 'wp_enqueue_scripts', $admin_bar_callback, 40 ); } + /** + * Add data-ampdevmode attributes to the elements that need it. + * + * @see \Google\Site_Kit\Core\Assets\Assets::get_assets() The 'googlesitekit' string is added to all inline scripts. + * @eee \Google\Site_Kit\Core\Assets\Assets::add_amp_dev_mode_attributes() The data-ampdevmode attribute is added to registered scripts/styles here. + * + * @param string[] $xpath_queries XPath queries for elements that should get the data-ampdevmode attribute. + * @return string[] XPath queries. + */ + public function add_amp_dev_mode( $xpath_queries ) { + $xpath_queries[] = '//script[ contains( text(), "googlesitekit" ) ]'; + return $xpath_queries; + } + /** * Render the Adminbar button. * diff --git a/includes/Core/Assets/Assets.php b/includes/Core/Assets/Assets.php index 657c834e1cd..3a8d1a86392 100644 --- a/includes/Core/Assets/Assets.php +++ b/includes/Core/Assets/Assets.php @@ -230,6 +230,41 @@ private function register_assets() { foreach ( $assets as $asset ) { $asset->register(); } + + $this->add_amp_dev_mode_attributes( $assets ); + } + + /** + * Add data-ampdevmode attributes to assets. + * + * @todo What about dependencies? + * + * @param Asset[] $assets Assets. + */ + private function add_amp_dev_mode_attributes( $assets ) { + add_filter( + 'script_loader_tag', + function ( $tag, $handle ) use ( $assets ) { + if ( $this->context->is_amp() && isset( $assets[ $handle ] ) && $assets[ $handle ] instanceof Script ) { + $tag = preg_replace( '/(?<=)/i', ' data-ampdevmode', $tag ); + } + return $tag; + }, + 10, + 2 + ); + + add_filter( + 'style_loader_tag', + function ( $tag, $handle ) use ( $assets ) { + if ( $this->context->is_amp() && isset( $assets[ $handle ] ) && $assets[ $handle ] instanceof Stylesheet ) { + $tag = preg_replace( '/(?<=)/i', ' data-ampdevmode', $tag ); + } + return $tag; + }, + 10, + 2 + ); } /** @@ -248,7 +283,7 @@ private function enqueue_minimal_admin_script() { * * @since 1.0.0 * - * @return array Associative array of asset $handle => $instance pairs. + * @return Asset[] Associative array of asset $handle => $instance pairs. */ private function get_assets() { if ( $this->assets ) { @@ -280,7 +315,7 @@ private function get_assets() { 'dependencies' => array( 'sitekit-vendor' ), 'post_register' => function( $handle ) use ( $base_url ) { $url_polyfill = ( - '( typeof URL === \'function\') || ' . + '/*googlesitekit*/ ( typeof URL === \'function\') || ' . 'document.write( \'