Skip to content

Commit

Permalink
Merge pull request #2682 from erwinmombay/add-prerendercomplete
Browse files Browse the repository at this point in the history
add prerender complete message
  • Loading branch information
erwinmombay committed Mar 24, 2016
2 parents f32074e + 21efcbd commit adc2993
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 6 deletions.
25 changes: 19 additions & 6 deletions src/performance.js
Original file line number Diff line number Diff line change
Expand Up @@ -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<TickEventDef>} */
this.events_ = [];
Expand Down Expand Up @@ -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)
Expand All @@ -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();
});
Expand Down Expand Up @@ -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,
});
}
}
}


Expand Down
8 changes: 8 additions & 0 deletions src/service/viewer-impl.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions test/functional/test-performance.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit adc2993

Please sign in to comment.