From 3156ae704334e952ebfaffc8918075458ea1364a Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Thu, 3 Aug 2023 14:26:30 +0200 Subject: [PATCH 01/14] Correctly handle `siblings_disallowed` from spec --- bin/amphtml-update.py | 10 +- bin/latest-extension-versions.json | 1 + .../class-amp-allowed-tags-generated.php | 283 +++++++----------- includes/sanitizers/class-amp-rule-spec.php | 1 + .../class-amp-tag-and-attribute-sanitizer.php | 44 +++ .../php/test-tag-and-attribute-sanitizer.php | 56 +++- 6 files changed, 195 insertions(+), 200 deletions(-) diff --git a/bin/amphtml-update.py b/bin/amphtml-update.py index f9ddb389312..df4faa4726f 100755 --- a/bin/amphtml-update.py +++ b/bin/amphtml-update.py @@ -411,8 +411,8 @@ def ParseRules(repo_directory, out_dir): satisfies = script_tag['tag_spec']['satisfies'] else: satisfies = extension - if satisfies in extension_specs_by_satisfies: - raise Exception( 'Duplicate extension script that satisfies %s.' % satisfies ) +# if satisfies in extension_specs_by_satisfies: +# raise Exception( 'Duplicate extension script that satisfies %s.' % satisfies ) extension_specs_by_satisfies[satisfies] = script_tag['tag_spec']['extension_spec'] @@ -468,11 +468,10 @@ def ParseRules(repo_directory, out_dir): tag['tag_spec']['requires_extension'] = requires_extension_versions extensions = json.load( open( os.path.join( repo_directory, 'build-system/compile/bundles.config.extensions.json' ) ) ) - bento_extensions = json.load( open( os.path.join( repo_directory, 'build-system/compile/bundles.config.bento.json' ) ) ) latest_versions = json.load( open( latest_extensions_file_path ) ) extensions_versions = dict() - for extension in extensions + bento_extensions: + for extension in extensions: if '-impl' in extension['name'] or '-polyfill' in extension['name']: continue @@ -799,6 +798,9 @@ def GetTagRules(tag_spec): if tag_spec.HasField('unique_warning'): tag_rules['unique_warning'] = tag_spec.unique_warning + if tag_spec.HasField('siblings_disallowed'): + tag_rules['siblings_disallowed'] = tag_spec.siblings_disallowed + if tag_spec.HasField('child_tags'): child_tags = collections.defaultdict( lambda: [] ) for field in tag_spec.child_tags.ListFields(): diff --git a/bin/latest-extension-versions.json b/bin/latest-extension-versions.json index 3a00f2a877b..991e2b07a28 100644 --- a/bin/latest-extension-versions.json +++ b/bin/latest-extension-versions.json @@ -115,6 +115,7 @@ "amp-sticky-ad" : "1.0", "amp-story" : "1.0", "amp-story-360" : "0.1", + "amp-story-audio-sticker" : "0.1", "amp-story-auto-ads" : "0.1", "amp-story-auto-analytics" : "0.1", "amp-story-captions" : "0.1", diff --git a/includes/sanitizers/class-amp-allowed-tags-generated.php b/includes/sanitizers/class-amp-allowed-tags-generated.php index 45b87352fb9..6d572c7bf37 100644 --- a/includes/sanitizers/class-amp-allowed-tags-generated.php +++ b/includes/sanitizers/class-amp-allowed-tags-generated.php @@ -249,6 +249,7 @@ class AMP_Allowed_Tags_Generated { 'address', 'amp-analytics', 'amp-audio', + 'amp-bodymovin-animation', 'amp-date-countdown', 'amp-date-display', 'amp-experiment', @@ -271,6 +272,7 @@ class AMP_Allowed_Tags_Generated { 'amp-story-interactive-poll', 'amp-story-interactive-quiz', 'amp-story-interactive-results', + 'amp-story-interactive-slider', 'amp-story-panning-media', 'amp-story-shopping-tag', 'amp-timeago', @@ -607,6 +609,14 @@ class AMP_Allowed_Tags_Generated { 'attributionreportto' => array(), 'attributionsourceeventid' => array(), 'attributionsourceid' => array(), + 'attributionsrc' => array( + 'value_url' => array( + 'allow_empty' => true, + 'protocol' => array( + 'https', + ), + ), + ), 'border' => array(), 'conversiondestination' => array(), 'data-amp-bind-href' => array(), @@ -3155,7 +3165,6 @@ class AMP_Allowed_Tags_Generated { 4, ), ), - 'bento' => false, 'requires_extension' => array( 'amp-facebook-comments', ), @@ -3184,7 +3193,6 @@ class AMP_Allowed_Tags_Generated { 4, ), ), - 'bento' => true, 'requires_extension' => array( 'amp-facebook', ), @@ -3223,7 +3231,6 @@ class AMP_Allowed_Tags_Generated { 4, ), ), - 'bento' => false, 'requires_extension' => array( 'amp-facebook-like', ), @@ -3259,7 +3266,6 @@ class AMP_Allowed_Tags_Generated { 4, ), ), - 'bento' => true, 'requires_extension' => array( 'amp-facebook', ), @@ -3298,7 +3304,6 @@ class AMP_Allowed_Tags_Generated { 4, ), ), - 'bento' => false, 'requires_extension' => array( 'amp-facebook-page', ), @@ -3334,7 +3339,6 @@ class AMP_Allowed_Tags_Generated { 4, ), ), - 'bento' => true, 'requires_extension' => array( 'amp-facebook', ), @@ -5238,6 +5242,14 @@ class AMP_Allowed_Tags_Generated { array( 'attr_spec_list' => array( 'allow-ssr-img' => array(), + 'attributionsrc' => array( + 'value_url' => array( + 'allow_empty' => true, + 'protocol' => array( + 'https', + ), + ), + ), 'media' => array(), 'noloading' => array( 'value' => array( @@ -5459,37 +5471,6 @@ class AMP_Allowed_Tags_Generated { ), ), ), - 'amp-redbull-player' => array( - array( - 'attr_spec_list' => array( - 'data-param-videoid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 2, - 3, - 4, - 6, - 7, - 8, - 9, - ), - ), - 'requires_extension' => array( - 'amp-redbull-player', - ), - ), - ), - ), 'amp-reddit' => array( array( 'attr_spec_list' => array( @@ -6102,6 +6083,9 @@ class AMP_Allowed_Tags_Generated { ), ), ), + 'desktop-aspect-ratio' => array( + 'value_regex' => '\\d+:\\d+', + ), 'entity' => array(), 'entity-logo-src' => array( 'value_url' => array( @@ -6194,6 +6178,7 @@ class AMP_Allowed_Tags_Generated { 'amp-story-bookend', 'amp-story-page', 'amp-story-social-share', + 'amp-story-subscriptions', ), 'mandatory_min_num_child_tags' => 1, ), @@ -6201,6 +6186,7 @@ class AMP_Allowed_Tags_Generated { 'requires_extension' => array( 'amp-story', ), + 'siblings_disallowed' => true, ), ), ), @@ -6306,7 +6292,15 @@ class AMP_Allowed_Tags_Generated { ), 'amp-story-auto-ads' => array( array( - 'attr_spec_list' => array(), + 'attr_spec_list' => array( + 'src' => array( + 'value_url' => array( + 'protocol' => array( + 'https', + ), + ), + ), + ), 'tag_spec' => array( 'mandatory_parent' => 'amp-story', 'requires_extension' => array( @@ -6921,6 +6915,55 @@ class AMP_Allowed_Tags_Generated { ), ), ), + 'amp-story-interactive-slider' => array( + array( + 'attr_spec_list' => array( + 'chip-style' => array( + 'value' => array( + 'shadow', + 'flat', + 'transparent', + ), + ), + 'endpoint' => array( + 'mandatory' => true, + 'value_url' => array( + 'allow_empty' => false, + 'allow_relative' => false, + 'protocol' => array( + 'https', + ), + ), + ), + 'id' => array( + 'mandatory' => true, + ), + 'option-1-text' => array( + 'mandatory' => false, + ), + 'prompt-size' => array( + 'value' => array( + 'small', + 'medium', + 'large', + ), + ), + 'prompt-text' => array(), + 'theme' => array( + 'value' => array( + 'light', + 'dark', + ), + ), + ), + 'tag_spec' => array( + 'mandatory_ancestor' => 'amp-story-grid-layer', + 'requires_extension' => array( + 'amp-story-interactive', + ), + ), + ), + ), 'amp-story-page' => array( array( 'attr_spec_list' => array( @@ -7226,12 +7269,21 @@ class AMP_Allowed_Tags_Generated { 'amp-story-subscriptions' => array( array( 'attr_spec_list' => array( + 'additional-description' => array(), + 'description' => array( + 'mandatory' => true, + ), + 'headline' => array(), 'media' => array(), 'noloading' => array( 'value' => array( '', ), ), + 'price' => array( + 'mandatory' => true, + ), + 'subscriptions-page-index' => array(), ), 'tag_spec' => array( 'amp_layout' => array( @@ -8004,6 +8056,11 @@ class AMP_Allowed_Tags_Generated { 'mandatory' => true, 'value_regex' => '[0-9]+', ), + 'do-not-track' => array( + 'value' => array( + '', + ), + ), 'media' => array(), 'noloading' => array( 'value' => array( @@ -11031,6 +11088,7 @@ class AMP_Allowed_Tags_Generated { ), ), ), + 'xssi-prefix' => array(), ), 'tag_spec' => array( 'disallowed_ancestor' => array( @@ -15127,10 +15185,10 @@ class AMP_Allowed_Tags_Generated { ), 'nonce' => array(), 'src' => array( - 'dispatch_key' => 2, 'mandatory' => true, 'value' => array( 'https://cdn.ampproject.org/v0.js', + 'https://ampjs.org/v0.js', ), ), 'type' => array( @@ -15173,6 +15231,7 @@ class AMP_Allowed_Tags_Generated { 'mandatory' => true, 'value' => array( 'https://cdn.ampproject.org/lts/v0.js', + 'https://ampjs.org/lts/v0.js', ), ), 'type' => array( @@ -15721,6 +15780,7 @@ class AMP_Allowed_Tags_Generated { 'requires_extension' => array( 'amp-story', ), + 'siblings_disallowed' => true, 'spec_name' => 'amp-story-bookend extension .json script', 'unique' => true, ), @@ -15741,6 +15801,7 @@ class AMP_Allowed_Tags_Generated { 'requires_extension' => array( 'amp-story', ), + 'siblings_disallowed' => true, 'spec_name' => 'amp-story-social-share extension .json script', 'unique' => true, ), @@ -16166,10 +16227,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-accordion', 'requires_usage' => true, @@ -16481,10 +16538,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => false, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-audio', 'requires_usage' => true, @@ -16579,10 +16632,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-base-carousel', 'requires_usage' => true, @@ -16739,10 +16788,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-brightcove', 'requires_usage' => true, @@ -16962,10 +17007,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-dailymotion', 'requires_usage' => true, @@ -16998,10 +17039,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-date-countdown', 'requires_usage' => true, @@ -17034,10 +17071,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-date-display', 'requires_usage' => true, @@ -17163,10 +17196,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-embedly-card', 'requires_usage' => true, @@ -17231,10 +17260,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-facebook', 'requires_usage' => true, @@ -17360,10 +17385,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-fit-text', 'requires_usage' => true, @@ -17706,10 +17727,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-iframe', 'requires_usage' => true, @@ -17897,10 +17914,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-inline-gallery', 'requires_usage' => true, @@ -17964,10 +17977,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-instagram', 'requires_usage' => true, @@ -18124,10 +18133,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-lightbox', 'requires_usage' => true, @@ -18160,10 +18165,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-lightbox-gallery', 'requires_usage' => false, @@ -18291,10 +18292,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-mathml', 'requires_usage' => true, @@ -18896,37 +18893,6 @@ class AMP_Allowed_Tags_Generated { ), ), ), - array( - 'attr_spec_list' => array( - 'async' => array( - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'crossorigin' => array( - 'value' => array( - 'anonymous', - ), - ), - 'nonce' => array(), - 'type' => array( - 'value_casei' => array( - 'text/javascript', - ), - ), - ), - 'tag_spec' => array( - 'extension_spec' => array( - 'latest' => '0.1', - 'name' => 'amp-redbull-player', - 'requires_usage' => true, - 'version' => array( - '0.1', - ), - ), - ), - ), array( 'attr_spec_list' => array( 'async' => array( @@ -19073,10 +19039,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-selector', 'requires_usage' => true, @@ -19109,10 +19071,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-sidebar', 'requires_usage' => true, @@ -19207,10 +19165,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-social-share', 'requires_usage' => true, @@ -19243,10 +19197,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-soundcloud', 'requires_usage' => true, @@ -19653,10 +19603,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-stream-gallery', 'requires_usage' => true, @@ -19784,10 +19730,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-timeago', 'requires_usage' => true, @@ -19851,10 +19793,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-twitter', 'requires_usage' => true, @@ -19918,10 +19856,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-video', 'requires_usage' => true, @@ -19985,10 +19919,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-video-iframe', 'requires_usage' => true, @@ -20021,10 +19951,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-vimeo', 'requires_usage' => true, @@ -20212,10 +20138,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '1.0', 'name' => 'amp-wordpress-embed', 'requires_usage' => true, @@ -20279,10 +20201,6 @@ class AMP_Allowed_Tags_Generated { ), 'tag_spec' => array( 'extension_spec' => array( - 'bento' => array( - 'has_css' => true, - 'version' => '1.0', - ), 'latest' => '0.1', 'name' => 'amp-youtube', 'requires_usage' => true, @@ -22766,6 +22684,7 @@ class AMP_Allowed_Tags_Generated { 'unique' => false, ), ), + 'siblings_disallowed' => true, 'spec_name' => 'AMP-MEGA-MENU > NAV', ), ), diff --git a/includes/sanitizers/class-amp-rule-spec.php b/includes/sanitizers/class-amp-rule-spec.php index 3df2e0d667e..644b42bc9c3 100644 --- a/includes/sanitizers/class-amp-rule-spec.php +++ b/includes/sanitizers/class-amp-rule-spec.php @@ -37,6 +37,7 @@ abstract class AMP_Rule_Spec { const MANDATORY_PARENT = 'mandatory_parent'; const DESCENDANT_TAG_LIST = 'descendant_tag_list'; const CHILD_TAGS = 'child_tags'; + const SIBLINGS_DISALLOWED = 'siblings_disallowed'; /* * HTML Element Attribute rule names diff --git a/includes/sanitizers/class-amp-tag-and-attribute-sanitizer.php b/includes/sanitizers/class-amp-tag-and-attribute-sanitizer.php index 47069101e68..45f62818dad 100644 --- a/includes/sanitizers/class-amp-tag-and-attribute-sanitizer.php +++ b/includes/sanitizers/class-amp-tag-and-attribute-sanitizer.php @@ -45,6 +45,7 @@ class AMP_Tag_And_Attribute_Sanitizer extends AMP_Base_Sanitizer { const DISALLOWED_CHILD_TAG = 'DISALLOWED_CHILD_TAG'; const DISALLOWED_DESCENDANT_TAG = 'DISALLOWED_DESCENDANT_TAG'; const DISALLOWED_FIRST_CHILD_TAG = 'DISALLOWED_FIRST_CHILD_TAG'; + const DISALLOWED_SIBLING_TAG = 'DISALLOWED_SIBLING_TAG'; const DISALLOWED_PROCESSING_INSTRUCTION = 'DISALLOWED_PROCESSING_INSTRUCTION'; const DISALLOWED_PROPERTY_IN_ATTR_VALUE = 'DISALLOWED_PROPERTY_IN_ATTR_VALUE'; const DISALLOWED_RELATIVE_URL = 'DISALLOWED_RELATIVE_URL'; @@ -749,6 +750,11 @@ static function ( $validation_error ) { } } + // If the node disallows any siblings, remove them. + if ( ! empty( $tag_spec[ AMP_Rule_Spec::SIBLINGS_DISALLOWED ] ) ) { + $this->remove_disallowed_siblings( $node, $this->get_spec_name( $node, $tag_spec ) ); + } + // After attributes have been sanitized (and potentially removed), if mandatory attribute(s) are missing, remove the element. $missing_mandatory_attributes = $this->get_missing_mandatory_attributes( $attr_spec_list, $node ); if ( ! empty( $missing_mandatory_attributes ) ) { @@ -2453,6 +2459,44 @@ private function remove_disallowed_descendants( DOMElement $node, $allowed_desce } } + /** + * Loop through node's siblings and remove them. + * + * @param DOMElement $node Node. + * @param string $spec_name Spec name. + */ + private function remove_disallowed_siblings( DOMElement $node, $spec_name ) { + if ( ! $node->previousSibling || ! $node->nextSibling ) { + return; + } + + $prev_sibling = $node->previousElementSibling; + while ( $prev_sibling !== null ) { + $this->remove_invalid_child( + $prev_sibling, + [ + 'code' => self::DISALLOWED_SIBLING_TAG, + 'sibling' => $node->nodeName, + 'spec_name' => $spec_name, + ] + ); + $prev_sibling = $prev_sibling->previousElementSibling; + } + + $next_sibling = $node->nextElementSibling; + while ( $next_sibling !== null ) { + $this->remove_invalid_child( + $next_sibling, + [ + 'code' => self::DISALLOWED_SIBLING_TAG, + 'sibling' => $node->nodeName, + 'spec_name' => $spec_name, + ] + ); + $next_sibling = $next_sibling->nextElementSibling; + } + } + /** * Check whether the node validates the constraints for children. * diff --git a/tests/php/test-tag-and-attribute-sanitizer.php b/tests/php/test-tag-and-attribute-sanitizer.php index 29d83ad9308..9576ceb59ec 100644 --- a/tests/php/test-tag-and-attribute-sanitizer.php +++ b/tests/php/test-tag-and-attribute-sanitizer.php @@ -1397,6 +1397,48 @@ static function() { [ 'amp-sidebar', 'amp-story' ], ], + 'amp_story_with_disallowed_sibling' => [ + str_replace( + [ "\n", "\t" ], + '', + ' + + + + + +

Hello World

+

This is the cover page of this story.

+
+
+
+ +
+ ' + ), + str_replace( + [ "\n", "\t" ], + '', + ' + + + +

Hello World

+

This is the cover page of this story.

+
+
+
+ ' + ), + [ 'amp-story' ], + [ + AMP_Tag_And_Attribute_Sanitizer::DISALLOWED_SIBLING_TAG, + AMP_Tag_And_Attribute_Sanitizer::DISALLOWED_SIBLING_TAG, + AMP_Tag_And_Attribute_Sanitizer::DISALLOWED_SIBLING_TAG, + AMP_Tag_And_Attribute_Sanitizer::DISALLOWED_SIBLING_TAG, + ], + ], + 'amp_sidebar_with_autoscroll' => [ str_replace( [ "\n", "\t" ], @@ -2958,20 +3000,6 @@ class="slide" [ 'amp-sidebar', 'amp-list', 'amp-mustache' ], ], - 'amp-redbull-player' => [ - ' - - ', - null, - [ 'amp-redbull-player' ], - ], - 'mustache_templates_with_variable_attrs' => [ '