Skip to content

Commit 1aa3fef

Browse files
authored
Story media performance metrics. (ampproject#23962)
* Squash media performance metrics service commits. * Reviews.
1 parent df85b7d commit 1aa3fef

File tree

10 files changed

+928
-0
lines changed

10 files changed

+928
-0
lines changed

extensions/amp-story-auto-ads/0.1/test/test-amp-story-auto-ads.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
} from './story-mock';
3434
import {Services} from '../../../../src/services';
3535
import {macroTask} from '../../../../testing/yield';
36+
import {registerServiceBuilder} from '../../../../src/service';
3637

3738
const NOOP = () => {};
3839

@@ -57,6 +58,9 @@ describes.realWin(
5758
doc = win.document;
5859
const viewer = Services.viewerForDoc(env.ampdoc);
5960
sandbox.stub(Services, 'viewerForDoc').returns(viewer);
61+
registerServiceBuilder(win, 'performance', () => ({
62+
isPerformanceTrackingOn: () => false,
63+
}));
6064
adElement = win.document.createElement('amp-story-auto-ads');
6165
storyElement = win.document.createElement('amp-story');
6266
win.document.body.appendChild(storyElement);

extensions/amp-story/1.0/amp-story-page.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import {getAmpdoc} from '../../../src/service';
6767
import {getData, listen} from '../../../src/event-helper';
6868
import {getFriendlyIframeEmbedOptional} from '../../../src/iframe-helper';
6969
import {getLogEntries} from './logging';
70+
import {getMediaPerformanceMetricsService} from './media-performance-metrics-service';
7071
import {getMode} from '../../../src/mode';
7172
import {htmlFor} from '../../../src/static-template';
7273
import {isExperimentOn} from '../../../src/experiments';
@@ -246,6 +247,14 @@ export class AmpStoryPage extends AMP.BaseElement {
246247

247248
const deferred = new Deferred();
248249

250+
/** @private @const {!./media-performance-metrics-service.MediaPerformanceMetricsService} */
251+
this.mediaPerformanceMetricsService_ = getMediaPerformanceMetricsService(
252+
this.win
253+
);
254+
255+
/** @private {!Array<!HTMLMediaElement>} */
256+
this.performanceTrackedVideos_ = [];
257+
249258
/** @private @const {!Promise<!MediaPool>} */
250259
this.mediaPoolPromise_ = deferred.promise;
251260

@@ -422,6 +431,7 @@ export class AmpStoryPage extends AMP.BaseElement {
422431
pauseCallback() {
423432
this.advancement_.stop();
424433

434+
this.stopMeasuringVideoPerformance_();
425435
this.stopListeningToVideoEvents_();
426436
this.toggleErrorMessage_(false);
427437
this.togglePlayMessage_(false);
@@ -455,6 +465,7 @@ export class AmpStoryPage extends AMP.BaseElement {
455465
this.checkPageHasAudio_();
456466
this.renderOpenAttachmentUI_();
457467
this.findAndPrepareEmbeddedComponents_();
468+
this.startMeasuringVideoPerformance_();
458469
this.preloadAllMedia_()
459470
.then(() => this.startListeningToVideoEvents_())
460471
.then(() => this.playAllMedia_());
@@ -1258,6 +1269,41 @@ export class AmpStoryPage extends AMP.BaseElement {
12581269
});
12591270
}
12601271

1272+
/**
1273+
* Starts measuring video performance metrics, if performance tracking is on.
1274+
* Has to be called directly before playing the video.
1275+
* @private
1276+
*/
1277+
startMeasuringVideoPerformance_() {
1278+
if (!this.mediaPerformanceMetricsService_.isPerformanceTrackingOn()) {
1279+
return;
1280+
}
1281+
1282+
this.performanceTrackedVideos_ = /** @type {!Array<!HTMLMediaElement>} */ (this.getAllVideos_());
1283+
for (let i = 0; i < this.performanceTrackedVideos_.length; i++) {
1284+
this.mediaPerformanceMetricsService_.startMeasuring(
1285+
this.performanceTrackedVideos_[i]
1286+
);
1287+
}
1288+
}
1289+
1290+
/**
1291+
* Stops measuring video performance metrics, if performance tracking is on.
1292+
* Computes and sends the metrics.
1293+
* @private
1294+
*/
1295+
stopMeasuringVideoPerformance_() {
1296+
if (!this.mediaPerformanceMetricsService_.isPerformanceTrackingOn()) {
1297+
return;
1298+
}
1299+
1300+
for (let i = 0; i < this.performanceTrackedVideos_.length; i++) {
1301+
this.mediaPerformanceMetricsService_.stopMeasuring(
1302+
this.performanceTrackedVideos_[i]
1303+
);
1304+
}
1305+
}
1306+
12611307
/**
12621308
* Displays a loading spinner whenever the video is buffering.
12631309
* Has to be called after the mediaPool preload method, that swaps the video

0 commit comments

Comments
 (0)