blob: 1aa630356cff167ec370961d7256920a21d6c508 [file] [log] [blame]
BenchmarkRunnerState = Utilities.createClass(
function(suites)
{
this._suites = suites;
this._suiteIndex = -1;
this._testIndex = 0;
this.next();
}, {
currentSuite: function()
{
return this._suites[this._suiteIndex];
},
currentTest: function()
{
var suite = this.currentSuite();
return suite ? suite.tests[this._testIndex] : null;
},
isFirstTest: function()
{
return !this._testIndex;
},
next: function()
{
this._testIndex++;
var suite = this._suites[this._suiteIndex];
if (suite && this._testIndex < suite.tests.length)
return;
this._testIndex = 0;
do {
this._suiteIndex++;
} while (this._suiteIndex < this._suites.length && this._suites[this._suiteIndex].disabled);
},
prepareCurrentTest: function(runner, frame)
{
var test = this.currentTest();
var promise = new SimplePromise;
frame.onload = function() {
promise.resolve();
};
frame.src = "tests/" + test.url;
return promise;
}
});
BenchmarkRunner = Utilities.createClass(
function(suites, frameContainer, client)
{
this._suites = suites;
this._client = client;
this._frameContainer = frameContainer;
}, {
_appendFrame: function()
{
var frame = document.createElement("iframe");
frame.setAttribute("scrolling", "no");
this._frameContainer.insertBefore(frame, this._frameContainer.firstChild);
this._frame = frame;
return frame;
},
_removeFrame: function()
{
if (this._frame) {
this._frame.parentNode.removeChild(this._frame);
this._frame = null;
}
},
_runBenchmarkAndRecordResults: function(state)
{
var promise = new SimplePromise;
var suite = state.currentSuite();
var test = state.currentTest();
if (this._client && this._client.willRunTest)
this._client.willRunTest(suite, test);
var contentWindow = this._frame.contentWindow;
var self = this;
var options = { complexity: test.complexity };
Utilities.extendObject(options, this._client.options);
Utilities.extendObject(options, contentWindow.Utilities.parseParameters());
var benchmark = new contentWindow.benchmarkClass(options);
document.body.style.backgroundColor = benchmark.backgroundColor();
benchmark.run().then(function(testData) {
var suiteResults = self._suitesResults[suite.name] || {};
suiteResults[test.name] = testData;
self._suitesResults[suite.name] = suiteResults;
if (self._client && self._client.didRunTest)
self._client.didRunTest(testData);
state.next();
if (state.currentSuite() != suite)
self._removeFrame();
promise.resolve(state);
});
return promise;
},
step: function(state)
{
if (!state) {
state = new BenchmarkRunnerState(this._suites);
this._suitesResults = {};
}
var suite = state.currentSuite();
if (!suite) {
this._finalize();
var promise = new SimplePromise;
promise.resolve();
return promise;
}
if (state.isFirstTest()) {
this._appendFrame();
}
return state.prepareCurrentTest(this, this._frame).then(function(prepareReturnValue) {
return this._runBenchmarkAndRecordResults(state);
}.bind(this));
},
runAllSteps: function(startingState)
{
var nextCallee = this.runAllSteps.bind(this);
this.step(startingState).then(function(nextState) {
if (nextState)
nextCallee(nextState);
});
},
runMultipleIterations: function()
{
var self = this;
var currentIteration = 0;
this._runNextIteration = function() {
currentIteration++;
if (currentIteration < self._client.iterationCount)
self.runAllSteps();
else if (this._client && this._client.didFinishLastIteration) {
document.body.style.backgroundColor = "";
self._client.didFinishLastIteration();
}
}
if (this._client && this._client.willStartFirstIteration)
this._client.willStartFirstIteration();
this.runAllSteps();
},
_finalize: function()
{
this._removeFrame();
if (this._client && this._client.didRunSuites)
this._client.didRunSuites(this._suitesResults);
if (this._runNextIteration)
this._runNextIteration();
}
});