From e7def6be4eb6284fb672d1356b4029331fb448c6 Mon Sep 17 00:00:00 2001 From: Gabriel Majoulet Date: Mon, 30 Mar 2020 17:33:06 -0400 Subject: [PATCH] Expose the advancementMode with the selectDocument messaging. (#27444) * Expose the advancementMode with the selectDocument API. * Add unit test for time based advancement. --- extensions/amp-story/1.0/amp-story.js | 23 +++++--- extensions/amp-story/1.0/page-advancement.js | 4 +- .../amp-story/1.0/test/test-amp-story.js | 59 +++++++++++++++---- 3 files changed, 67 insertions(+), 19 deletions(-) diff --git a/extensions/amp-story/1.0/amp-story.js b/extensions/amp-story/1.0/amp-story.js index 64b665c2905f..b908ff6e1af5 100644 --- a/extensions/amp-story/1.0/amp-story.js +++ b/extensions/amp-story/1.0/amp-story.js @@ -1313,7 +1313,13 @@ export class AmpStory extends AMP.BaseElement { */ onNoNextPage_() { if (this.viewer_.hasCapability('swipe') && this.viewerMessagingHandler_) { - this.viewerMessagingHandler_.send('selectDocument', dict({'next': true})); + const advancementMode = this.storeService_.get( + StateProperty.ADVANCEMENT_MODE + ); + this.viewerMessagingHandler_.send( + 'selectDocument', + dict({'next': true, 'advancementMode': advancementMode}) + ); return; } @@ -1342,9 +1348,12 @@ export class AmpStory extends AMP.BaseElement { */ onNoPreviousPage_() { if (this.viewer_.hasCapability('swipe') && this.viewerMessagingHandler_) { + const advancementMode = this.storeService_.get( + StateProperty.ADVANCEMENT_MODE + ); this.viewerMessagingHandler_.send( 'selectDocument', - dict({'previous': true}) + dict({'previous': true, 'advancementMode': advancementMode}) ); return; } @@ -1359,6 +1368,11 @@ export class AmpStory extends AMP.BaseElement { * @private */ performTapNavigation_(direction) { + this.storeService_.dispatch( + Action.SET_ADVANCEMENT_MODE, + AdvancementMode.MANUAL_ADVANCE + ); + if ( this.storeService_.get(StateProperty.UI_STATE) === UIType.DESKTOP_PANELS ) { @@ -1366,11 +1380,6 @@ export class AmpStory extends AMP.BaseElement { return; } - this.storeService_.dispatch( - Action.SET_ADVANCEMENT_MODE, - AdvancementMode.MANUAL_ADVANCE - ); - if (direction === TapNavigationDirection.NEXT) { this.next_(); } else if (direction === TapNavigationDirection.PREVIOUS) { diff --git a/extensions/amp-story/1.0/page-advancement.js b/extensions/amp-story/1.0/page-advancement.js index 8b6c8fba287c..b8cb262e2493 100644 --- a/extensions/amp-story/1.0/page-advancement.js +++ b/extensions/amp-story/1.0/page-advancement.js @@ -756,11 +756,11 @@ class TimeBasedAdvancement extends AdvancementConfig { /** @override */ onAdvance() { - super.onAdvance(); this.storeService_.dispatch( Action.SET_ADVANCEMENT_MODE, AdvancementMode.AUTO_ADVANCE_TIME ); + super.onAdvance(); } /** @@ -1031,11 +1031,11 @@ class MediaBasedAdvancement extends AdvancementConfig { /** @override */ onAdvance() { - super.onAdvance(); this.storeService_.dispatch( Action.SET_ADVANCEMENT_MODE, AdvancementMode.AUTO_ADVANCE_MEDIA ); + super.onAdvance(); } /** diff --git a/extensions/amp-story/1.0/test/test-amp-story.js b/extensions/amp-story/1.0/test/test-amp-story.js index 4087b5d9018c..7e32318d2fa0 100644 --- a/extensions/amp-story/1.0/test/test-amp-story.js +++ b/extensions/amp-story/1.0/test/test-amp-story.js @@ -23,6 +23,7 @@ import { UIType, } from '../amp-story-store-service'; import {ActionTrust} from '../../../../src/action-constants'; +import {AdvancementMode} from '../story-analytics'; import {AmpStory} from '../amp-story'; import {AmpStoryBookend} from '../bookend/amp-story-bookend'; import {AmpStoryConsent} from '../amp-story-consent'; @@ -51,26 +52,30 @@ describes.realWin( }, }, env => { - let win, ampdoc; + let ampdoc; let element; let hasSwipeCapability = false; let isEmbedded = false; let story; let replaceStateStub; + let win; /** * @param {number} count - * @param {Array=} opt_ids + * @param {Array=} ids * @return {!Array} */ - async function createStoryWithPages(count, opt_ids) { + async function createStoryWithPages(count, ids = [], autoAdvance = false) { element = win.document.createElement('amp-story'); Array(count) .fill(undefined) .map((unused, i) => { const page = win.document.createElement('amp-story-page'); - page.id = opt_ids && opt_ids[i] ? opt_ids[i] : `-page-${i}`; + if (autoAdvance) { + page.setAttribute('auto-advance-after', '2s'); + } + page.id = ids && ids[i] ? ids[i] : `-page-${i}`; element.appendChild(page); return page; }); @@ -1149,9 +1154,39 @@ describes.realWin( story.activePage_.element.dispatchEvent(clickEvent); await waitFor(() => { if (sendMessageStub.calledOnce) { - expect( - sendMessageStub - ).to.be.calledWithExactly('selectDocument', {next: true}); + expect(sendMessageStub).to.be.calledWithExactly( + 'selectDocument', + { + next: true, + advancementMode: AdvancementMode.MANUAL_ADVANCE, + } + ); + return true; + } + return false; + }, 'sendMessageStub should be called'); + }); + + it('should send a message when auto-advancing on last page in viewer', async () => { + await createStoryWithPages(1, ['cover'], true /** autoAdvance */); + const sendMessageStub = env.sandbox.stub( + story.viewerMessagingHandler_, + 'send' + ); + + await story.layoutCallback(); + + story.activePage_.advancement_.onAdvance(); + + await waitFor(() => { + if (sendMessageStub.calledOnce) { + expect(sendMessageStub).to.be.calledWithExactly( + 'selectDocument', + { + next: true, + advancementMode: AdvancementMode.AUTO_ADVANCE_TIME, + } + ); return true; } return false; @@ -1202,9 +1237,13 @@ describes.realWin( story.activePage_.element.dispatchEvent(clickEvent); await waitFor(() => { if (sendMessageStub.calledOnce) { - expect( - sendMessageStub - ).to.be.calledWithExactly('selectDocument', {previous: true}); + expect(sendMessageStub).to.be.calledWithExactly( + 'selectDocument', + { + previous: true, + advancementMode: AdvancementMode.MANUAL_ADVANCE, + } + ); return true; } return false;