diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..2911cedc5e1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +lib/optimizer/resources/local_fallback/* linguist-generated=true +lib/optimizer/tests/spec/* linguist-generated=true diff --git a/includes/embeds/class-amp-wordpress-tv-embed-handler.php b/includes/embeds/class-amp-wordpress-tv-embed-handler.php index 512d38c7ef6..d02430ee427 100644 --- a/includes/embeds/class-amp-wordpress-tv-embed-handler.php +++ b/includes/embeds/class-amp-wordpress-tv-embed-handler.php @@ -9,17 +9,12 @@ /** * Class AMP_WordPress_TV_Embed_Handler * + * This sanitizes embeds both for WordPress.tv and for VideoPress (which use the same underlying infrastructure). + * * @since 1.4 */ class AMP_WordPress_TV_Embed_Handler extends AMP_Base_Embed_Handler { - /** - * The URL pattern to determine if an embed URL is for this type, copied from WP_oEmbed. - * - * @see https://github.com/WordPress/wordpress-develop/blob/e13480/src/wp-includes/class-wp-oembed.php#L64 - */ - const URL_PATTERN = '#https?://wordpress\.tv/.*#i'; - /** * Register embed. */ @@ -42,7 +37,8 @@ public function unregister_embed() { * @return string The filtered embed markup. */ public function filter_oembed_html( $cache, $url ) { - if ( ! preg_match( self::URL_PATTERN, $url ) ) { + $host = wp_parse_url( $url, PHP_URL_HOST ); + if ( ! in_array( $host, [ 'wordpress.tv', 'videopress.com' ], true ) ) { return $cache; } diff --git a/lib/common/src/RemoteRequest/FilesystemRemoteGetRequest.php b/lib/common/src/RemoteRequest/FilesystemRemoteGetRequest.php index 00b0ef7e3ae..dc57c1c6f8b 100644 --- a/lib/common/src/RemoteRequest/FilesystemRemoteGetRequest.php +++ b/lib/common/src/RemoteRequest/FilesystemRemoteGetRequest.php @@ -20,16 +20,17 @@ final class FilesystemRemoteGetRequest implements RemoteGetRequest { /** - * Associative array of data for mapping between arguments and returned results. + * Associative array of data for mapping between arguments and filepaths pointing to the results to return. * * @var array */ private $argumentMap; /** - * Instantiate a StubbedRemoteGetRequest object. + * Instantiate a FilesystemRemoteGetRequest object. * - * @param array $argumentMap Associative array of data for mapping between arguments and returned results. + * @param array $argumentMap Associative array of data for mapping between arguments and filepaths pointing to the + * results to return. */ public function __construct($argumentMap) { diff --git a/lib/optimizer/resources/local_fallback/rtv/metadata b/lib/optimizer/resources/local_fallback/rtv/metadata index 075574e4725..031b783c4a1 100644 --- a/lib/optimizer/resources/local_fallback/rtv/metadata +++ b/lib/optimizer/resources/local_fallback/rtv/metadata @@ -1 +1 @@ -{"ampRuntimeVersion":"012004030010070","ampCssUrl":"https://cdn.ampproject.org/rtv/012004030010070/v0.css","canaryPercentage":"0.005","diversions":["002004012111560","002004012158290","022004030010070","032004012111560","032004012158290","042004030033570"],"ltsRuntimeVersion":"012002251816300","ltsCssUrl":"https://cdn.ampproject.org/rtv/012002251816300/v0.css"} \ No newline at end of file +{"ampRuntimeVersion":"012004252135000","ampCssUrl":"https://cdn.ampproject.org/rtv/012004252135000/v0.css","canaryPercentage":"0.005","diversions":["002004252135000","002005050322000","022004252135000","032004252135000","032005050322000","042005051629000","052004252135000","102004252135000"],"ltsRuntimeVersion":"012004030010070","ltsCssUrl":"https://cdn.ampproject.org/rtv/012004030010070/v0.css"} \ No newline at end of file diff --git a/lib/optimizer/resources/local_fallback/v0.css b/lib/optimizer/resources/local_fallback/v0.css index 8bd733adce3..d3ec1fdd807 100644 --- a/lib/optimizer/resources/local_fallback/v0.css +++ b/lib/optimizer/resources/local_fallback/v0.css @@ -1,3 +1,3 @@ -html{overflow-x:hidden!important}html.i-amphtml-fie{height:100%!important;width:100%!important}html:not([amp4ads]),html:not([amp4ads]) body{height:auto!important}html:not([amp4ads]) body{margin:0!important}body{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}html.i-amphtml-singledoc.i-amphtml-embedded{-ms-touch-action:pan-y;touch-action:pan-y}html.i-amphtml-fie>body,html.i-amphtml-singledoc>body{overflow:visible!important}html.i-amphtml-fie:not(.i-amphtml-inabox)>body,html.i-amphtml-singledoc:not(.i-amphtml-inabox)>body{position:relative!important}html.i-amphtml-webview>body{overflow-x:hidden!important;overflow-y:visible!important;min-height:100vh!important}html.i-amphtml-ios-embed-legacy>body{overflow-x:hidden!important;overflow-y:auto!important;position:absolute!important}html.i-amphtml-ios-embed{overflow-y:auto!important;position:static}#i-amphtml-wrapper{overflow-x:hidden!important;overflow-y:auto!important;position:absolute!important;top:0!important;left:0!important;right:0!important;bottom:0!important;margin:0!important;display:block!important}html.i-amphtml-ios-embed.i-amphtml-ios-overscroll,html.i-amphtml-ios-embed.i-amphtml-ios-overscroll>#i-amphtml-wrapper{-webkit-overflow-scrolling:touch!important}#i-amphtml-wrapper>body{position:relative!important;border-top:1px solid transparent!important}#i-amphtml-wrapper+body{visibility:visible}#i-amphtml-wrapper+body .i-amphtml-lightbox-element,#i-amphtml-wrapper+body[i-amphtml-lightbox]{visibility:hidden}#i-amphtml-wrapper+body[i-amphtml-lightbox] .i-amphtml-lightbox-element{visibility:visible}#i-amphtml-wrapper.i-amphtml-scroll-disabled,.i-amphtml-scroll-disabled{overflow-x:hidden!important;overflow-y:hidden!important}amp-instagram{padding:54px 0px 0px!important;background-color:#fff}amp-iframe iframe{box-sizing:border-box!important}[amp-access][amp-access-hide]{display:none}[subscriptions-dialog],body:not(.i-amphtml-subs-ready) [subscriptions-action],body:not(.i-amphtml-subs-ready) [subscriptions-section]{display:none!important}amp-experiment,amp-live-list>[update],amp-share-tracking{display:none}.i-amphtml-jank-meter{position:fixed;background-color:rgba(232,72,95,0.5);bottom:0;right:0;color:#fff;font-size:16px;z-index:1000;padding:5px}amp-list[resizable-children]>.i-amphtml-loading-container.amp-hidden{display:none!important}amp-list[load-more] [load-more-button],amp-list[load-more] [load-more-end],amp-list[load-more] [load-more-failed],amp-list[load-more] [load-more-loading]{display:none}amp-story-page,amp-story[standalone]{min-height:1px!important;display:block!important;height:100%!important;margin:0!important;padding:0!important;overflow:hidden!important;width:100%!important}amp-story[standalone]{background-color:#202125!important;position:relative!important}amp-story-page{background-color:#757575}amp-story .amp-active>div{display:none!important}amp-story-page:not(:first-of-type):not([distance]):not([active]){transform:translateY(1000vh)!important}amp-autocomplete{position:relative!important;display:inline-block!important}amp-autocomplete>input,amp-autocomplete>textarea{padding:0.5rem;border:1px solid rgba(0,0,0,0.33)}.i-amphtml-autocomplete-results,amp-autocomplete>input,amp-autocomplete>textarea{font-size:1rem;line-height:1.5rem}[amp-fx^=fly-in]{visibility:hidden} -/*# sourceURL=/css/ampdoc.css*/[hidden]{display:none!important}.i-amphtml-element{display:inline-block}.i-amphtml-blurry-placeholder{transition:opacity 0.3s cubic-bezier(0.0,0.0,0.2,1)!important}[layout=nodisplay]:not(.i-amphtml-element){display:none!important}.i-amphtml-layout-fixed,[layout=fixed][width][height]:not(.i-amphtml-layout-fixed){display:inline-block;position:relative}.i-amphtml-layout-responsive,[layout=responsive][width][height]:not(.i-amphtml-layout-responsive),[width][height][sizes]:not(.i-amphtml-layout-responsive){display:block;position:relative}.i-amphtml-layout-intrinsic{display:inline-block;position:relative;max-width:100%}.i-amphtml-intrinsic-sizer{max-width:100%;display:block!important}.i-amphtml-layout-container,.i-amphtml-layout-fixed-height,[layout=container],[layout=fixed-height][height]{display:block;position:relative}.i-amphtml-layout-fill,[layout=fill]:not(.i-amphtml-layout-fill){display:block;overflow:hidden!important;position:absolute;top:0;left:0;bottom:0;right:0}.i-amphtml-layout-flex-item,[layout=flex-item]:not(.i-amphtml-layout-flex-item){display:block;position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.i-amphtml-layout-fluid{position:relative}.i-amphtml-layout-size-defined{overflow:hidden!important}.i-amphtml-layout-awaiting-size{position:absolute!important;top:auto!important;bottom:auto!important}i-amphtml-sizer{display:block!important}.i-amphtml-blurry-placeholder,.i-amphtml-fill-content{display:block;height:0;max-height:100%;max-width:100%;min-height:100%;min-width:100%;width:0;margin:auto}.i-amphtml-layout-size-defined .i-amphtml-fill-content{position:absolute;top:0;left:0;bottom:0;right:0}.i-amphtml-layout-intrinsic .i-amphtml-sizer{max-width:100%}.i-amphtml-replaced-content,.i-amphtml-screen-reader{padding:0!important;border:none!important}.i-amphtml-screen-reader{position:fixed!important;top:0px!important;left:0px!important;width:4px!important;height:4px!important;opacity:0!important;overflow:hidden!important;margin:0!important;display:block!important;visibility:visible!important}.i-amphtml-screen-reader~.i-amphtml-screen-reader{left:8px!important}.i-amphtml-screen-reader~.i-amphtml-screen-reader~.i-amphtml-screen-reader{left:12px!important}.i-amphtml-screen-reader~.i-amphtml-screen-reader~.i-amphtml-screen-reader~.i-amphtml-screen-reader{left:16px!important}.i-amphtml-unresolved{position:relative;overflow:hidden!important}.i-amphtml-select-disabled{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.i-amphtml-notbuilt,[layout]:not(.i-amphtml-element){position:relative;overflow:hidden!important;color:transparent!important}.i-amphtml-notbuilt:not(.i-amphtml-layout-container)>*,[layout]:not([layout=container]):not(.i-amphtml-element)>*{display:none}.i-amphtml-ghost{visibility:hidden!important}.i-amphtml-element>[placeholder],[layout]:not(.i-amphtml-element)>[placeholder]{display:block}.i-amphtml-element>[placeholder].amp-hidden,.i-amphtml-element>[placeholder].hidden{visibility:hidden}.i-amphtml-element:not(.amp-notsupported)>[fallback],.i-amphtml-layout-container>[placeholder].amp-hidden,.i-amphtml-layout-container>[placeholder].hidden{display:none}.i-amphtml-layout-size-defined>[fallback],.i-amphtml-layout-size-defined>[placeholder]{position:absolute!important;top:0!important;left:0!important;right:0!important;bottom:0!important;z-index:1}.i-amphtml-notbuilt>[placeholder]{display:block!important}.i-amphtml-hidden-by-media-query{display:none!important}.i-amphtml-element-error{background:red!important;color:#fff!important;position:relative!important}.i-amphtml-element-error:before{content:attr(error-message)}i-amp-scroll-container,i-amphtml-scroll-container{position:absolute;top:0;left:0;right:0;bottom:0;display:block}i-amp-scroll-container.amp-active,i-amphtml-scroll-container.amp-active{overflow:auto;-webkit-overflow-scrolling:touch}.i-amphtml-loading-container{display:block!important;pointer-events:none;z-index:1}.i-amphtml-notbuilt>.i-amphtml-loading-container{display:block!important}.i-amphtml-loading-container.amp-hidden{visibility:hidden}.i-amphtml-element>[overflow]{cursor:pointer;position:relative;z-index:2;visibility:hidden}.i-amphtml-element>[overflow].amp-visible{visibility:visible}template{display:none!important}.amp-border-box,.amp-border-box *,.amp-border-box :after,.amp-border-box :before{box-sizing:border-box}amp-pixel{display:none!important}amp-analytics,amp-story-auto-ads{position:fixed!important;top:0!important;width:1px!important;height:1px!important;overflow:hidden!important;visibility:hidden}html.i-amphtml-fie>amp-analytics{position:initial!important}[visible-when-invalid]:not(.visible),amp-list [fetch-error],form [submit-error],form [submit-success],form [submitting]{display:none}amp-accordion{display:block!important}amp-accordion>section{float:none!important}amp-accordion>section>*{float:none!important;display:block!important;overflow:hidden!important;position:relative!important}amp-accordion,amp-accordion>section{margin:0}amp-accordion>section>:last-child{display:none!important}amp-accordion>section[expanded]>:last-child{display:block!important} +html{overflow-x:hidden!important}html.i-amphtml-fie{height:100%!important;width:100%!important}html:not([amp4ads]),html:not([amp4ads]) body{height:auto!important}html:not([amp4ads]) body{margin:0!important}body{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}html.i-amphtml-singledoc.i-amphtml-embedded{-ms-touch-action:pan-y;touch-action:pan-y}html.i-amphtml-fie>body,html.i-amphtml-singledoc>body{overflow:visible!important}html.i-amphtml-fie:not(.i-amphtml-inabox)>body,html.i-amphtml-singledoc:not(.i-amphtml-inabox)>body{position:relative!important}html.i-amphtml-webview>body{overflow-x:hidden!important;overflow-y:visible!important;min-height:100vh!important}html.i-amphtml-ios-embed-legacy>body{overflow-x:hidden!important;overflow-y:auto!important;position:absolute!important}html.i-amphtml-ios-embed{overflow-y:auto!important;position:static}#i-amphtml-wrapper{overflow-x:hidden!important;overflow-y:auto!important;position:absolute!important;top:0!important;left:0!important;right:0!important;bottom:0!important;margin:0!important;display:block!important}html.i-amphtml-ios-embed.i-amphtml-ios-overscroll,html.i-amphtml-ios-embed.i-amphtml-ios-overscroll>#i-amphtml-wrapper{-webkit-overflow-scrolling:touch!important}#i-amphtml-wrapper>body{position:relative!important;border-top:1px solid transparent!important}#i-amphtml-wrapper+body{visibility:visible}#i-amphtml-wrapper+body .i-amphtml-lightbox-element,#i-amphtml-wrapper+body[i-amphtml-lightbox]{visibility:hidden}#i-amphtml-wrapper+body[i-amphtml-lightbox] .i-amphtml-lightbox-element{visibility:visible}#i-amphtml-wrapper.i-amphtml-scroll-disabled,.i-amphtml-scroll-disabled{overflow-x:hidden!important;overflow-y:hidden!important}amp-instagram{padding:54px 0px 0px!important;background-color:#fff}amp-iframe iframe{box-sizing:border-box!important}[amp-access][amp-access-hide]{display:none}[subscriptions-dialog],body:not(.i-amphtml-subs-ready) [subscriptions-action],body:not(.i-amphtml-subs-ready) [subscriptions-section]{display:none!important}amp-experiment,amp-live-list>[update],amp-share-tracking{display:none}.i-amphtml-jank-meter{position:fixed;background-color:rgba(232,72,95,0.5);bottom:0;right:0;color:#fff;font-size:16px;z-index:1000;padding:5px}amp-list[resizable-children]>.i-amphtml-loading-container.amp-hidden{display:none!important}amp-list [fetch-error],amp-list[load-more] [load-more-button],amp-list[load-more] [load-more-end],amp-list[load-more] [load-more-failed],amp-list[load-more] [load-more-loading]{display:none}amp-list[diffable] div[role=list]{display:block}amp-story-page,amp-story[standalone]{min-height:1px!important;display:block!important;height:100%!important;margin:0!important;padding:0!important;overflow:hidden!important;width:100%!important}amp-story[standalone]{background-color:#202125!important;position:relative!important}amp-story-page{background-color:#757575}amp-story .amp-active>div{display:none!important}amp-story-page:not(:first-of-type):not([distance]):not([active]){transform:translateY(1000vh)!important}amp-autocomplete{position:relative!important;display:inline-block!important}amp-autocomplete>input,amp-autocomplete>textarea{padding:0.5rem;border:1px solid rgba(0,0,0,0.33)}.i-amphtml-autocomplete-results,amp-autocomplete>input,amp-autocomplete>textarea{font-size:1rem;line-height:1.5rem}[amp-fx^=fly-in]{visibility:hidden} +/*# sourceURL=/css/ampdoc.css*/[hidden]{display:none!important}.i-amphtml-element{display:inline-block}.i-amphtml-blurry-placeholder{transition:opacity 0.3s cubic-bezier(0.0,0.0,0.2,1)!important}[layout=nodisplay]:not(.i-amphtml-element){display:none!important}.i-amphtml-layout-fixed,[layout=fixed][width][height]:not(.i-amphtml-layout-fixed){display:inline-block;position:relative}.i-amphtml-layout-responsive,[layout=responsive][width][height]:not(.i-amphtml-layout-responsive),[width][height][sizes]:not(.i-amphtml-layout-responsive){display:block;position:relative}.i-amphtml-layout-intrinsic{display:inline-block;position:relative;max-width:100%}.i-amphtml-intrinsic-sizer{max-width:100%;display:block!important}.i-amphtml-layout-container,.i-amphtml-layout-fixed-height,[layout=container],[layout=fixed-height][height]{display:block;position:relative}.i-amphtml-layout-fill,[layout=fill]:not(.i-amphtml-layout-fill){display:block;overflow:hidden!important;position:absolute;top:0;left:0;bottom:0;right:0}.i-amphtml-layout-flex-item,[layout=flex-item]:not(.i-amphtml-layout-flex-item){display:block;position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.i-amphtml-layout-fluid{position:relative}.i-amphtml-layout-size-defined{overflow:hidden!important}.i-amphtml-layout-awaiting-size{position:absolute!important;top:auto!important;bottom:auto!important}i-amphtml-sizer{display:block!important}.i-amphtml-blurry-placeholder,.i-amphtml-fill-content{display:block;height:0;max-height:100%;max-width:100%;min-height:100%;min-width:100%;width:0;margin:auto}.i-amphtml-layout-size-defined .i-amphtml-fill-content{position:absolute;top:0;left:0;bottom:0;right:0}.i-amphtml-layout-intrinsic .i-amphtml-sizer{max-width:100%}.i-amphtml-replaced-content,.i-amphtml-screen-reader{padding:0!important;border:none!important}.i-amphtml-screen-reader{position:fixed!important;top:0px!important;left:0px!important;width:4px!important;height:4px!important;opacity:0!important;overflow:hidden!important;margin:0!important;display:block!important;visibility:visible!important}.i-amphtml-screen-reader~.i-amphtml-screen-reader{left:8px!important}.i-amphtml-screen-reader~.i-amphtml-screen-reader~.i-amphtml-screen-reader{left:12px!important}.i-amphtml-screen-reader~.i-amphtml-screen-reader~.i-amphtml-screen-reader~.i-amphtml-screen-reader{left:16px!important}.i-amphtml-unresolved{position:relative;overflow:hidden!important}.i-amphtml-select-disabled{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.i-amphtml-notbuilt,[layout]:not(.i-amphtml-element){position:relative;overflow:hidden!important;color:transparent!important}.i-amphtml-notbuilt:not(.i-amphtml-layout-container)>*,[layout]:not([layout=container]):not(.i-amphtml-element)>*{display:none}.i-amphtml-ghost{visibility:hidden!important}.i-amphtml-element>[placeholder],[layout]:not(.i-amphtml-element)>[placeholder]{display:block}.i-amphtml-element>[placeholder].amp-hidden,.i-amphtml-element>[placeholder].hidden{visibility:hidden}.i-amphtml-element:not(.amp-notsupported)>[fallback],.i-amphtml-layout-container>[placeholder].amp-hidden,.i-amphtml-layout-container>[placeholder].hidden{display:none}.i-amphtml-layout-size-defined>[fallback],.i-amphtml-layout-size-defined>[placeholder]{position:absolute!important;top:0!important;left:0!important;right:0!important;bottom:0!important;z-index:1}.i-amphtml-notbuilt>[placeholder]{display:block!important}.i-amphtml-hidden-by-media-query{display:none!important}.i-amphtml-element-error{background:red!important;color:#fff!important;position:relative!important}.i-amphtml-element-error:before{content:attr(error-message)}i-amp-scroll-container,i-amphtml-scroll-container{position:absolute;top:0;left:0;right:0;bottom:0;display:block}i-amp-scroll-container.amp-active,i-amphtml-scroll-container.amp-active{overflow:auto;-webkit-overflow-scrolling:touch}.i-amphtml-loading-container{display:block!important;pointer-events:none;z-index:1}.i-amphtml-notbuilt>.i-amphtml-loading-container{display:block!important}.i-amphtml-loading-container.amp-hidden{visibility:hidden}.i-amphtml-element>[overflow]{cursor:pointer;position:relative;z-index:2;visibility:hidden;display:initial}.i-amphtml-element>[overflow].amp-visible{visibility:visible}template{display:none!important}.amp-border-box,.amp-border-box *,.amp-border-box :after,.amp-border-box :before{box-sizing:border-box}amp-pixel{display:none!important}amp-analytics,amp-story-auto-ads{position:fixed!important;top:0!important;width:1px!important;height:1px!important;overflow:hidden!important;visibility:hidden}html.i-amphtml-fie>amp-analytics{position:initial!important}[visible-when-invalid]:not(.visible),form [submit-error],form [submit-success],form [submitting]{display:none}amp-accordion{display:block!important}amp-accordion>section{float:none!important}amp-accordion>section>*{float:none!important;display:block!important;overflow:hidden!important;position:relative!important}amp-accordion,amp-accordion>section{margin:0}amp-accordion>section>:last-child{display:none!important}amp-accordion>section[expanded]>:last-child{display:block!important} /*# sourceURL=/css/ampshared.css*/ \ No newline at end of file diff --git a/lib/optimizer/src/Configurable.php b/lib/optimizer/src/Configurable.php deleted file mode 100644 index 592cd3d5b59..00000000000 --- a/lib/optimizer/src/Configurable.php +++ /dev/null @@ -1,13 +0,0 @@ - '', + self::STYLES => '', self::CANARY => false, ]; } @@ -63,6 +75,13 @@ protected function validate($key, $value) $value = trim($value); break; + case self::STYLES: + if (! is_string($value)) { + throw InvalidConfigurationValue::forInvalidSubValueType(self::class, self::STYLES, 'string', gettype($value)); + } + $value = trim($value); + break; + case self::CANARY: if (! is_bool($value)) { throw InvalidConfigurationValue::forInvalidSubValueType(self::class, self::CANARY, 'boolean', gettype($value)); diff --git a/lib/optimizer/src/MakesRemoteRequests.php b/lib/optimizer/src/MakesRemoteRequests.php deleted file mode 100644 index 2b8526cdfdf..00000000000 --- a/lib/optimizer/src/MakesRemoteRequests.php +++ /dev/null @@ -1,13 +0,0 @@ -configuration = $configuration; + $this->configuration = isset($configuration) ? $configuration : new Configuration(); $this->remoteRequest = isset($remoteRequest) ? $remoteRequest : new CurlRemoteGetRequest(); + + $this->initializeTransformers(); } /** @@ -50,7 +61,7 @@ public function __construct(Configuration $configuration, RemoteGetRequest $remo */ public function optimizeDom(Document $document, ErrorCollection $errors) { - foreach ($this->getTransformers() as $transformer) { + foreach ($this->transformers as $transformer) { $transformer->transform($document, $errors); } } @@ -71,31 +82,58 @@ public function optimizeHtml($html, ErrorCollection $errors) } /** - * Get the array of transformers to use. + * Initialize the array of transformers to use. + */ + private function initializeTransformers() + { + $this->transformers = []; + + foreach ($this->configuration->get(Configuration::KEY_TRANSFORMERS) as $transformerClass) { + $this->transformers[$transformerClass] = new $transformerClass( + ...$this->getTransformerDependencies($transformerClass) + ); + } + } + + /** + * Get the dependencies of a transformer and put them in the correct order. * - * @return Transformer[] Array of transformers to use. + * @param string $transformerClass Class of the transformer to get the dependencies for. + * @return array Array of dependencies in the order as they appear in the transformer's constructor. + * @throws ReflectionException If the transformer could not be reflected upon. */ - private function getTransformers() + private function getTransformerDependencies($transformerClass) { - static $transformers = null; + $constructor = (new ReflectionClass($transformerClass))->getConstructor(); + + if ($constructor === null) { + return []; + } - if (null === $transformers) { - $transformers = []; - foreach ($this->configuration->get(Configuration::KEY_TRANSFORMERS) as $transformerClass) { - $arguments = []; + $dependencies = []; + foreach ($constructor->getParameters() as $parameter) { + $dependencyType = $parameter->getClass(); - if (is_a($transformerClass, MakesRemoteRequests::class, true)) { - $arguments[] = $this->remoteRequest; - } + if ($dependencyType === null) { + // No type provided, so we pass `null` in the hopes that the argument is optional. + $dependencies[] = null; + continue; + } - if (is_a($transformerClass, Configurable::class, true)) { - $arguments[] = $this->configuration->getTransformerConfiguration($transformerClass); - } + if (is_a($dependencyType->name, TransformerConfiguration::class, true)) { + $dependencies[] = $this->configuration->getTransformerConfiguration($transformerClass); + continue; + } - $transformers[$transformerClass] = new $transformerClass(...$arguments); + if (is_a($dependencyType->name, RemoteGetRequest::class, true)) { + $dependencies[] = $this->remoteRequest; + continue; } + + // Unknown dependency type, so we pass `null` in the hopes that the argument is optional. + $dependencies[] = null; } - return $transformers; + return $dependencies; } } diff --git a/lib/optimizer/src/Transformer/AmpRuntimeCss.php b/lib/optimizer/src/Transformer/AmpRuntimeCss.php index c0927e11d7f..949c83347a3 100644 --- a/lib/optimizer/src/Transformer/AmpRuntimeCss.php +++ b/lib/optimizer/src/Transformer/AmpRuntimeCss.php @@ -5,11 +5,9 @@ use AmpProject\Amp; use AmpProject\Attribute; use AmpProject\Dom\Document; -use AmpProject\Optimizer\Configurable; use AmpProject\Optimizer\Configuration\AmpRuntimeCssConfiguration; use AmpProject\Optimizer\Error; use AmpProject\Optimizer\ErrorCollection; -use AmpProject\Optimizer\MakesRemoteRequests; use AmpProject\Optimizer\TransformerConfiguration; use AmpProject\RemoteGetRequest; use AmpProject\Optimizer\Transformer; @@ -36,7 +34,7 @@ * * @package ampproject/optimizer */ -final class AmpRuntimeCss implements Transformer, Configurable, MakesRemoteRequests +final class AmpRuntimeCss implements Transformer { /** @@ -61,29 +59,29 @@ final class AmpRuntimeCss implements Transformer, Configurable, MakesRemoteReque const V0_CSS_URL = Amp::CACHE_HOST . '/' . self::V0_CSS; /** - * Transport to use for remote requests. + * Configuration store to use. * - * @var RemoteGetRequest + * @var TransformerConfiguration */ - private $remoteRequest; + private $configuration; /** - * Configuration store to use. + * Transport to use for remote requests. * - * @var TransformerConfiguration + * @var RemoteGetRequest */ - private $configuration; + private $remoteRequest; /** * Instantiate an AmpRuntimeCss object. * - * @param RemoteGetRequest $remoteRequest Transport to use for remote requests. * @param TransformerConfiguration $configuration Configuration store to use. + * @param RemoteGetRequest $remoteRequest Transport to use for remote requests. */ - public function __construct(RemoteGetRequest $remoteRequest, TransformerConfiguration $configuration) + public function __construct(TransformerConfiguration $configuration, RemoteGetRequest $remoteRequest) { - $this->remoteRequest = $remoteRequest; $this->configuration = $configuration; + $this->remoteRequest = $remoteRequest; } /** @@ -143,6 +141,7 @@ private function addStaticCss(Document $document, DOMElement $ampRuntimeStyle, E } catch (Exception $exception) { $errors->add(Error\CannotInlineRuntimeCss::fromException($exception, $ampRuntimeStyle, $version)); $this->linkCss($document, $ampRuntimeStyle); + $ampRuntimeStyle->parentNode->removeChild($ampRuntimeStyle); } } @@ -164,14 +163,21 @@ private function inlineCss(DOMElement $ampRuntimeStyle, $version) } $ampRuntimeStyle->setAttribute(Attribute::I_AMPHTML_VERSION, $version); - $response = $this->remoteRequest->get($v0CssUrl); - $statusCode = $response->getStatusCode(); - if ($statusCode < 200 || $statusCode >= 300) { - return; + $styles = $this->configuration->get(AmpRuntimeCssConfiguration::STYLES); + + if (empty($styles)) { + $response = $this->remoteRequest->get($v0CssUrl); + $statusCode = $response->getStatusCode(); + + if (200 < $statusCode || $statusCode >= 300) { + return; + } + + $styles = $response->getBody(); } - $ampRuntimeStyle->textContent = $response->getBody(); + $ampRuntimeStyle->textContent = $styles; } /** diff --git a/lib/optimizer/src/Transformer/ReorderHead.php b/lib/optimizer/src/Transformer/ReorderHead.php index 3d7b20e1692..c5280d4acd8 100644 --- a/lib/optimizer/src/Transformer/ReorderHead.php +++ b/lib/optimizer/src/Transformer/ReorderHead.php @@ -17,7 +17,7 @@ * ReorderHead reorders the children of . Specifically, it * orders the like so: * (0) tag - * (1) ' . '', - ['canary' => true], + [AmpRuntimeCssConfiguration::CANARY => true], + ], + + 'override version via config' => [ + TestMarkup::DOCTYPE . '' . TestMarkup::META_CHARSET . TestMarkup::STYLE_AMPRUNTIME . '', + + TestMarkup::DOCTYPE . '' . TestMarkup::META_CHARSET . + '' . + '', + + [AmpRuntimeCssConfiguration::VERSION => '012345678901234'], + ], + + 'override styles via config' => [ + TestMarkup::DOCTYPE . '' . TestMarkup::META_CHARSET . TestMarkup::STYLE_AMPRUNTIME . '', + + TestMarkup::DOCTYPE . '' . TestMarkup::META_CHARSET . + '' . + '', + + [AmpRuntimeCssConfiguration::STYLES => '/* custom-styles-v0.css */'], + ], + + 'trying to inline invalid version results in linked stylesheet' => [ + TestMarkup::DOCTYPE . '' . TestMarkup::META_CHARSET . TestMarkup::STYLE_AMPRUNTIME . '', + + TestMarkup::DOCTYPE . '' . TestMarkup::META_CHARSET . + '' . + '', + + [AmpRuntimeCssConfiguration::VERSION => '0000000000000000'], ], ]; } @@ -61,7 +91,7 @@ public function testTransform($source, $expectedHtml, $config = []) { $document = Document::fromHtml($source); $remoteRequest = new StubbedRemoteGetRequest(TestMarkup::STUBBED_REMOTE_REQUESTS); - $transformer = new AmpRuntimeCss($remoteRequest, new AmpRuntimeCssConfiguration($config)); + $transformer = new AmpRuntimeCss(new AmpRuntimeCssConfiguration($config), $remoteRequest); $errors = new ErrorCollection(); $transformer->transform($document, $errors); diff --git a/lib/optimizer/tests/spec/end-to-end/body-only/expected_output.valid.html b/lib/optimizer/tests/spec/end-to-end/body-only/expected_output.valid.html index b4cfeb2c140..70aa8be8e57 100644 --- a/lib/optimizer/tests/spec/end-to-end/body-only/expected_output.valid.html +++ b/lib/optimizer/tests/spec/end-to-end/body-only/expected_output.valid.html @@ -1,7 +1,7 @@ - + diff --git a/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.html b/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.html index 96c971120af..2ad5227e436 100644 --- a/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.html +++ b/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.html @@ -1,17 +1,17 @@ - + - - + + - - - - + + + + - +

Hello, AMP world!

diff --git a/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.valid.html b/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.valid.html index 82bc3f473f1..ce3cb19953b 100644 --- a/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.valid.html +++ b/lib/optimizer/tests/spec/end-to-end/hello-world/expected_output.valid.html @@ -1,7 +1,7 @@ - + diff --git a/lib/optimizer/tests/spec/end-to-end/hello-world/input.html b/lib/optimizer/tests/spec/end-to-end/hello-world/input.html index 5d3c471c95d..0216462639f 100644 --- a/lib/optimizer/tests/spec/end-to-end/hello-world/input.html +++ b/lib/optimizer/tests/spec/end-to-end/hello-world/input.html @@ -1,8 +1,9 @@ diff --git a/lib/optimizer/tests/spec/end-to-end/markdown/expected_output.valid.html b/lib/optimizer/tests/spec/end-to-end/markdown/expected_output.valid.html index d0d4ff7b869..3d2832b54f2 100644 --- a/lib/optimizer/tests/spec/end-to-end/markdown/expected_output.valid.html +++ b/lib/optimizer/tests/spec/end-to-end/markdown/expected_output.valid.html @@ -1,7 +1,7 @@ - + diff --git a/lib/optimizer/tests/spec/transformers/experimental/AmpBoilerplateTransformer/uses_given_runtime_version/expected_output.html b/lib/optimizer/tests/spec/transformers/experimental/AmpBoilerplateTransformer/uses_given_runtime_version/expected_output.html deleted file mode 100644 index a0aef2ac27e..00000000000 --- a/lib/optimizer/tests/spec/transformers/experimental/AmpBoilerplateTransformer/uses_given_runtime_version/expected_output.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/experimental/AmpBoilerplateTransformer/uses_given_runtime_version/input.html b/lib/optimizer/tests/spec/transformers/experimental/AmpBoilerplateTransformer/uses_given_runtime_version/input.html deleted file mode 100644 index 27b0f61a906..00000000000 --- a/lib/optimizer/tests/spec/transformers/experimental/AmpBoilerplateTransformer/uses_given_runtime_version/input.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_esm/expected_output.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_esm/expected_output.html new file mode 100644 index 00000000000..65663c3ff66 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_esm/expected_output.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_esm/input.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_esm/input.html new file mode 100644 index 00000000000..f3ab7ec0dc3 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_esm/input.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_geoapi/expected_output.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_geoapi/expected_output.html new file mode 100644 index 00000000000..1a0397c9302 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_geoapi/expected_output.html @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_geoapi/input.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_geoapi/input.html new file mode 100644 index 00000000000..7cece1eb1a9 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_geoapi/input.html @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_lts/expected_output.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_lts/expected_output.html new file mode 100644 index 00000000000..d24376bc103 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_lts/expected_output.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_lts/input.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_lts/input.html new file mode 100644 index 00000000000..c99fddab9b5 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_lts/input.html @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_preloads/expected_output.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_preloads/expected_output.html index 4a160fd163d..65663c3ff66 100644 --- a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_preloads/expected_output.html +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_preloads/expected_output.html @@ -1,12 +1,14 @@ - - + + + + + - diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/expected_output.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/expected_output.html index 7863bd10304..91daa629cbf 100644 --- a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/expected_output.html +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/expected_output.html @@ -1,12 +1,14 @@ - - + + + + + - diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/input.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/input.html index c7a43086ae3..287a0bf187c 100644 --- a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/input.html +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/adds_runtime_version/input.html @@ -1,5 +1,6 @@ diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/expected_output.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/expected_output.html index 9c6be4a0b83..11b7b9586fd 100644 --- a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/expected_output.html +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/expected_output.html @@ -2,12 +2,14 @@ - - + + + + + - diff --git a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/input.html b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/input.html index c1ac9a6b700..bbdc56c84ca 100644 --- a/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/input.html +++ b/lib/optimizer/tests/spec/transformers/experimental/RewriteAmpUrls/rewrites_host_and_adds_version/input.html @@ -1,5 +1,6 @@ diff --git a/lib/optimizer/tests/spec/transformers/valid/AmpBoilerplateTransformer/does_not_add_v0.css_if_style_amp-runtime_not_present/input.html b/lib/optimizer/tests/spec/transformers/valid/AmpBoilerplateTransformer/does_not_add_v0.css_if_style_amp-runtime_not_present/input.html index b0f3319e908..8fb601e80f0 100644 --- a/lib/optimizer/tests/spec/transformers/valid/AmpBoilerplateTransformer/does_not_add_v0.css_if_style_amp-runtime_not_present/input.html +++ b/lib/optimizer/tests/spec/transformers/valid/AmpBoilerplateTransformer/does_not_add_v0.css_if_style_amp-runtime_not_present/input.html @@ -1,3 +1,9 @@ + diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/amp-video_with_missing_poster/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/amp-video_with_missing_poster/expected_output.html new file mode 100644 index 00000000000..44369b0f433 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/amp-video_with_missing_poster/expected_output.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/amp-video_with_missing_poster/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/amp-video_with_missing_poster/input.html new file mode 100644 index 00000000000..8063e5e6c92 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/amp-video_with_missing_poster/input.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/disable_via_param/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/disable_via_param/expected_output.html new file mode 100644 index 00000000000..9f87ae9b515 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/disable_via_param/expected_output.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/disable_via_param/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/disable_via_param/input.html new file mode 100644 index 00000000000..933972c2435 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/disable_via_param/input.html @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimensions_from_parent_container/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimensions_from_parent_container/expected_output.html new file mode 100644 index 00000000000..11f05d60796 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimensions_from_parent_container/expected_output.html @@ -0,0 +1,10 @@ + + + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimensions_from_parent_container/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimensions_from_parent_container/input.html new file mode 100644 index 00000000000..dd2bab99115 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimensions_from_parent_container/input.html @@ -0,0 +1,8 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimesions_from_parent_container-_too_small/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimesions_from_parent_container-_too_small/expected_output.html new file mode 100644 index 00000000000..eebe67d850f --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimesions_from_parent_container-_too_small/expected_output.html @@ -0,0 +1,8 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimesions_from_parent_container-_too_small/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimesions_from_parent_container-_too_small/input.html new file mode 100644 index 00000000000..f0f83a30ac1 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/hero_image_dimesions_from_parent_container-_too_small/input.html @@ -0,0 +1,8 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset/expected_output.html new file mode 100644 index 00000000000..f3a932d8c42 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset/expected_output.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset/input.html new file mode 100644 index 00000000000..58b59838578 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset/input.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset_duplicates/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset_duplicates/expected_output.html new file mode 100644 index 00000000000..d18dad5bb02 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset_duplicates/expected_output.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset_duplicates/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset_duplicates/input.html new file mode 100644 index 00000000000..67ed4fd1f1f --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/invalid_srcset_duplicates/input.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimension_from_parent_because_layout_is_not_responsive_or_fill/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimension_from_parent_because_layout_is_not_responsive_or_fill/expected_output.html new file mode 100644 index 00000000000..1f9035ecedf --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimension_from_parent_because_layout_is_not_responsive_or_fill/expected_output.html @@ -0,0 +1,8 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimension_from_parent_because_layout_is_not_responsive_or_fill/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimension_from_parent_because_layout_is_not_responsive_or_fill/input.html new file mode 100644 index 00000000000..b38e210ab9c --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimension_from_parent_because_layout_is_not_responsive_or_fill/input.html @@ -0,0 +1,8 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimensions_in_parent_containers/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimensions_in_parent_containers/expected_output.html new file mode 100644 index 00000000000..511cbc39a4c --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimensions_in_parent_containers/expected_output.html @@ -0,0 +1,8 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimensions_in_parent_containers/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimensions_in_parent_containers/input.html new file mode 100644 index 00000000000..7ef2d9afff4 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_dimensions_in_parent_containers/input.html @@ -0,0 +1,8 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_display_layout/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_display_layout/expected_output.html new file mode 100644 index 00000000000..a2b48e83416 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_display_layout/expected_output.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_display_layout/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_display_layout/input.html new file mode 100644 index 00000000000..00f99979107 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/no_display_layout/input.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/preloads_hero_image/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/preloads_hero_image/expected_output.html new file mode 100644 index 00000000000..12e3305cc69 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/preloads_hero_image/expected_output.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/preloads_hero_image/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/preloads_hero_image/input.html new file mode 100644 index 00000000000..34d566811dd --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/preloads_hero_image/input.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/same_as_above_with_nodisplay_layout_removed/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/same_as_above_with_nodisplay_layout_removed/expected_output.html new file mode 100644 index 00000000000..8cd5fc8fe5c --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/same_as_above_with_nodisplay_layout_removed/expected_output.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/same_as_above_with_nodisplay_layout_removed/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/same_as_above_with_nodisplay_layout_removed/input.html new file mode 100644 index 00000000000..5673d503db0 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/same_as_above_with_nodisplay_layout_removed/input.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/srcset_validity_empty_srcset/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/srcset_validity_empty_srcset/expected_output.html new file mode 100644 index 00000000000..40186ece231 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/srcset_validity_empty_srcset/expected_output.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/srcset_validity_empty_srcset/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/srcset_validity_empty_srcset/input.html new file mode 100644 index 00000000000..fa8751631bb --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/srcset_validity_empty_srcset/input.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/video_posters/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/video_posters/expected_output.html new file mode 100644 index 00000000000..8703c83b57f --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/video_posters/expected_output.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/video_posters/input.html b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/video_posters/input.html new file mode 100644 index 00000000000..d622ed596f6 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/PreloadHeroImage/video_posters/input.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/SeparateKeyframes/ignores_amp_stories/expected_output.html b/lib/optimizer/tests/spec/transformers/valid/SeparateKeyframes/ignores_amp_stories/expected_output.html new file mode 100644 index 00000000000..3751fd95705 --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/SeparateKeyframes/ignores_amp_stories/expected_output.html @@ -0,0 +1,40 @@ + + + + + + My Story + + + + + + + + + + + +

Hello World

+

This is the cover page of this story.

+
+
+ + + +

First Page

+

This is the first page of this story.

+
+
+ + + +

Second Page

+

This is the second page of this story.

+
+
+
+ + \ No newline at end of file diff --git a/lib/optimizer/tests/spec/transformers/valid/SeparateKeyframes/ignores_amp_stories/input.html b/lib/optimizer/tests/spec/transformers/valid/SeparateKeyframes/ignores_amp_stories/input.html new file mode 100644 index 00000000000..74a7805e5ad --- /dev/null +++ b/lib/optimizer/tests/spec/transformers/valid/SeparateKeyframes/ignores_amp_stories/input.html @@ -0,0 +1,41 @@ + + + + + + My Story + + + + + + + + + + + +

Hello World

+

This is the cover page of this story.

+
+
+ + + +

First Page

+

This is the first page of this story.

+
+
+ + + +

Second Page

+

This is the second page of this story.

+
+
+
+ + diff --git a/lib/optimizer/tests/src/TestMarkup.php b/lib/optimizer/tests/src/TestMarkup.php index a111d99dd3a..425c66faac3 100644 --- a/lib/optimizer/tests/src/TestMarkup.php +++ b/lib/optimizer/tests/src/TestMarkup.php @@ -24,6 +24,8 @@ final class TestMarkup const STUBBED_REMOTE_REQUESTS = [ 'https://cdn.ampproject.org/rtv/metadata' => '{"ampRuntimeVersion":"012345678900000","ampCssUrl":"https://cdn.ampproject.org/rtv/012345678900000/v0.css","canaryPercentage":"0.1","diversions":["023456789000000","034567890100000","045678901200000"]}', 'https://cdn.ampproject.org/v0.css' => '/* v0.css */', + 'https://cdn.ampproject.org/rtv/012345678900000/v0.css' => '/* 012345678900000/v0.css */', + 'https://cdn.ampproject.org/rtv/012345678901234/v0.css' => '/* 012345678901234/v0.css */', ]; // Doctype is the doctype expected for AMP documents. diff --git a/lib/optimizer/tests/src/TestTransformer/ConfigurationOnly.php b/lib/optimizer/tests/src/TestTransformer/ConfigurationOnly.php new file mode 100644 index 00000000000..fa051b50da6 --- /dev/null +++ b/lib/optimizer/tests/src/TestTransformer/ConfigurationOnly.php @@ -0,0 +1,20 @@ +' . self::CAPTION_TEXT . ''; - $loading_attribute = version_compare( get_bloginfo( 'version' ), '5.5', '>' ) ? 'loading="lazy"' : ''; + $loading_attribute = version_compare( get_bloginfo( 'version' ), '5.5-alpha', '>' ) ? 'loading="lazy"' : ''; return [ 'shortcode_with_invalid_id' => [ diff --git a/tests/php/test-class-amp-hulu-embed-handler.php b/tests/php/test-class-amp-hulu-embed-handler.php index b16a0fb5e7c..743f3874843 100644 --- a/tests/php/test-class-amp-hulu-embed-handler.php +++ b/tests/php/test-class-amp-hulu-embed-handler.php @@ -25,7 +25,7 @@ public function setUp() { add_filter( 'pre_http_request', static function( $pre, $r, $url ) { - if ( in_array( 'external-http', $_SERVER['argv'], true ) ) { + if ( self::is_external_http_test_suite() ) { return $pre; } @@ -55,6 +55,15 @@ static function( $pre, $r, $url ) { } } + /** + * Whether external-http test suite is running. + * + * @return bool Running external-http test suite. + */ + private static function is_external_http_test_suite() { + return in_array( 'external-http', $_SERVER['argv'], true ); + } + /** * Get conversion data. * @@ -62,18 +71,13 @@ static function( $pre, $r, $url ) { */ public function get_conversion_data() { return [ - 'no_embed' => [ - '

Hello world.

', - '

Hello world.

' . PHP_EOL, - ], - 'url_simple' => [ - 'https://www.hulu.com/watch/771496' . PHP_EOL, + 'https://www.hulu.com/watch/771496', '

' . PHP_EOL, ], 'url_with_params' => [ - 'https://www.hulu.com/watch/771496?foo=bar' . PHP_EOL, + 'https://www.hulu.com/watch/771496?foo=bar', '

' . PHP_EOL, ], @@ -83,14 +87,18 @@ public function get_conversion_data() { /** * Test conversion. * - * @param string $source Source. + * @param string $url URL. * @param string $expected Expected. * @dataProvider get_conversion_data */ - public function test__conversion( $source, $expected ) { + public function test__conversion( $url, $expected ) { $embed = new AMP_Hulu_Embed_Handler(); $embed->register_embed(); - $filtered_content = apply_filters( 'the_content', $source ); + $filtered_content = apply_filters( 'the_content', $url ); + + if ( self::is_external_http_test_suite() && "

$url

" === trim( $filtered_content ) ) { + $this->markTestSkipped( 'Endpoint is down.' ); + } $this->assertEquals( $expected, $filtered_content ); } @@ -107,7 +115,7 @@ public function get_scripts_data() { [], ], 'converted' => [ - 'https://www.hulu.com/watch/771496' . PHP_EOL, + 'https://www.hulu.com/watch/771496', [ 'amp-hulu' => true ], ], ]; @@ -116,16 +124,20 @@ public function get_scripts_data() { /** * Test scripts. * - * @param string $source Source. + * @param string $url URL. * @param string $expected Expected. * @dataProvider get_scripts_data */ - public function test__get_scripts( $source, $expected ) { + public function test__get_scripts( $url, $expected ) { $embed = new AMP_Hulu_Embed_Handler(); $embed->register_embed(); - $source = apply_filters( 'the_content', $source ); + $filtered_content = apply_filters( 'the_content', $url ); + + if ( self::is_external_http_test_suite() && "

$url

" === trim( $filtered_content ) ) { + $this->markTestSkipped( 'Endpoint is down.' ); + } - $whitelist_sanitizer = new AMP_Tag_And_Attribute_Sanitizer( AMP_DOM_Utils::get_dom_from_content( $source ) ); + $whitelist_sanitizer = new AMP_Tag_And_Attribute_Sanitizer( AMP_DOM_Utils::get_dom_from_content( $filtered_content ) ); $whitelist_sanitizer->sanitize(); $scripts = array_merge( diff --git a/tests/php/test-class-amp-theme-support.php b/tests/php/test-class-amp-theme-support.php index 226fd9b7d3c..98840d2c793 100644 --- a/tests/php/test-class-amp-theme-support.php +++ b/tests/php/test-class-amp-theme-support.php @@ -2002,11 +2002,10 @@ static function ( $url ) { '', '', + '', '##s', - '', - '"}'; // phpcs:ignore + } elseif ( 'videopress.com' === $host ) { + $body = '{"version":"1.0","provider_name":"VideoPress","provider_url":"https:\/\/videopress.com\/","type":"video","title":"VideoPress Demo","width":560,"height":316,"thumbnail_url":"https:\/\/videos.files.wordpress.com\/kUJmAcSf\/bbb_sunflower_1080p_30fps_normal_scruberthumbnail_2.jpg","thumbnail_width":560,"thumbnail_height":316,"html":"