Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update amphtml spec to 2309011827000 #7615

Merged
merged 19 commits into from
Oct 17, 2023

Conversation

thelovekesh
Copy link
Collaborator

@thelovekesh thelovekesh commented Sep 11, 2023

Previously #7078 and #7597

  • Run ./bin/amphtml-update.sh (lando ssh -c 'bash ./bin/amphtml-update.sh vendor/amphtml').
  • Examine diff for changelog.
  • Examine upstream diff to ensure nothing was missed.
  • Update spec generator as needed based on spec format changes.
  • Modify validating sanitizer based on changes to spec, if needed.
  • Add tests for key changes, if needed.

Changelog

Details

(
    PREV_VERSION=2204221712000;
    THIS_VERSION=2309011827000;
    git checkout $THIS_VERSION;
    git diff $PREV_VERSION...$THIS_VERSION -w -- build-system/compile/bundles.config.extensions.json $( git ls-files | grep '.protoascii' );
    git checkout - > /dev/null
)
Diff 2204221712000...2309011827000
diff --git a/build-system/compile/bundles.config.extensions.json b/build-system/compile/bundles.config.extensions.json
index d46fcdae8f..8d01a9545b 100644
--- a/build-system/compile/bundles.config.extensions.json
+++ b/build-system/compile/bundles.config.extensions.json
@@ -113,6 +113,11 @@
     "version": "0.1",
     "latestVersion": "0.1"
   },
+  {
+    "name": "amp-ad-network-mgid-impl",
+    "version": "0.1",
+    "latestVersion": "0.1"
+  },
   {
     "name": "amp-ad-network-nws-impl",
     "version": "0.1",
@@ -176,9 +181,7 @@
     "name": "amp-app-banner",
     "version": "1.0",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -190,9 +193,7 @@
     "name": "amp-audio",
     "version": "1.0",
     "latestVersion": "0.1",
-    "options": {
-      "bento": true
-    }
+    "options": {}
   },
   {
     "name": "amp-auto-ads",
@@ -331,8 +332,6 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "npm": true,
-      "bento": true,
       "hasCss": true
     }
   },
@@ -346,8 +345,6 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "npm": true,
-      "bento": true,
       "hasCss": true
     }
   },
@@ -364,9 +361,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "npm": true,
-      "hasCss": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -392,9 +387,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -446,9 +439,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -496,9 +487,7 @@
     "name": "amp-gist",
     "version": "1.0",
     "options": {
-      "hasCss": true,
-      "bento": true,
-      "npm": true
+      "hasCss": true
     }
   },
   {
@@ -533,9 +522,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -569,9 +556,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -706,9 +691,7 @@
     "name": "amp-list",
     "version": "1.0",
     "options": {
-      "hasCss": false,
-      "npm": true,
-      "bento": true
+      "hasCss": false
     }
   },
   {
@@ -740,9 +723,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "bento": true,
-      "npm": true
+      "hasCss": true
     }
   },
   {
@@ -840,8 +821,7 @@
     "name": "amp-pan-zoom",
     "version": "1.0",
     "options": {
-      "hasCss": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -883,11 +863,6 @@
       "hasCss": true
     }
   },
-  {
-    "name": "amp-redbull-player",
-    "version": "0.1",
-    "latestVersion": "0.1"
-  },
   {
     "name": "amp-reddit",
     "version": "0.1",
@@ -929,9 +904,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -958,9 +931,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -975,6 +946,11 @@
     "version": "0.1",
     "latestVersion": "0.1"
   },
+  {
+    "name": "amp-slikeplayer",
+    "version": "0.1",
+    "latestVersion": "0.1"
+  },
   {
     "name": "amp-smartlinks",
     "version": "0.1",
@@ -1035,6 +1011,16 @@
       "hasCss": true
     }
   },
+  {
+    "name": "amp-story",
+    "version": "1.0",
+    "latestVersion": "1.0",
+    "options": {
+      "hasCss": false,
+      "additionalSuffix": "ssr-css",
+      "ssrCss": true
+    }
+  },
   {
     "name": "amp-story-360",
     "version": "0.1",
@@ -1043,6 +1029,13 @@
       "hasCss": true
     }
   },
