@@ -32,6 +32,7 @@ import {
3232 whenUpgradedToCustomElement ,
3333} from '../../../src/dom' ;
3434import { dev } from '../../../src/log' ;
35+ import { loadPromise } from '../../../src/event-helper' ;
3536import { measureIntersectionNoRoot } from '../../../src/utils/intersection-no-root' ;
3637import { toArray } from '../../../src/core/types/array' ;
3738import { tryParseJson } from '../../../src/core/types/object/json' ;
@@ -114,25 +115,23 @@ const META_OG_TYPE = 'meta[property="og:type"]';
114115
115116const NOOP = ( ) => { } ;
116117
117- /**
118- * For better minification.
119- * @param {!../../../src/service/ampdoc-impl.AmpDoc } ampdoc
120- * @return {!Document|!ShadowRoot }
121- */
122- const getRootNode = ( ampdoc ) => ampdoc . getRootNode ( ) ;
123-
124118/** @visibleForTesting */
125119export class Criteria {
126120 /**
127121 * @param {!Element } element
122+ * @param {!../../../src/service/ampdoc-impl.AmpDoc } ampdoc
128123 * @param {number } renderWidth
129124 * @param {number } renderHeight
130125 * @return {boolean }
131126 */
132- static meetsAll ( element , renderWidth , renderHeight ) {
127+ static meetsAll ( element , ampdoc , renderWidth , renderHeight ) {
133128 return (
134- Criteria . meetsSizingCriteria ( element , renderWidth , renderHeight ) &&
135- Criteria . meetsTreeShapeCriteria ( element )
129+ Criteria . meetsSizingCriteria (
130+ element ,
131+ ampdoc ,
132+ renderWidth ,
133+ renderHeight
134+ ) && Criteria . meetsTreeShapeCriteria ( element )
136135 ) ;
137136 }
138137
@@ -155,16 +154,17 @@ export class Criteria {
155154
156155 /**
157156 * @param {!Element } element
157+ * @param {!../../../src/service/ampdoc-impl.AmpDoc } ampdoc
158158 * @param {number } renderWidth
159159 * @param {number } renderHeight
160160 * @return {boolean }
161161 */
162- static meetsSizingCriteria ( element , renderWidth , renderHeight ) {
162+ static meetsSizingCriteria ( element , ampdoc , renderWidth , renderHeight ) {
163163 const { naturalHeight, naturalWidth} = getMaxNaturalDimensions (
164- dev ( ) . assertElement ( element . querySelector ( 'img' ) )
164+ dev ( ) . assertElement ( element . querySelector ( 'img' ) || element )
165165 ) ;
166166
167- const viewport = Services . viewportForDoc ( element ) ;
167+ const viewport = Services . viewportForDoc ( ampdoc ) ;
168168 const { height : vh , width : vw } = viewport . getSize ( ) ;
169169
170170 return meetsSizingCriteria (
@@ -273,18 +273,26 @@ function markAsVisited(candidate) {
273273}
274274
275275/**
276- * @param {string } tagName
276+ * @param {!Array< string> } tagNames
277277 * @return {string }
278278 */
279- function candidateSelector ( tagName ) {
280- return `${ tagName } :not([${ LIGHTBOXABLE_ATTR } ]):not([${ VISITED_ATTR } ])` ;
279+ function candidateSelector ( tagNames ) {
280+ return tagNames
281+ . map (
282+ ( tagName ) =>
283+ `${ tagName } :not([${ LIGHTBOXABLE_ATTR } ]):not([${ VISITED_ATTR } ])`
284+ )
285+ . join ( ',' ) ;
281286}
282287
283288/**
284289 * @param {!Element } element
285290 * @return {!Promise }
286291 */
287292function whenLoaded ( element ) {
293+ if ( element . tagName === 'IMG' ) {
294+ return loadPromise ( element ) ;
295+ }
288296 return whenUpgradedToCustomElement ( element ) . then ( ( element ) =>
289297 element . signals ( ) . whenSignal ( CommonSignals . LOAD_END )
290298 ) ;
@@ -298,7 +306,7 @@ export class Scanner {
298306 * @return {!Array<!Element> }
299307 */
300308 static getCandidates ( root ) {
301- const selector = candidateSelector ( 'amp-img' ) ;
309+ const selector = candidateSelector ( [ 'amp-img' , 'img' ] ) ;
302310 const candidates = toArray ( root . querySelectorAll ( selector ) ) ;
303311 // TODO(alanorozco): DOM mutations should be wrapped in mutate contexts.
304312 // Alternatively, use in-memory "visited" marker instead of attribute.
@@ -318,7 +326,7 @@ export class DocMetaAnnotations {
318326 * @return {string|undefined }
319327 */
320328 static getOgType ( ampdoc ) {
321- const tag = getRootNode ( ampdoc ) . querySelector ( META_OG_TYPE ) ;
329+ const tag = ampdoc . getRootNode ( ) . querySelector ( META_OG_TYPE ) ;
322330 if ( tag ) {
323331 return tag . getAttribute ( 'content' ) ;
324332 }
@@ -339,7 +347,7 @@ export class DocMetaAnnotations {
339347 * @return {!Array<string> }
340348 */
341349 static getAllLdJsonTypes ( ampdoc ) {
342- return toArray ( getRootNode ( ampdoc ) . querySelectorAll ( SCRIPT_LD_JSON ) )
350+ return toArray ( ampdoc . getRootNode ( ) . querySelectorAll ( SCRIPT_LD_JSON ) )
343351 . map ( ( el ) => {
344352 const { textContent} = el ;
345353 return ( tryParseJson ( textContent ) || { } ) [ '@type' ] ;
@@ -369,10 +377,8 @@ export class DocMetaAnnotations {
369377function usesLightboxExplicitly ( ampdoc ) {
370378 // TODO(alanorozco): Backport into Extensions service.
371379 const requiredExtensionSelector = `script[custom-element="${ REQUIRED_EXTENSION } "]` ;
372-
373380 const lightboxedElementsSelector = `[${ LIGHTBOXABLE_ATTR } ]:not([${ VISITED_ATTR } ])` ;
374-
375- const exists = ( selector ) => ! ! getRootNode ( ampdoc ) . querySelector ( selector ) ;
381+ const exists = ( selector ) => ! ! ampdoc . getRootNode ( ) . querySelector ( selector ) ;
376382
377383 return (
378384 exists ( requiredExtensionSelector ) && exists ( lightboxedElementsSelector )
@@ -440,13 +446,17 @@ export function runCandidates(ampdoc, candidates) {
440446 whenLoaded ( candidate ) . then ( ( ) => {
441447 return measureIntersectionNoRoot ( candidate ) . then (
442448 ( { boundingClientRect} ) => {
443- // <amp-img> will change the img's src inline data on unlayout and
444- // remove it from DOM.
445- if ( ! candidate . signals ( ) . get ( CommonSignals . LOAD_END ) ) {
449+ if (
450+ ! candidate . tagName === 'IMG' &&
451+ ! candidate . signals ( ) . get ( CommonSignals . LOAD_END )
452+ ) {
453+ // <amp-img> will change the img's src inline data on unlayout and
454+ // remove it from DOM.
446455 return ;
447456 }
457+
448458 const { height, width} = boundingClientRect ;
449- if ( ! Criteria . meetsAll ( candidate , width , height ) ) {
459+ if ( ! Criteria . meetsAll ( candidate , ampdoc , width , height ) ) {
450460 return ;
451461 }
452462 dev ( ) . info ( TAG , 'apply' , candidate ) ;
@@ -475,7 +485,7 @@ export function scan(ampdoc, opt_root) {
475485AMP . extension ( TAG , '0.1' , ( AMP ) => {
476486 const { ampdoc} = AMP ;
477487 ampdoc . whenReady ( ) . then ( ( ) => {
478- getRootNode ( ampdoc ) . addEventListener ( AmpEvents . DOM_UPDATE , ( e ) => {
488+ ampdoc . getRootNode ( ) . addEventListener ( AmpEvents . DOM_UPDATE , ( e ) => {
479489 const { target} = e ;
480490 scan ( ampdoc , dev ( ) . assertElement ( target ) ) ;
481491 } ) ;
0 commit comments