diff --git a/extensions/amp-video-iframe/0.1/amp-video-iframe.js b/extensions/amp-video-iframe/0.1/amp-video-iframe.js index 96ab3533f3c0..eac329a4afe9 100644 --- a/extensions/amp-video-iframe/0.1/amp-video-iframe.js +++ b/extensions/amp-video-iframe/0.1/amp-video-iframe.js @@ -43,6 +43,7 @@ import { import {getData, listen} from '../../../src/event-helper'; import {installVideoManagerForDoc} from '../../../src/service/video-manager-impl'; import {isLayoutSizeDefined} from '../../../src/layout'; +import {measureIntersection} from '../../../src/utils/intersection'; import {once} from '../../../src/utils/function'; /** @private @const */ @@ -275,6 +276,7 @@ class AmpVideoIframe extends AMP.BaseElement { /** * @param {!Event} event + * @return {!Promise|undefined} * @private */ onMessage_(event) { @@ -302,8 +304,9 @@ class AmpVideoIframe extends AMP.BaseElement { if (methodReceived) { if (methodReceived == 'getIntersection') { - this.postIntersection_(messageId); - return; + return measureIntersection(this.element).then((intersection) => { + this.postIntersection_(messageId, intersection); + }); } userAssert(false, 'Unknown method `%s`.', methodReceived); return; @@ -361,10 +364,11 @@ class AmpVideoIframe extends AMP.BaseElement { /** * @param {number} messageId + * @param {!IntersectionObserverEntry} intersection * @private */ - postIntersection_(messageId) { - const {time, intersectionRatio} = this.element.getIntersectionChangeEntry(); + postIntersection_(messageId, intersection) { + const {intersectionRatio, time} = intersection; // Only post ratio > 0 when in autoplay range to prevent internal autoplay // implementations that differ from ours. diff --git a/extensions/amp-video-iframe/0.1/test/test-amp-video-iframe.js b/extensions/amp-video-iframe/0.1/test/test-amp-video-iframe.js index ef6c63c466dc..324852a0ae98 100644 --- a/extensions/amp-video-iframe/0.1/test/test-amp-video-iframe.js +++ b/extensions/amp-video-iframe/0.1/test/test-amp-video-iframe.js @@ -106,12 +106,16 @@ describes.realWin( ); } - function stubIntersectionEntry(element, time, intersectionRatio) { - const entry = {time, intersectionRatio}; - env.sandbox - ./*OK*/ stub(element, 'getIntersectionChangeEntry') - .returns(entry); - return entry; + function stubMeasureIntersection(target, time, intersectionRatio) { + env.win.IntersectionObserver = (callback) => ({ + observe() { + Promise.resolve().then(() => { + callback([{target, time, intersectionRatio}]); + }); + }, + unobserve() {}, + disconnect() {}, + }); } describe('#layoutCallback', () => { @@ -288,12 +292,10 @@ describes.realWin( const message = getIntersectionMessage(id); - const expectedResponseMessage = { - id, - args: stubIntersectionEntry(videoIframe, time, intersectionRatio), - }; + stubMeasureIntersection(videoIframe, time, intersectionRatio); + const expectedResponseMessage = {id, args: {time, intersectionRatio}}; - videoIframe.implementation_.onMessage_(message); + await videoIframe.implementation_.onMessage_(message); expect(postMessage.withArgs(env.sandbox.match(expectedResponseMessage))) .to.have.been.calledOnce; @@ -311,7 +313,7 @@ describes.realWin( const postMessage = stubPostMessage(videoIframe); - stubIntersectionEntry(videoIframe, time, intersectionRatio); + stubMeasureIntersection(videoIframe, time, intersectionRatio); acceptMockedMessages(videoIframe); @@ -325,7 +327,7 @@ describes.realWin( }, }; - videoIframe.implementation_.onMessage_(message); + await videoIframe.implementation_.onMessage_(message); expect(postMessage.withArgs(env.sandbox.match(expectedResponseMessage))) .to.have.been.calledOnce;