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 allowed tags/attributes from spec in amphtml 2003031842100 #4390

Merged
merged 14 commits into from
Mar 18, 2020

Conversation

westonruter
Copy link
Member

@westonruter westonruter commented Mar 15, 2020

Previously #3619.

  • Run ./bin/amphtml-update.sh (lando ssh -c 'bash ./bin/amphtml-update.sh vendor/amphtml')
  • Examine diff for changelog
  • 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

Changelog

  • Add component: amp-inline-gallery, including amp-inline-gallery-pagination and amp-inline-gallery-thumbnails.
  • Add component: amp-mega-menu.
  • Add component: amp-nested-menu. Added amp-nested-submenu-close and amp-nested-submenu-open attributes to nested button elements, as well as adding attributes to div, span, and each level of heading elements (h2h6).
  • New link protocols: chrome and feed. Allowing type of application/rss+xml.
  • Updates to what are allowed in amp-story-page-attachment and amp-story-grid-layer.
  • Update attributes for amp-autocomplete, allowing inline and query attributes, and making filter mandatory.
  • Add dock support to amp-brid-player.
  • Add hide-keyboard-shortcuts-panel to amp-date-picker.
  • Update amp-list, removing [state] attribute and adding xssi-prefix.
  • Update amp-next-page, adding attributes for deep-parsing and max-pages, and adding reference points.
  • Add component: amp-redbull-player.
  • Add intrinsic layout to amp-script.
  • Remove amp-story-access component.
  • Add next-page-no-ad attribute to amp-story-page.
  • Remove amp-user-location component.
  • Allow input[type=button] element.
  • Update script[type=text/plain][template=amp-mustache] to accept an id attribute.
  • Add subscriptions script ciphertext and cryptokeys .json script.
  • Update time to allow pubdate attribute.
  • Update global attribute list to include next-page-hide and next-page-replace.
  • Update visible-when-invalid global attribute to add tooShort value.
  • Add recognition of of LTS release channel. Full support including opt-in will come with Add support for release channel(s) and crossorigin=anonymous scripts and links #4403.
  • Allow crossorigin=anonymous attribute to script and link elements. Will become the default with Add support for release channel(s) and crossorigin=anonymous scripts and links #4403.
  • Add reference points for:
    • amp-mega-menu — note these do not currently enforce validation, as can be seen in the failing and now-reverted commit 7550879. Work will need to be done later to improve validation for reference points. The most important thing is that valid AMP is not being treated as invalid.
      • AMP-MEGA-MENU > AMP-LIST
      • AMP-MEGA-MENU > AMP-LIST > TEMPLATE
      • AMP-MEGA-MENU > NAV
      • AMP-MEGA-MENU NAV > UL/OL
      • AMP-MEGA-MENU NAV > UL/OL > LI
      • AMP-MEGA-MENU item-content
      • AMP-MEGA-MENU item-heading
    • AMP-NEXT-PAGE > [footer]
    • AMP-NEXT-PAGE > [recommendation-box]

Details

