3 function forEach(iterable, fn, bind){
4 for (var i = 0, j = iterable.length; i < j; i++) fn.call(bind, iterable[i], i, iterable);
9 window.onload = function(){
13 forEach(document.getElementsByTagName('iframe'), function(iframe){
14 frameworks[iframe.name] = {
15 'test': window.frames[iframe.name].test,
16 'attribute': window.frames[iframe.name].modifier || '',
21 var tbody = document.getElementById('tbody');
22 var tfoot = document.getElementById('tfoot');
23 var lastrow = tfoot.getElementsByTagName('tr')[0];
25 var controls = document.getElementById('controls');
27 var links = controls.getElementsByTagName('a');
32 start.onclick = function(){
37 stop.onclick = function(){
47 for (var name in frameworks){
48 var framework = frameworks[name];
49 forEach(window.selectors, function(selector){
50 var frameworkSelector = selector.replace('%', frameworks[name].attribute);
51 framework.selectors.push(frameworkSelector);
53 scores[name] = lastrow.getElementsByTagName('td')[frxi];
60 forEach(window.selectors, function(selector, i){
62 var row = tbody.getElementsByTagName('tr')[i];
63 for (var name in frameworks){
64 var framework = frameworks[name];
65 var cell = row.getElementsByTagName('td')[frxi];
67 'execute': framework.test,
68 'selector': framework.selectors[i],
79 var testRunner = function(){
80 var test = tests.shift();
82 var results = test.execute(test.selector);
83 test.cell.className = 'test';
84 test.cell.innerHTML = results.time + ' ms | ' + results.found + ' found';
85 test.cell.speed = results.time;
86 if (results.found == 0){
87 test.cell.innerHTML = results.time + ' ms | zero results';
88 test.cell.className += ' zero';
90 test.cell.error = true;
91 } else if (results.error){
92 test.cell.innerHTML = results.time + ' ms | <span class="exception" title="' + results.error + '">error returned</a>';
93 test.cell.className += ' exception';
95 test.cell.error = true;
97 test.cell.found = results.found;
98 test.cell.error = false;
101 score[test.name] += test.cell.speed;
102 scores[test.name].innerHTML = ' ' + score[test.name] + ' ';
104 if (test.cell == test.row.lastChild) colourRow(test.row);
105 timer = setTimeout(testRunner, 0);
108 var colourRow = function(row){
112 var tds = row.getElementsByTagName('td');
113 forEach(tds, function(td){
119 forEach(cells, function(cell, i){
120 if (!cell.error) speeds[i] = cell.speed;
121 //error, so we exclude it from colouring
122 else speeds[i] = 99999999999999999999999;
125 var min = Math.min.apply(this, speeds);
126 var max = Math.max.apply(this, speeds);
129 var mismatch = false;
130 forEach(cells, function(cell, i){
131 found.push(cell.found);
133 forEach(found, function(n){
134 if (cell.found && n && cell.found != n){
140 if (cell.speed == min) cell.className += ' good';
141 else if (cell.speed == max) cell.className += ' bad';
142 else cell.className += ' normal';
146 forEach(cells, function(cell, i){
147 if (cell.found) cell.className += ' mismatch';