Initial patch.
[vuplus_webkit] / Websites / webkit.org / perf / slickspeed / system / slickspeed.js
diff --git a/Websites/webkit.org/perf/slickspeed/system/slickspeed.js b/Websites/webkit.org/perf/slickspeed/system/slickspeed.js
new file mode 100644 (file)
index 0000000..de4c1b5
--- /dev/null
@@ -0,0 +1,154 @@
+//base test functions
+
+function forEach(iterable, fn, bind){
+       for (var i = 0, j = iterable.length; i < j; i++) fn.call(bind, iterable[i], i, iterable);
+};
+
+//test start
+
+window.onload = function(){
+       
+       var frameworks = {};
+       
+       forEach(document.getElementsByTagName('iframe'), function(iframe){
+               frameworks[iframe.name] = {
+                       'test': window.frames[iframe.name].test,
+                       'attribute': window.frames[iframe.name].modifier || '',
+                       'selectors': []
+               };
+       });
+       
+       var tbody = document.getElementById('tbody');
+       var tfoot = document.getElementById('tfoot');
+       var lastrow = tfoot.getElementsByTagName('tr')[0];
+       
+       var controls = document.getElementById('controls');
+       
+       var links = controls.getElementsByTagName('a');
+       
+       var start = links[1];
+       var stop = links[0];
+       
+       start.onclick = function(){
+               testRunner();
+               return false;
+       };
+       
+       stop.onclick = function(){
+               clearTimeout(timer);
+               timer = null;
+               return false;
+       };
+       
+       var score = [];
+       var scores = {};
+       
+       var frxi = 0;
+       for (var name in frameworks){
+               var framework = frameworks[name];
+               forEach(window.selectors, function(selector){
+                       var frameworkSelector = selector.replace('%', frameworks[name].attribute);
+                       framework.selectors.push(frameworkSelector);
+               });
+               scores[name] = lastrow.getElementsByTagName('td')[frxi];
+               score[name] = 0;
+               frxi++;
+       }
+       
+       var tests = [];
+
+       forEach(window.selectors, function(selector, i){
+               var frxi = 0;
+               var row = tbody.getElementsByTagName('tr')[i];
+               for (var name in frameworks){
+                       var framework = frameworks[name];
+                       var cell = row.getElementsByTagName('td')[frxi];
+                       tests.push({
+                               'execute': framework.test,
+                               'selector': framework.selectors[i],
+                               'name': name,
+                               'row': row,
+                               'cell' : cell
+                       });
+                       frxi++;
+               }
+       });
+       
+       var timer = null;
+       
+       var testRunner = function(){
+               var test = tests.shift();
+               if (!test) return;
+               var results = test.execute(test.selector);
+               test.cell.className = 'test';
+               test.cell.innerHTML = results.time + ' ms | ' + results.found + ' found';
+               test.cell.speed = results.time;
+               if (results.found == 0){
+                       test.cell.innerHTML = results.time + ' ms | zero results';
+                       test.cell.className += ' zero';
+                       test.cell.found = 0;
+                       test.cell.error = true;
+               } else if (results.error){
+                       test.cell.innerHTML = results.time + ' ms | <span class="exception" title="' + results.error + '">error returned</a>';
+                       test.cell.className += ' exception';
+                       test.cell.found = 0;
+                       test.cell.error = true;
+               } else {
+                       test.cell.found = results.found;
+                       test.cell.error = false;
+               }
+               
+               score[test.name] += test.cell.speed;
+               scores[test.name].innerHTML =  '&nbsp;' + score[test.name] + '&nbsp;';
+               
+               if (test.cell == test.row.lastChild) colourRow(test.row);
+               timer = setTimeout(testRunner, 0);
+       };
+       
+       var colourRow = function(row){
+               
+               var cells = [];
+               
+               var tds = row.getElementsByTagName('td');
+               forEach(tds, function(td){
+                       cells.push(td);
+               });
+               
+               var speeds = [];
+               
+               forEach(cells, function(cell, i){
+                       if (!cell.error) speeds[i] = cell.speed;
+                       //error, so we exclude it from colouring
+                       else speeds[i] = 99999999999999999999999;
+               });
+               
+               var min = Math.min.apply(this, speeds);
+               var max = Math.max.apply(this, speeds);
+               
+               var found = [];
+               var mismatch = false;
+               forEach(cells, function(cell, i){
+                       found.push(cell.found);
+                       if (!mismatch){
+                               forEach(found, function(n){
+                                       if (cell.found && n && cell.found != n){
+                                               mismatch = true;
+                                               return;
+                                       }
+                               });
+                       }
+                       if (cell.speed == min) cell.className += ' good';
+                       else if (cell.speed == max) cell.className += ' bad';
+                       else cell.className += ' normal';
+               });
+               
+               if (mismatch){
+                       forEach(cells, function(cell, i){
+                               if (cell.found) cell.className += ' mismatch';
+                       });
+               }
+               
+       };
+       
+
+};
\ No newline at end of file