ampproject / ampproject/amphtml
Validator fails to detect lack of required amp-access-scroll extension script
- Dominant language
- JavaScript
- Stars
- 14.9k
- Forks
- 4.1k
- PR merge metrics
- No merged PRs in 30d
Description
## What's the issue?
If a site using `amp-access` adds an integration to the Scroll network, it is required to load the `amp-access-scroll` extension script ([see docs](https://amp.dev/documentation/components/amp-access-scroll/)).
However, the validator does not detect this issue as it is missing a rule to recognize this use case. This is clearly an invalid AMP page, though, as the functionality it is trying to use is broken if that dependency is missing.
This also means that the `auto-extensions` transformer in the NodeJS and PHP toolbox packages will not properly add the required `amp-access-scroll` extension script automatically, leading to a broken page.
Related issue: https://github.com/ampproject/amp-wp/issues/5999
## How do we reproduce the issue?
Here's a playground example which should throw a validation error, as the required `amp-access-scroll` extension script is not loaded even though it is being used by the markup: [Playground example](https://playground.amp.dev/#share=PCEtLSAjIyBJbnRyb2R1Y3Rpb24KICBUaGUgW2FtcC1hY2Nlc3NdKC9jb250ZW50L2FtcC1kZXYvZG9jdW1lbnRhdGlvbi9jb21wb25lbnRzL3JlZmVyZW5jZS9hbXAtYWNjZXNzLXYwLjEubWQpIGNvbXBvbmVudCBhZGRzIHN1cHBvcnQgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uLCBhbGxvd2luZyB5b3UgdG8gbGltaXQgYWNjZXNzIHRvIHBhcnRzIG9mIHlvdXIgQU1QIHBhZ2VzIGFzIHdlbGwgYXMgZGlzcGxheSBjdXN0b21pemVkIGNvbnRlbnQgZm9yIHRoZSBsb2dnZWQgaW4gdXNlci4gIEl0IGFsc28gYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB2aWV3IGNvdW50aW5nLCBwYXl3YWxscyBhbmQgc3Vic2NyaXB0aW9ucy4gRm9yIHNhbXBsZSBgYW1wLWFjY2Vzc2Agc2VydmVyIGVuZHBvaW50cywgc2VlIHRoZSBbYW1wLXB1Ymxpc2hlci1zYW1wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbXBwcm9qZWN0L2FtcC1wdWJsaXNoZXItc2FtcGxlKSBwcm9qZWN0LgotLT48IS0tIC0tPgo8IWRvY3R5cGUgaHRtbD4KPGh0bWwg4pqhIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8dGl0bGU+YW1wLWFjY2VzczwvdGl0bGU+CiAgPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vY2RuLmFtcHByb2plY3Qub3JnL3YwLmpzIj48L3NjcmlwdD4KCiAgPCEtLSAjIyBTZXR1cCAtLT4KICA8IS0tIEltcG9ydCB0aGUgYGFtcC1hY2Nlc3NgIGNvbXBvbmVudCBpbiB0aGUgaGVhZGVyLiAtLT4KICA8c2NyaXB0IGFzeW5jIGN1c3RvbS1lbGVtZW50PSJhbXAtYWNjZXNzIiBzcmM9Imh0dHBzOi8vY2RuLmFtcHByb2plY3Qub3JnL3YwL2FtcC1hY2Nlc3MtMC4xLmpzIj48L3NjcmlwdD4KICA8IS0tIGBhbXAtYWNjZXNzYCByZXF1aXJlcyBgYW1wLWFuYWx5dGljc2AgdG8gYmUgaW1wb3J0ZWQgYXMgd2VsbC4gLS0+CiAgPHNjcmlwdCBhc3luYyBjdXN0b20tZWxlbWVudD0iYW1wLWFuYWx5dGljcyIgc3JjPSJodHRwczovL2Nkbi5hbXBwcm9qZWN0Lm9yZy92MC9hbXAtYW5hbHl0aWNzLTAuMS5qcyI+PC9zY3JpcHQ+CgogIDwhLS0gT3B0aW9uYWxseSwgdXNlIHRoZSBbYGFtcC1tdXN0YWNoZWBdKC9jb250ZW50L2FtcC1kZXYvZG9jdW1lbnRhdGlvbi9jb21wb25lbnRzL3JlZmVyZW5jZS9hbXAtbXVzdGFjaGUtdjAuMi5tZCkgY29tcG9uZW50IHRvIHNob3cgdGV4dCB3aXRoIHZhbHVlcyByZXBsYWNlZCBmcm9tIHRoZSBhdXRob3JpemF0aW9uIHJlc3BvbnNlIC0tPgogIDxzY3JpcHQgYXN5bmMgY3VzdG9tLXRlbXBsYXRlPSJhbXAtbXVzdGFjaGUiIHNyYz0iaHR0cHM6Ly9jZG4uYW1wcHJvamVjdC5vcmcvdjAvYW1wLW11c3RhY2hlLTAuMi5qcyI+PC9zY3JpcHQ+CgogIDwhLS0gQWRkIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgYGF1dGhvcml6YXRpb25gIGFuZCB0aGUgYGxvZ2luYCBlbmRwb2ludHMuIFdlIHByb3ZpZGUgdHdvIGxvZ2luIGVuZHBvaW50cywgb25lIGZvciBzaWduLWluIGFuZCBvbmUgZm9yIHNpZ24tb3V0LiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIGZhbGxiYWNrIHJlc3BvbnNlIHRoYXQgd2lsbCBiZSB1c2VkIGlmIHRoZSBhdXRob3JpemF0aW9uIGZhaWxzIHdpdGggdGhlIGBhdXRob3JpemF0aW9uRmFsbGJhY2tSZXNwb25zZWAgYXR0cmlidXRlLgoKICAgIFRoZSBbUGluZ2JhY2sgRW5kcG9pbnRdKC9jb250ZW50L2FtcC1kZXYvZG9jdW1lbnRhdGlvbi9jb21wb25lbnRzL3JlZmVyZW5jZS9hbXAtYWNjZXNzLm1kI3BpbmdiYWNrLWVuZHBvaW50KSBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgdmlld3MgdGhlIGRvY3VtZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byB1cGRhdGUgbWV0ZXJpbmcgaW5mb3JtYXRpb24uIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgdXNlZCBpbiB0aGlzIHNhbXBsZS4KICAtLT4KICA8c2NyaXB0IGlkPSJhbXAtYWNjZXNzIiB0eXBlPSJhcHBsaWNhdGlvbi9qc29uIj4KICAgIHsKICAgICAgICAiYXV0aG9yaXphdGlvbiI6ICIvZG9jdW1lbnRhdGlvbi9leGFtcGxlcy9hcGkvYW1wLWFjY2Vzcy9hdXRob3JpemF0aW9uP3JpZD1SRUFERVJfSUQmdXJsPUNBTk9OSUNBTF9VUkwmcmVmPURPQ1VNRU5UX1JFRkVSUkVSJl89UkFORE9NIiwKICAgICAgICAicGluZ2JhY2siOiAiL2RvY3VtZW50YXRpb24vZXhhbXBsZXMvYXBpL2FtcC1hY2Nlc3MvcGluZ2JhY2s/cmlkPVJFQURFUl9JRCZ1cmw9Q0FOT05JQ0FMX1VSTCZyZWY9RE9DVU1FTlRfUkVGRVJSRVImXz1SQU5ET00iLAogICAgICAgICJsb2dpbiI6IHsKICAgICAgICAgICJzaWduLWluIjogIi9kb2N1bWVudGF0aW9uL2V4YW1wbGVzL2FwaS9hbXAtYWNjZXNzL2xvZ2luP3JpZD1SRUFERVJfSUQmdXJsPUNBTk9OSUNBTF9VUkwiLAogICAgICAgICAgInNpZ24tb3V0IjogIi9kb2N1bWVudGF0aW9uL2V4YW1wbGVzL2FwaS9hbXAtYWNjZXNzL2xvZ291dCIKICAgICAgICB9LAogICAgICAgICJhdXRob3JpemF0aW9uRmFsbGJhY2tSZXNwb25zZSI6IHsKICAgICAgICAgICAgImVycm9yIjogdHJ1ZSwKICAgICAgICAgICAgImxvZ2dlZEluIjogZmFsc2UsCiAgICAgICAgICAgICJwb3dlclVzZXIiOiBmYWxzZQogICAgICAgIH0sCgkJInZlbmRvciI6ICJzY3JvbGwiLAoJCSJuYW1lc3BhY2UiOiAic2Nyb2xsIgogICAgfQogIDwvc2NyaXB0PgogIDxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRwczovL2FtcC5kZXYvZG9jdW1lbnRhdGlvbi9leGFtcGxlcy9jb21wb25lbnRzL2FtcC1hY2Nlc3MvaW5kZXguaHRtbCI+CiAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCI+CiAgPHN0eWxlIGFtcC1ib2lsZXJwbGF0ZT5ib2R5ey13ZWJraXQtYW5pbWF0aW9uOi1hbXAtc3RhcnQgOHMgc3RlcHMoMSxlbmQpIDBzIDEgbm9ybWFsIGJvdGg7LW1vei1hbmltYXRpb246LWFtcC1zdGFydCA4cyBzdGVwcygxLGVuZCkgMHMgMSBub3JtYWwgYm90aDstbXMtYW5pbWF0aW9uOi1hbXAtc3RhcnQgOHMgc3RlcHMoMSxlbmQpIDBzIDEgbm9ybWFsIGJvdGg7YW5pbWF0aW9uOi1hbXAtc3RhcnQgOHMgc3RlcHMoMSxlbmQpIDBzIDEgbm9ybWFsIGJvdGh9QC13ZWJraXQta2V5ZnJhbWVzIC1hbXAtc3RhcnR7ZnJvbXt2aXNpYmlsaXR5OmhpZGRlbn10b3t2aXNpYmlsaXR5OnZpc2libGV9fUAtbW96LWtleWZyYW1lcyAtYW1wLXN0YXJ0e2Zyb217dmlzaWJpbGl0eTpoaWRkZW59dG97dmlzaWJpbGl0eTp2aXNpYmxlfX1ALW1zLWtleWZyYW1lcyAtYW1wLXN0YXJ0e2Zyb217dmlzaWJpbGl0eTpoaWRkZW59dG97dmlzaWJpbGl0eTp2aXNpYmxlfX1ALW8ta2V5ZnJhbWVzIC1hbXAtc3RhcnR7ZnJvbXt2aXNpYmlsaXR5OmhpZGRlbn10b3t2aXNpYmlsaXR5OnZpc2libGV9fUBrZXlmcmFtZXMgLWFtcC1zdGFydHtmcm9te3Zpc2liaWxpdHk6aGlkZGVufXRve3Zpc2liaWxpdHk6dmlzaWJsZX19PC9zdHlsZT48bm9zY3JpcHQ+PHN0eWxlIGFtcC1ib2lsZXJwbGF0ZT5ib2R5ey13ZWJraXQtYW5pbWF0aW9uOm5vbmU7LW1vei1hbmltYXRpb246bm9uZTstbXMtYW5pbWF0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9PC9zdHlsZT48L25vc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PgoKICA8IS0tICMjIENvbnRyb2xsaW5nIHZpc2liaWxpdHkgLS0+CiAgPCEtLSBUaGlzIHNlY3Rpb24gaXMgdmlzaWJsZSB0byBhbGwgdXNlcnMuIE5vIHNwZWNpYWwgbWFya3VwIGlzIG5lZWRlZCBpbiB0aGlzIGNhc2UuLS0+CiAgPHNlY3Rpb24+CiAgICBXZWxjb21lIHRvIHRoZSB3ZWJzaXRlISBUaGlzIHNlY3Rpb24gaXMgdmlzaWJsZSB0byBhbGwuCiAgPC9zZWN0aW9uPgoKICAgPCEtLSBVc2UgdGhlIGBhbXAtYWNjZXNzYCBhdHRyaWJ1dGUgdG8gY29udHJvbCB0aGUgdmlzaWJpbGl0eSBvZiBlYWNoIGNvbXBvbmVudC4gVGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIGJvb2xlYW4gdmFsdWUuIElmIGl0IGV2YWx1YXRlcyB0byBgVFJVRWAsIHRoZSBzZWN0aW9uIHdpbGwgYmUgc2hvd24uCgogICAgV2UgdXNlIHRoZSBgbG9nZ2VkSW5gIHByb3BlcnR5IGZyb20gdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGxvZ2dlZCBpbi4KICAtLT4KICA8c2VjdGlvbiBhbXAtYWNjZXNzPSJsb2dnZWRJbiI+CiAgICBUaGlzIHNlY3Rpb24gaXMgb25seSB2aXNpYmxlIGlmIHlvdSdyZSBsb2dnZWQgaW4uIFdlbGNvbWUgYmFjayEKICA8L3NlY3Rpb24+CgogIDwhLS0gVGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBjYW4gYmUgdXNlZCB0byBjb252ZXkgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9nZ2VkIGluIHVzZXIuIEluIHRoaXMgY2FzZSwgd2UgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHVzZXJzIHdobyBoYXZlIHRoZSBgcG93ZXJVc2VyYCBwcm9wZXJ0eSBzZXQgaW4gYWRkaXRpb24gdG8gYmVpbmcgbG9nZ2VkIGluLgogIC0tPgogIDxzZWN0aW9uIGFtcC1hY2Nlc3M9ImxvZ2dlZEluIEFORCBwb3dlclVzZXIiPgogICAgVGhpcyBzZWN0aW9uIGlzIG9ubHkgdmlzaWJsZSBpZiB5b3UncmUgbG9nZ2VkIGluIDxlbT5hbmQ8L2VtPiBjbGFzc2lmaWVkIGFzICJwb3dlciB1c2VyIi4KICA8L3NlY3Rpb24+CgogIDwhLS0gSWYgdGhlIGBsb2dnZWRJbmAgcHJvcGVydHkgaGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGZhbHNlLCB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHVzZXIgaXMgbm90IGxvZ2dlZCBpbi4KICAgLS0+CiAgPHNlY3Rpb24gYW1wLWFjY2Vzcz0iTk9UIGxvZ2dlZEluIj4KICAgIFRoaXMgc2VjdGlvbiBpcyBvbmx5IHZpc2libGUgaWYgeW91J3JlIG5vdCBsb2dnZWQgaW4uCiAgPC9zZWN0aW9uPgoKICA8IS0tIENvbWJpbmUgYGFtcC1hY2Nlc3NgIGFuZCBgYW1wLW11c3RhY2hlYCB0byBzaG93IGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gdGhlIGF1dGhvcml6YXRpb24gcmVxdWVzdC4gSW4gdGhpcyBjYXNlIHdlIHNob3cgdGhlIGVtYWlsIHJldHVybmVkIGluIHRoZSBhdXRoZW50aWZpY2F0aW9uIHJlc3BvbnNlLgogIC0tPgogIDxzZWN0aW9uIGFtcC1hY2Nlc3M9ImxvZ2dlZEluIj4KICAgIDx0ZW1wbGF0ZSBhbXAtYWNjZXNzLXRlbXBsYXRlIHR5cGU9ImFtcC1tdXN0YWNoZSI+CiAgICAgIDxoMz5IZWxsbyB7e2VtYWlsfX0hPC9oMz4KCiAgICAgIHt7I3Bvd2VyVXNlcn19CiAgICAgIDxwPllvdSBhcmUgYSBwb3dlciB1c2VyLjwvcD4KICAgICAge3svcG93ZXJVc2VyfX0KICAgIDwvdGVtcGxhdGU+CiAgPC9zZWN0aW9uPgoKICA8IS0tICMjIExvZ2luICAtLT4KICA8IS0tIFVzZSBgb249InRhcDphbXAtYWNjZXNzLmxvZ2luLXNpZ24taW4iYCB0byBvcGVuIHRoZSBsb2dpbiBkaWFsb2cgd2hlbiB0aGUgZWxlbWVudCBpcyBjbGlja2VkLiBUaGlzIHNpbXBseSBvcGVucyBhIHBvcHVwIHdpbmRvdyB0aGF0IHRha2VzIHRoZSB1c2VyIHRvIHRoZSBVUkwgZGVmaW5lZCBpbnNpZGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgdGhlIHRvcC4gYGFtcC1hY2Nlc3MtaGlkZWAgd2lsbCBkZWZhdWx0IHRoZSBjb21wb25lbnQgdG8gYmUgaGlkZGVuIGFuZCBlbmFibGVkIGxhdGVyIGlmIHRoZSBgYW1wLWFjY2Vzc2AgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgdG8gYFRSVUVgIC0tPgogIDxidXR0b24gYW1wLWFjY2Vzcz0iTk9UIGxvZ2dlZEluIiBhbXAtYWNjZXNzLWhpZGUgb249InRhcDphbXAtYWNjZXNzLmxvZ2luLXNpZ24taW4iPgogICAgTG9naW4KICA8L2J1dHRvbj4KCiAgPCEtLSAjIyBMb2dvdXQgIC0tPgogIDwhLS0gVGhlIGxvZ291dCBsaW5rIHNob3VsZCBvbmx5IGJlIHNob3duIGZvciBsb2dnZWQgaW4gc3Vic2NyaWJlcnMuIFdlIHVzZSBhIHRyaWNrIGhlcmU6IHRoZSBsb2dvdXQgaXMgYSBsb2dpbiBhY3Rpb24gdGhhdCBkaXJlY3RseSByZWRpcmVjdHMgYmFjayB0byB0aGUgb3JpZ2luYWwgVVJMLiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIHBhZ2UgdXBkYXRlcyB3aXRob3V0IGJlaW5nIHJlbG9hZGVkLgogIC0tPgogIDxidXR0b24gYW1wLWFjY2Vzcz0ibG9nZ2VkSW4iIGFtcC1hY2Nlc3MtaGlkZSBvbj0idGFwOmFtcC1hY2Nlc3MubG9naW4tc2lnbi1vdXQiPgogICAgTG9nb3V0CiAgPC9idXR0b24+CiAgPCEtLSBDaGVjayBvdXQgdGhlIFtvZmZpY2lhbCBhbXAtYWNjZXNzIHNhbXBsZV0oaHR0cHM6Ly9yb2NreS1zaWVycmEtMTkxOS5oZXJva3VhcHAuY29tLykgZm9yIGRlbW9zIG9mIGZpcnN0LWNsaWNrLWZyZWUgYW5kIHZpZXcgY291bnRpbmcuIC0tPgoKICA8c2VjdGlvbiBhbXAtYWNjZXNzPSJOT1Qgc2Nyb2xsLnNjcm9sbCI+CiAgICBUaGlzIGlzIG9ubHkgc2hvd24gd2hlbiB1c2VyIG5vdCBpZGVudGlmaWVkIGFzIG1lbWJlciBvZiB0aGUgU2Nyb2xsIG5ldHdvcmsuCiAgPC9zZWN0aW9uPgo8L2JvZHk+PC9odG1sPg==)
Contributor guide
Research direction
Start with the linked AMP Playground example and reproduce the missing validation error for an amp-access configuration using the Scroll vendor. Then trace the validator rule and the auto-extensions behavior in the NodeJS and PHP toolbox packages; done means the validator reports the missing amp-access-scroll script and both toolboxes add it automatically.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, node.js, php
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100