From 21efcbdca72b0a9e745ececbb0d9e55e271c49ae Mon Sep 17 00:00:00 2001 From: Erwin Mombay Date: Fri, 4 Mar 2016 12:22:18 -0800 Subject: [PATCH] add prerender complete message --- src/performance.js | 25 +++++++++++++++++++------ src/service/viewer-impl.js | 8 ++++++++ test/functional/test-performance.js | 26 ++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/performance.js b/src/performance.js index fc72a795f975..b4ebb236781f 100644 --- a/src/performance.js +++ b/src/performance.js @@ -78,11 +78,8 @@ export class Performance { /** @const {!Window} */ this.win = win; - /** @const @private {funtion(string,?string=,number=)|undefined} */ - this.tick_ = undefined; - - /** @const @private {funtion()|undefined} */ - this.flush_ = undefined; + /** @private @const {number} */ + this.initTime_ = timer.now(); /** @const @private {!Array} */ this.events_ = []; @@ -137,7 +134,7 @@ export class Performance { */ measureUserPerceivedVisualCompletenessTime_() { const didStartInPrerender = !this.viewer_.hasBeenVisible(); - let docVisibleTime = didStartInPrerender ? -1 : timer.now(); + let docVisibleTime = didStartInPrerender ? -1 : this.initTime_; // This is only relevant if the viewer is in prerender mode. // (hasn't been visible yet, ever at this point) @@ -154,11 +151,15 @@ export class Performance { : 1 /* MS (magic number for prerender was complete by the time the user opened the page) */; this.tickDelta('pc', userPerceivedVisualCompletenesssTime); + this.prerenderComplete_(userPerceivedVisualCompletenesssTime); } else { // If it didnt start in prerender, no need to calculate anything // and we just need to tick `pc`. (it will give us the relative // time since the viewer initialized the timer) this.tick('pc'); + // We don't have the actual csi timer's clock start time, + // so we just have to use `docVisibleTime`. + this.prerenderComplete_(timer.now() - docVisibleTime); } this.flush(); }); @@ -320,6 +321,18 @@ export class Performance { this.setFlushParams_(params); }); } + + /** + * @private + * @param {number} value + */ + prerenderComplete_(value) { + if (this.viewer_ && this.viewer_.isPerformanceTrackingOn()) { + this.viewer_.prerenderComplete({ + 'value': value, + }); + } + } } diff --git a/src/service/viewer-impl.js b/src/service/viewer-impl.js index cc2c2c6845f2..a1c54826ff7e 100644 --- a/src/service/viewer-impl.js +++ b/src/service/viewer-impl.js @@ -829,6 +829,14 @@ export class Viewer { this.sendMessageUnreliable_('setFlushParams', message, false); } + /** + * Triggers "prerenderComplete" event for the viewer. + * @param {!JSONObject} message + */ + prerenderComplete(message) { + this.sendMessageUnreliable_('prerenderComplete', message, false); + } + /** * Requests AMP document to receive a message from Viewer. * @param {string} eventType diff --git a/test/functional/test-performance.js b/test/functional/test-performance.js index 70aaf054c1d2..b051ee9c4989 100644 --- a/test/functional/test-performance.js +++ b/test/functional/test-performance.js @@ -308,6 +308,21 @@ describe('performance', () => { perf.coreServicesAvailable(); }); + it('should call prerenderComplete on viewer', () => { + clock.tick(100); + whenFirstVisibleResolve(); + const prerenderSpy = sandbox.spy(viewer, 'prerenderComplete'); + sandbox.stub(viewer, 'isPerformanceTrackingOn').returns(true); + return viewer.whenFirstVisible().then(() => { + clock.tick(400); + whenReadyToRetrieveResourcesResolve(); + whenViewportLayoutCompleteResolve(); + return perf.whenViewportLayoutComplete_().then(() => { + expect(prerenderSpy.firstCall.args[0].value).to.equal(400); + }); + }); + }); + it('should tick `pc` with opt_value=400 when user request document ' + 'to be visible before before first viewport completion', () => { clock.tick(100); @@ -352,6 +367,17 @@ describe('performance', () => { perf.coreServicesAvailable(); }); + it('should call prerenderComplete on viewer', () => { + const prerenderSpy = sandbox.spy(viewer, 'prerenderComplete'); + sandbox.stub(viewer, 'isPerformanceTrackingOn').returns(true); + clock.tick(300); + whenReadyToRetrieveResourcesResolve(); + whenViewportLayoutCompleteResolve(); + return perf.whenViewportLayoutComplete_().then(() => { + expect(prerenderSpy.firstCall.args[0].value).to.equal(300); + }); + }); + it('should tick `pc` with `opt_value=undefined` when user requests ' + 'document to be visible', () => { clock.tick(300);