Commit 72cb95fa authored by shadi@chromium.org's avatar shadi@chromium.org

Telemetry: make media perf tests log errors rather than timing out

BUG=318432
TEST=tools/perf/run_benchmark media.tough_media_cases (with tough_video_cases.json edited to include invalid media URLs)

Review URL: https://codereview.chromium.org/70333004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@235672 0039d316-1c4b-4281-b951-d872f2087c98
parent 967ffdc9
......@@ -123,12 +123,17 @@
};
HTMLMediaMetric.prototype.getMetrics = function() {
this.metrics['decoded_frame_count'] = this.element.webkitDecodedFrameCount;
this.metrics['dropped_frame_count'] = this.element.webkitDroppedFrameCount;
var decodedFrames = this.element.webkitDecodedFrameCount;
var droppedFrames = this.element.webkitDroppedFrameCount;
// Audio media does not report decoded/dropped frame count
if (decodedFrames != undefined)
this.metrics['decoded_frame_count'] = decodedFrames;
if (droppedFrames != undefined)
this.metrics['dropped_frame_count'] = droppedFrames;
this.metrics['decoded_video_bytes'] =
this.element.webkitVideoDecodedByteCount;
this.element.webkitVideoDecodedByteCount || 0;
this.metrics['decoded_audio_bytes'] =
this.element.webkitAudioDecodedByteCount;
this.element.webkitAudioDecodedByteCount || 0;
return this.metrics;
};
......@@ -157,10 +162,16 @@
function checkElementIsNotBound(element) {
if (!element)
return;
if (getMediaMetric(element))
throw new Error('Can not create MediaMetric for same element twice.');
}
function getMediaMetric(element) {
for (var i = 0; i < window.__mediaMetrics.length; i++) {
if (window.__mediaMetrics[i].element == element)
throw new Error('Can not create MediaMetric for same element twice.');
return window.__mediaMetrics[i];
}
return null;
}
function createMediaMetricsForDocument() {
......@@ -192,6 +203,7 @@
window.__globalCounter = 0;
window.__mediaMetrics = [];
window.__getMediaMetric = getMediaMetric;
window.__getAllMetrics = getAllMetrics;
window.__createMediaMetricsForDocument = createMediaMetricsForDocument;
})();
......@@ -34,7 +34,6 @@ class MediaMetric(Metric):
def AddResults(self, tab, results):
"""Reports all recorded metrics as Telemetry perf results."""
assert self._results
trace_names = []
for media_metric in self._results:
trace_names.append(self._AddResultsForMediaElement(media_metric, results))
......
......@@ -29,6 +29,7 @@
testElement = document.createElement(qsParams["type"]);
if (qsParams["id"])
testElement.id = qsParams["id"];
testElement.preload = "none";
testElement.src = qsParams["src"];
testElement.controls = true;
document.body.appendChild(testElement);
......
......@@ -20,6 +20,7 @@
}
function loopHTML5Element(element, loopCount) {
window.__registerHTML5ErrorEvents(element);
element['loop_completed'] = false;
var currentLoop = 0;
var onLoop = function(e) {
......@@ -35,11 +36,6 @@
}
};
function onError(e) {
throw new Error('Error playing media :' + e.type);
}
element.addEventListener('error', onError);
element.addEventListener('abort', onError);
element.addEventListener('seeked', onLoop);
element.loop = true;
......
......@@ -36,3 +36,24 @@ window.__hasEventCompleted = function(selector, event_name) {
}
return true;
};
window.__registerHTML5ErrorEvents = function(element) {
// Listens to HTML5 media errors.
function onError(e) {
window.__error = 'Media error: ' + e.type + ', code:' + e.target.error.code;
throw new Error(window.__error);
}
element.addEventListener('error', onError);
element.addEventListener('abort', onError);
};
window.__registerHTML5EventCompleted = function(element, event_name) {
// Logs |even_name| on element when completed.
var logEventHappened = function(e) {
element[e.type + '_completed'] = true;
element.removeEventListener(event_name, logEventHappened);
}
element.addEventListener(event_name, logEventHappened);
};
window.__error = null;
......@@ -4,6 +4,7 @@
"""Common media action functions."""
import logging
import os
from telemetry.core import util
......@@ -33,9 +34,17 @@ class MediaAction(page_action.PageAction):
event_name: Name of the event to check if fired or not.
timeout: Timeout to check for event, throws an exception if not fired.
"""
util.WaitFor(lambda: self.HasEventCompleted(tab, selector, event_name),
util.WaitFor(lambda:
self.HasEventCompletedOrError(tab, selector, event_name),
timeout=timeout)
def HasEventCompleted(self, tab, selector, event_name):
return tab.EvaluateJavaScript(
'window.__hasEventCompleted("%s", "%s");' % (selector, event_name))
def HasEventCompletedOrError(self, tab, selector, event_name):
if tab.EvaluateJavaScript(
'window.__hasEventCompleted("%s", "%s");' % (selector, event_name)):
return True
error = tab.EvaluateJavaScript('window.__error')
if error:
logging.error('Detected media error while waiting for %s: %s', event_name,
error)
return True
return False
......@@ -21,16 +21,9 @@
}
function playHTML5Element(element) {
function logEventHappened(e) {
element[e.type + '_completed'] = true;
}
function onError(e) {
throw new Error('Error playing media :' + e.type);
}
element.addEventListener('playing', logEventHappened);
element.addEventListener('ended', logEventHappened);
element.addEventListener('error', onError);
element.addEventListener('abort', onError);
window.__registerHTML5ErrorEvents(element);
window.__registerHTML5EventCompleted(element, 'playing');
window.__registerHTML5EventCompleted(element, 'ended');
var willPlayEvent = document.createEvent('Event');
willPlayEvent.initEvent('willPlay', false, false);
......
......@@ -32,18 +32,10 @@
}
function seekHTML5ElementPostLoad(element, seekTime, logSeekTime, seekLabel) {
var onSeeked = function(e) {
element[e.type + '_completed'] = true;
element.removeEventListener('seeked', onSeeked);
};
function onError(e) {
throw new Error('Error playing media :' + e.type);
}
// Reset seek completion since multiple seeks can run on same media element.
element['seeked_completed'] = false;
element.addEventListener('error', onError);
element.addEventListener('abort', onError);
element.addEventListener('seeked', onSeeked);
window.__registerHTML5ErrorEvents(element);
window.__registerHTML5EventCompleted(element, 'seeked');
if (logSeekTime) {
var willSeekEvent = document.createEvent('Event');
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment