Chromium Code Reviews| Index: chrome/browser/resources/media_internals/metrics.js |
| diff --git a/chrome/browser/resources/media_internals/metrics.js b/chrome/browser/resources/media_internals/metrics.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c2681c53963ee1febcb2df6583b7d930a76db66c |
| --- /dev/null |
| +++ b/chrome/browser/resources/media_internals/metrics.js |
| @@ -0,0 +1,118 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +cr.define('media', function() { |
| + 'use strict'; |
| + |
| + // A set of parameter names. An entry of 'abc' allows metrics to specify |
| + // events with specific values of 'abc'. |
| + var metricProperties = { |
| + 'pipeline_state': true, |
| + }; |
| + |
| + // A set of metrics to measure. The user will see the most recent and average |
| + // measurement of the time between each metric's start and end events. |
| + var metrics = { |
| + 'seek': { |
| + 'start': 'SEEK', |
| + 'end': 'pipeline_state=started' |
| + }, |
| + 'first frame': { |
| + 'start': 'WEBMEDIAPLAYER_CREATED', |
| + 'end': 'pipeline_state=started' |
| + }, |
| + }; |
| + |
| + /** |
| + * This class measures times between the events specified above. It inherits |
| + * <li> and contains a table that displays the measurements. |
| + */ |
| + var Metrics = cr.ui.define('li'); |
| + |
| + Metrics.prototype = { |
| + __proto__: HTMLLIElement.prototype, |
| + |
| + /** |
| + * Decorate this <li> as a Metrics. |
| + */ |
| + decorate: function() { |
| + this.table_ = document.createElement('table'); |
| + var details = document.createElement('details'); |
| + var summary = media.makeElement('summary', 'Metrics:'); |
| + details.appendChild(summary); |
| + details.appendChild(this.table_); |
| + this.appendChild(details); |
| + |
| + var hRow = document.createElement('tr'); |
| + hRow.appendChild(media.makeElement('th', 'Metric:')); |
| + hRow.appendChild(media.makeElement('th', 'Last Measure:')); |
| + hRow.appendChild(media.makeElement('th', 'Average:')); |
| + var header = document.createElement('thead'); |
| + header.appendChild(hRow); |
| + this.table_.appendChild(header); |
| + |
| + for (var metric in metrics) { |
| + var last = document.createElement('td'); |
| + var avg = document.createElement('td'); |
| + this[metric] = { |
| + count: 0, |
| + total: 0, |
| + start: null, |
| + last: last, |
| + avg: avg |
| + }; |
| + var row = document.createElement('tr'); |
| + row.appendChild(media.makeElement('td', metric + ':')); |
| + row.appendChild(last); |
| + row.appendChild(avg); |
| + this.table_.appendChild(row); |
| + } |
| + }, |
| + |
| + /** |
| + * An event has occurred. Update any metrics that refer to this type |
| + * of event. Can be called multiple times by addEvent below if the metrics |
| + * refer to specific parameters. |
| + * @param {Object} event The MediaLogEvent that has occurred. |
| + * @param {string} type The type of event. |
| + */ |
| + addEventInternal: function(event, type) { |
| + var time_in_ms = event.time * 1000; // Work with milliseconds. |
|
arv (Not doing code reviews)
2011/10/18 20:50:07
no underscores
scherkus (not reviewing)
2011/10/19 00:19:43
Done.
|
| + |
| + for (var metric in metrics) { |
| + var m = this[metric]; |
| + if (type == metrics[metric].start && !m.start) { |
| + m.start = time_in_ms; |
| + } else if (type == metrics[metric].end && m.start != null) { |
| + var last = time_in_ms - m.start; |
| + m.last.textContent = media.round(last); |
| + m.total += last; |
| + m.count++; |
| + if (m.count > 1) |
| + m.avg.textContent = media.round(m.total / m.count); |
| + m.start = null; |
| + } |
| + } |
| + }, |
| + |
| + /** |
| + * An event has occurred. Update any metrics that refer to events of this |
| + * type or with this event's parameters. |
| + * @param {Object} event The MediaLogEvent that has occurred. |
| + */ |
| + addEvent: function(event) { |
| + this.addEventInternal(event, event.type); |
| + for (var p in event.params) { |
| + if (p in metricProperties) { |
| + var type = p + '=' + event.params[p]; |
| + this.addEventInternal(event, type); |
| + } |
| + } |
| + }, |
| + }; |
| + |
| + return { |
| + Metrics: Metrics, |
| + }; |
| +}); |