blob: 34843e85db997a4bb7b3219ca30257198a87b549 [file] [log] [blame]
// CanvasRunner is a wrapper of PerformanceTests/resources/runner.js for canvas tests.
(function () {
var MEASURE_DRAW_TIMES = 50;
var MAX_MEASURE_DRAW_TIMES = 1000;
var MAX_MEASURE_TIME_PER_FRAME = 1000; // 1 sec
var currentTest = null;
var isTestDone = false;
var CanvasRunner = {};
CanvasRunner.start = function (test) {
PerfTestRunner.startMeasureValuesAsync({
unit: 'runs/s',
description: test.description,
done: testDone,
run: function() {
if (!test.doRun) {
CanvasRunner.logFatalError("doRun must be set.");
return;
}
currentTest = test;
runTest();
}});
}
function runTest() {
try {
if (currentTest.preRun)
currentTest.preRun();
var start = PerfTestRunner.now();
var count = 0;
while ((PerfTestRunner.now() - start <= MAX_MEASURE_TIME_PER_FRAME) && (count * MEASURE_DRAW_TIMES < MAX_MEASURE_DRAW_TIMES)) {
for (var i = 0; i < MEASURE_DRAW_TIMES; i++) {
currentTest.doRun();
}
count++;
}
if (currentTest.ensureComplete)
currentTest.ensureComplete();
var elapsedTime = PerfTestRunner.now() - start;
if (currentTest.postRun)
currentTest.postRun();
PerfTestRunner.measureValueAsync(MEASURE_DRAW_TIMES * count * 1000 / elapsedTime);
} catch(err) {
CanvasRunner.logFatalError("test fails due to GPU issue. " + err);
return;
}
if (!isTestDone)
requestAnimationFrame(runTest);
}
function testDone() {
isTestDone = true;
}
CanvasRunner.logFatalError = function (text) {
PerfTestRunner.logFatalError(text);
}
CanvasRunner.startPlayingAndWaitForVideo = function (video, callback) {
var gotPlaying = false;
var gotTimeUpdate = false;
var maybeCallCallback = function() {
if (gotPlaying && gotTimeUpdate && callback) {
callback(video);
callback = undefined;
video.removeEventListener('playing', playingListener, true);
video.removeEventListener('timeupdate', timeupdateListener, true);
}
};
var playingListener = function() {
gotPlaying = true;
maybeCallCallback();
};
var timeupdateListener = function() {
// Checking to make sure the current time has advanced beyond
// the start time seems to be a reliable heuristic that the
// video element has data that can be consumed.
if (video.currentTime > 0.0) {
gotTimeUpdate = true;
maybeCallCallback();
}
};
video.addEventListener('playing', playingListener, true);
video.addEventListener('timeupdate', timeupdateListener, true);
video.loop = true;
video.play();
}
window.CanvasRunner = CanvasRunner;
})();