(
    PREV_VERSION=1910161528000;
    THIS_VERSION=2003031842100; 
    git checkout $THIS_VERSION;
    git diff $PREV_VERSION...$THIS_VERSION -w -- $( git ls-files | grep '.protoascii' );
    git checkout - > /dev/null
)
Compare 1910161528000..2003031842100
diff --git a/extensions/amp-access/validator-amp-access.protoascii b/extensions/amp-access/validator-amp-access.protoascii
index cf6966c76..2226348dd 100644
--- a/extensions/amp-access/validator-amp-access.protoascii
+++ b/extensions/amp-access/validator-amp-access.protoascii
@@ -20,7 +20,7 @@ tags: {  # amp-access
     name: "amp-access"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-accordion/validator-amp-accordion.protoascii b/extensions/amp-accordion/validator-amp-accordion.protoascii
index c646ff1a8..c1f007a2a 100644
--- a/extensions/amp-accordion/validator-amp-accordion.protoascii
+++ b/extensions/amp-accordion/validator-amp-accordion.protoascii
@@ -22,7 +22,7 @@ tags: {  # amp-accordion
     name: "amp-accordion"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
@@ -35,7 +35,7 @@ tags: {  # amp-accordion
     name: "amp-accordion"
     # AMP4EMAIL doesn't allow version: "latest".
     version: "0.1"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-ad/validator-amp-ad.protoascii b/extensions/amp-ad/validator-amp-ad.protoascii
index 67cce32bb..4cae8ec1b 100644
--- a/extensions/amp-ad/validator-amp-ad.protoascii
+++ b/extensions/amp-ad/validator-amp-ad.protoascii
@@ -38,7 +38,7 @@ tags: {  # amp-ad
     name: "amp-ad"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-analytics/validator-amp-analytics.protoascii b/extensions/amp-analytics/validator-amp-analytics.protoascii
index b63d599a5..b59d28352 100644
--- a/extensions/amp-analytics/validator-amp-analytics.protoascii
+++ b/extensions/amp-analytics/validator-amp-analytics.protoascii
@@ -24,7 +24,7 @@ tags: {  # amp-analytics
     name: "amp-analytics"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-anim/validator-amp-anim.protoascii b/extensions/amp-anim/validator-amp-anim.protoascii
index 56cbfae06..b6656fbfd 100644
--- a/extensions/amp-anim/validator-amp-anim.protoascii
+++ b/extensions/amp-anim/validator-amp-anim.protoascii
@@ -23,7 +23,7 @@ tags: {  # amp-anim
     name: "amp-anim"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-apester-media/validator-amp-apester-media.protoascii b/extensions/amp-apester-media/validator-amp-apester-media.protoascii
index c923f8e8d..1ecb27d54 100644
--- a/extensions/amp-apester-media/validator-amp-apester-media.protoascii
+++ b/extensions/amp-apester-media/validator-amp-apester-media.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-apester-media
     name: "amp-apester-media"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-audio/validator-amp-audio.protoascii b/extensions/amp-audio/validator-amp-audio.protoascii
index 8592a2f64..b35a10c7c 100644
--- a/extensions/amp-audio/validator-amp-audio.protoascii
+++ b/extensions/amp-audio/validator-amp-audio.protoascii
@@ -22,7 +22,7 @@ tags: {  # amp-audio
     version: "0.1"
     version: "latest"
     deprecated_allow_duplicates: true
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
diff --git a/extensions/amp-autocomplete/validator-amp-autocomplete.protoascii b/extensions/amp-autocomplete/validator-amp-autocomplete.protoascii
index 803ec9a2c..4d51a7403 100644
--- a/extensions/amp-autocomplete/validator-amp-autocomplete.protoascii
+++ b/extensions/amp-autocomplete/validator-amp-autocomplete.protoascii
@@ -41,14 +41,24 @@ tags: {  # <amp-autocomplete>
       if_value_regex: "custom"
       also_requires_attr: "filter-expr"
     }
+    mandatory: true
   }
   attrs: {
     name: "filter-expr"
     requires_extension: "amp-bind"
   }
   attrs: { name: "filter-value" }
+  attrs: { name: "highlight-user-entry" }
+  attrs: { name: "inline" }
+  attrs: { name: "items" }
   attrs: { name: "max-entries" }
   attrs: { name: "min-characters" }
+  attrs: {
+    name: "query"
+    trigger: {
+      also_requires_attr: "src"
+    }
+  }
   attrs: {
     name: "src"
     value_url: {
@@ -59,13 +69,8 @@ tags: {  # <amp-autocomplete>
   attrs: { name: "submit-on-enter" }
   attrs: {
     name: "suggest-first"
-    trigger: {
-      also_requires_attr: "filter"
-    }
   }
-  attrs: { name: "highlight-user-entry" }
   attrs: { name: "template" }
-  attrs: { name: "items" }
   # amp-bind
   attrs: {
     name: "[src]"
diff --git a/extensions/amp-bind/validator-amp-bind.protoascii b/extensions/amp-bind/validator-amp-bind.protoascii
index 67b4208d1..13e7b36c5 100644
--- a/extensions/amp-bind/validator-amp-bind.protoascii
+++ b/extensions/amp-bind/validator-amp-bind.protoascii
@@ -24,7 +24,7 @@ tags: {  # amp-bind
     version: "latest"
     # amp-bind has no associated tag which indicates usage of the extension.
     # TODO(gregable): Implement a mechanism to associate attributes with
-    # extension usage and then set this to GRANDFATHERED or ERROR.
+    # extension usage and then set this to EXEMPTED or ERROR.
     requires_usage: NONE
   }
   attr_lists: "common-extension-attrs"
@@ -39,7 +39,7 @@ tags: {  # amp-bind
     version: "0.1"
     # amp-bind has no associated tag which indicates usage of the extension.
     # TODO(gregable): Implement a mechanism to associate attributes with
-    # extension usage and then set this to GRANDFATHERED or ERROR.
+    # extension usage and then set this to EXEMPTED or ERROR.
     requires_usage: NONE
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-brid-player/validator-amp-brid-player.protoascii b/extensions/amp-brid-player/validator-amp-brid-player.protoascii
index 0a6ed37b7..e00484b0c 100644
--- a/extensions/amp-brid-player/validator-amp-brid-player.protoascii
+++ b/extensions/amp-brid-player/validator-amp-brid-player.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-brid-player
     name: "amp-brid-player"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
@@ -60,6 +60,10 @@ tags: {  # <amp-brid-player>
     mandatory_oneof: "['data-outstream', 'data-playlist', 'data-video']"
     value_regex: "[0-9]+"
   }
+  attrs: {
+    name: "dock"
+    requires_extension: "amp-video-docking"
+  }
   attr_lists: "extended-amp-global"
   spec_url: "https://amp.dev/documentation/components/amp-brid-player"
   amp_layout: {
diff --git a/extensions/amp-brightcove/validator-amp-brightcove.protoascii b/extensions/amp-brightcove/validator-amp-brightcove.protoascii
index 872fc4303..c9079d25c 100644
--- a/extensions/amp-brightcove/validator-amp-brightcove.protoascii
+++ b/extensions/amp-brightcove/validator-amp-brightcove.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-brightcove
     name: "amp-brightcove"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-call-tracking/validator-amp-call-tracking.protoascii b/extensions/amp-call-tracking/validator-amp-call-tracking.protoascii
index 48be5dea9..86e50ee96 100644
--- a/extensions/amp-call-tracking/validator-amp-call-tracking.protoascii
+++ b/extensions/amp-call-tracking/validator-amp-call-tracking.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-call-tracking
     name: "amp-call-tracking"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
diff --git a/extensions/amp-carousel/validator-amp-carousel.protoascii b/extensions/amp-carousel/validator-amp-carousel.protoascii
index 11b1e55ab..f94eefebe 100644
--- a/extensions/amp-carousel/validator-amp-carousel.protoascii
+++ b/extensions/amp-carousel/validator-amp-carousel.protoascii
@@ -24,7 +24,7 @@ tags: {  # amp-carousel
     version: "0.1"
     version: "0.2"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii b/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii
index 28959b2ac..c66072a02 100644
--- a/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii
+++ b/extensions/amp-dailymotion/validator-amp-dailymotion.protoascii
@@ -20,7 +20,7 @@ tags: {  # amp-dailymotion
     name: "amp-dailymotion"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-date-picker/validator-amp-date-picker.protoascii b/extensions/amp-date-picker/validator-amp-date-picker.protoascii
index 07633ddae..4379338e2 100644
--- a/extensions/amp-date-picker/validator-amp-date-picker.protoascii
+++ b/extensions/amp-date-picker/validator-amp-date-picker.protoascii
@@ -170,6 +170,10 @@ attr_lists: {
     name: "open-after-select"
     value: ""
   }
+  attrs: {
+    name: "hide-keyboard-shortcuts-panel"
+    value: ""
+  }
   attrs: {
     name: "src"
     value_url: {
diff --git a/extensions/amp-experiment/validator-amp-experiment.protoascii b/extensions/amp-experiment/validator-amp-experiment.protoascii
index 02316d0ee..4c35444db 100644
--- a/extensions/amp-experiment/validator-amp-experiment.protoascii
+++ b/extensions/amp-experiment/validator-amp-experiment.protoascii
@@ -24,7 +24,7 @@ tags: {  # amp-experiment
     version: "0.1"
     version: "1.0"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-facebook/validator-amp-facebook.protoascii b/extensions/amp-facebook/validator-amp-facebook.protoascii
index 72330802e..100c4e8ad 100644
--- a/extensions/amp-facebook/validator-amp-facebook.protoascii
+++ b/extensions/amp-facebook/validator-amp-facebook.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-facebook
     name: "amp-facebook"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-fit-text/validator-amp-fit-text.protoascii b/extensions/amp-fit-text/validator-amp-fit-text.protoascii
index c29376537..203e1b554 100644
--- a/extensions/amp-fit-text/validator-amp-fit-text.protoascii
+++ b/extensions/amp-fit-text/validator-amp-fit-text.protoascii
@@ -17,30 +17,26 @@
 tags: {  # amp-fit-text
   html_format: AMP
   html_format: AMP4ADS
-  html_format: AMP4EMAIL
   html_format: ACTIONS
   tag_name: "SCRIPT"
   extension_spec: {
     name: "amp-fit-text"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
 }
-tags: {  # amp-fit-text
-  html_format: AMP
-  html_format: AMP4ADS
+tags: {  # amp-fit-text (AMP4EMAIL)
   html_format: AMP4EMAIL
-  html_format: ACTIONS
   tag_name: "SCRIPT"
   spec_name: "SCRIPT[custom-element=amp-fit-text] (AMP4EMAIL)"
   extension_spec: {
     name: "amp-fit-text"
     # AMP4EMAIL doesn't allow version: "latest".
     version: "0.1"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-font/validator-amp-font.protoascii b/extensions/amp-font/validator-amp-font.protoascii
index 735900db3..7b375a3e3 100644
--- a/extensions/amp-font/validator-amp-font.protoascii
+++ b/extensions/amp-font/validator-amp-font.protoascii
@@ -23,7 +23,7 @@ tags: {  # amp-font
     name: "amp-font"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-form/validator-amp-form.protoascii b/extensions/amp-form/validator-amp-form.protoascii
index e06e18b78..3c6558b1a 100644
--- a/extensions/amp-form/validator-amp-form.protoascii
+++ b/extensions/amp-form/validator-amp-form.protoascii
@@ -25,7 +25,7 @@ tags: {  # amp-form
     version: "0.1"
     version: "latest"
     deprecated_allow_duplicates: true
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
@@ -38,7 +38,7 @@ tags: {  # amp-form
     # AMP4EMAIL doesn't allow version: "latest".
     version: "0.1"
     deprecated_allow_duplicates: true
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
diff --git a/extensions/amp-fx-flying-carpet/validator-amp-fx-flying-carpet.protoascii b/extensions/amp-fx-flying-carpet/validator-amp-fx-flying-carpet.protoascii
index a6332b6a9..1b853a862 100644
--- a/extensions/amp-fx-flying-carpet/validator-amp-fx-flying-carpet.protoascii
+++ b/extensions/amp-fx-flying-carpet/validator-amp-fx-flying-carpet.protoascii
@@ -20,7 +20,7 @@ tags: {  # <script custom-element="amp-fx-flying-carpet">
     name: "amp-fx-flying-carpet"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-gfycat/validator-amp-gfycat.protoascii b/extensions/amp-gfycat/validator-amp-gfycat.protoascii
index a1a2836df..4e5fa19b2 100644
--- a/extensions/amp-gfycat/validator-amp-gfycat.protoascii
+++ b/extensions/amp-gfycat/validator-amp-gfycat.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-gfycat
     name: "amp-gfycat"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-iframe/validator-amp-iframe.protoascii b/extensions/amp-iframe/validator-amp-iframe.protoascii
index 5b4c88fba..13dc48ce8 100644
--- a/extensions/amp-iframe/validator-amp-iframe.protoascii
+++ b/extensions/amp-iframe/validator-amp-iframe.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-iframe
     name: "amp-iframe"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-image-lightbox/validator-amp-image-lightbox.protoascii b/extensions/amp-image-lightbox/validator-amp-image-lightbox.protoascii
index 238852928..43c62d817 100644
--- a/extensions/amp-image-lightbox/validator-amp-image-lightbox.protoascii
+++ b/extensions/amp-image-lightbox/validator-amp-image-lightbox.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-image-lightbox
     name: "amp-image-lightbox"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-inline-gallery/validator-amp-inline-gallery.protoascii b/extensions/amp-inline-gallery/validator-amp-inline-gallery.protoascii
new file mode 100644
index 000000000..24d4fdffc
--- /dev/null
+++ b/extensions/amp-inline-gallery/validator-amp-inline-gallery.protoascii
@@ -0,0 +1,110 @@
+#
+# Copyright 2020 The AMP HTML Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the license.
+#
+
+tags: {  # amp-inline-gallery
+  html_format: AMP
+  tag_name: "SCRIPT"
+  extension_spec: {
+    name: "amp-inline-gallery"
+    version: "0.1"
+    version: "latest"
+  }
+  attr_lists: "common-extension-attrs"
+}
+tags: {  # <amp-inline-gallery>
+  html_format: AMP
+  tag_name: "AMP-INLINE-GALLERY"
+  requires_extension: "amp-inline-gallery"
+  attr_lists: "extended-amp-global"
+  spec_url: "https://amp.dev/documentation/components/amp-inline-gallery"
+  amp_layout: {
+    supported_layouts: CONTAINER
+  }
+}
+tags: {  # <amp-inline-gallery-pagination>
+  html_format: AMP
+  tag_name: "AMP-INLINE-GALLERY-PAGINATION"
+  spec_name: "amp-inline-gallery-pagination"
+  requires_extension: "amp-inline-gallery"
+  attr_lists: "extended-amp-global"
+  spec_url: "https://amp.dev/documentation/components/amp-inline-gallery"
+  mandatory_ancestor: "AMP-INLINE-GALLERY"
+  amp_layout: {
+    supported_layouts: FILL
+    supported_layouts: FIXED
+    supported_layouts: FIXED_HEIGHT
+    supported_layouts: FLEX_ITEM
+    supported_layouts: INTRINSIC
+    supported_layouts: NODISPLAY
+    supported_layouts: RESPONSIVE
+  }
+}
+tags: {  # <amp-inline-gallery-pagination inset>
+  html_format: AMP
+  tag_name: "AMP-INLINE-GALLERY-PAGINATION"
+  spec_name: "amp-inline-gallery-pagination [inset]"
+  requires_extension: "amp-inline-gallery"
+  attrs: {
+    name: "inset"
+    mandatory: true
+  }
+  attr_lists: "extended-amp-global"
+  spec_url: "https://amp.dev/documentation/components/amp-inline-gallery"
+  mandatory_ancestor: "AMP-INLINE-GALLERY"
+  amp_layout: {
+    supported_layouts: NODISPLAY
+  }
+}
+tags: {  # <amp-inline-gallery-thumbnails>
+  html_format: AMP
+  tag_name: "AMP-INLINE-GALLERY-THUMBNAILS"
+  requires_extension: "amp-inline-gallery"
+  attrs: {
+    name: "aspect-ratio-height"
+    # Non-zero number
+    value_regex: "\\d+(\\.\\d+)?"
+    blacklisted_value_regex: "^0+(\\.0+)?$"
+    trigger: {
+      also_requires_attr: "aspect-ratio-width"
+    }
+  }
+  attrs: {
+    name: "aspect-ratio-width"
+    # Non-zero number
+    value_regex: "\\d+(\\.\\d+)?"
+    blacklisted_value_regex: "^0+(\\.0+)?$"
+    trigger: {
+      also_requires_attr: "aspect-ratio-height"
+    }
+  }
+  attrs: {
+    name: "loop"
+    value: "true"
+    value: "false"
+  }
+  attr_lists: "extended-amp-global"
+  spec_url: "https://amp.dev/documentation/components/amp-inline-gallery"
+  mandatory_ancestor: "AMP-INLINE-GALLERY"
+  amp_layout: {
+    supported_layouts: FILL
+    supported_layouts: FIXED
+    supported_layouts: FIXED_HEIGHT
+    supported_layouts: FLEX_ITEM
+    supported_layouts: INTRINSIC
+    supported_layouts: NODISPLAY
+    supported_layouts: RESPONSIVE
+  }
+}
diff --git a/extensions/amp-inputmask/validator-amp-inputmask.protoascii b/extensions/amp-inputmask/validator-amp-inputmask.protoascii
index b1fff7a0b..c4b1b4d99 100644
--- a/extensions/amp-inputmask/validator-amp-inputmask.protoascii
+++ b/extensions/amp-inputmask/validator-amp-inputmask.protoascii
@@ -22,7 +22,7 @@ tags: {  # amp-inputmask
     version: "latest"
     # amp-inputmask has no associated tag which indicates usage of the extension.
     # TODO(gregable): Implement a mechanism to associate attributes with
-    # extension usage and then set this to GRANDFATHERED or ERROR.
+    # extension usage and then set this to EXEMPTED or ERROR.
     requires_usage: NONE
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-instagram/validator-amp-instagram.protoascii b/extensions/amp-instagram/validator-amp-instagram.protoascii
index e8deeaa31..4a462662c 100644
--- a/extensions/amp-instagram/validator-amp-instagram.protoascii
+++ b/extensions/amp-instagram/validator-amp-instagram.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-instagram
     name: "amp-instagram"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-install-serviceworker/validator-amp-install-serviceworker.protoascii b/extensions/amp-install-serviceworker/validator-amp-install-serviceworker.protoascii
index 87aae591b..d0d20ad06 100644
--- a/extensions/amp-install-serviceworker/validator-amp-install-serviceworker.protoascii
+++ b/extensions/amp-install-serviceworker/validator-amp-install-serviceworker.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-install-serviceworker
     name: "amp-install-serviceworker"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-izlesene/validator-amp-izlesene.protoascii b/extensions/amp-izlesene/validator-amp-izlesene.protoascii
index 7c56262f5..4dc56f819 100644
--- a/extensions/amp-izlesene/validator-amp-izlesene.protoascii
+++ b/extensions/amp-izlesene/validator-amp-izlesene.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-izlesene
     name: "amp-izlesene"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
diff --git a/extensions/amp-jwplayer/validator-amp-jwplayer.protoascii b/extensions/amp-jwplayer/validator-amp-jwplayer.protoascii
index fe0af650d..600dd84eb 100644
--- a/extensions/amp-jwplayer/validator-amp-jwplayer.protoascii
+++ b/extensions/amp-jwplayer/validator-amp-jwplayer.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-jwplayer
     name: "amp-jwplayer"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-kaltura-player/validator-amp-kaltura-player.protoascii b/extensions/amp-kaltura-player/validator-amp-kaltura-player.protoascii
index fd15c0b08..168f857a8 100644
--- a/extensions/amp-kaltura-player/validator-amp-kaltura-player.protoascii
+++ b/extensions/amp-kaltura-player/validator-amp-kaltura-player.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-kaltura-player
     name: "amp-kaltura-player"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-lightbox/validator-amp-lightbox.protoascii b/extensions/amp-lightbox/validator-amp-lightbox.protoascii
index afb77bd7d..308668f21 100644
--- a/extensions/amp-lightbox/validator-amp-lightbox.protoascii
+++ b/extensions/amp-lightbox/validator-amp-lightbox.protoascii
@@ -22,7 +22,7 @@ tags: {  # amp-lightbox
     name: "amp-lightbox"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
@@ -65,7 +65,10 @@ tags: {  # <amp-lightbox>
   }
   attrs: { name: "controls" }
   attrs: { name: "from" }
-  attrs: { name: "scrollable" }
+  attrs: {
+    name: "scrollable"
+    disabled_by: "amp4email"
+  }
   # <amp-bind>
   attrs: { name: "[open]" }
   attr_lists: "extended-amp-global"
diff --git a/extensions/amp-list/validator-amp-list.protoascii b/extensions/amp-list/validator-amp-list.protoascii
index 267713a0f..0d36870e2 100644
--- a/extensions/amp-list/validator-amp-list.protoascii
+++ b/extensions/amp-list/validator-amp-list.protoascii
@@ -20,7 +20,7 @@ tags: {  # amp-list
     name: "amp-list"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
@@ -64,6 +64,10 @@ tags: {  # <amp-list> with mandatory src and/or [src] attr
     value: "refresh"
   }
   attrs: { name: "credentials" }
+  attrs: {
+    name: "data-amp-bind-src"
+    mandatory_anyof: "['src','[src]','data-amp-bind-src']"
+  }
   attrs: {
     name: "diffable"
     value: ""
@@ -88,9 +92,10 @@ tags: {  # <amp-list> with mandatory src and/or [src] attr
     value: "fetch"
   }
   attrs: { name: "single-item" }
+  attrs: { name: "xssi-prefix" }
   attrs: {
     name: "src"
-    mandatory_anyof: "['src','[src]']"
+    mandatory_anyof: "['src','[src]','data-amp-bind-src']"
     value_url: {
       protocol: "https"
       allow_relative: true  # Will be set to false at a future date.
@@ -107,11 +112,7 @@ tags: {  # <amp-list> with mandatory src and/or [src] attr
   }
   attrs: {
     name: "[src]"
-    mandatory_anyof: "['src','[src]']"
-  }
-  attrs: {
-    name: "[state]"
-    deprecation: "[src]"
+    mandatory_anyof: "['src','[src]','data-amp-bind-src']"
   }
   attr_lists: "extended-amp-global"
   amp_layout: {
@@ -233,6 +234,10 @@ tags: {  # <amp-list>
     name: "template"
     value_oneof_set: TEMPLATE_IDS
   }
+  # <amp-bind>
+  attrs: {
+    name: "[is-layout-container]"
+  }
   attr_lists: "extended-amp-global"
   amp_layout: {
     supported_layouts: FILL
@@ -281,7 +286,7 @@ tags: {  # <amp-list>
   attrs: { name: "single-item" }
   attrs: {
     name: "src"
-    mandatory_anyof: "['src','[src]']"
+    mandatory_anyof: "['src','[src]','data-amp-bind-src']"
     value_url: {
       protocol: "https"
       allow_relative: true
@@ -292,7 +297,7 @@ tags: {  # <amp-list>
   # <amp-bind>
   attrs: {
     name: "[src]"
-    mandatory_anyof: "['src','[src]']"
+    mandatory_anyof: "['src','[src]','data-amp-bind-src']"
   }
   attrs: {
     name: "[state]"
diff --git a/extensions/amp-live-list/validator-amp-live-list.protoascii b/extensions/amp-live-list/validator-amp-live-list.protoascii
index 330da465c..abda4a5c3 100644
--- a/extensions/amp-live-list/validator-amp-live-list.protoascii
+++ b/extensions/amp-live-list/validator-amp-live-list.protoascii
@@ -23,7 +23,7 @@ tags: {  # amp-live-list
     name: "amp-live-list"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
diff --git a/extensions/amp-mega-menu/validator-amp-mega-menu.protoascii b/extensions/amp-mega-menu/validator-amp-mega-menu.protoascii
new file mode 100644
index 000000000..392a1aafc
--- /dev/null
+++ b/extensions/amp-mega-menu/validator-amp-mega-menu.protoascii
@@ -0,0 +1,215 @@
+#
+# Copyright 2019 The AMP HTML Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the license.
+#
+tags: {  # amp-mega-menu
+  html_format: AMP
+  tag_name: "SCRIPT"
+  extension_spec: {
+    name: "amp-mega-menu"
+    version: "0.1"
+    version: "latest"
+  }
+  attr_lists: "common-extension-attrs"
+}
+tags: {  # <amp-mega-menu>
+  html_format: AMP
+  tag_name: "AMP-MEGA-MENU"
+  requires_extension: "amp-mega-menu"
+  attr_lists: "extended-amp-global"
+  spec_url: "https://amp.dev/documentation/components/amp-mega-menu"
+  descendant_tag_list: "amp-mega-menu-allowed-descendants"
+  # We want to support both of the cases below:
+  # <amp-mega-menu> > <nav> > ... and
+  # <amp-mega-menu> > <amp-list> > <template> > <nav> > ...
+  # The latter is needed for dynamic template rendering.
+  child_tags: {
+    mandatory_num_child_tags: 1
+    child_tag_name_oneof: "NAV"
+    child_tag_name_oneof: "AMP-LIST"
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU > AMP-LIST"
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU > NAV"
+  }
+  amp_layout: {
+    supported_layouts: FIXED_HEIGHT
+  }
+}
+tags: {  # <amp-mega-menu> <nav>
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-MEGA-MENU > NAV"
+  siblings_disallowed: true
+  child_tags: {
+    mandatory_num_child_tags: 1
+    child_tag_name_oneof: "OL"
+    child_tag_name_oneof: "UL"
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU NAV > UL/OL"
+  }
+}
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-MEGA-MENU > AMP-LIST"
+  # Include mandatory amp-list attrs so that <amp-mega-menu> > <nav>
+  # does not match to this tag.
+  attrs: {
+    name: "src"
+    mandatory_anyof: "['src','[src]']"
+  }
+  attrs: {
+    name: "[src]"
+    mandatory_anyof: "['src','[src]']"
+  }
+  child_tags: {
+    mandatory_num_child_tags: 1
+    child_tag_name_oneof: "TEMPLATE"
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU > AMP-LIST > TEMPLATE"
+  }
+}
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-MEGA-MENU > AMP-LIST > TEMPLATE"
+  mandatory_parent: "AMP-LIST"
+  child_tags: {
+    mandatory_num_child_tags: 1
+    child_tag_name_oneof: "NAV"
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU > NAV"
+  }
+}
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-MEGA-MENU NAV > UL/OL"
+  mandatory_parent: "NAV"
+  child_tags: {
+    mandatory_min_num_child_tags: 1
+    child_tag_name_oneof: "LI"
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU NAV > UL/OL > LI"
+  }
+}
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-MEGA-MENU NAV > UL/OL > LI"
+  child_tags: {
+    mandatory_min_num_child_tags: 1
+    child_tag_name_oneof: "A"
+    child_tag_name_oneof: "BUTTON"
+    child_tag_name_oneof: "DIV"
+    child_tag_name_oneof: "H1"
+    child_tag_name_oneof: "H2"
+    child_tag_name_oneof: "H3"
+    child_tag_name_oneof: "H4"
+    child_tag_name_oneof: "H5"
+    child_tag_name_oneof: "H6"
+    child_tag_name_oneof: "SPAN"
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU item-content"
+    unique: true
+  }
+  reference_points: {
+    tag_spec_name: "AMP-MEGA-MENU item-heading"
+    mandatory: true
+    unique: true
+  }
+}
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-MEGA-MENU item-heading"
+  attrs: {
+    name: "role"
+    value: "button"
+  }
+}
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-MEGA-MENU item-content"
+  # Disallow role=menu until supported by implementation.
+  attrs: {
+    name: "role"
+    value: "dialog"
+    mandatory: true
+  }
+}
+descendant_tag_list {
+  # Purposefully being restrictive when whitelisting child components;
+  # On demand, add more components to this list after manual testing.
+  name: "amp-mega-menu-allowed-descendants"
+  tag: "A"
+  tag: "AMP-AD"
+  tag: "AMP-CAROUSEL"
+  tag: "AMP-EMBED"
+  tag: "AMP-IMG"
+  tag: "AMP-LIGHTBOX"
+  tag: "AMP-LIST"
+  tag: "AMP-VIDEO"
+  tag: "B"
+  tag: "BR"
+  tag: "BUTTON"
+  tag: "COL"
+  tag: "COLGROUP"
+  tag: "DIV"
+  tag: "EM"
+  tag: "FIELDSET"
+  tag: "FORM"
+  tag: "H1"
+  tag: "H2"
+  tag: "H3"
+  tag: "H4"
+  tag: "H5"
+  tag: "H6"
+  tag: "I"
+  tag: "INPUT"
+  tag: "LABEL"
+  tag: "LI"
+  tag: "MARK"
+  tag: "NAV"
+  tag: "OL"
+  tag: "OPTION"
+  tag: "P"
+  tag: "PATH"
+  tag: "SECTION"
+  tag: "SPAN"
+  tag: "STRIKE"
+  tag: "STRONG"
+  tag: "SUB"
+  tag: "SUP"
+  tag: "SVG"
+  tag: "TABLE"
+  tag: "TBODY"
+  tag: "TD"
+  tag: "TEMPLATE"
+  tag: "TH"
+  tag: "TIME"
+  tag: "TITLE"
+  tag: "TR"
+  tag: "U"
+  tag: "UL"
+}
diff --git a/extensions/amp-minute-media-player/validator-amp-minute-media-player.protoascii b/extensions/amp-minute-media-player/validator-amp-minute-media-player.protoascii
index 9dbfa2e67..156a0ce30 100644
--- a/extensions/amp-minute-media-player/validator-amp-minute-media-player.protoascii
+++ b/extensions/amp-minute-media-player/validator-amp-minute-media-player.protoascii
@@ -29,18 +29,15 @@ tags: {  # <amp-minute-media-player>
   tag_name: "AMP-MINUTE-MEDIA-PLAYER"
   requires_extension: "amp-minute-media-player"
   attrs: { name: "autoplay" }
-  attrs: {
-    name: "dock"
-    requires_extension: "amp-video-docking"
-  }
+  attrs: { name: "data-content-id" }
   attrs: {
     name: "data-content-type"
     mandatory: true
     value: "curated"
-    value: "specific"
     value: "semantic"
+    value: "specific"
   }
-  attrs: { name: "data-content-id" }
+  attrs: { name: "data-minimum-date-factor" }
   attrs: { name: "data-scanned-element" }
   attrs: {
     name: "data-scanned-element-type"
@@ -48,17 +45,19 @@ tags: {  # <amp-minute-media-player>
     value: "id"
     value: "tag"
   }
-  attrs: { name: "data-tags" }
-  attrs: { name: "data-minimum-date-factor" }
   attrs: { name: "data-scoped-keywords" }
-
+  attrs: { name: "data-tags" }
+  attrs: {
+    name: "dock"
+    requires_extension: "amp-video-docking"
+  }
   attr_lists: "extended-amp-global"
   spec_url: "https://amp.dev/documentation/components/amp-minute-media-player"
   amp_layout: {
-    supported_layouts: RESPONSIVE
     supported_layouts: FILL
     supported_layouts: FIXED
     supported_layouts: FIXED_HEIGHT
     supported_layouts: FLEX_ITEM
+    supported_layouts: RESPONSIVE
   }
 }
diff --git a/extensions/amp-mustache/validator-amp-mustache.protoascii b/extensions/amp-mustache/validator-amp-mustache.protoascii
index 8f310f62d..bca89f9b1 100644
--- a/extensions/amp-mustache/validator-amp-mustache.protoascii
+++ b/extensions/amp-mustache/validator-amp-mustache.protoascii
@@ -29,7 +29,7 @@ tags: {  # amp-mustache
     version: "0.2"
     version: "latest"
     deprecated_version: "0.1"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
@@ -77,6 +77,132 @@ tags: {
   disallowed_ancestor: "FORM DIV [submitting][template]"
   disallowed_ancestor: "FORM DIV [verify-error][template]"
   requires_extension: "amp-mustache"
+  attrs: {
+    name: "id"
+    add_value_to_set: TEMPLATE_IDS
+    # When updating this blacklisted_value_regex, also update elsewhere in this
+    # file, and in mandatory-id-attr and $GLOBAL_ATTRS in
+    # validator-main.protoascii, and validator-amp-script.protoascii.
+    blacklisted_value_regex: "(^|\\s)("  # Values are space separated
+        "__amp_\\S*|"
+        "__count__|"
+        "__defineGetter__|"
+        "__defineSetter__|"
+        "__lookupGetter__|"
+        "__lookupSetter__|"
+        "__noSuchMethod__|"
+        "__parent__|"
+        "__proto__|"
+        "__AMP_\\S*|"
+        "\\$p|"
+        "\\$proxy|"
+        "acceptCharset|"
+        "addEventListener|"
+        "appendChild|"
+        "assignedSlot|"
+        "attachShadow|"
+        "AMP|"
+        "baseURI|"
+        "checkValidity|"
+        "childElementCount|"
+        "childNodes|"
+        "classList|"
+        "className|"
+        "clientHeight|"
+        "clientLeft|"
+        "clientTop|"
+        "clientWidth|"
+        "compareDocumentPosition|"
+        "computedName|"
+        "computedRole|"
+        "contentEditable|"
+        "createShadowRoot|"
+        "enqueAction|"
+        "firstChild|"
+        "firstElementChild|"
+        "getAnimations|"
+        "getAttribute|"
+        "getAttributeNS|"
+        "getAttributeNode|"
+        "getAttributeNodeNS|"
+        "getBoundingClientRect|"
+        "getClientRects|"
+        "getDestinationInsertionPoints|"
+        "getElementsByClassName|"
+        "getElementsByTagName|"
+        "getElementsByTagNameNS|"
+        "getRootNode|"
+        "hasAttribute|"
+        "hasAttributeNS|"
+        "hasAttributes|"
+        "hasChildNodes|"
+        "hasPointerCapture|"
+        "i-amphtml-\\S*|"
+        "innerHTML|"
+        "innerText|"
+        "inputMode|"
+        "insertAdjacentElement|"
+        "insertAdjacentHTML|"
+        "insertAdjacentText|"
+        "isContentEditable|"
+        "isDefaultNamespace|"
+        "isEqualNode|"
+        "isSameNode|"
+        "lastChild|"
+        "lastElementChild|"
+        "lookupNamespaceURI|"
+        "namespaceURI|"
+        "nextElementSibling|"
+        "nextSibling|"
+        "nodeName|"
+        "nodeType|"
+        "nodeValue|"
+        "offsetHeight|"
+        "offsetLeft|"
+        "offsetParent|"
+        "offsetTop|"
+        "offsetWidth|"
+        "outerHTML|"
+        "outerText|"
+        "ownerDocument|"
+        "parentElement|"
+        "parentNode|"
+        "previousElementSibling|"
+        "previousSibling|"
+        "querySelector|"
+        "querySelectorAll|"
+        "releasePointerCapture|"
+        "removeAttribute|"
+        "removeAttributeNS|"
+        "removeAttributeNode|"
+        "removeChild|"
+        "removeEventListener|"
+        "replaceChild|"
+        "reportValidity|"
+        "requestPointerLock|"
+        "scrollHeight|"
+        "scrollIntoView|"
+        "scrollIntoViewIfNeeded|"
+        "scrollLeft|"
+        "scrollWidth|"
+        "setAttribute|"
+        "setAttributeNS|"
+        "setAttributeNode|"
+        "setAttributeNodeNS|"
+        "setPointerCapture|"
+        "shadowRoot|"
+        "styleMap|"
+        "tabIndex|"
+        "tagName|"
+        "textContent|"
+        "toString|"
+        "valueOf|"
+        "(webkit|ms|moz|o)dropzone|"
+        "(webkit|moz|ms|o)MatchesSelector|"
+        "(webkit|moz|ms|o)RequestFullScreen|"
+        "(webkit|moz|ms|o)RequestFullscreen"
+        ")(\\s|$)"
+  }
   attrs: {
     name: "type"
     mandatory: true
@@ -114,6 +240,132 @@ tags: {
   # AMP4EMAIL addition.
   disallowed_ancestor: "FORM DIV [submitting]"
   requires_extension: "amp-mustache"
+  attrs: {
+    name: "id"
+    add_value_to_set: TEMPLATE_IDS
+    # When updating this blacklisted_value_regex, also update elsewhere in this
+    # file, and in mandatory-id-attr and $GLOBAL_ATTRS in
+    # validator-main.protoascii, and validator-amp-script.protoascii.
+    blacklisted_value_regex: "(^|\\s)("  # Values are space separated
+        "__amp_\\S*|"
+        "__count__|"
+        "__defineGetter__|"
+        "__defineSetter__|"
+        "__lookupGetter__|"
+        "__lookupSetter__|"
+        "__noSuchMethod__|"
+        "__parent__|"
+        "__proto__|"
+        "__AMP_\\S*|"
+        "\\$p|"
+        "\\$proxy|"
+        "acceptCharset|"
+        "addEventListener|"
+        "appendChild|"
+        "assignedSlot|"
+        "attachShadow|"
+        "AMP|"
+        "baseURI|"
+        "checkValidity|"
+        "childElementCount|"
+        "childNodes|"
+        "classList|"
+        "className|"
+        "clientHeight|"
+        "clientLeft|"
+        "clientTop|"
+        "clientWidth|"
+        "compareDocumentPosition|"
+        "computedName|"
+        "computedRole|"
+        "contentEditable|"
+        "createShadowRoot|"
+        "enqueAction|"
+        "firstChild|"
+        "firstElementChild|"
+        "getAnimations|"
+        "getAttribute|"
+        "getAttributeNS|"
+        "getAttributeNode|"
+        "getAttributeNodeNS|"
+        "getBoundingClientRect|"
+        "getClientRects|"
+        "getDestinationInsertionPoints|"
+        "getElementsByClassName|"
+        "getElementsByTagName|"
+        "getElementsByTagNameNS|"
+        "getRootNode|"
+        "hasAttribute|"
+        "hasAttributeNS|"
+        "hasAttributes|"
+        "hasChildNodes|"
+        "hasPointerCapture|"
+        "i-amphtml-\\S*|"
+        "innerHTML|"
+        "innerText|"
+        "inputMode|"
+        "insertAdjacentElement|"
+        "insertAdjacentHTML|"
+        "insertAdjacentText|"
+        "isContentEditable|"
+        "isDefaultNamespace|"
+        "isEqualNode|"
+        "isSameNode|"
+        "lastChild|"
+        "lastElementChild|"
+        "lookupNamespaceURI|"
+        "namespaceURI|"
+        "nextElementSibling|"
+        "nextSibling|"
+        "nodeName|"
+        "nodeType|"
+        "nodeValue|"
+        "offsetHeight|"
+        "offsetLeft|"
+        "offsetParent|"
+        "offsetTop|"
+        "offsetWidth|"
+        "outerHTML|"
+        "outerText|"
+        "ownerDocument|"
+        "parentElement|"
+        "parentNode|"
+        "previousElementSibling|"
+        "previousSibling|"
+        "querySelector|"
+        "querySelectorAll|"
+        "releasePointerCapture|"
+        "removeAttribute|"
+        "removeAttributeNS|"
+        "removeAttributeNode|"
+        "removeChild|"
+        "removeEventListener|"
+        "replaceChild|"
+        "reportValidity|"
+        "requestPointerLock|"
+        "scrollHeight|"
+        "scrollIntoView|"
+        "scrollIntoViewIfNeeded|"
+        "scrollLeft|"
+        "scrollWidth|"
+        "setAttribute|"
+        "setAttributeNS|"
+        "setAttributeNode|"
+        "setAttributeNodeNS|"
+        "setPointerCapture|"
+        "shadowRoot|"
+        "styleMap|"
+        "tabIndex|"
+        "tagName|"
+        "textContent|"
+        "toString|"
+        "valueOf|"
+        "(webkit|ms|moz|o)dropzone|"
+        "(webkit|moz|ms|o)MatchesSelector|"
+        "(webkit|moz|ms|o)RequestFullScreen|"
+        "(webkit|moz|ms|o)RequestFullscreen"
+        ")(\\s|$)"
+  }
   attrs: {
     name: "type"
     mandatory: true
@@ -156,8 +408,9 @@ tags: {
   attrs: {
     name: "id"
     add_value_to_set: TEMPLATE_IDS
-    # When updating this blacklisted_value_regex, also update below, and in
-    # mandatory-id-attr and $GLOBAL_ATTRS in validator-main.protoascii.
+    # When updating this blacklisted_value_regex, also update elsewhere in this
+    # file, and in mandatory-id-attr and $GLOBAL_ATTRS in
+    # validator-main.protoascii, and validator-amp-script.protoascii.
     blacklisted_value_regex: "(^|\\s)("  # Values are space separated
         "__amp_\\S*|"
         "__count__|"
@@ -308,8 +561,9 @@ tags: {
   attrs: {
     name: "id"
     add_value_to_set: TEMPLATE_IDS
-    # When updating this blacklisted_value_regex, also update above, and in
-    # mandatory-id-attr and $GLOBAL_ATTRS in validator-main.protoascii.
+    # When updating this blacklisted_value_regex, also update elsewhere in this
+    # file, and in mandatory-id-attr and $GLOBAL_ATTRS in
+    # validator-main.protoascii, and validator-amp-script.protoascii.
     blacklisted_value_regex: "(^|\\s)("  # Values are space separated
         "__amp_\\S*|"
         "__count__|"
diff --git a/extensions/amp-nested-menu/validator-amp-nested-menu.protoascii b/extensions/amp-nested-menu/validator-amp-nested-menu.protoascii
new file mode 100644
index 000000000..d944fec2a
--- /dev/null
+++ b/extensions/amp-nested-menu/validator-amp-nested-menu.protoascii
@@ -0,0 +1,175 @@
+#
+# Copyright 2019 The AMP HTML Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the license.
+#
+tags: {  # amp-nested-menu
+  html_format: AMP
+  tag_name: "SCRIPT"
+  extension_spec: {
+    name: "amp-nested-menu"
+    version: "0.1"
+    version: "latest"
+  }
+  attr_lists: "common-extension-attrs"
+}
+tags: {  # amp-nested-menu
+  html_format: AMP
+  tag_name: "AMP-NESTED-MENU"
+  # nested menu can be lazy loaded by sidebar.
+  requires_extension: "amp-sidebar"
+  mandatory_ancestor: "AMP-SIDEBAR"
+  attrs: {
+    name: "side"
+    value: "left"
+    value: "right"
+  }
+  attr_lists: "extended-amp-global"
+  amp_layout: {
+    supported_layouts: FILL
+  }
+  descendant_tag_list: "amp-nested-menu-allowed-descendants"
+  spec_url: "https://amp.dev/documentation/components/amp-nested-menu"
+}
+tags: {  # <amp-nested-menu> <div amp-nested-submenu(-open/-close)>
+  html_format: AMP
+  tag_name: "DIV"
+  spec_name: "div amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  # submenus inside accordion do not display correctly due to styling of <amp-accordion>.
+  disallowed_ancestor: "AMP-ACCORDION"
+  attrs: {
+    name: "amp-nested-submenu"
+    mandatory_oneof: "['amp-nested-submenu', 'amp-nested-submenu-close', 'amp-nested-submenu-open']"
+  }
+  attrs: {
+    name: "amp-nested-submenu-close"
+    mandatory_oneof: "['amp-nested-submenu', 'amp-nested-submenu-close', 'amp-nested-submenu-open']"
+  }
+  attrs: {
+    name: "amp-nested-submenu-open"
+    mandatory_oneof: "['amp-nested-submenu', 'amp-nested-submenu-close', 'amp-nested-submenu-open']"
+  }
+}
+
+attr_lists {
+  name: "amp-nested-menu-actions"
+  attrs: {
+    name: "amp-nested-submenu-close"
+    mandatory_oneof: "['amp-nested-submenu-close', 'amp-nested-submenu-open']"
+  }
+  attrs: {
+    name: "amp-nested-submenu-open"
+    mandatory_oneof: "['amp-nested-submenu-close', 'amp-nested-submenu-open']"
+  }
+}
+tags: {  # <amp-nested-menu> <button amp-nested-submenu-open/close>
+  html_format: AMP
+  tag_name: "BUTTON"
+  spec_name: "button amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  attr_lists: "amp-nested-menu-actions"
+}
+tags: {  # <amp-nested-menu> <h2 amp-nested-submenu-open/close>
+  html_format: AMP
+  tag_name: "H2"
+  spec_name: "h2 amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  attr_lists: "amp-nested-menu-actions"
+}
+tags: {  # <amp-nested-menu> <h3 amp-nested-submenu-open/close>
+  html_format: AMP
+  tag_name: "H3"
+  spec_name: "h3 amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  attr_lists: "amp-nested-menu-actions"
+}
+tags: {  # <amp-nested-menu> <h4 amp-nested-submenu-open/close>
+  html_format: AMP
+  tag_name: "H4"
+  spec_name: "h4 amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  attr_lists: "amp-nested-menu-actions"
+}
+tags: {  # <amp-nested-menu> <h5 amp-nested-submenu-open/close>
+  html_format: AMP
+  tag_name: "H5"
+  spec_name: "h5 amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  attr_lists: "amp-nested-menu-actions"
+}
+tags: {  # <amp-nested-menu> <h6 amp-nested-submenu-open/close>
+  html_format: AMP
+  tag_name: "H6"
+  spec_name: "h6 amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  attr_lists: "amp-nested-menu-actions"
+}
+tags: {  # <amp-nested-menu> <span amp-nested-submenu-open/close>
+  html_format: AMP
+  tag_name: "SPAN"
+  spec_name: "span amp-nested-menu"
+  mandatory_ancestor: "AMP-NESTED-MENU"
+  attr_lists: "amp-nested-menu-actions"
+}
+descendant_tag_list {
+  # Purposefully being restrictive when whitelisting child components;
+  # On demand, add more components to this list after manual testing.
+  name: "amp-nested-menu-allowed-descendants"
+  tag: "A"
+  tag: "AMP-ACCORDION"
+  tag: "AMP-IMG"
+  tag: "AMP-LIST"
+  tag: "B"
+  tag: "BR"
+  tag: "BUTTON"
+  tag: "COL"
+  tag: "COLGROUP"
+  tag: "DIV"
+  tag: "EM"
+  tag: "FIELDSET"
+  tag: "FORM"
+  tag: "H1"
+  tag: "H2"
+  tag: "H3"
+  tag: "H4"
+  tag: "H5"
+  tag: "H6"
+  tag: "I"
+  tag: "INPUT"
+  tag: "LABEL"
+  tag: "LI"
+  tag: "MARK"
+  tag: "NAV"
+  tag: "OL"
+  tag: "OPTION"
+  tag: "P"
+  tag: "PATH"
+  tag: "SECTION"
+  tag: "SPAN"
+  tag: "STRIKE"
+  tag: "STRONG"
+  tag: "SUB"
+  tag: "SUP"
+  tag: "SVG"
+  tag: "TABLE"
+  tag: "TBODY"
+  tag: "TD"
+  tag: "TEMPLATE"
+  tag: "TH"
+  tag: "TIME"
+  tag: "TITLE"
+  tag: "TR"
+  tag: "U"
+  tag: "UL"
+}
diff --git a/extensions/amp-next-page/validator-amp-next-page.protoascii b/extensions/amp-next-page/validator-amp-next-page.protoascii
index 63b5403ad..beb38f5b9 100644
--- a/extensions/amp-next-page/validator-amp-next-page.protoascii
+++ b/extensions/amp-next-page/validator-amp-next-page.protoascii
@@ -19,14 +19,15 @@ tags: {  # amp-next-page
   extension_spec: {
     name: "amp-next-page"
     version: "0.1"
+    version: "1.0"
     version: "latest"
   }
   attr_lists: "common-extension-attrs"
 }
-tags: {  # amp-next-page: json config
+tags: {  # amp-next-page: JSON Config
   html_format: AMP
   tag_name: "SCRIPT"
-  spec_name: "amp-next-page extension .json configuration"
+  spec_name: "AMP-NEXT-PAGE > SCRIPT[type=application/json]"
   requires_extension: "amp-next-page"
   mandatory_parent: "AMP-NEXT-PAGE"
   attrs: {
@@ -47,18 +48,51 @@ tags: {
     mandatory: true
   }
 }
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-NEXT-PAGE > [recommendation-box]"
+  mandatory_parent: "AMP-NEXT-PAGE"
+  attrs: {
+    name: "recommendation-box"
+    mandatory: true
+  }
+}
+tags: {
+  html_format: AMP
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "AMP-NEXT-PAGE > [footer]"
+  mandatory_parent: "AMP-NEXT-PAGE"
+  attrs: {
+    name: "footer"
+    mandatory: true
+  }
+}
 tags: {  # <amp-next-page>
   html_format: AMP
   tag_name: "AMP-NEXT-PAGE"
   spec_name: "amp-next-page with inline config"
   unique: true
   requires_extension: "amp-next-page"
+  ### TODO(wassgha) Uncomment after deprecating 0.1
+  # mandatory_parent: "BODY"
+  # mandatory_last_child: true
+  attrs: { name: "deep-parsing" }
+  attrs: { name: "max-pages" }
   reference_points: {
     tag_spec_name: "AMP-NEXT-PAGE > [separator]"
     unique: true
   }
   reference_points: {
-    tag_spec_name: "amp-next-page extension .json configuration"
+    tag_spec_name: "AMP-NEXT-PAGE > [recommendation-box]"
+    unique: true
+  }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > [footer]"
+    unique: true
+  }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > SCRIPT[type=application/json]"
     mandatory: true
     unique: true
   }
@@ -70,6 +104,11 @@ tags: {  # <amp-next-page src>
   spec_name: "amp-next-page with src attribute"
   unique: true
   requires_extension: "amp-next-page"
+  ### TODO(wassgha) Uncomment after deprecating 0.1
+  # mandatory_parent: "BODY"
+  # mandatory_last_child: true
+  attrs: { name: "deep-parsing" }
+  attrs: { name: "max-pages" }
   attrs: {
     name: "src"
     mandatory: true
@@ -79,10 +118,23 @@ tags: {  # <amp-next-page src>
     }
     blacklisted_value_regex: "__amp_source_origin"
   }
+  attrs: { name: "xssi-prefix" }
   reference_points: {
     tag_spec_name: "AMP-NEXT-PAGE > [separator]"
     unique: true
   }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > [recommendation-box]"
+    unique: true
+  }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > [footer]"
+    unique: true
+  }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > SCRIPT[type=application/json]"
+    unique: true
+  }
   spec_url: "https://amp.dev/documentation/components/amp-next-page"
 }
 tags: {  # <amp-next-page type="adsense">
@@ -91,6 +143,9 @@ tags: {  # <amp-next-page type="adsense">
   spec_name: "amp-next-page [type=adsense]"
   unique: true
   requires_extension: "amp-next-page"
+  ### TODO(wassgha) Uncomment after deprecating 0.1
+  # mandatory_parent: "BODY"
+  # mandatory_last_child: true
   attrs: {
     name: "data-client"
     mandatory: true
@@ -99,6 +154,8 @@ tags: {  # <amp-next-page type="adsense">
     name: "data-slot"
     mandatory: true
   }
+  attrs: { name: "deep-parsing" }
+  attrs: { name: "max-pages" }
   attrs: {
     name: "type"
     mandatory: true
@@ -108,5 +165,17 @@ tags: {  # <amp-next-page type="adsense">
     tag_spec_name: "AMP-NEXT-PAGE > [separator]"
     unique: true
   }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > [recommendation-box]"
+    unique: true
+  }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > [footer]"
+    unique: true
+  }
+  reference_points: {
+    tag_spec_name: "AMP-NEXT-PAGE > SCRIPT[type=application/json]"
+    unique: true
+  }
   spec_url: "https://amp.dev/documentation/components/amp-next-page"
 }
diff --git a/extensions/amp-o2-player/validator-amp-o2-player.protoascii b/extensions/amp-o2-player/validator-amp-o2-player.protoascii
index 8542604b8..07cd62b14 100644
--- a/extensions/amp-o2-player/validator-amp-o2-player.protoascii
+++ b/extensions/amp-o2-player/validator-amp-o2-player.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-o2-player
     name: "amp-o2-player"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-pinterest/validator-amp-pinterest.protoascii b/extensions/amp-pinterest/validator-amp-pinterest.protoascii
index 36b61f92b..3dafb56e6 100644
--- a/extensions/amp-pinterest/validator-amp-pinterest.protoascii
+++ b/extensions/amp-pinterest/validator-amp-pinterest.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-pinterest
     name: "amp-pinterest"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-reach-player/validator-amp-reach-player.protoascii b/extensions/amp-reach-player/validator-amp-reach-player.protoascii
index 9e78ce5e9..93a6ffd83 100644
--- a/extensions/amp-reach-player/validator-amp-reach-player.protoascii
+++ b/extensions/amp-reach-player/validator-amp-reach-player.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-reach-player
     name: "amp-reach-player"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-izlesene/validator-amp-izlesene.protoascii b/extensions/amp-redbull-player/validator-amp-redbull-player.protoascii
similarity index 75%
copy from extensions/amp-izlesene/validator-amp-izlesene.protoascii
copy to extensions/amp-redbull-player/validator-amp-redbull-player.protoascii
index 7c56262f5..8ee98822d 100644
--- a/extensions/amp-izlesene/validator-amp-izlesene.protoascii
+++ b/extensions/amp-redbull-player/validator-amp-redbull-player.protoascii
@@ -1,5 +1,5 @@
 #
-# Copyright 2017 The AMP HTML Authors. All Rights Reserved.
+# Copyright 2019 The AMP HTML Authors. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,32 +14,32 @@
 # limitations under the license.
 #
 
-tags: {  # amp-izlesene
+tags: {  # amp-redbull-player
   html_format: AMP
   tag_name: "SCRIPT"
   extension_spec: {
-    name: "amp-izlesene"
+    name: "amp-redbull-player"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
   }
   attr_lists: "common-extension-attrs"
 }
-tags: {  # <amp-izlesene>
+tags: {  # <amp-redbull-player>
   html_format: AMP
-  tag_name: "AMP-IZLESENE"
-  requires_extension: "amp-izlesene"
+  tag_name: "AMP-REDBULL-PLAYER"
+  requires_extension: "amp-redbull-player"
   attrs: {
-    name: "data-videoid"
+    name: "data-param-videoid"
     mandatory: true
-    value_regex: "[0-9]+"
   }
   attr_lists: "extended-amp-global"
   amp_layout: {
-    supported_layouts: FILL
     supported_layouts: FIXED
     supported_layouts: FIXED_HEIGHT
-    supported_layouts: FLEX_ITEM
     supported_layouts: RESPONSIVE
+    supported_layouts: FILL
+    supported_layouts: FLEX_ITEM
+    supported_layouts: FLUID
+    supported_layouts: INTRINSIC
   }
 }
diff --git a/extensions/amp-script/validator-amp-script.protoascii b/extensions/amp-script/validator-amp-script.protoascii
index c0f6d5c69..9725ae2e2 100644
--- a/extensions/amp-script/validator-amp-script.protoascii
+++ b/extensions/amp-script/validator-amp-script.protoascii
@@ -33,6 +33,9 @@ tags: {  # <amp-script> (local script)
     name: "id"
     add_value_to_set: AMP_SCRIPT_IDS
     mandatory: true
+    # When updating this blacklisted_value_regex, also update for
+    # mandatory-id-attr and $GLOBAL_ATTRS in validator-main.protoascii, and
+    # validator-amp-mustache.protoascii.
     blacklisted_value_regex: "(^|\\s)("  # Values are space separated
         "__amp_\\S*|"
         "__count__|"
@@ -211,6 +214,7 @@ tags: {  # <amp-script>
     supported_layouts: FIXED
     supported_layouts: FIXED_HEIGHT
     supported_layouts: FLEX_ITEM
+    supported_layouts: INTRINSIC
     supported_layouts: NODISPLAY
     supported_layouts: RESPONSIVE
   }
diff --git a/extensions/amp-selector/validator-amp-selector.protoascii b/extensions/amp-selector/validator-amp-selector.protoascii
index 82d7e6b2b..1c6580e19 100644
--- a/extensions/amp-selector/validator-amp-selector.protoascii
+++ b/extensions/amp-selector/validator-amp-selector.protoascii
@@ -15,13 +15,14 @@
 #
 tags: {
   html_format: AMP
+  html_format: AMP4ADS
   html_format: ACTIONS
   tag_name: "SCRIPT"
   extension_spec: {
     name: "amp-selector"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
@@ -34,12 +35,13 @@ tags: {
     name: "amp-selector"
     # AMP4EMAIL doesn't allow version: "latest".
     version: "0.1"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
 tags: {  # <amp-selector> for AMP (autoplay attribute allowed)
   html_format: AMP
+  html_format: AMP4ADS
   html_format: AMP4EMAIL
   html_format: ACTIONS
   tag_name: "AMP-SELECTOR"
@@ -93,6 +95,7 @@ tags: {  # <amp-selector> for AMP (autoplay attribute allowed)
 # always match, we want to prefer 'option' when both of them match.
 tags: {
   html_format: AMP
+  html_format: AMP4ADS
   html_format: AMP4EMAIL
   html_format: ACTIONS
   tag_name: "$REFERENCE_POINT"
@@ -113,6 +116,7 @@ tags: {
 }
 tags: {
   html_format: AMP
+  html_format: AMP4ADS
   html_format: AMP4EMAIL
   html_format: ACTIONS
   tag_name: "$REFERENCE_POINT"
diff --git a/extensions/amp-sidebar/validator-amp-sidebar.protoascii b/extensions/amp-sidebar/validator-amp-sidebar.protoascii
index b4e5f7605..5c3df0a18 100644
--- a/extensions/amp-sidebar/validator-amp-sidebar.protoascii
+++ b/extensions/amp-sidebar/validator-amp-sidebar.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-sidebar
     name: "amp-sidebar"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
@@ -37,11 +37,11 @@ tags: {  # amp-sidebar
   }
   attr_lists: "common-extension-attrs"
 }
-tags: {  # <amp-sidebar> not in amp-story
+tags: {  # <amp-sidebar> not in amp-story or email
   html_format: AMP
-  html_format: AMP4EMAIL
   html_format: ACTIONS
   tag_name: "AMP-SIDEBAR"
+  spec_name: "amp-sidebar"
   # There is an alternate spec for amp-sidebar in amp-story.
   disallowed_ancestor: "AMP-STORY"
   requires_extension: "amp-sidebar"
@@ -59,6 +59,22 @@ tags: {  # <amp-sidebar> not in amp-story
   }
   spec_url: "https://amp.dev/documentation/components/amp-sidebar"
 }
+tags: {  # <amp-sidebar> in email
+  html_format: AMP4EMAIL
+  tag_name: "AMP-SIDEBAR"
+  spec_name: "amp-sidebar (AMP4EMAIL)"
+  requires_extension: "amp-sidebar"
+  attrs: {
+    name: "side"
+    value: "left"
+    value: "right"
+  }
+  attr_lists: "extended-amp-global"
+  amp_layout: {
+    supported_layouts: NODISPLAY
+  }
+  spec_url: "https://amp.dev/documentation/components/amp-sidebar"
+}
 tags: { # <amp-sidebar> in amp-story
   html_format: AMP
   tag_name: "AMP-SIDEBAR"
diff --git a/extensions/amp-social-share/validator-amp-social-share.protoascii b/extensions/amp-social-share/validator-amp-social-share.protoascii
index d74f62d4e..73711c0c9 100644
--- a/extensions/amp-social-share/validator-amp-social-share.protoascii
+++ b/extensions/amp-social-share/validator-amp-social-share.protoascii
@@ -22,7 +22,7 @@ tags: {  # amp-social-share
     name: "amp-social-share"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii b/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii
index 84081d8c0..d72b5a18c 100644
--- a/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii
+++ b/extensions/amp-soundcloud/validator-amp-soundcloud.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-soundcloud
     name: "amp-soundcloud"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-springboard-player/validator-amp-springboard-player.protoascii b/extensions/amp-springboard-player/validator-amp-springboard-player.protoascii
index 6a887086d..1bd1ed641 100644
--- a/extensions/amp-springboard-player/validator-amp-springboard-player.protoascii
+++ b/extensions/amp-springboard-player/validator-amp-springboard-player.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-springboard-player
     name: "amp-springboard-player"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-sticky-ad/validator-amp-sticky-ad.protoascii b/extensions/amp-sticky-ad/validator-amp-sticky-ad.protoascii
index b12deae1c..4f45ed63d 100644
--- a/extensions/amp-sticky-ad/validator-amp-sticky-ad.protoascii
+++ b/extensions/amp-sticky-ad/validator-amp-sticky-ad.protoascii
@@ -22,7 +22,7 @@ tags: {  # <script custom-element="amp-sticky-ad">
     version: "1.0"
     version: "latest"
     deprecated_version: "0.1"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
   }
   attr_lists: "common-extension-attrs"
 }
diff --git a/extensions/amp-story/validator-amp-story.protoascii b/extensions/amp-story/validator-amp-story.protoascii
index 94c57912f..627571eb0 100644
--- a/extensions/amp-story/validator-amp-story.protoascii
+++ b/extensions/amp-story/validator-amp-story.protoascii
@@ -104,7 +104,6 @@ tags: {  # <amp-story>
     child_tag_name_oneof: "AMP-GEO"
     child_tag_name_oneof: "AMP-PIXEL"
     child_tag_name_oneof: "AMP-SIDEBAR"
-    child_tag_name_oneof: "AMP-STORY-ACCESS"
     child_tag_name_oneof: "AMP-STORY-AUTO-ADS"
     child_tag_name_oneof: "AMP-STORY-BOOKEND"
     child_tag_name_oneof: "AMP-STORY-PAGE"
@@ -124,6 +123,7 @@ tags: {  # <amp-story-page>
       protocol: "https"
     }
   }
+  attrs: { name: "next-page-no-ad" }
   attr_lists: "mandatory-id-attr"
   child_tags: {
     child_tag_name_oneof: "AMP-ANALYTICS"
@@ -342,18 +342,6 @@ tags: {
   }
   spec_url: "https://amp.dev/documentation/components/amp-story"
 }
-tags: {  # <amp-story-access>
-  html_format: AMP
-  tag_name: "AMP-STORY-ACCESS"
-  requires_extension: "amp-access"
-  mandatory_parent: "AMP-STORY"
-  attrs: {
-    name: "type"
-    value: "blocking"
-    value: "notification"
-  }
-  attr_lists: "extended-amp-global"
-}
 tags: {  # <amp-story-bookend>
   html_format: AMP
   tag_name: "AMP-STORY-BOOKEND"
@@ -604,6 +592,7 @@ descendant_tag_list: {
   tag: "SMALL"
   tag: "SOLIDCOLOR"
   tag: "SPAN"
+  tag: "STOP"
   tag: "STRONG"
   tag: "SUB"
   tag: "SUP"
@@ -636,7 +625,6 @@ descendant_tag_list: {
   tag: "AMP-EXPERIMENT"
   tag: "AMP-FIT-TEXT"
   tag: "AMP-FONT"
-  tag: "AMP-GFYCAT"
   tag: "AMP-GIST"
   tag: "AMP-GOOGLE-VRVIEW-IMAGE"
   tag: "AMP-IMG"
@@ -733,6 +721,7 @@ descendant_tag_list: {
   tag: "SOLIDCOLOR"
   tag: "SOURCE"
   tag: "SPAN"
+  tag: "STOP"
   tag: "STRONG"
   tag: "SUB"
   tag: "SUP"
@@ -808,12 +797,9 @@ descendant_tag_list {
   tag: "AMP-FX-COLLECTION"
   tag: "AMP-FX-FLYING-CARPET"
   tag: "AMP-GFYCAT"
-  tag: "AMP-GFYCAT"
-  tag: "AMP-GIST"
   tag: "AMP-GIST"
   tag: "AMP-GOOGLE-DOCUMENT-EMBED"
   tag: "AMP-GOOGLE-VRVIEW-IMAGE"
-  tag: "AMP-GOOGLE-VRVIEW-IMAGE"
   tag: "AMP-HULU"
   tag: "AMP-IMA-VIDEO"
   tag: "AMP-IMAGE-SLIDER"
@@ -824,8 +810,6 @@ descendant_tag_list {
   tag: "AMP-JWPLAYER"
   tag: "AMP-KALTURA-PLAYER"
   tag: "AMP-LIST"
-  tag: "AMP-LIST"
-  tag: "AMP-LIVE-LIST"
   tag: "AMP-LIVE-LIST"
   tag: "AMP-MATHML"
   tag: "AMP-MEGAPHONE"
@@ -938,6 +922,7 @@ descendant_tag_list {
   tag: "SOLIDCOLOR"
   tag: "SOURCE"
   tag: "SPAN"
+  tag: "STOP"
   tag: "STRONG"
   tag: "SUB"
   tag: "SUP"
diff --git a/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii b/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii
index 0c49ab3c2..925a7796d 100644
--- a/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii
+++ b/extensions/amp-subscriptions/validator-amp-subscriptions.protoascii
@@ -65,4 +65,85 @@ tags: {  # amp-subscriptions-google
   requires_extension: "amp-subscriptions"
   attr_lists: "common-extension-attrs"
 }
+tags: {  # <script cryptokeys sha-256-hash>
+  html_format: AMP
+  tag_name: "SCRIPT"
+  spec_name: "cryptokeys .json script"
+  unique: true
+  mandatory_parent: "HEAD"
+  requires_extension: "amp-subscriptions"
+  attrs: {
+    name: "cryptokeys"
+    mandatory: true
+    value: ""
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  attrs: {
+    name: "sha-256-hash"
+    mandatory: true
+  }
+  attrs: {
+    name: "type"
+    mandatory: true
+    value_casei: "application/json"
+  }
+}
+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"
+  mandatory_ancestor: "BODY"
+  attrs: {
+    name: "encrypted"
+    mandatory: true
+    dispatch_key: NAME_DISPATCH
+  }
+  attrs: {
+    name: "subscriptions-section"
+    value_casei: "content"
+  }
+  attrs: {
+    name: "swg_amp_cache_nonce"
+    mandatory: true
+  }
+}
+tags: {  # <script type="application/octet-stream" ciphertext>
+  html_format: AMP
+  tag_name: "SCRIPT"
+  spec_name: "subscriptions script ciphertext"
+  mandatory_parent: "subscriptions-section content swg_amp_cache_nonce"
+  mandatory_ancestor: "BODY"
+  attrs: {
+    name: "ciphertext"
+    dispatch_key: NAME_DISPATCH
+    mandatory: true
+  }
+  attrs: {
+    name: "type"
+    value_casei: "application/octet-stream"
+    mandatory: true
+  }
+  cdata: {
+    blacklisted_cdata_regex: {
+      regex: "<!--"
+      error_message: "html comments"
+    }
+  }
+}
+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"
+  mandatory_ancestor: "BODY"
+  requires_extension: "amp-subscriptions"
+  attrs: {
+    name: "swg_amp_cache_nonce"
+    mandatory: true
+    dispatch_key: NAME_DISPATCH
+  }
+}
 # related attributes are listed in validator-main.protoascii
diff --git a/extensions/amp-twitter/validator-amp-twitter.protoascii b/extensions/amp-twitter/validator-amp-twitter.protoascii
index 02ec95854..8922ff7ae 100644
--- a/extensions/amp-twitter/validator-amp-twitter.protoascii
+++ b/extensions/amp-twitter/validator-amp-twitter.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-twitter
     name: "amp-twitter"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-user-notification/validator-amp-user-notification.protoascii b/extensions/amp-user-notification/validator-amp-user-notification.protoascii
index 2ddd0341f..87bccf634 100644
--- a/extensions/amp-user-notification/validator-amp-user-notification.protoascii
+++ b/extensions/amp-user-notification/validator-amp-user-notification.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-user-notification
     name: "amp-user-notification"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-vimeo/validator-amp-vimeo.protoascii b/extensions/amp-vimeo/validator-amp-vimeo.protoascii
index 640d4fbda..50eeeadac 100644
--- a/extensions/amp-vimeo/validator-amp-vimeo.protoascii
+++ b/extensions/amp-vimeo/validator-amp-vimeo.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-vimeo
     name: "amp-vimeo"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-vine/validator-amp-vine.protoascii b/extensions/amp-vine/validator-amp-vine.protoascii
index 7d60cd28d..37cc42dc0 100644
--- a/extensions/amp-vine/validator-amp-vine.protoascii
+++ b/extensions/amp-vine/validator-amp-vine.protoascii
@@ -21,7 +21,7 @@ tags: {  # amp-vine
     name: "amp-vine"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/extensions/amp-youtube/validator-amp-youtube.protoascii b/extensions/amp-youtube/validator-amp-youtube.protoascii
index b87d55b5f..3923f0fd1 100644
--- a/extensions/amp-youtube/validator-amp-youtube.protoascii
+++ b/extensions/amp-youtube/validator-amp-youtube.protoascii
@@ -22,7 +22,7 @@ tags: {  # amp-youtube
     name: "amp-youtube"
     version: "0.1"
     version: "latest"
-    requires_usage: GRANDFATHERED
+    requires_usage: EXEMPTED
     deprecated_allow_duplicates: true
   }
   attr_lists: "common-extension-attrs"
diff --git a/validator/java/src/test/resources/validator-all-test.protoascii b/validator/java/src/test/resources/validator-all-test.protoascii
new file mode 100644
index 000000000..1fb79c027
--- /dev/null
+++ b/validator/java/src/test/resources/validator-all-test.protoascii
@@ -0,0 +1,61 @@
+tags: {
+  html_format: AMP4EMAIL
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "test_satisfies"
+  satisfies: "amp-app-banner button[open-button]"
+  mandatory_alternatives: "alternative"
+  siblings_disallowed: true
+}
+
+descendant_tag_list: {
+      name: "satisfies-allowed-descendants"
+      tag: "A"
+      tag: "ABBR"
+}
+
+tags: {
+  html_format: AMP4EMAIL
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "test_satisfies_parent_head"
+  descendant_tag_list: "satisfies-allowed-descendants"
+  attrs: {
+      name: "href"
+      mandatory: true
+      alternative_names: "href"
+      value_url: {
+        protocol: "https"
+      }
+      blacklisted_value_regex: "__amp_source_origin"
+    }
+    mark_descendants {
+        marker: AUTOSCROLL
+      }
+    siblings_disallowed: true
+    mandatory_last_child: true
+    named_id: STYLE_AMP_CUSTOM
+
+}
+
+tags: {
+  html_format: AMP4EMAIL
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "SCRIPT"
+  attrs: {
+    name: "type"
+    mandatory: true
+    value_casei: "application/json"
+  }
+}
+
+tags: {
+  html_format: AMP4EMAIL
+  tag_name: "$REFERENCE_POINT"
+  spec_name: "test_parent"
+  satisfies: "amp-app-banner button[open-button]"
+  mandatory_alternatives: "alternative"
+  siblings_disallowed: true
+  child_tags: {
+      mandatory_num_child_tags: 1
+      first_child_tag_name_oneof: "AMP-AD"
+  }
+}
\ No newline at end of file
diff --git a/validator/validator-main.protoascii b/validator/validator-main.protoascii
index f9b75ec6e..1157fb364 100644
--- a/validator/validator-main.protoascii
+++ b/validator/validator-main.protoascii
@@ -26,14 +26,14 @@ min_validator_revision_required: 375
 # newer versions of the spec file. This is currently a Google internal
 # mechanism, validator.js does not use this facility. However, any
 # change to this file (validator-main.js) requires updating this revision id.
-spec_file_revision: 961
+spec_file_revision: 1012
 
 styles_spec_url: "https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/style_pages"
 script_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags"
 
 css_length_spec: {
   html_format: AMP
-  max_bytes: 50000
+  max_bytes: 75000
   max_bytes_per_inline_style: 1000
   spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#maximum-size"
 }
@@ -1058,7 +1058,7 @@ tags: {  # Special custom 'author' spreadsheet for AMP
     value_casei: "text/css"
   }
   cdata: {
-    max_bytes: 50000
+    max_bytes: 75000
     max_bytes_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#maximum-size"
     css_spec: {
       at_rule_spec: {
@@ -1176,7 +1176,7 @@ tags: {  # Special custom 'author' spreadsheet for transformed AMP
     value_casei: "text/css"
   }
   cdata: {
-    max_bytes: 50000
+    max_bytes: 75000
     url_bytes_included: false
     max_bytes_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#maximum-size"
     css_spec: {
@@ -1257,7 +1257,7 @@ tags: {  # Special custom 'author' spreadsheet for AMP4ADS
     value_casei: "text/css"
   }
   cdata: {
-    max_bytes: 20000  # Smaller than AMP, which is 50,000.
+    max_bytes: 20000  # Smaller than AMP, which is 75,000.
     max_bytes_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/a4a_spec#css"
     css_spec: {
       at_rule_spec: {
@@ -1346,7 +1346,7 @@ tags: {  # Special custom 'author' spreadsheet for AMP
   }
   # TODO(b/68756045): Whitelist CSS properties allowed in Dynamic Mail.
   cdata: {
-    max_bytes: 50000
+    max_bytes: 75000
     max_bytes_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#maximum-size"
     css_spec: {
       at_rule_spec: {
@@ -1623,12 +1623,17 @@ attr_lists: {
 tags: {
   html_format: AMP
   html_format: AMP4ADS
-  html_format: AMP4EMAIL
   html_format: ACTIONS
   tag_name: "SECTION"
   disallowed_ancestor: "AMP-ACCORDION"
   attr_lists: "poool-access-attrs"
 }
+tags: {
+  html_format: AMP4EMAIL
+  tag_name: "SECTION"
+  spec_name: "section (AMP4EMAIL)"
+  disallowed_ancestor: "AMP-ACCORDION"
+}
 # 4.3.4 The nav element
 tags: {
   html_format: AMP
@@ -1890,11 +1895,13 @@ tags: {
       # Blackberry messenger
       # (http://devblog.blackberry.com/2015/02/cross-platform-sharing-with-bbm/)
       protocol: "bbmi"
+      protocol: "chrome"
       # IOS over-the-air app installation
       # (https://github.com/nifcblm/AHPP-iOS-App/wiki/How-to-distribute-enterprise-iOS-App)
       protocol: "itms-services"
       protocol: "fb-me"
       protocol: "fb-messenger"
+      protocol: "feed"
       protocol: "intent"
       # Line messenger (https://media.line.me/howto/en/)
       protocol: "line"
@@ -1962,6 +1969,7 @@ tags: {
   attrs: {
     name: "type"
     value_casei: "text/html"
+    value_casei: "application/rss+xml"
   }
   attr_lists: "name-attr"
   # <amp-bind>
@@ -2104,6 +2112,10 @@ tags: {
   attrs: {
     name: "datetime"
   }
+  attrs: {
+    name: "pubdate"
+    value: ""
+  }
 }
 # 4.5.12 The code element
 tags: {
@@ -4410,7 +4422,10 @@ attr_lists: {
   attrs: { name: "accept" }
   attrs: { name: "accesskey" }
   attrs: { name: "autocomplete" }
-  attrs: { name: "autofocus" }
+  attrs: {
+    disabled_by: "amp4email"
+    name: "autofocus"
+  }
   attrs: { name: "checked" }
   attrs: { name: "disabled" }
   attrs: { name: "height" }
@@ -4503,7 +4518,6 @@ tags: {
   attrs: {
     name: "type"
     blacklisted_value_regex: "(^|\\s)("  # Values are space separated.
-        "button|"
         "file|"
         "image|"
         "password|"
@@ -4852,30 +4866,89 @@ tags: {
 # description are allowed.
 # Note that the type TEXT/PLAIN description is define in
 # validator-amp-mustache.protoascii.
+
+# The three tagspecs below all handle the runtime engine v0.js script. They
+# enforce that exactly one runtime script must be included. This tagspec is
+# for the standard runtime, while the one below it is an identical spec but for
+# the LTS runtime, with the only difference being the src attribute. The third
+# is the corresponding spec for AMP4EMAIL and ACTIONS.
+attr_lists: {
+  name: "amphtml-engine-attrs"
+  attrs: {
+    name: "async"
+    mandatory: true
+    value: ""
+  }
+  attrs: {
+    name: "crossorigin"
+    value: "anonymous"
+  }
+  attrs: {
+    name: "type"
+    value_casei: "text/javascript"
+  }
+}
 tags: {
   html_format: AMP
-  html_format: AMP4EMAIL
-  html_format: ACTIONS
   tag_name: "SCRIPT"
   spec_name: "amphtml engine v0.js script"
-  mandatory: true
+  mandatory_alternatives: "amphtml engine v0.js script"
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
+  attr_lists: "amphtml-engine-attrs"
   attrs: {
-    name: "async"
+    name: "src"
     mandatory: true
-    value: ""
+    value: "https://cdn.ampproject.org/v0.js"
+    dispatch_key: NAME_VALUE_DISPATCH
+  }
+  cdata: {
+    blacklisted_cdata_regex: {
+      regex: "."
+      error_message: "contents"
     }
+  }
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup"
+}
+tags: {
+  html_format: AMP
+  tag_name: "SCRIPT"
+  spec_name: "amphtml engine v0.js lts script"
+  mandatory_alternatives: "amphtml engine v0.js script"
+  unique: true
+  mandatory_parent: "HEAD"
+  attr_lists: "nonce-attr"
+  attr_lists: "amphtml-engine-attrs"
   attrs: {
     name: "src"
     mandatory: true
-    value: "https://cdn.ampproject.org/v0.js"
+    value: "https://cdn.ampproject.org/lts/v0.js"
     dispatch_key: NAME_VALUE_DISPATCH
   }
+  cdata: {
+    blacklisted_cdata_regex: {
+      regex: "."
+      error_message: "contents"
+    }
+  }
+  spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup"
+}
+tags: {
+  html_format: AMP4EMAIL
+  html_format: ACTIONS
+  tag_name: "SCRIPT"
+  spec_name: "amphtml engine v0.js script [AMP4EMAIL,ACTIONS]"
+  mandatory: true
+  unique: true
+  mandatory_parent: "HEAD"
+  attr_lists: "nonce-attr"
+  attr_lists: "amphtml-engine-attrs"
   attrs: {
-    name: "type"
-    value_casei: "text/javascript"
+    name: "src"
+    mandatory: true
+    value: "https://cdn.ampproject.org/v0.js"
+    dispatch_key: NAME_VALUE_DISPATCH
   }
   cdata: {
     blacklisted_cdata_regex: {
@@ -4893,21 +4966,13 @@ tags: {
   unique: true
   mandatory_parent: "HEAD"
   attr_lists: "nonce-attr"
-  attrs: {
-    name: "async"
-    mandatory: true
-    value: ""
-  }
+  attr_lists: "amphtml-engine-attrs"
   attrs: {
     name: "src"
     mandatory: true
     value: "https://cdn.ampproject.org/amp4ads-v0.js"
     dispatch_key: NAME_VALUE_DISPATCH
   }
-  attrs: {
-    name: "type"
-    value_casei: "text/javascript"
-  }
   cdata: {
     blacklisted_cdata_regex: {
       regex: "."
@@ -5307,9 +5372,11 @@ tags: {
   html_format: ACTIONS
   enabled_by: "transformed"
   tag_name: "I-AMPHTML-SIZER"
+  spec_name: "I-AMPHTML-SIZER-RESPONSIVE"
   explicit_attrs_only: true
   attrs: {
     name: "style"
+    dispatch_key: NAME_DISPATCH
     mandatory: true
     blacklisted_value_regex: "!\\s*important"
     css_declaration: {
@@ -5320,6 +5387,49 @@ tags: {
   }
 }
 
+tags: {
+  html_format: AMP
+  html_format: ACTIONS
+  enabled_by: "transformed"
+  tag_name: "I-AMPHTML-SIZER"
+  spec_name: "I-AMPHTML-SIZER-INTRINSIC"
+  explicit_attrs_only: true
+  attrs: {
+    name: "class"
+    value: "i-amphtml-sizer"
+    mandatory: true
+    dispatch_key: NAME_DISPATCH
+  }
+}
+
+tags: {
+  html_format: AMP
+  enabled_by: "transformed"
+  tag_name: "IMG"
+  spec_name: "IMG-I-AMPHTML-INTRINSIC-SIZER"
+  mandatory_parent: "I-AMPHTML-SIZER-INTRINSIC"
+  attrs: {
+    name: "alt"
+    value: ""
+    mandatory: true
+  }
+  attrs: {
+    name: "aria-hidden"
+    value: "true"
+    mandatory: true
+  }
+  attrs: {
+    name: "role"
+    value: "presentation"
+    mandatory: true
+  }
+  attrs: {
+    name: "src"
+    value_regex: "data:image\\/svg\\+xml;charset=utf-8,<svg height=\"\\d+\" width=\"\\d+\" xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg\" version=\"1\\.1\"\\/>|data:image\\/svg\\+xml;charset=utf-8,<svg height='100' width='300' xmlns='http:\\/\\/www\\.w3\\.org\\/2000\\/svg' version='1\\.1'\\/>"
+    mandatory: true
+  }
+}
+
 # AMP Layout attributes: implied for TagSpecs with amp_layout field
 # set. Note that while these attributes are defined as optional here,
 # depending on amp layout the validator will examine these fields and
@@ -5361,6 +5471,10 @@ attr_lists: {
     mandatory: true
     value: ""
   }
+  attrs: {
+    name: "crossorigin"
+    value: "anonymous"
+  }
   attrs: {
     disabled_by: "transformed"
     disabled_by: "amp4email"
@@ -5379,7 +5493,8 @@ attr_lists: {
     name: "id"
     mandatory: true
     # When updating this blacklisted_value_regex, also update the entry for
-    # "id" in $GLOBAL_ATTRS and "id" in "amp-script extension local script".
+    # "id" in $GLOBAL_ATTRS, and also validator-amp-script.protoascii and
+    # validator-amp-mustache.protoascii.
     blacklisted_value_regex: "(^|\\s)("  # Values are space separated
         "__amp_\\S*|"
         "__count__|"
@@ -6411,7 +6526,8 @@ attr_lists: {
   attrs: {
     name: "id"
     # When updating this blacklisted_value_regex, also update for
-    # mandatory-id-attr and validator-amp-mustache.protoascii.
+    # mandatory-id-attr, validator-amp-script.protoascii, and
+    # validator-amp-mustache.protoascii.
     blacklisted_value_regex: "(^|\\s)("  # Values are space separated
         "__amp_\\S*|"
         "__count__|"
@@ -6622,6 +6738,7 @@ attr_lists: {
     value: "rangeUnderflow"
     value: "stepMismatch"
     value: "tooLong"
+    value: "tooShort"
     value: "typeMismatch"
     value: "valueMissing"
     trigger: {
@@ -6693,6 +6810,16 @@ attr_lists: {
     name: "subscriptions-service"
     requires_extension: "amp-subscriptions"
   }
+  # amp-next-page specific attributes, see
+  # https://amp.dev/documentation/components/amp-next-page
+  attrs: {
+    name: "next-page-hide"
+    requires_extension: "amp-next-page"
+  }
+  attrs: {
+    name: "next-page-replace"
+    requires_extension: "amp-next-page"
+  }
   # <amp-bind>
   attrs: { name: "[aria-activedescendant]" }
   attrs: { name: "[aria-atomic]" }
@@ -6762,156 +6889,162 @@ error_specificity { code: WARNING_TAG_REQUIRED_BY_MISSING specificity: 14 }
 error_specificity { code: EXTENSION_UNUSED specificity: 15 }
 error_specificity { code: WARNING_EXTENSION_UNUSED specificity: 16 }
 error_specificity { code: WARNING_EXTENSION_DEPRECATED_VERSION specificity: 17 }
-error_specificity { code: DISALLOWED_TAG specificity: 18 }
-error_specificity { code: DISALLOWED_ATTR specificity: 19 }
-error_specificity { code: INVALID_ATTR_VALUE specificity: 20 }
-error_specificity { code: DUPLICATE_ATTRIBUTE specificity: 21 }
-error_specificity { code: ATTR_VALUE_REQUIRED_BY_LAYOUT specificity: 22 }
-error_specificity { code: MANDATORY_ATTR_MISSING specificity: 23 }
-error_specificity { code: MANDATORY_ONEOF_ATTR_MISSING specificity: 24 }
-error_specificity { code: MANDATORY_ANYOF_ATTR_MISSING specificity: 25 }
-error_specificity { code: ATTR_REQUIRED_BUT_MISSING specificity: 26 }
-error_specificity { code: DUPLICATE_UNIQUE_TAG specificity: 27 }
-error_specificity { code: DUPLICATE_UNIQUE_TAG_WARNING specificity: 28 }
-error_specificity { code: STYLESHEET_TOO_LONG specificity: 29 }
-error_specificity { code: STYLESHEET_AND_INLINE_STYLE_TOO_LONG specificity: 30 }
-error_specificity { code: INLINE_STYLE_TOO_LONG specificity: 31 }
-error_specificity { code: CSS_SYNTAX_INVALID_AT_RULE specificity: 32 }
+error_specificity { code: NON_LTS_SCRIPT_AFTER_LTS specificity: 18 }
+error_specificity { code: LTS_SCRIPT_AFTER_NON_LTS specificity: 19 }
+error_specificity { code: DISALLOWED_TAG specificity: 20 }
+error_specificity { code: DISALLOWED_ATTR specificity: 21 }
+error_specificity { code: INVALID_ATTR_VALUE specificity: 22 }
+error_specificity { code: DUPLICATE_ATTRIBUTE specificity: 23 }
+error_specificity { code: ATTR_VALUE_REQUIRED_BY_LAYOUT specificity: 24 }
+error_specificity { code: MANDATORY_ATTR_MISSING specificity: 25 }
+error_specificity { code: MANDATORY_ONEOF_ATTR_MISSING specificity: 26 }
+error_specificity { code: MANDATORY_ANYOF_ATTR_MISSING specificity: 27 }
+error_specificity { code: ATTR_REQUIRED_BUT_MISSING specificity: 28 }
+error_specificity { code: DUPLICATE_UNIQUE_TAG specificity: 29 }
+error_specificity { code: DUPLICATE_UNIQUE_TAG_WARNING specificity: 30 }
+error_specificity { code: STYLESHEET_TOO_LONG specificity: 31 }
+error_specificity { code: STYLESHEET_AND_INLINE_STYLE_TOO_LONG specificity: 32 }
+error_specificity { code: INLINE_STYLE_TOO_LONG specificity: 33 }
+error_specificity { code: CSS_SYNTAX_INVALID_AT_RULE specificity: 34 }
 error_specificity {
-  code: MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE specificity: 33
-}
-error_specificity { code: INVALID_PROPERTY_VALUE_IN_ATTR_VALUE specificity: 34 }
-error_specificity { code: DISALLOWED_PROPERTY_IN_ATTR_VALUE specificity: 35 }
-error_specificity { code: MUTUALLY_EXCLUSIVE_ATTRS specificity: 36 }
-error_specificity { code: UNESCAPED_TEMPLATE_IN_ATTR_VALUE specificity: 37 }
-error_specificity { code: TEMPLATE_PARTIAL_IN_ATTR_VALUE specificity: 38 }
-error_specificity { code: TEMPLATE_IN_ATTR_NAME specificity: 39 }
+  code: MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE specificity: 35
+}
+error_specificity { code: INVALID_PROPERTY_VALUE_IN_ATTR_VALUE specificity: 36 }
+error_specificity { code: DISALLOWED_PROPERTY_IN_ATTR_VALUE specificity: 37 }
+error_specificity { code: MUTUALLY_EXCLUSIVE_ATTRS specificity: 38 }
+error_specificity { code: UNESCAPED_TEMPLATE_IN_ATTR_VALUE specificity: 39 }
+error_specificity { code: TEMPLATE_PARTIAL_IN_ATTR_VALUE specificity: 40 }
+error_specificity { code: TEMPLATE_IN_ATTR_NAME specificity: 41 }
 error_specificity {
-  code: INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT specificity: 40
-}
-error_specificity { code: MISSING_LAYOUT_ATTRIBUTES specificity: 41 }
-error_specificity { code: IMPLIED_LAYOUT_INVALID specificity: 42 }
-error_specificity { code: SPECIFIED_LAYOUT_INVALID specificity: 43 }
-error_specificity { code: ATTR_DISALLOWED_BY_IMPLIED_LAYOUT specificity: 44 }
-error_specificity { code: ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT specificity: 45 }
-error_specificity { code: DUPLICATE_DIMENSION specificity: 46 }
-error_specificity { code: DISALLOWED_RELATIVE_URL specificity: 47 }
-error_specificity { code: MISSING_URL specificity: 48 }
-error_specificity { code: DISALLOWED_DOMAIN specificity: 49 }
-error_specificity { code: INVALID_URL_PROTOCOL specificity: 50 }
-error_specificity { code: INVALID_URL specificity: 51 }
-error_specificity { code: DISALLOWED_STYLE_ATTR specificity: 52 }
-error_specificity { code: CSS_SYNTAX_STRAY_TRAILING_BACKSLASH specificity: 53 }
-error_specificity { code: CSS_SYNTAX_UNTERMINATED_COMMENT specificity: 54 }
-error_specificity { code: CSS_SYNTAX_UNTERMINATED_STRING specificity: 55 }
-error_specificity { code: CSS_SYNTAX_BAD_URL specificity: 56 }
+  code: INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT specificity: 42
+}
+error_specificity { code: MISSING_LAYOUT_ATTRIBUTES specificity: 43 }
+error_specificity { code: IMPLIED_LAYOUT_INVALID specificity: 44 }
+error_specificity { code: SPECIFIED_LAYOUT_INVALID specificity: 45 }
+error_specificity { code: ATTR_DISALLOWED_BY_IMPLIED_LAYOUT specificity: 46 }
+error_specificity { code: ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT specificity: 47 }
+error_specificity { code: DUPLICATE_DIMENSION specificity: 48 }
+error_specificity { code: DISALLOWED_RELATIVE_URL specificity: 49 }
+error_specificity { code: MISSING_URL specificity: 50 }
+error_specificity { code: DISALLOWED_DOMAIN specificity: 51 }
+error_specificity { code: INVALID_URL_PROTOCOL specificity: 52 }
+error_specificity { code: INVALID_URL specificity: 53 }
+error_specificity { code: DISALLOWED_STYLE_ATTR specificity: 54 }
+error_specificity { code: CSS_SYNTAX_STRAY_TRAILING_BACKSLASH specificity: 55 }
+error_specificity { code: CSS_SYNTAX_UNTERMINATED_COMMENT specificity: 56 }
+error_specificity { code: CSS_SYNTAX_UNTERMINATED_STRING specificity: 57 }
+error_specificity { code: CSS_SYNTAX_BAD_URL specificity: 58 }
 error_specificity {
-  code: CSS_SYNTAX_EOF_IN_PRELUDE_OF_QUALIFIED_RULE specificity: 57
+  code: CSS_SYNTAX_EOF_IN_PRELUDE_OF_QUALIFIED_RULE specificity: 59
 }
-error_specificity { code: CSS_SYNTAX_INVALID_DECLARATION specificity: 58 }
-error_specificity { code: CSS_SYNTAX_INCOMPLETE_DECLARATION specificity: 59 }
-error_specificity { code: CSS_SYNTAX_ERROR_IN_PSEUDO_SELECTOR specificity: 60 }
-error_specificity { code: CSS_SYNTAX_MISSING_SELECTOR specificity: 61 }
-error_specificity { code: CSS_SYNTAX_NOT_A_SELECTOR_START specificity: 62 }
+error_specificity { code: CSS_SYNTAX_INVALID_DECLARATION specificity: 60 }
+error_specificity { code: CSS_SYNTAX_INCOMPLETE_DECLARATION specificity: 61 }
+error_specificity { code: CSS_SYNTAX_ERROR_IN_PSEUDO_SELECTOR specificity: 62 }
+error_specificity { code: CSS_SYNTAX_MISSING_SELECTOR specificity: 63 }
+error_specificity { code: CSS_SYNTAX_NOT_A_SELECTOR_START specificity: 64 }
 error_specificity {
-  code: CSS_SYNTAX_UNPARSED_INPUT_REMAINS_IN_SELECTOR specificity: 63
-}
-error_specificity { code: CSS_SYNTAX_MISSING_URL specificity: 64 }
-error_specificity { code: CSS_SYNTAX_DISALLOWED_DOMAIN specificity: 65 }
-error_specificity { code: CSS_SYNTAX_INVALID_URL specificity: 66 }
-error_specificity { code: CSS_SYNTAX_INVALID_URL_PROTOCOL specificity: 67 }
-error_specificity { code: CSS_SYNTAX_DISALLOWED_RELATIVE_URL specificity: 68 }
-error_specificity { code: INCORRECT_NUM_CHILD_TAGS specificity: 69 }
-error_specificity { code: DISALLOWED_CHILD_TAG_NAME specificity: 70 }
-error_specificity { code: DISALLOWED_FIRST_CHILD_TAG_NAME specificity: 71 }
-error_specificity { code: CSS_SYNTAX_INVALID_ATTR_SELECTOR specificity: 72 }
+  code: CSS_SYNTAX_UNPARSED_INPUT_REMAINS_IN_SELECTOR specificity: 65
+}
+error_specificity { code: CSS_SYNTAX_MISSING_URL specificity: 66 }
+error_specificity { code: CSS_SYNTAX_DISALLOWED_DOMAIN specificity: 67 }
+error_specificity { code: CSS_SYNTAX_INVALID_URL specificity: 68 }
+error_specificity { code: CSS_SYNTAX_INVALID_URL_PROTOCOL specificity: 69 }
+error_specificity { code: CSS_SYNTAX_DISALLOWED_RELATIVE_URL specificity: 70 }
+error_specificity { code: INCORRECT_NUM_CHILD_TAGS specificity: 71 }
+error_specificity { code: DISALLOWED_CHILD_TAG_NAME specificity: 72 }
+error_specificity { code: DISALLOWED_FIRST_CHILD_TAG_NAME specificity: 73 }
+error_specificity { code: CSS_SYNTAX_INVALID_ATTR_SELECTOR specificity: 74 }
 error_specificity {
-  code: CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT specificity: 73
+  code: CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT specificity: 75
 }
-error_specificity { code: MANDATORY_REFERENCE_POINT_MISSING specificity: 74 }
-error_specificity { code: DUPLICATE_REFERENCE_POINT specificity: 75 }
-error_specificity { code: TAG_REFERENCE_POINT_CONFLICT specificity: 76 }
+error_specificity { code: MANDATORY_REFERENCE_POINT_MISSING specificity: 76 }
+error_specificity { code: DUPLICATE_REFERENCE_POINT specificity: 77 }
+error_specificity { code: TAG_REFERENCE_POINT_CONFLICT specificity: 78 }
 error_specificity {
   code: CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT_SINGULAR
-  specificity: 77
+  specificity: 79
 }
-error_specificity { code: CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE specificity: 78 }
+error_specificity { code: CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE specificity: 80 }
 error_specificity {
   code: CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE_WITH_HINT
-  specificity: 79
+  specificity: 81
 }
 error_specificity {
   code: CSS_SYNTAX_PROPERTY_DISALLOWED_WITHIN_AT_RULE
-  specificity: 80
+  specificity: 82
 }
 error_specificity {
   code: CSS_SYNTAX_PROPERTY_DISALLOWED_TOGETHER_WITH
-  specificity: 81
+  specificity: 83
 }
 error_specificity {
   code: CSS_SYNTAX_PROPERTY_REQUIRES_QUALIFICATION
-  specificity: 82
+  specificity: 84
 }
 error_specificity {
   code: BASE_TAG_MUST_PRECEED_ALL_URLS
-  specificity: 83
-}
-error_specificity { code: DISALLOWED_SCRIPT_TAG specificity: 100 }
-error_specificity { code: GENERAL_DISALLOWED_TAG specificity: 101 }
-error_specificity { code: DEPRECATED_ATTR specificity: 102 }
-error_specificity { code: DEPRECATED_TAG specificity: 103 }
-error_specificity { code: DISALLOWED_MANUFACTURED_BODY specificity: 104 }
-error_specificity { code: DOCUMENT_TOO_COMPLEX specificity: 105 }
-error_specificity { code: INCORRECT_MIN_NUM_CHILD_TAGS specificity: 106 }
-error_specificity { code: TAG_NOT_ALLOWED_TO_HAVE_SIBLINGS specificity: 107 }
-error_specificity { code: MANDATORY_LAST_CHILD_TAG specificity: 108 }
+  specificity: 85
+}
+error_specificity { code: DISALLOWED_SCRIPT_TAG specificity: 102 }
+error_specificity { code: GENERAL_DISALLOWED_TAG specificity: 103 }
+error_specificity { code: DEPRECATED_ATTR specificity: 104 }
+error_specificity { code: DEPRECATED_TAG specificity: 105 }
+error_specificity { code: DISALLOWED_MANUFACTURED_BODY specificity: 106 }
+error_specificity { code: DOCUMENT_TOO_COMPLEX specificity: 107 }
+error_specificity { code: INCORRECT_MIN_NUM_CHILD_TAGS specificity: 108 }
+error_specificity { code: TAG_NOT_ALLOWED_TO_HAVE_SIBLINGS specificity: 109 }
+error_specificity { code: MANDATORY_LAST_CHILD_TAG specificity: 110 }
 error_specificity {
   code: CSS_SYNTAX_INVALID_PROPERTY
-  specificity: 109
+  specificity: 111
 }
 error_specificity {
   code: CSS_SYNTAX_INVALID_PROPERTY_NOLIST
-  specificity: 110
+  specificity: 112
 }
 error_specificity {
   code: CSS_SYNTAX_QUALIFIED_RULE_HAS_NO_DECLARATIONS
-  specificity: 111
+  specificity: 113
 }
 error_specificity {
   code: CSS_SYNTAX_DISALLOWED_QUALIFIED_RULE_MUST_BE_INSIDE_KEYFRAME
-  specificity: 112
+  specificity: 114
 }
 error_specificity {
   code: CSS_SYNTAX_DISALLOWED_KEYFRAME_INSIDE_KEYFRAME
-  specificity: 113
+  specificity: 115
 }
 error_specificity {
   code: CSS_SYNTAX_MALFORMED_MEDIA_QUERY
-  specificity: 115
+  specificity: 117
 }
 error_specificity {
   code: CSS_SYNTAX_DISALLOWED_MEDIA_TYPE
-  specificity: 116
+  specificity: 118
 }
 error_specificity {
   code: CSS_SYNTAX_DISALLOWED_MEDIA_FEATURE
-  specificity: 117
+  specificity: 119
 }
 error_specificity {
   code: INVALID_UTF8
-  specificity: 118
+  specificity: 120
 }
 error_specificity {
   code: CSS_EXCESSIVELY_NESTED
-  specificity: 119
+  specificity: 121
 }
 error_specificity {
   code: DOCUMENT_SIZE_LIMIT_EXCEEDED
-  specificity: 120
+  specificity: 122
 }
 error_specificity {
   code: VALUE_SET_MISMATCH
-  specificity: 121
+  specificity: 123
+}
+error_specificity {
+  code: INVALID_DOCTYPE_HTML
+  specificity: 124
 }
 error_specificity {
   code: DEV_MODE_ONLY
@@ -6926,6 +7059,11 @@ error_formats {
   code: UNKNOWN_CODE
   format: "Unknown error."
 }
+error_formats {
+  code: INVALID_DOCTYPE_HTML
+  format: "Invalid or missing doctype declaration. Should be <!doctype html>. "
+          "See https://amp.dev/documentation/guides-and-tutorials/start/create/basic_markup/"
+}
 error_formats {
   code: MANDATORY_TAG_MISSING
   format: "The mandatory tag '%1' is missing or incorrect."
@@ -6960,6 +7098,17 @@ error_formats {
           "extension. This may become an error in the future."
 }
 
+error_formats {
+  code: NON_LTS_SCRIPT_AFTER_LTS
+  format: "'%1' must use the LTS version to correspond with the first script "
+          "in the page, which uses LTS."
+}
+error_formats {
+  code: LTS_SCRIPT_AFTER_NON_LTS
+  format: "'%1' must use the non-LTS version to correspond with the first "
+          "script in the page, which does not use LTS."
+}
+
 error_formats {
   code: ATTR_REQUIRED_BUT_MISSING
   format: "The attribute '%1' in tag '%2' is missing or incorrect, but "

@westonruter westonruter added this to the v1.5 milestone Mar 15, 2020
@googlebot googlebot added the cla: yes Signed the Google CLA label Mar 15, 2020
includes/sanitizers/class-amp-allowed-tags-generated.php Outdated Show resolved Hide resolved
),
'tag_spec' => array(
'mandatory_ancestor' => 'body',
'mandatory_parent' => 'subscriptions-section content swg_amp_cache_nonce',
Copy link
Member Author

Choose a reason for hiding this comment

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

This looks like it is going to be problematic.

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, it is. We can't currently add <script ciphertext type="application/octet-stream">...</script> inside of a section[subscriptions-section]. Will need to be addressed as part of #3817

'spec_name' => 'AMP-MEGA-MENU item-content',
),
),
'AMP-MEGA-MENU item-heading' => array(
Copy link
Member Author

Choose a reason for hiding this comment

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

Problem: there is no item-heading element.

'spec_name' => 'AMP-MEGA-MENU NAV > UL/OL > LI',
),
),
'AMP-MEGA-MENU item-content' => array(
Copy link
Member Author

Choose a reason for hiding this comment

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

Problem: there is no item-content element.

'spec_name' => 'AMP-MEGA-MENU NAV > UL/OL',
),
),
'AMP-MEGA-MENU NAV > UL/OL > LI' => array(
Copy link
Member Author

Choose a reason for hiding this comment

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

The UL/OL will be a problem here.

'spec_name' => 'AMP-MEGA-MENU > NAV',
),
),
'AMP-MEGA-MENU NAV > UL/OL' => array(
Copy link
Member Author

Choose a reason for hiding this comment

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

The UL/OL will be a problem here.

@westonruter westonruter marked this pull request as ready for review March 18, 2020 06:26
@westonruter westonruter requested a review from amedina March 18, 2020 06:26
Copy link
Member

@amedina amedina left a comment

Choose a reason for hiding this comment

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

Ship it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cla: yes Signed the Google CLA
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants