diff --git a/build-system/test-configs/forbidden-terms.js b/build-system/test-configs/forbidden-terms.js index 2a3d68c03aa6..ceb6767eb50d 100644 --- a/build-system/test-configs/forbidden-terms.js +++ b/build-system/test-configs/forbidden-terms.js @@ -870,6 +870,8 @@ const forbiddenTermsSrcInclusive = { 'extensions/amp-analytics/0.1/transport.js', 'extensions/amp-web-push/0.1/iframehost.js', 'extensions/amp-recaptcha-input/0.1/amp-recaptcha-service.js', + 'extensions/amp-auto-lightbox/0.1/amp-auto-lightbox.js', + 'extensions/amp-image-slider/0.1/amp-image-slider.js', ], }, '\\.getTime\\(\\)': { diff --git a/builtins/amp-img/amp-img.js b/builtins/amp-img/amp-img.js index dc6cd6518e2c..b405a2e13147 100644 --- a/builtins/amp-img/amp-img.js +++ b/builtins/amp-img/amp-img.js @@ -21,6 +21,7 @@ import {Services} from '../../src/services'; import {dev} from '../../src/log'; import {guaranteeSrcForSrcsetUnsupportedBrowsers} from '../../src/utils/img'; import {listen} from '../../src/event-helper'; +import {propagateAttributes} from '../../src/core/dom/propagate-attributes'; import {propagateObjectFitStyles, setImportantStyles} from '../../src/style'; import {registerElement} from '../../src/service/custom-element-registry'; import {removeElement, scopedQuerySelector} from '../../src/dom'; @@ -130,8 +131,9 @@ export class AmpImg extends BaseElement { this.element ); } - this.propagateAttributes( + propagateAttributes( attrs, + this.element, this.img_, /* opt_removeMissingAttrs */ true ); @@ -216,7 +218,7 @@ export class AmpImg extends BaseElement { // It is important to call this before setting `srcset` attribute. this.maybeGenerateSizes_(/* sync setAttribute */ true); - this.propagateAttributes(ATTRIBUTES_TO_PROPAGATE, this.img_); + propagateAttributes(ATTRIBUTES_TO_PROPAGATE, this.element, this.img_); this.propagateDataset(this.img_); if (!IS_ESM) { guaranteeSrcForSrcsetUnsupportedBrowsers(this.img_); diff --git a/examples/amp-lightbox.amp.html b/examples/amp-lightbox.amp.html index 0dcfa9652c18..30c236916a3c 100644 --- a/examples/amp-lightbox.amp.html +++ b/examples/amp-lightbox.amp.html @@ -63,6 +63,8 @@
+
+
diff --git a/examples/image-lightbox.amp.html b/examples/image-lightbox.amp.html index 25e861cf1ba8..2b908c612cee 100644 --- a/examples/image-lightbox.amp.html +++ b/examples/image-lightbox.amp.html @@ -22,6 +22,13 @@
+ + diff --git a/extensions/amp-anim/0.1/amp-anim.js b/extensions/amp-anim/0.1/amp-anim.js index 47205b27615c..7f3dab9cb7c3 100644 --- a/extensions/amp-anim/0.1/amp-anim.js +++ b/extensions/amp-anim/0.1/amp-anim.js @@ -22,6 +22,7 @@ import { observeWithSharedInOb, unobserveWithSharedInOb, } from '../../../src/viewport-observer'; +import {propagateAttributes} from '../../../src/core/dom/propagate-attributes'; import {propagateObjectFitStyles} from '../../../src/style'; const TAG = 'amp-anim'; @@ -55,7 +56,7 @@ export class AmpAnim extends AMP.BaseElement { buildCallback() { this.img_ = new Image(); this.img_.setAttribute('decoding', 'async'); - this.propagateAttributes(BUILD_ATTRIBUTES, this.img_); + propagateAttributes(BUILD_ATTRIBUTES, this.element, this.img_); this.applyFillContent(this.img_, true); propagateObjectFitStyles(this.element, this.img_); @@ -88,8 +89,9 @@ export class AmpAnim extends AMP.BaseElement { const img = dev().assertElement(this.img_); // Remove missing attributes to remove the placeholder srcset if none is // specified on the element. - this.propagateAttributes( + propagateAttributes( LAYOUT_ATTRIBUTES, + this.element, img, /* opt_removeMissingAttrs */ true ); diff --git a/extensions/amp-audio/0.1/amp-audio.js b/extensions/amp-audio/0.1/amp-audio.js index 9491dfaeba9f..92baf1cf7473 100644 --- a/extensions/amp-audio/0.1/amp-audio.js +++ b/extensions/amp-audio/0.1/amp-audio.js @@ -28,6 +28,7 @@ import {closestAncestorElementBySelector} from '../../../src/dom'; import {dev, user} from '../../../src/log'; import {getMode} from '../../../src/mode'; import {listen} from '../../../src/event-helper'; +import {propagateAttributes} from '../../../src/core/dom/propagate-attributes'; import {setIsMediaComponent} from '../../../src/video-interface'; import {triggerAnalyticsEvent} from '../../../src/analytics'; @@ -85,7 +86,11 @@ export class AmpAudio extends AMP.BaseElement { if (src !== undefined) { assertHttpsUrl(src, this.element); } - this.propagateAttributes(['src', 'loop', 'controlsList'], this.audio_); + propagateAttributes( + ['src', 'loop', 'controlsList'], + this.element, + this.audio_ + ); } const artist = mutations['artist']; @@ -119,7 +124,7 @@ export class AmpAudio extends AMP.BaseElement { if (src) { assertHttpsUrl(src, this.element); } - this.propagateAttributes( + propagateAttributes( [ 'src', 'preload', @@ -131,6 +136,7 @@ export class AmpAudio extends AMP.BaseElement { 'aria-labelledby', 'controlsList', ], + this.element, audio ); diff --git a/extensions/amp-auto-lightbox/0.1/amp-auto-lightbox.js b/extensions/amp-auto-lightbox/0.1/amp-auto-lightbox.js index 97a4be2146c4..11748995f7e2 100644 --- a/extensions/amp-auto-lightbox/0.1/amp-auto-lightbox.js +++ b/extensions/amp-auto-lightbox/0.1/amp-auto-lightbox.js @@ -32,6 +32,7 @@ import { whenUpgradedToCustomElement, } from '../../../src/dom'; import {dev} from '../../../src/log'; +import {loadPromise} from '../../../src/event-helper'; import {measureIntersectionNoRoot} from '../../../src/utils/intersection-no-root'; import {toArray} from '../../../src/core/types/array'; import {tryParseJson} from '../../../src/core/types/object/json'; @@ -114,25 +115,23 @@ const META_OG_TYPE = 'meta[property="og:type"]'; const NOOP = () => {}; -/** - * For better minification. - * @param {!../../../src/service/ampdoc-impl.AmpDoc} ampdoc - * @return {!Document|!ShadowRoot} - */ -const getRootNode = (ampdoc) => ampdoc.getRootNode(); - /** @visibleForTesting */ export class Criteria { /** * @param {!Element} element + * @param {!../../../src/service/ampdoc-impl.AmpDoc} ampdoc * @param {number} renderWidth * @param {number} renderHeight * @return {boolean} */ - static meetsAll(element, renderWidth, renderHeight) { + static meetsAll(element, ampdoc, renderWidth, renderHeight) { return ( - Criteria.meetsSizingCriteria(element, renderWidth, renderHeight) && - Criteria.meetsTreeShapeCriteria(element) + Criteria.meetsSizingCriteria( + element, + ampdoc, + renderWidth, + renderHeight + ) && Criteria.meetsTreeShapeCriteria(element) ); } @@ -155,16 +154,17 @@ export class Criteria { /** * @param {!Element} element + * @param {!../../../src/service/ampdoc-impl.AmpDoc} ampdoc * @param {number} renderWidth * @param {number} renderHeight * @return {boolean} */ - static meetsSizingCriteria(element, renderWidth, renderHeight) { + static meetsSizingCriteria(element, ampdoc, renderWidth, renderHeight) { const {naturalWidth, naturalHeight} = getMaxNaturalDimensions( - dev().assertElement(element.querySelector('img')) + dev().assertElement(element.querySelector('img') || element) ); - const viewport = Services.viewportForDoc(element); + const viewport = Services.viewportForDoc(ampdoc); const {width: vw, height: vh} = viewport.getSize(); return meetsSizingCriteria( @@ -273,11 +273,16 @@ function markAsVisited(candidate) { } /** - * @param {string} tagName + * @param {!ArrayHUGE PADDING
+ +NO labels; NO whatever modifications
NO labels; NO whatever modifications using ImageElements
+Labels with NO positioning rules specified (default to both top left)
Labels with NO positioning rules specified (default to both top left) using ImageElements
+Labels with positioning rules specified (both should be at the center)
Labels with positioning rules specified (both should be at the center) using ImageElements
+Has alt
on amp-img
s. ARIA order: [label content], [alt text if present], left/right image
Has alt
on amp-img
s. ARIA order: [label content], [alt text if present], left/right image using ImageElements
Disable default viewport behavior (hint would NOT reappear after the slider interacted, out of viewport, and then back into viewport)
Disable default viewport behavior (hint would NOT reappear after the slider interacted, out of viewport, and then back into viewport) using ImageElements
+Fully customized hint (replace with triangles)
Fully customized hint (replace with triangles) using ImageElements
+Actions
seekTo
test (currently, seekTo
is not considered as user interaction)
Actions
seekTo
test (currently, seekTo
is not considered as user interaction) using ImageElements
Set initial-slider-position
to 0.3
Set initial-slider-position
to 0.3 using ImageElements
Set step-size
to 0.2
Set step-size
to 0.2 using ImageElements