+  {
+    "name": "amp-story-audio-sticker",
+    "version": "0.1",
+    "options": {
+      "hasCss": true
+    }
+  },
   {
     "name": "amp-story-auto-ads",
     "version": "0.1",
@@ -1147,9 +1140,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -1186,9 +1177,7 @@
     "version": "1.0",
     "latestVersion": "0.1",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
@@ -1312,9 +1301,7 @@
     "version": "1.0",
     "latestVersion": "1.0",
     "options": {
-      "hasCss": true,
-      "npm": true,
-      "bento": true
+      "hasCss": true
     }
   },
   {
diff --git a/extensions/amp-accordion/validator-amp-accordion.protoascii b/extensions/amp-accordion/validator-amp-accordion.protoascii
index e0b5a9739e..c65a7f8e8f 100644
--- a/extensions/amp-accordion/validator-amp-accordion.protoascii
+++ b/extensions/amp-accordion/validator-amp-accordion.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-accordion for websites
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-accordion 1.0"
-  excludes: "amp-accordion 0.1"
+  satisfies_condition: "amp-accordion 1.0"
+  excludes_condition: "amp-accordion 0.1"
   extension_spec: {
     name: "amp-accordion"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-accordion for ads
   html_format: AMP
   html_format: AMP4ADS
   tag_name: "SCRIPT"
-  satisfies: "amp-accordion 0.1"
-  excludes: "amp-accordion 1.0"
+  satisfies_condition: "amp-accordion 0.1"
+  excludes_condition: "amp-accordion 1.0"
   extension_spec: {
     name: "amp-accordion"
     version_name: "v0.1"
diff --git a/extensions/amp-ad-exit/validator-amp-ad-exit.protoascii b/extensions/amp-ad-exit/validator-amp-ad-exit.protoascii
index 3e8ea5d6a9..259f6b3700 100644
--- a/extensions/amp-ad-exit/validator-amp-ad-exit.protoascii
+++ b/extensions/amp-ad-exit/validator-amp-ad-exit.protoascii
@@ -12,7 +12,7 @@ tags: {  # <amp-ad-exit>
   html_format: AMP4ADS
   tag_name: "AMP-AD-EXIT"
   requires_extension: "amp-ad-exit"
-  requires: "amp-ad-exit configuration JSON"
+  requires_condition: "amp-ad-exit configuration JSON"
   attr_lists: "extended-amp-global"
   attr_lists: "mandatory-id-attr"
   child_tags: {
@@ -29,7 +29,7 @@ tags: {  # amp-ad-exit config JSON
   html_format: AMP4ADS
   tag_name: "SCRIPT"
   spec_name: "amp-ad-exit configuration JSON"
-  satisfies: "amp-ad-exit configuration JSON"
+  satisfies_condition: "amp-ad-exit configuration JSON"
   requires_extension: "amp-ad-exit"
   mandatory_parent: "AMP-AD-EXIT"
   attrs: {
diff --git a/extensions/amp-animation/validator-amp-animation.protoascii b/extensions/amp-animation/validator-amp-animation.protoascii
index 27b1884616..e513cd42d7 100644
--- a/extensions/amp-animation/validator-amp-animation.protoascii
+++ b/extensions/amp-animation/validator-amp-animation.protoascii
@@ -16,7 +16,7 @@ tags: {  # <amp-animation> (json)
   spec_name: "amp-animation extension .json script"
   mandatory_parent: "AMP-ANIMATION"
   requires_extension: "amp-animation"
-  satisfies: "amp-animation extension .json script"
+  satisfies_condition: "amp-animation extension .json script"
   attrs: {
     name: "type"
     mandatory: true
@@ -36,7 +36,7 @@ tags: {  # <amp-animation>
   html_format: AMP4ADS
   tag_name: "AMP-ANIMATION"
   requires_extension: "amp-animation"
-  requires: "amp-animation extension .json script"
+  requires_condition: "amp-animation extension .json script"
   attrs: {
     name: "trigger"
     value: "visibility"
diff --git a/extensions/amp-app-banner/validator-amp-app-banner.protoascii b/extensions/amp-app-banner/validator-amp-app-banner.protoascii
index b1517a408b..50fbd0b417 100644
--- a/extensions/amp-app-banner/validator-amp-app-banner.protoascii
+++ b/extensions/amp-app-banner/validator-amp-app-banner.protoascii
@@ -14,11 +14,11 @@ tags: {  # <amp-app-banner>
   tag_name: "AMP-APP-BANNER"
   mandatory_parent: "BODY"
   requires_extension: "amp-app-banner"
-  requires: "amp-app-banner data source"
+  requires_condition: "amp-app-banner data source"
   # The "amp-app-banner button[open-button]" tag is in
   # validator-main.protoascii and in turn has an "AMP-APP-BANNER"
   # mandatory_parent.
-  requires: "amp-app-banner button[open-button]"
+  requires_condition: "amp-app-banner button[open-button]"
   attr_lists: "extended-amp-global"
   attr_lists: "mandatory-id-attr"
   unique: true
diff --git a/extensions/amp-audio/validator-amp-audio.protoascii b/extensions/amp-audio/validator-amp-audio.protoascii
index c6a9e4d06d..5c6a5996ac 100644
--- a/extensions/amp-audio/validator-amp-audio.protoascii
+++ b/extensions/amp-audio/validator-amp-audio.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-audio 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-audio 1.0"
-  excludes: "amp-audio 0.1"
+  satisfies_condition: "amp-audio 1.0"
+  excludes_condition: "amp-audio 0.1"
   extension_spec: {
     name: "amp-audio"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-audio 0.1
   html_format: AMP
   html_format: AMP4ADS
   tag_name: "SCRIPT"
-  satisfies: "amp-audio 0.1"
-  excludes: "amp-audio 1.0"
+  satisfies_condition: "amp-audio 0.1"
+  excludes_condition: "amp-audio 1.0"
   extension_spec: {
     name: "amp-audio"
     version_name: "v0.1"
diff --git a/extensions/amp-brightcove/validator-amp-brightcove.protoascii b/extensions/amp-brightcove/validator-amp-brightcove.protoascii
index 5142e25c10..707afa35c1 100644
--- a/extensions/amp-brightcove/validator-amp-brightcove.protoascii
+++ b/extensions/amp-brightcove/validator-amp-brightcove.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-brightcove 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-brightcove 1.0"
-  excludes: "amp-brightcove 0.1"
+  satisfies_condition: "amp-brightcove 1.0"
+  excludes_condition: "amp-brightcove 0.1"
   extension_spec: {
     name: "amp-brightcove"
     version_name: "v1.0"
@@ -14,8 +14,8 @@ tags: {  # amp-brightcove 1.0
 tags: {  # amp-brightcove 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-brightcove 0.1"
-  excludes: "amp-brightcove 1.0"
+  satisfies_condition: "amp-brightcove 0.1"
+  excludes_condition: "amp-brightcove 1.0"
   extension_spec: {
     name: "amp-brightcove"
     version_name: "v0.1"
diff --git a/extensions/amp-consent/validator-amp-consent.protoascii b/extensions/amp-consent/validator-amp-consent.protoascii
index 9c0d7e321e..ecaa82de21 100644
--- a/extensions/amp-consent/validator-amp-consent.protoascii
+++ b/extensions/amp-consent/validator-amp-consent.protoascii
@@ -15,7 +15,7 @@ tags: {  # amp-consent (json)
   requires_extension: "amp-consent"
   mandatory_parent: "AMP-CONSENT"
   unique: true
-  satisfies: "amp-consent extension .json script"
+  satisfies_condition: "amp-consent extension .json script"
   attrs: {
     name: "type"
     mandatory: true
@@ -35,8 +35,8 @@ tags: {  # <amp-consent>
   tag_name: "AMP-CONSENT"
   requires_extension: "amp-consent"
   unique: true
-  requires: "amp-consent extension .json script"
-  excludes: "amp-consent [type]"
+  requires_condition: "amp-consent extension .json script"
+  excludes_condition: "amp-consent [type]"
   attr_lists: "extended-amp-global"
   amp_layout: {
     supported_layouts: NODISPLAY
@@ -49,9 +49,9 @@ tags: {  # <amp-consent> (type)
   spec_name: "amp-consent [type]"
   requires_extension: "amp-consent"
   unique: true
-  requires: "meta name=amp-consent-blocking"
-  requires: "amp-consent extension .json script"
-  satisfies: "amp-consent [type]"
+  requires_condition: "meta name=amp-consent-blocking"
+  requires_condition: "amp-consent extension .json script"
+  satisfies_condition: "amp-consent [type]"
   attrs: {
     name: "type"
     mandatory: true
diff --git a/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii b/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii
index e9e3b6a28e..1e86049676 100644
--- a/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii
+++ b/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-dailymotion 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-dailymotion 1.0"
-  excludes: "amp-dailymotion 0.1"
+  satisfies_condition: "amp-dailymotion 1.0"
+  excludes_condition: "amp-dailymotion 0.1"
   extension_spec: {
     name: "amp-dailymotion"
     version_name: "v1.0"
@@ -14,8 +14,8 @@ tags: {  # amp-dailymotion 1.0
 tags: {  # amp-dailymotion 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-dailymotion 0.1"
-  excludes: "amp-dailymotion 1.0"
+  satisfies_condition: "amp-dailymotion 0.1"
+  excludes_condition: "amp-dailymotion 1.0"
   extension_spec: {
     name: "amp-dailymotion"
     version_name: "v0.1"
diff --git a/extensions/amp-facebook-comments/validator-amp-facebook-comments.protoascii b/extensions/amp-facebook-comments/validator-amp-facebook-comments.protoascii
index 328ebbb436..0edb0b8b09 100644
--- a/extensions/amp-facebook-comments/validator-amp-facebook-comments.protoascii
+++ b/extensions/amp-facebook-comments/validator-amp-facebook-comments.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-facebook-comments
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-facebook-comments 0.1"
-  excludes: "amp-facebook 1.0"
+  satisfies_condition: "amp-facebook-comments 0.1"
+  excludes_condition: "amp-facebook 1.0"
   extension_spec: {
     name: "amp-facebook-comments"
     version: "0.1"
@@ -14,7 +14,7 @@ tags: {  # <amp-facebook-comments>
   html_format: AMP
   tag_name: "AMP-FACEBOOK-COMMENTS"
   requires_extension: "amp-facebook-comments"
-  requires: "amp-facebook-comments 0.1"
+  requires_condition: "amp-facebook-comments 0.1"
   # The amp-facebook attr_list is defined in the amp-facebook protoascii
   attr_lists: "amp-facebook"
   attr_lists: "extended-amp-global"
diff --git a/extensions/amp-facebook-like/validator-amp-facebook-like.protoascii b/extensions/amp-facebook-like/validator-amp-facebook-like.protoascii
index 913a4d6c6b..a1764847e7 100644
--- a/extensions/amp-facebook-like/validator-amp-facebook-like.protoascii
+++ b/extensions/amp-facebook-like/validator-amp-facebook-like.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-facebook-like
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-facebook-like 0.1"
-  excludes: "amp-facebook 1.0"
+  satisfies_condition: "amp-facebook-like 0.1"
+  excludes_condition: "amp-facebook 1.0"
   extension_spec: {
     name: "amp-facebook-like"
     version: "0.1"
@@ -14,7 +14,7 @@ tags: {  # <amp-facebook-like>
   html_format: AMP
   tag_name: "AMP-FACEBOOK-LIKE"
   requires_extension: "amp-facebook-like"
-  requires: "amp-facebook-like 0.1"
+  requires_condition: "amp-facebook-like 0.1"
   # The amp-facebook-strict attr_list is defined in the amp-facebook protoascii
   attr_lists: "amp-facebook-strict"
   attr_lists: "extended-amp-global"
diff --git a/extensions/amp-facebook-page/validator-amp-facebook-page.protoascii b/extensions/amp-facebook-page/validator-amp-facebook-page.protoascii
index b6338f25a3..543ccdb7d9 100644
--- a/extensions/amp-facebook-page/validator-amp-facebook-page.protoascii
+++ b/extensions/amp-facebook-page/validator-amp-facebook-page.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-facebook-page
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-facebook-page 0.1"
-  excludes: "amp-facebook 1.0"
+  satisfies_condition: "amp-facebook-page 0.1"
+  excludes_condition: "amp-facebook 1.0"
   extension_spec: {
     name: "amp-facebook-page"
     version: "0.1"
@@ -14,7 +14,7 @@ tags: {  # <amp-facebook-page>
   html_format: AMP
   tag_name: "AMP-FACEBOOK-PAGE"
   requires_extension: "amp-facebook-page"
-  requires: "amp-facebook-page 0.1"
+  requires_condition: "amp-facebook-page 0.1"
   # The amp-facebook-strict attr_list is defined in the amp-facebook protoascii
   attr_lists: "amp-facebook-strict"
   attr_lists: "extended-amp-global"
diff --git a/extensions/amp-facebook/validator-amp-facebook.protoascii b/extensions/amp-facebook/validator-amp-facebook.protoascii
index 88fa688c19..d348aec531 100644
--- a/extensions/amp-facebook/validator-amp-facebook.protoascii
+++ b/extensions/amp-facebook/validator-amp-facebook.protoascii
@@ -4,11 +4,11 @@ tags: {  # amp-facebook 1.0
   # The 1.0 amp-facebook script registers all amp-facebook-* components.
   # See https://github.com/ampproject/amphtml/pull/35395 for context.
   spec_name: "amp-facebook 1.0"
-  satisfies: "amp-facebook 1.0"
-  excludes: "amp-facebook 0.1"
-  excludes: "amp-facebook-comments 0.1"
-  excludes: "amp-facebook-like 0.1"
-  excludes: "amp-facebook-page 0.1"
+  satisfies_condition: "amp-facebook 1.0"
+  excludes_condition: "amp-facebook 0.1"
+  excludes_condition: "amp-facebook-comments 0.1"
+  excludes_condition: "amp-facebook-like 0.1"
+  excludes_condition: "amp-facebook-page 0.1"
   extension_spec: {
     name: "amp-facebook"
     version_name: "v1.0"
@@ -20,8 +20,8 @@ tags: {  # amp-facebook 1.0
 tags: {  # amp-facebook 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-facebook 0.1"
-  excludes: "amp-facebook 1.0"
+  satisfies_condition: "amp-facebook 0.1"
+  excludes_condition: "amp-facebook 1.0"
   extension_spec: {
     name: "amp-facebook"
     version_name: "v0.1"
@@ -52,7 +52,7 @@ tags: {  # <amp-facebook-comments> via amp-facebook script
   spec_name: "amp-facebook-comments 1.0"
   tag_name: "AMP-FACEBOOK-COMMENTS"
   requires_extension: "amp-facebook"
-  requires: "amp-facebook 1.0"
+  requires_condition: "amp-facebook 1.0"
   attr_lists: "amp-facebook"
   attr_lists: "extended-amp-global"
   amp_layout: {
@@ -69,7 +69,7 @@ tags: {  # <amp-facebook-like> via amp-facebook script
   spec_name: "amp-facebook-like 1.0"
   tag_name: "AMP-FACEBOOK-LIKE"
   requires_extension: "amp-facebook"
-  requires: "amp-facebook 1.0"
+  requires_condition: "amp-facebook 1.0"
   attr_lists: "amp-facebook-strict"
   attr_lists: "extended-amp-global"
   amp_layout: {
@@ -86,7 +86,7 @@ tags: {  # <amp-facebook-page> via amp-facebook script
   spec_name: "amp-facebook-page 1.0"
   tag_name: "AMP-FACEBOOK-PAGE"
   requires_extension: "amp-facebook"
-  requires: "amp-facebook 1.0"
+  requires_condition: "amp-facebook 1.0"
   attr_lists: "amp-facebook-strict"
   attr_lists: "extended-amp-global"
   amp_layout: {
diff --git a/extensions/amp-fit-text/validator-amp-fit-text.protoascii b/extensions/amp-fit-text/validator-amp-fit-text.protoascii
index e303db22b1..9ed1056124 100644
--- a/extensions/amp-fit-text/validator-amp-fit-text.protoascii
+++ b/extensions/amp-fit-text/validator-amp-fit-text.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-fit-text 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-fit-text 1.0"
-  excludes: "amp-fit-text 0.1"
+  satisfies_condition: "amp-fit-text 1.0"
+  excludes_condition: "amp-fit-text 0.1"
   extension_spec: {
     name: "amp-fit-text"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-fit-text 0.1 and latest
   html_format: AMP
   html_format: AMP4ADS
   tag_name: "SCRIPT"
-  satisfies: "amp-fit-text 0.1"
-  excludes: "amp-fit-text 1.0"
+  satisfies_condition: "amp-fit-text 0.1"
+  excludes_condition: "amp-fit-text 1.0"
   extension_spec: {
     name: "amp-fit-text"
     version_name: "v0.1"
diff --git a/extensions/amp-iframe/validator-amp-iframe.protoascii b/extensions/amp-iframe/validator-amp-iframe.protoascii
index d7446e26ba..ad3df9f43f 100644
--- a/extensions/amp-iframe/validator-amp-iframe.protoascii
+++ b/extensions/amp-iframe/validator-amp-iframe.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-iframe 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-iframe 1.0"
-  excludes: "amp-iframe 0.1"
+  satisfies_condition: "amp-iframe 1.0"
+  excludes_condition: "amp-iframe 0.1"
   extension_spec: {
     name: "amp-iframe"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-iframe 1.0
 tags: {  # amp-iframe 0.1 and latest
   html_format: AMP  # Iframes not allowed in ads.
   tag_name: "SCRIPT"
-  satisfies: "amp-iframe 0.1"
-  excludes: "amp-iframe 1.0"
+  satisfies_condition: "amp-iframe 0.1"
+  excludes_condition: "amp-iframe 1.0"
   extension_spec: {
     name: "amp-iframe"
     version_name: "v0.1"
diff --git a/extensions/amp-instagram/validator-amp-instagram.protoascii b/extensions/amp-instagram/validator-amp-instagram.protoascii
index 6fa93298f6..3ad22625f1 100644
--- a/extensions/amp-instagram/validator-amp-instagram.protoascii
+++ b/extensions/amp-instagram/validator-amp-instagram.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-instagram 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-instagram 1.0"
-  excludes: "amp-instagram 0.1"
+  satisfies_condition: "amp-instagram 1.0"
+  excludes_condition: "amp-instagram 0.1"
   extension_spec: {
     name: "amp-instagram"
     version_name: "v1.0"
@@ -14,8 +14,8 @@ tags: {  # amp-instagram 1.0
 tags: {  # amp-instagram 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-instagram 0.1"
-  excludes: "amp-instagram 1.0"
+  satisfies_condition: "amp-instagram 0.1"
+  excludes_condition: "amp-instagram 1.0"
   extension_spec: {
     name: "amp-instagram"
     version_name: "v0.1"
diff --git a/extensions/amp-lightbox/validator-amp-lightbox.protoascii b/extensions/amp-lightbox/validator-amp-lightbox.protoascii
index 29cc75b978..f97b42c4a2 100644
--- a/extensions/amp-lightbox/validator-amp-lightbox.protoascii
+++ b/extensions/amp-lightbox/validator-amp-lightbox.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-lightbox 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-lightbox 1.0"
-  excludes: "amp-lightbox 0.1"
+  satisfies_condition: "amp-lightbox 1.0"
+  excludes_condition: "amp-lightbox 0.1"
   extension_spec: {
     name: "amp-lightbox"
     version_name: "v1.0"
@@ -14,8 +14,8 @@ tags: {  # amp-lightbox 1.0
 tags: {  # amp-lightbox 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-lightbox 0.1"
-  excludes: "amp-lightbox 1.0"
+  satisfies_condition: "amp-lightbox 0.1"
+  excludes_condition: "amp-lightbox 1.0"
   extension_spec: {
     name: "amp-lightbox"
     version_name: "v0.1"
diff --git a/extensions/amp-link-rewriter/validator-amp-link-rewriter.protoascii b/extensions/amp-link-rewriter/validator-amp-link-rewriter.protoascii
index d72dc42579..070929e78d 100644
--- a/extensions/amp-link-rewriter/validator-amp-link-rewriter.protoascii
+++ b/extensions/amp-link-rewriter/validator-amp-link-rewriter.protoascii
@@ -7,9 +7,9 @@ tags: {  # amp-link-rewriter
     version: "latest"
   }
   attr_lists: "common-extension-attrs"
-  satisfies: "amp-link-rewriter"
-  excludes: "amp-skimlinks"
-  excludes: "amp-smartlinks"
+  satisfies_condition: "amp-link-rewriter"
+  excludes_condition: "amp-skimlinks"
+  excludes_condition: "amp-smartlinks"
 }
 tags: {  # amp-link-rewriter (json)
   html_format: AMP
diff --git a/extensions/amp-mathml/validator-amp-mathml.protoascii b/extensions/amp-mathml/validator-amp-mathml.protoascii
index c6575e672d..8b66d0f5bf 100644
--- a/extensions/amp-mathml/validator-amp-mathml.protoascii
+++ b/extensions/amp-mathml/validator-amp-mathml.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-mathml 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-mathml 1.0"
-  excludes: "amp-mathml 0.1"
+  satisfies_condition: "amp-mathml 1.0"
+  excludes_condition: "amp-mathml 0.1"
   extension_spec: {
     name: "amp-mathml"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-mathml 1.0
 tags: {  # amp-mathml 0.1
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-mathml 0.1"
-  excludes: "amp-mathml 1.0"
+  satisfies_condition: "amp-mathml 0.1"
+  excludes_condition: "amp-mathml 1.0"
   extension_spec: {
     name: "amp-mathml"
     version: "0.1"
diff --git a/extensions/amp-mega-menu/validator-amp-mega-menu.protoascii b/extensions/amp-mega-menu/validator-amp-mega-menu.protoascii
index 68755765b1..45fc28fe4d 100644
--- a/extensions/amp-mega-menu/validator-amp-mega-menu.protoascii
+++ b/extensions/amp-mega-menu/validator-amp-mega-menu.protoascii
@@ -178,11 +178,14 @@ descendant_tag_list {
   tag: "H5"
   tag: "H6"
   tag: "I"
+  tag: "I-AMPHTML-SIZER" # For transformed documents.
+  tag: "IMG" # For SSR'ed hero images on transformed documents and native images.
   tag: "INPUT"
   tag: "LABEL"
   tag: "LI"
   tag: "MARK"
   tag: "NAV"
+  tag: "NOSCRIPT" # For amp-img fallbacks.
   tag: "OL"
   tag: "OPTION"
   tag: "P"
diff --git a/extensions/amp-selector/validator-amp-selector.protoascii b/extensions/amp-selector/validator-amp-selector.protoascii
index aa455fcfcd..3f4520dd32 100644
--- a/extensions/amp-selector/validator-amp-selector.protoascii
+++ b/extensions/amp-selector/validator-amp-selector.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-selector 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-selector 1.0"
-  excludes: "amp-selector 0.1"
+  satisfies_condition: "amp-selector 1.0"
+  excludes_condition: "amp-selector 0.1"
   extension_spec: {
     name: "amp-selector"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-selector 0.1 and latest
   html_format: AMP
   html_format: AMP4ADS
   tag_name: "SCRIPT"
-  satisfies: "amp-selector 0.1"
-  excludes: "amp-selector 1.0"
+  satisfies_condition: "amp-selector 0.1"
+  excludes_condition: "amp-selector 1.0"
   extension_spec: {
     name: "amp-selector"
     version_name: "v0.1"
diff --git a/extensions/amp-sidebar/validator-amp-sidebar.protoascii b/extensions/amp-sidebar/validator-amp-sidebar.protoascii
index b917ce009b..782e9360bd 100644
--- a/extensions/amp-sidebar/validator-amp-sidebar.protoascii
+++ b/extensions/amp-sidebar/validator-amp-sidebar.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-sidebar
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-sidebar 1.0"
-  excludes: "amp-sidebar 0.1"
+  satisfies_condition: "amp-sidebar 1.0"
+  excludes_condition: "amp-sidebar 0.1"
   extension_spec: {
     name: "amp-sidebar"
     version_name: "v1.0"
@@ -14,8 +14,8 @@ tags: {  # amp-sidebar
 tags: {  # amp-sidebar
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-sidebar 0.1"
-  excludes: "amp-sidebar 1.0"
+  satisfies_condition: "amp-sidebar 0.1"
+  excludes_condition: "amp-sidebar 1.0"
   extension_spec: {
     name: "amp-sidebar"
     version_name: "v0.1"
diff --git a/extensions/amp-skimlinks/validator-amp-skimlinks.protoascii b/extensions/amp-skimlinks/validator-amp-skimlinks.protoascii
index af84f954fc..d4231f5014 100644
--- a/extensions/amp-skimlinks/validator-amp-skimlinks.protoascii
+++ b/extensions/amp-skimlinks/validator-amp-skimlinks.protoascii
@@ -7,9 +7,9 @@ tags: {  # amp-skimlinks
     version: "latest"
   }
   attr_lists: "common-extension-attrs"
-  satisfies: "amp-skimlinks"
-  excludes: "amp-link-rewriter"
-  excludes: "amp-smartlinks"
+  satisfies_condition: "amp-skimlinks"
+  excludes_condition: "amp-link-rewriter"
+  excludes_condition: "amp-smartlinks"
 }
 
 tags: {  # <amp-skimlinks>
diff --git a/extensions/amp-slikeplayer/validator-amp-slikeplayer.protoascii b/extensions/amp-slikeplayer/validator-amp-slikeplayer.protoascii
new file mode 100644
index 0000000000..d806df992e
--- /dev/null
+++ b/extensions/amp-slikeplayer/validator-amp-slikeplayer.protoascii
@@ -0,0 +1,33 @@
+tags: {  # amp-slikeplayer
+  html_format: AMP
+  tag_name: "SCRIPT"
+  extension_spec: {
+    name: "amp-slikeplayer"
+    version: "0.1"
+    version: "latest"
+    requires_usage: EXEMPTED
+    deprecated_allow_duplicates: true
+  }
+  attr_lists: "common-extension-attrs"
+}
+tags: {  # <amp-slikeplayer>
+  html_format: AMP
+  tag_name: "AMP-SLIKEPLAYER"
+  requires_extension: "amp-slikeplayer"
+   attrs: {
+    name: "data-apikey"
+    mandatory: true
+  }
+  attrs: {
+    name: "data-videoid"
+    mandatory: true
+  }
+  spec_url: "https://developers.slike.in/html5/"
+  amp_layout: {
+    supported_layouts: CONTAINER
+    supported_layouts: FILL
+    supported_layouts: FIXED
+    supported_layouts: FIXED_HEIGHT
+    supported_layouts: RESPONSIVE
+  }
+}
diff --git a/extensions/amp-smartlinks/validator-amp-smartlinks.protoascii b/extensions/amp-smartlinks/validator-amp-smartlinks.protoascii
index c31529e15b..4e92543539 100644
--- a/extensions/amp-smartlinks/validator-amp-smartlinks.protoascii
+++ b/extensions/amp-smartlinks/validator-amp-smartlinks.protoascii
@@ -7,9 +7,9 @@ tags: {  # amp-smartlinks
     version: "latest"
   }
   attr_lists: "common-extension-attrs"
-  satisfies: "amp-smartlinks"
-  excludes: "amp-link-rewriter"
-  excludes: "amp-skimlinks"
+  satisfies_condition: "amp-smartlinks"
+  excludes_condition: "amp-link-rewriter"
+  excludes_condition: "amp-skimlinks"
 }
 
 tags: {  # <amp-smartlinks>
diff --git a/extensions/amp-social-share/validator-amp-social-share.protoascii b/extensions/amp-social-share/validator-amp-social-share.protoascii
index 76971ce7ca..9c07521cff 100644
--- a/extensions/amp-social-share/validator-amp-social-share.protoascii
+++ b/extensions/amp-social-share/validator-amp-social-share.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-social-share 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-social-share 1.0"
-  excludes: "amp-social-share 0.1"
+  satisfies_condition: "amp-social-share 1.0"
+  excludes_condition: "amp-social-share 0.1"
   extension_spec: {
     name: "amp-social-share"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-social-share 0.1 and latest
   html_format: AMP
   html_format: AMP4ADS
   tag_name: "SCRIPT"
-  satisfies: "amp-social-share 0.1"
-  excludes: "amp-social-share 1.0"
+  satisfies_condition: "amp-social-share 0.1"
+  excludes_condition: "amp-social-share 1.0"
   extension_spec: {
     name: "amp-social-share"
     version_name: "v0.1"
diff --git a/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii b/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii
index f7de4da5e1..78e49c0521 100644
--- a/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii
+++ b/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-soundcloud 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-soundcloud 1.0"
-  excludes: "amp-soundcloud 0.1"
+  satisfies_condition: "amp-soundcloud 1.0"
+  excludes_condition: "amp-soundcloud 0.1"
   extension_spec: {
     name: "amp-soundcloud"
     version_name: "v1.0"
@@ -14,8 +14,8 @@ tags: {  # amp-soundcloud 1.0
 tags: {  # amp-soundcloud 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-soundcloud 0.1"
-  excludes: "amp-soundcloud 1.0"
+  satisfies_condition: "amp-soundcloud 0.1"
+  excludes_condition: "amp-soundcloud 1.0"
   extension_spec: {
     name: "amp-soundcloud"
     version_name: "v0.1"
diff --git a/extensions/amp-story-audio-sticker/validator-amp-story-audio-sticker.protoascii b/extensions/amp-story-audio-sticker/validator-amp-story-audio-sticker.protoascii
new file mode 100644
index 0000000000..a71134bc7f
--- /dev/null
+++ b/extensions/amp-story-audio-sticker/validator-amp-story-audio-sticker.protoascii
@@ -0,0 +1,65 @@
+tags: {  # amp-story-audio-sticker
+  html_format: AMP
+  tag_name: "SCRIPT"
+  extension_spec: {
+    name: "amp-story-audio-sticker"
+    version: "0.1"
+  }
+  attr_lists: "common-extension-attrs"
+}
+tags: {  # <amp-story-audio-sticker>
+  html_format: AMP
+  tag_name: "AMP-STORY-AUDIO-STICKER"
+  requires_extension: "amp-story-audio-sticker"
+  mandatory_parent: "AMP-STORY-GRID-LAYER"
+  attr_lists: "extended-amp-global"
+  amp_layout: {
+    supported_layouts: CONTAINER
+  }
+  attrs: {
+    name: "size"
+    value: "small"
+    value: "large"
+  }
+  attrs: {
+    name: "sticker"
+    value: "headphone-cat"
+    value: "tape-player"
+    value: "loud-speaker"
+    value: "audio-cloud"
+  }
+  attrs: {
+    name: "sticker-style"
+    value: "outline"
+    value: "dropshadow"
+  }
+}
+
+tags: {  # <amp-story-audio-sticker-pretap>
+  html_format: AMP
+  tag_name: "AMP-STORY-AUDIO-STICKER-PRETAP"
+  requires_extension: "amp-story-audio-sticker"
+  mandatory_parent: "AMP-STORY-AUDIO-STICKER"
+  descendant_tag_list: "amp-story-audio-sticker-allowed-descendants"
+  amp_layout: {
+    supported_layouts: CONTAINER
+  }
+}
+
+tags: {  # <amp-story-audio-sticker-posttap>
+  html_format: AMP
+  tag_name: "AMP-STORY-AUDIO-STICKER-POSTTAP"
+  requires_extension: "amp-story-audio-sticker"
+  mandatory_parent: "AMP-STORY-AUDIO-STICKER"
+  descendant_tag_list: "amp-story-audio-sticker-allowed-descendants"
+  amp_layout: {
+    supported_layouts: CONTAINER
+  }
+}
+
+descendant_tag_list: {
+  name: "amp-story-audio-sticker-allowed-descendants"
+  tag: "AMP-IMG"
+  tag: "DIV"
+  tag: "SPAN"
+}
\ No newline at end of file
diff --git a/extensions/amp-story-auto-ads/validator-amp-story-auto-ads.protoascii b/extensions/amp-story-auto-ads/validator-amp-story-auto-ads.protoascii
index 235c23760b..cfc8d6760f 100644
--- a/extensions/amp-story-auto-ads/validator-amp-story-auto-ads.protoascii
+++ b/extensions/amp-story-auto-ads/validator-amp-story-auto-ads.protoascii
@@ -19,6 +19,12 @@ tags: {  # <amp-story-auto-ads>
   mandatory_parent: "AMP-STORY"
   unique: true
   spec_url: "https://amp.dev/documentation/components/amp-story-auto-ads/"
+  attrs: {
+    name: "src"
+    value_url: {
+      protocol: "https"
+    }
+  }
 }
 tags: {  # amp-story-auto-ads (json config)
   html_format: AMP
diff --git a/extensions/amp-story-interactive/validator-amp-story-interactive.protoascii b/extensions/amp-story-interactive/validator-amp-story-interactive.protoascii
index dabafc3cf2..7c1f82ab10 100644
--- a/extensions/amp-story-interactive/validator-amp-story-interactive.protoascii
+++ b/extensions/amp-story-interactive/validator-amp-story-interactive.protoascii
@@ -331,6 +331,17 @@ attr_lists: {
     }
   }
 }
+tags: {  # <amp-story-interactive-slider>
+  html_format: AMP
+  tag_name: "AMP-STORY-INTERACTIVE-SLIDER"
+  requires_extension: "amp-story-interactive"
+  mandatory_ancestor: "AMP-STORY-GRID-LAYER"
+  attr_lists: "interactive-shared-configs-attrs"
+  attrs: {
+    name: "option-1-text"
+    mandatory: false
+  }
+}
 attr_lists: {
   name: "interactive-options-img-attrs"
   attrs: {
diff --git a/extensions/amp-story-subscriptions/validator-amp-story-subscriptions.protoascii b/extensions/amp-story-subscriptions/validator-amp-story-subscriptions.protoascii
index b9d77326a2..18804bb078 100644
--- a/extensions/amp-story-subscriptions/validator-amp-story-subscriptions.protoascii
+++ b/extensions/amp-story-subscriptions/validator-amp-story-subscriptions.protoascii
@@ -15,4 +15,21 @@ tags: {  # <amp-story-subscriptions>
   amp_layout: {
     supported_layouts: CONTAINER
   }
+  attrs: {
+    name: "price"
+    mandatory: true
+  }
+  attrs: {
+    name: "description"
+    mandatory: true
+  }
+  attrs: {
+    name: "subscriptions-page-index"
+  }
+  attrs: {
+    name: "headline"
+  }
+  attrs: {
+    name: "additional-description"
+  }
 }
diff --git a/extensions/amp-story/validator-amp-story.protoascii b/extensions/amp-story/validator-amp-story.protoascii
index fe284b6506..2de6e5875f 100644
--- a/extensions/amp-story/validator-amp-story.protoascii
+++ b/extensions/amp-story/validator-amp-story.protoascii
@@ -17,7 +17,7 @@ tags: {  # <amp-story>
   # TODO(gregable): This global requires/satisfies approach only works because
   # there is only one <amp-story standalone> in a document. We really want this
   # requirement to be expressed on the <amp-story> children, however.
-  requires: "amp-story-page"
+  requires_condition: "amp-story-page"
   attrs: {
     name: "background-audio"
     value_url: {
@@ -97,6 +97,10 @@ tags: {  # <amp-story>
     name: "live-story-disabled"
     value: ""
   }
+  attrs: {
+    name: "desktop-aspect-ratio"
+    value_regex: "\d+:\d+"
+  }
   siblings_disallowed: true
   child_tags: {
     mandatory_min_num_child_tags: 1
@@ -110,6 +114,7 @@ tags: {  # <amp-story>
     child_tag_name_oneof: "AMP-STORY-BOOKEND"
     child_tag_name_oneof: "AMP-STORY-PAGE"
     child_tag_name_oneof: "AMP-STORY-SOCIAL-SHARE"
+    child_tag_name_oneof: "AMP-STORY-SUBSCRIPTIONS"
   }
 }
 tags: {  # <amp-story-page>
@@ -117,7 +122,7 @@ tags: {  # <amp-story-page>
   tag_name: "AMP-STORY-PAGE"
   requires_extension: "amp-story"
   mandatory_parent: "AMP-STORY"
-  satisfies: "amp-story-page"
+  satisfies_condition: "amp-story-page"
   attrs: { name: "auto-advance-after" }
   attrs: {
     name: "background-audio"
@@ -468,7 +473,7 @@ tags: {  # amp-story-consent (json)
   requires_extension: "amp-story"
   mandatory_parent: "AMP-STORY-CONSENT"
   unique: true
-  satisfies: "amp-story-consent extension .json script"
+  satisfies_condition: "amp-story-consent extension .json script"
   attrs: {
     name: "type"
     mandatory: true
@@ -489,7 +494,7 @@ tags: {  # <amp-story-consent>
   requires_extension: "amp-consent"
   requires_extension: "amp-story"
   mandatory_parent: "AMP-CONSENT"
-  requires: "amp-story-consent extension .json script"
+  requires_condition: "amp-story-consent extension .json script"
   attr_lists: "mandatory-id-attr"
   child_tags: {
     mandatory_num_child_tags: 1
@@ -711,6 +716,7 @@ descendant_tag_list: {
   tag: "ADDRESS"
   tag: "AMP-ANALYTICS"
   tag: "AMP-AUDIO"
+  tag: "AMP-BODYMOVIN-ANIMATION"
   tag: "AMP-DATE-COUNTDOWN"
   tag: "AMP-DATE-DISPLAY"
   tag: "AMP-EXPERIMENT"
@@ -725,6 +731,9 @@ descendant_tag_list: {
   tag: "AMP-RENDER"
   tag: "AMP-STATE"
   tag: "AMP-STORY-360"
+  tag: "AMP-STORY-AUDIO-STICKER"
+  tag: "AMP-STORY-AUDIO-STICKER-PRETAP"
+  tag: "AMP-STORY-AUDIO-STICKER-POSTTAP"
   tag: "AMP-STORY-AUTO-ANALYTICS"
   tag: "AMP-STORY-CAPTIONS"
   tag: "AMP-STORY-INTERACTIVE-BINARY-POLL"
@@ -733,6 +742,7 @@ descendant_tag_list: {
   tag: "AMP-STORY-INTERACTIVE-POLL"
   tag: "AMP-STORY-INTERACTIVE-QUIZ"
   tag: "AMP-STORY-INTERACTIVE-RESULTS"
+  tag: "AMP-STORY-INTERACTIVE-SLIDER"
   tag: "AMP-STORY-PANNING-MEDIA"
   tag: "AMP-STORY-SHOPPING-TAG"
   tag: "AMP-TIMEAGO"
@@ -972,7 +982,7 @@ tags: {  # <amp-story-animation> <script>
   tag_name: "SCRIPT"
   spec_name: "amp-story-animation json script"
   mandatory_parent: "AMP-STORY-ANIMATION"
-  satisfies: "amp-story-animation json script"
+  satisfies_condition: "amp-story-animation json script"
   attrs: {
     name: "type"
     mandatory: true
@@ -992,7 +1002,7 @@ tags: {  # <amp-story-animation>
   html_format: AMP
   tag_name: "AMP-STORY-ANIMATION"
   requires_extension: "amp-story"
-  requires: "amp-story-animation json script"
+  requires_condition: "amp-story-animation json script"
   mandatory_parent: "AMP-STORY-PAGE"
   attrs: { name: "animate-in-after" }
   attrs: {
diff --git a/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii b/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii
index 7a696b625a..3d2834f562 100644
--- a/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii
+++ b/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii
@@ -74,8 +74,8 @@ tags: {  # <section subscriptions-section="content" swg_amp_cache_nonce="NONCE">
   html_format: AMP
   tag_name: "SECTION"
   spec_name: "subscriptions-section content swg_amp_cache_nonce"
-  requires: "span swg_amp_cache_nonce"
-  satisfies: "subscriptions-section content swg_amp_cache_nonce"
+  requires_condition: "span swg_amp_cache_nonce"
+  satisfies_condition: "subscriptions-section content swg_amp_cache_nonce"
   mandatory_ancestor: "BODY"
   attrs: {
     name: "encrypted"
@@ -118,8 +118,8 @@ tags: {  # <span swg_amp_cache_nonce="NONCE">
   html_format: AMP
   tag_name: "SPAN"
   spec_name: "span swg_amp_cache_nonce"
-  requires: "subscriptions-section content swg_amp_cache_nonce"
-  satisfies: "span swg_amp_cache_nonce"
+  requires_condition: "subscriptions-section content swg_amp_cache_nonce"
+  satisfies_condition: "span swg_amp_cache_nonce"
   mandatory_ancestor: "BODY"
   requires_extension: "amp-subscriptions"
   attrs: {
diff --git a/extensions/amp-twitter/validator-amp-twitter.protoascii b/extensions/amp-twitter/validator-amp-twitter.protoascii
index fde96f89ab..815fa44430 100644
--- a/extensions/amp-twitter/validator-amp-twitter.protoascii
+++ b/extensions/amp-twitter/validator-amp-twitter.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-twitter 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-twitter 1.0"
-  excludes: "amp-twitter 0.1"
+  satisfies_condition: "amp-twitter 1.0"
+  excludes_condition: "amp-twitter 0.1"
   extension_spec: {
     name: "amp-twitter"
     version_name: "v1.0"
@@ -14,8 +14,8 @@ tags: {  # amp-twitter 1.0
 tags: {  # amp-twitter 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-twitter 0.1"
-  excludes: "amp-twitter 1.0"
+  satisfies_condition: "amp-twitter 0.1"
+  excludes_condition: "amp-twitter 1.0"
   extension_spec: {
     name: "amp-twitter"
     version_name: "v0.1"
diff --git a/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii b/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii
index a734dce91e..b6a29a46d8 100644
--- a/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii
+++ b/extensions/amp-video-iframe/validator-amp-video-iframe.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-video-iframe
   html_format: AMP  # Iframes not allowed in ads.
   tag_name: "SCRIPT"
-  satisfies: "amp-video-iframe 1.0"
-  excludes: "amp-video-iframe 0.1"
+  satisfies_condition: "amp-video-iframe 1.0"
+  excludes_condition: "amp-video-iframe 0.1"
   extension_spec: {
     name: "amp-video-iframe"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-video-iframe
 tags: {  # amp-video-iframe
   html_format: AMP  # Iframes not allowed in ads.
   tag_name: "SCRIPT"
-  satisfies: "amp-video-iframe 0.1"
-  excludes: "amp-video-iframe 1.0"
+  satisfies_condition: "amp-video-iframe 0.1"
+  excludes_condition: "amp-video-iframe 1.0"
   extension_spec: {
     name: "amp-video-iframe"
     version_name: "v0.1"
diff --git a/extensions/amp-video/validator-amp-video.protoascii b/extensions/amp-video/validator-amp-video.protoascii
index 321ca52d57..b937dca0c2 100644
--- a/extensions/amp-video/validator-amp-video.protoascii
+++ b/extensions/amp-video/validator-amp-video.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-video 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-video 1.0"
-  excludes: "amp-video 0.1"
+  satisfies_condition: "amp-video 1.0"
+  excludes_condition: "amp-video 0.1"
   extension_spec: {
     name: "amp-video"
     version_name: "v1.0"
@@ -16,8 +16,8 @@ tags: {  # amp-video 0.1
   html_format: AMP
   html_format: AMP4ADS
   tag_name: "SCRIPT"
-  satisfies: "amp-video 0.1"
-  excludes: "amp-video 1.0"
+  satisfies_condition: "amp-video 0.1"
+  excludes_condition: "amp-video 1.0"
   extension_spec: {
     name: "amp-video"
     version: "0.1"
diff --git a/extensions/amp-vimeo/validator-amp-vimeo.protoascii b/extensions/amp-vimeo/validator-amp-vimeo.protoascii
index 4ebd8bf574..793513af2c 100644
--- a/extensions/amp-vimeo/validator-amp-vimeo.protoascii
+++ b/extensions/amp-vimeo/validator-amp-vimeo.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-vimeo
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-vimeo 0.1"
-  excludes: "amp-vimeo 1.0"
+  satisfies_condition: "amp-vimeo 0.1"
+  excludes_condition: "amp-vimeo 1.0"
   extension_spec: {
     name: "amp-vimeo"
     version_name: "v0.1"
@@ -17,8 +17,8 @@ tags: {  # amp-vimeo
 tags: {  # amp-vimeo 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-vimeo 1.0"
-  excludes: "amp-vimeo 0.1"
+  satisfies_condition: "amp-vimeo 1.0"
+  excludes_condition: "amp-vimeo 0.1"
   extension_spec: {
     name: "amp-vimeo"
     version_name: "v1.0"
@@ -34,6 +34,10 @@ tags: {  # <amp-vimeo>
     name: "autoplay"
     value: ""
   }
+  attrs: {
+    name: "do-not-track"
+    value: ""
+  }
   attrs: {
     name: "data-videoid"
     mandatory: true
diff --git a/extensions/amp-youtube/validator-amp-youtube.protoascii b/extensions/amp-youtube/validator-amp-youtube.protoascii
index bd57af18b8..411cb89b67 100644
--- a/extensions/amp-youtube/validator-amp-youtube.protoascii
+++ b/extensions/amp-youtube/validator-amp-youtube.protoascii
@@ -1,8 +1,8 @@
 tags: {  # amp-youtube 1.0
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-youtube 1.0"
-  excludes: "amp-youtube 0.1"
+  satisfies_condition: "amp-youtube 1.0"
+  excludes_condition: "amp-youtube 0.1"
   extension_spec: {
     name: "amp-youtube"
     version_name: "v1.0"
@@ -15,8 +15,8 @@ tags: {  # amp-youtube 1.0
 tags: {  # amp-youtube 0.1 and latest
   html_format: AMP
   tag_name: "SCRIPT"
-  satisfies: "amp-youtube 0.1"
-  excludes: "amp-youtube 1.0"
+  satisfies_condition: "amp-youtube 0.1"
+  excludes_condition: "amp-youtube 1.0"
   extension_spec: {
     name: "amp-youtube"
     version_name: "v0.1"
diff --git a/validator/validator-css.protoascii b/validator/validator-css.protoascii
index a888200e82..a73c09538e 100644
--- a/validator/validator-css.protoascii
+++ b/validator/validator-css.protoascii
@@ -626,7 +626,7 @@ css {
 css {
   html_format: AMP4EMAIL
   disabled_by: "data-css-strict"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-css"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/email/learn/email-spec/amp-email-css"
 
   # Due to a bug, we allowed unlimited doc-level bytes for CSS in AMP4EMAIL
   # formats. To avoid breaking emails, this is temporarily set to a warning but
@@ -636,7 +636,7 @@ css {
   max_bytes_per_inline_style: 1000
 
   max_bytes_spec_url:
-  "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
+  "https://amp.dev/documentation/guides-and-tutorials/email/learn/spec/amphtml#maximum-size"
   url_bytes_included: true
 
   allow_all_declaration_in_style: true
@@ -653,15 +653,14 @@ css {
 css {
   html_format: AMP4EMAIL
   enabled_by: "data-css-strict"
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-css"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/email/learn/email-spec/amp-email-css"
 
   max_bytes_is_warning: false
   max_bytes: 75000
   max_bytes_per_inline_style: 1000
 
-  # TODO(b/162314127): add maximum size documentation to the email spec
   max_bytes_spec_url:
-  "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
+  "https://amp.dev/documentation/guides-and-tutorials/email/learn/spec/amphtml#maximum-size"
   url_bytes_included: true
 
   allow_all_declaration_in_style: false
@@ -924,7 +923,7 @@ tags: {  # <style amp-custom>, AMP4EMAIL, not data-css-strict
     doc_css_bytes: true
     max_bytes: 75000
     max_bytes_spec_url:
-    "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
+    "https://amp.dev/documentation/guides-and-tutorials/email/learn/spec/amphtml#maximum-size"
 
     css_spec: {
       at_rule_spec: {
@@ -960,7 +959,7 @@ tags: {  # <style amp-custom>, AMP4EMAIL, not data-css-strict
       error_message: "CSS i-amphtml- name prefix"
     }
   }
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-css"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/email/learn/email-spec/amp-email-css"
 }
 
 tags: {  # <style amp-custom>, AMP4EMAIL, data-css-strict
@@ -989,7 +988,7 @@ tags: {  # <style amp-custom>, AMP4EMAIL, data-css-strict
     doc_css_bytes: true
     max_bytes: 75000
     max_bytes_spec_url:
-    "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#maximum-size"
+    "https://amp.dev/documentation/guides-and-tutorials/email/learn/spec/amphtml#maximum-size"
 
     css_spec: {
       at_rule_spec: {
@@ -1093,7 +1092,7 @@ tags: {  # <style amp-custom>, AMP4EMAIL, data-css-strict
       error_message: "CSS i-amphtml- name prefix"
     }
   }
-  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-css"
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/email/learn/email-spec/amp-email-css"
 }
 
 tags: {  # `<style amp-boilerplate>`, [AMP]
@@ -1101,7 +1100,7 @@ tags: {  # `<style amp-boilerplate>`, [AMP]
   tag_name: "STYLE"
   spec_name: "head > style[amp-boilerplate]"
   descriptive_name: "head > style[amp-boilerplate]"
-  satisfies: "style[amp-boilerplate]"
+  satisfies_condition: "style[amp-boilerplate]"
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
@@ -1125,7 +1124,7 @@ tags: {  # `<style amp4ads-boilerplate>`, AMP4ADS
   tag_name: "STYLE"
   spec_name: "head > style[amp4ads-boilerplate]"
   descriptive_name: "head > style[amp4ads-boilerplate]"
-  satisfies: "style[amp-boilerplate]"
+  satisfies_condition: "style[amp-boilerplate]"
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
@@ -1150,7 +1149,7 @@ tags: {  # `<style amp4email-boilerplate>`, AMP4EMAIL
   tag_name: "STYLE"
   spec_name: "head > style[amp4email-boilerplate]"
   descriptive_name: "head > style[amp4email-boilerplate]"
-  satisfies: "style[amp-boilerplate]"
+  satisfies_condition: "style[amp-boilerplate]"
   unique: true
   mandatory_parent: "HEAD"
   attrs: {
@@ -1173,7 +1172,7 @@ tags: {  # `<style amp-boilerplate>`, [AMP]
   tag_name: "STYLE"
   spec_name: "noscript > style[amp-boilerplate]"
   descriptive_name: "noscript > style[amp-boilerplate]"
-  satisfies: "noscript > style[amp-boilerplate]"
+  satisfies_condition: "noscript > style[amp-boilerplate]"
   unique: true
   mandatory_parent: "NOSCRIPT"
   mandatory_ancestor: "HEAD"
diff --git a/validator/validator-main.protoascii b/validator/validator-main.protoascii
index 3fa17525a3..5e5f882a51 100644
--- a/validator/validator-main.protoascii
+++ b/validator/validator-main.protoascii
@@ -160,6 +160,12 @@ attr_lists: {
   attrs: { name: "charset" value_casei: "utf-8" }
   attrs: { name: "color" }
   attrs: { name: "crossorigin" }
+  attrs: {
+    name: "fetchpriority"
+    value_casei: "high"
+    value_casei: "low"
+    value_casei: "auto"
+  }
   attrs: { name: "hreflang" }
   attrs: { name: "media" }
   attrs: { name: "sizes" }
@@ -241,7 +247,7 @@ tags: {
   spec_name: "link rel=manifest"
   descriptive_name: "link rel=manifest"
   mandatory_parent: "HEAD"
-  satisfies: "amp-app-banner data source"
+  satisfies_condition: "amp-app-banner data source"
   attrs: {
     name: "href"
     mandatory: true
@@ -330,6 +336,8 @@ tags: {
     mandatory: true
     value: "https://cdn.ampproject.org/v0/amp-story-1.0.css"
     value: "https://cdn.ampproject.org/lts/v0/amp-story-1.0.css"
+    value: "https://ampjs.org/v0/amp-story-1.0.css"
+    value: "https://ampjs.org/lts/v0/amp-story-1.0.css"
   }
   attrs: { name: "integrity" }  # SRI attribute (https://www.w3.org/TR/SRI/)
   attrs: { name: "media" }
@@ -532,7 +540,7 @@ tags: {
   tag_name: "META"
   spec_name: "meta name=apple-itunes-app"
   mandatory_parent: "HEAD"
-  satisfies: "amp-app-banner data source"
+  satisfies_condition: "amp-app-banner data source"
   attrs: {
     name: "content"
     mandatory: true
@@ -593,7 +601,7 @@ tags: {
   tag_name: "META"
   spec_name: "meta name=amp-consent-blocking"
   mandatory_parent: "HEAD"
-  satisfies: "meta name=amp-consent-blocking"
+  satisfies_condition: "meta name=amp-consent-blocking"
   unique: true
   attrs: {
     name: "content"
@@ -625,7 +633,7 @@ tags: {
   }
   # Disabled because there are no active origin experiments; uncomment when
   # there is at least one corresponding `requires` clause.
-  # satisfies: "amp-experiment-token"
+  # satisfies_condition: "amp-experiment-token"
 }
 # AMP metadata, name=amp-link-variable-allowed-origin
 # https://github.com/ampproject/amphtml/issues/8132
@@ -1347,6 +1355,13 @@ tags: {
   html_format: AMP
   html_format: AMP4ADS
   tag_name: "A"
+  attrs: {
+    name: "attributionsrc"
+    value_url: {
+      protocol: "https"
+      allow_empty: true
+    }
+  }
   attrs: { name: "border" }  # Not valid html5 but commonly used and supported.
   attrs: { name: "download" }
   attrs: {
@@ -1792,6 +1807,12 @@ attr_lists: {
     value_casei: "anonymous"
     value_casei: "use-credentials"
   }
+  attrs: {
+    name: "fetchpriority"
+    value_casei: "high"
+    value_casei: "low"
+    value_casei: "auto"
+  }
   attrs: { name: "height" }
   attrs: { name: "hspace" }
   # https://developers.google.com/web/updates/2019/02/priority-hints
@@ -2588,6 +2609,7 @@ tags {  # <form method=POST ...>
     }
     disallowed_value_regex: "__amp_source_origin"
   }
+  attrs: { name: "xssi-prefix" }
   attr_lists: "form-name-attr"
 }
 # AMP4EMAIL allows action-xhr and disallows action attribute. It also disallows
@@ -3015,7 +3037,7 @@ tags: {
   html_format: AMP4ADS
   tag_name: "BUTTON"
   spec_name: "amp-app-banner button[open-button]"
-  satisfies: "amp-app-banner button[open-button]"
+  satisfies_condition: "amp-app-banner button[open-button]"
   mandatory_ancestor: "AMP-APP-BANNER"
   attrs: {
     name: "open-button"
@@ -3326,9 +3348,9 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml engine script"
   descriptive_name: "amphtml engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
-  requires: "style[amp-boilerplate]"
-  requires: "noscript > style[amp-boilerplate]"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
+  requires_condition: "style[amp-boilerplate]"
+  requires_condition: "noscript > style[amp-boilerplate]"
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
@@ -3337,7 +3359,7 @@ tags: {
     name: "src"
     mandatory: true
     value: "https://cdn.ampproject.org/v0.js"
-    dispatch_key: NAME_VALUE_DISPATCH
+    value: "https://ampjs.org/v0.js"
   }
   cdata: {
     disallowed_cdata_regex: {
@@ -3355,7 +3377,7 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml engine script (transformed)"
   descriptive_name: "amphtml engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
@@ -3364,6 +3386,7 @@ tags: {
     name: "src"
     mandatory: true
     value: "https://cdn.ampproject.org/v0.js"
+    value: "https://ampjs.org/v0.js"
     dispatch_key: NAME_VALUE_DISPATCH
   }
   cdata: {
@@ -3380,9 +3403,9 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml engine script (LTS)"
   descriptive_name: "amphtml engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
-  requires: "style[amp-boilerplate]"
-  requires: "noscript > style[amp-boilerplate]"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
+  requires_condition: "style[amp-boilerplate]"
+  requires_condition: "noscript > style[amp-boilerplate]"
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
@@ -3391,6 +3414,7 @@ tags: {
     name: "src"
     mandatory: true
     value: "https://cdn.ampproject.org/lts/v0.js"
+    value: "https://ampjs.org/lts/v0.js"
     dispatch_key: NAME_VALUE_DISPATCH
   }
   cdata: {
@@ -3409,7 +3433,7 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml engine script (LTS) (transformed)"
   descriptive_name: "amphtml engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
@@ -3418,6 +3442,7 @@ tags: {
     name: "src"
     mandatory: true
     value: "https://cdn.ampproject.org/lts/v0.js"
+    value: "https://ampjs.org/lts/v0.js"
     dispatch_key: NAME_VALUE_DISPATCH
   }
   cdata: {
@@ -3434,11 +3459,11 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml module engine script"
   descriptive_name: "amphtml module engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
   unique: true
   mandatory_parent: "HEAD"
-  satisfies: "amphtml module engine script"
-  requires: "amphtml nomodule engine script"
+  satisfies_condition: "amphtml module engine script"
+  requires_condition: "amphtml nomodule engine script"
   attr_lists: "nonce-attr"
   attr_lists: "amphtml-module-engine-attrs"
   attrs: {
@@ -3459,11 +3484,11 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml nomodule engine script"
   descriptive_name: "amphtml nomodule engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
   unique: true
   mandatory_parent: "HEAD"
-  satisfies: "amphtml nomodule engine script"
-  requires: "amphtml module engine script"
+  satisfies_condition: "amphtml nomodule engine script"
+  requires_condition: "amphtml module engine script"
   attr_lists: "nonce-attr"
   attr_lists: "amphtml-nomodule-engine-attrs"
   attrs: {
@@ -3484,17 +3509,18 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml module LTS engine script"
   descriptive_name: "amphtml module LTS engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
   unique: true
   mandatory_parent: "HEAD"
-  satisfies: "amphtml module LTS engine script"
-  requires: "amphtml nomodule LTS engine script"
+  satisfies_condition: "amphtml module LTS engine script"
+  requires_condition: "amphtml nomodule LTS engine script"
   attr_lists: "nonce-attr"
   attr_lists: "amphtml-module-engine-attrs"
   attrs: {
     name: "src"
     mandatory: true
     value: "https://cdn.ampproject.org/lts/v0.mjs"
+    value: "https://ampjs.org/lts/v0.mjs"
     dispatch_key: NAME_VALUE_DISPATCH
   }
   cdata: {
@@ -3509,17 +3535,18 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml nomodule LTS engine script"
   descriptive_name: "amphtml nomdule LTS engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
   unique: true
   mandatory_parent: "HEAD"
-  satisfies: "amphtml nomodule LTS engine script"
-  requires: "amphtml module LTS engine script"
+  satisfies_condition: "amphtml nomodule LTS engine script"
+  requires_condition: "amphtml module LTS engine script"
   attr_lists: "nonce-attr"
   attr_lists: "amphtml-nomodule-engine-attrs"
   attrs: {
     name: "src"
     mandatory: true
     value: "https://cdn.ampproject.org/lts/v0.js"
+    value: "https://ampjs.org/lts/v0.js"
     dispatch_key: NAME_VALUE_DISPATCH
   }
   cdata: {
@@ -3533,8 +3560,8 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amphtml engine script [AMP4EMAIL]"
   descriptive_name: "amphtml engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
-  requires: "style[amp-boilerplate]"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
+  requires_condition: "style[amp-boilerplate]"
   mandatory: true
   unique: true
   mandatory_parent: "HEAD"
@@ -3559,8 +3586,8 @@ tags: {
   tag_name: "SCRIPT"
   spec_name: "amp4ads engine script"
   descriptive_name: "amphtml engine script"
-  satisfies: "amphtml javascript runtime (v0.js)"
-  requires: "style[amp-boilerplate]"
+  satisfies_condition: "amphtml javascript runtime (v0.js)"
+  requires_condition: "style[amp-boilerplate]"
   mandatory: true
   unique: true
   mandatory_parent: "HEAD"
@@ -3910,7 +3937,7 @@ tags: {  # <amp-img>
   tag_name: "AMP-IMG"
   # amp-img does not require a matching extension script, it's built in to v0.
   # js directly, so we explicitly list that dependency here.
-  requires: "amphtml javascript runtime (v0.js)"
+  requires_condition: "amphtml javascript runtime (v0.js)"
   attrs: { name: "alt" }
   attrs: { name: "attribution" }
   attrs: { name: "crossorigin" }
@@ -3952,7 +3979,7 @@ tags: {  # <amp-img i-amphtml-ssr>
   spec_name: "amp-img (transformed)"
   # amp-img does not require a matching extension script, it's built in to v0.
   # js directly, so we explicitly list that dependency here.
-  requires: "amphtml javascript runtime (v0.js)"
+  requires_condition: "amphtml javascript runtime (v0.js)"
   attrs: {
     dispatch_key: NAME_DISPATCH
     name: "i-amphtml-ssr"
@@ -3967,6 +3994,12 @@ tags: {  # <amp-img i-amphtml-ssr>
     value_casei: "low"
     value_casei: "auto"
   }
+  attrs: {
+    name: "fetchpriority",
+    value_casei: "high"
+    value_casei: "low"
+    value_casei: "auto"
+  }
   attrs: { name: "object-fit" }
   attrs: { name: "object-position" }
   attrs: { name: "placeholder" }
@@ -4000,7 +4033,7 @@ tags: {  # <amp-img>
   # js directly, so we explicitly list that dependency here. This is redundant
   # for email since v0.js is still required, but we include to for consistency
   # and to future proof.
-  requires: "amphtml javascript runtime (v0.js)"
+  requires_condition: "amphtml javascript runtime (v0.js)"
   attrs: { name: "alt" }
   attrs: { name: "attribution" }
   attrs: { name: "placeholder" }
@@ -4027,7 +4060,7 @@ tags: {  # <amp-layout>
   tag_name: "AMP-LAYOUT"
   # amp-pixel does not require a matching extension script, it's built in to v0.
   # js directly, so we explicitly list that dependency here.
-  requires: "amphtml javascript runtime (v0.js)"
+  requires_condition: "amphtml javascript runtime (v0.js)"
   attr_lists: "extended-amp-global"
   spec_url: "https://amp.dev/documentation/components/amp-layout/"
   amp_layout: {
@@ -4047,7 +4080,7 @@ tags: {  # <amp-pixel>
   tag_name: "AMP-PIXEL"
   # amp-pixel does not require a matching extension script, it's built in to v0.
   # js directly, so we explicitly list that dependency here.
-  requires: "amphtml javascript runtime (v0.js)"
+  requires_condition: "amphtml javascript runtime (v0.js)"
   attrs: { name: "allow-ssr-img" }
   attrs: {
     name: "referrerpolicy"
@@ -4063,6 +4096,13 @@ tags: {  # <amp-pixel>
     }
     disallowed_value_regex: "__amp_source_origin"
   }
+  attrs: {
+    name: "attributionsrc"
+    value_url: {
+      protocol: "https"
+      allow_empty: true
+    }
+  }
   attr_lists: "extended-amp-global"
   spec_url: "https://amp.dev/documentation/components/amp-pixel/"
   amp_layout {
@@ -4168,6 +4208,12 @@ tags: {
   attrs: { name: "attribution" }
   attrs: { name: "height" }
   # https://developers.google.com/web/updates/2019/02/priority-hints
+  attrs: {
+    name: "fetchpriority"
+    value_casei: "high"
+    value_casei: "low"
+    value_casei: "auto"
+  }
   attrs: {
     name: "importance"
     value_casei: "high"

Comment on lines 414 to 416
if satisfies in extension_specs_by_satisfies:
raise Exception( 'Duplicate extension script that satisfies %s.' % satisfies )
# TODO: Confirm once if this need to be disabled as there can be more than once spec per extension.
# if satisfies in extension_specs_by_satisfies:
# raise Exception( 'Duplicate extension script that satisfies %s.' % satisfies )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like satisfies was renamed to satisfies_condition in the protoascii, so this update can be made above.

@westonruter westonruter added this to the v2.4.3 milestone Sep 11, 2023
@thelovekesh thelovekesh force-pushed the update/amphtml-spec-2309011827000 branch from 01cc0cc to 89e60a2 Compare September 12, 2023 05:05
@thelovekesh thelovekesh force-pushed the update/amphtml-spec-2309011827000 branch from d33906a to da942cf Compare September 20, 2023 15:44
includes/deprecated.php Outdated Show resolved Hide resolved
includes/deprecated.php Outdated Show resolved Hide resolved
includes/sanitizers/class-amp-script-sanitizer.php Outdated Show resolved Hide resolved
@thelovekesh thelovekesh force-pushed the update/amphtml-spec-2309011827000 branch from ca8cc7f to 1bbacbb Compare October 14, 2023 08:32
@thelovekesh thelovekesh marked this pull request as ready for review October 16, 2023 18:57
@github-actions
Copy link
Contributor

github-actions bot commented Oct 16, 2023

Plugin builds for 93ade31 are ready 🛎️!

@codecov
Copy link

codecov bot commented Oct 16, 2023

Codecov Report

Merging #7615 (1563115) into develop (4132152) will decrease coverage by 1.34%.
The diff coverage is 50.00%.

❗ Current head 1563115 differs from pull request most recent head 93ade31. Consider uploading reports for the commit 93ade31 to get more accurate results

Additional details and impacted files

Impacted file tree graph

@@              Coverage Diff              @@
##             develop    #7615      +/-   ##
=============================================
- Coverage      78.49%   77.15%   -1.34%     
+ Complexity      6909     6897      -12     
=============================================
  Files            210      277      +67     
  Lines          22228    23356    +1128     
=============================================
+ Hits           17447    18021     +574     
- Misses          4781     5335     +554     
Flag Coverage Δ
javascript 64.73% <ø> (?)
php 77.82% <50.00%> (-0.67%) ⬇️
unit 77.82% <50.00%> (-0.67%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files Coverage Δ
includes/amp-helper-functions.php 85.58% <100.00%> (-0.36%) ⬇️
includes/class-amp-theme-support.php 88.21% <ø> (-0.31%) ⬇️
...es/sanitizers/class-amp-allowed-tags-generated.php 57.14% <ø> (ø)
includes/sanitizers/class-amp-bento-sanitizer.php 0.00% <ø> (-98.67%) ⬇️
includes/sanitizers/class-amp-script-sanitizer.php 66.35% <ø> (ø)
...nitizers/class-amp-tag-and-attribute-sanitizer.php 96.31% <ø> (-0.04%) ⬇️
src/ValidationExemption.php 98.38% <ø> (ø)
includes/deprecated.php 0.00% <0.00%> (ø)

... and 67 files with indirect coverage changes

@westonruter
Copy link
Member

I'm seeing some missing changes in PHP versus the diff in protoascii:

  • Allow attributionsrc on <a /> amphtml#38652
  • amp-story-audio-sticker-pretap and amp-story-audio-sticker-posttap
  • amp-story-interactive-slider
  • new attributes on amp-story-subscriptions
  • desktop-aspect-ratio on amp-story-page
  • do-not-track attribute on amp-vimeo

Could it be that the diff was gathered for a later release than the PHP was generated from?

Copy link
Member

@westonruter westonruter left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aside from the missing additions, this PR looks great! If fixing the omissions is just a matter of re-running with the current release, then we should do that. Otherwise, that could be done in another PR.

@thelovekesh
Copy link
Collaborator Author

I forgot to mention it here but #7597 also attempted to update the spec previously, which has already covered the above missing changes.

@westonruter westonruter merged commit 339b8e3 into develop Oct 17, 2023
34 of 37 checks passed
@westonruter westonruter deleted the update/amphtml-spec-2309011827000 branch October 17, 2023 16:19
@westonruter westonruter added the Changelogged Whether the issue/PR has been added to release notes. label Nov 6, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Changelogged Whether the issue/PR has been added to release notes.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Skip rendering child amp-img tags of amp-mega-menu
2 participants