<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[191586] trunk/PerformanceTests</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/191586">191586</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-10-26 09:44:54 -0700 (Mon, 26 Oct 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add an option to output the results of the graphics benchmark in JSON format
https://bugs.webkit.org/show_bug.cgi?id=150484
&lt;rdar://problem/23243721&gt;

Patch by Said Abou-Hallawa &lt;sabouhallawa@apple.com&gt; on 2015-10-26
Reviewed by Darin Adler.

* Animometer/resources/extensions.js:
(ResultsDashboard): A new class to hold the iterations results.
(ResultsDashboard.prototype.push): Appends an iteration results;
(ResultsDashboard.prototype.toJSON): Converts the iterations results to JSON format.

(RecordTable.prototype.clear): Clears the results table.
(RecordTable.prototype._showTitles): Shows the header titles and appends the sub-titles to a queue.
(RecordTable.prototype._showHeader): Shows the table header titles.
(RecordTable.prototype._showEmpty): Shows an empty table cell.
(RecordTable.prototype._showValue): Shows a number value in the results table.
(RecordTable.prototype._showSamples): Shows a button for the sampled data graph.
(RecordTable.prototype._showTest): Shows the results of a single test.
(RecordTable.prototype._showSuite): Shows the results of a single suite.
(RecordTable.prototype.showRecord): Shows a single iteration for a single test.
(RecordTable.prototype.showIterations): Shows the results of all the suites of the iterations.

(ResultsTable): RecordTable was renamed to ResultsTable.
(ResultsTable.prototype.clear): Clears the table element.
(ResultsTable.prototype._showHeaderRow): Shows a row in the results table header.
(ResultsTable.prototype._showHeader): Shows the results table header.
(ResultsTable.prototype._showEmpty): Shows an empty table cell.
(ResultsTable.prototype._showText): Shows a string in a new table cell.
(ResultsTable.prototype._showFixedNumber): Shows a number in a new table cell.
(ResultsTable.prototype._showGraph): Shows a button for the sampled data graph.
(ResultsTable.prototype._showJSON): Shows a button for the sampled data JSON.
(ResultsTable.prototype._showTest): Shows the results of a single test.
(ResultsTable.prototype._showSuite): Shows the results of a single suite.
(ResultsTable.prototype._showIteration): Shows the results of a single iteration.
(ResultsTable.prototype.showRecord): Shows a single iteration for a single test.
(ResultsTable.prototype.showIterations): Shows all the results.
(RecordTable): Deleted.
(RecordTable.prototype.clear): Deleted.
(RecordTable.prototype._showTitles): Deleted.
(RecordTable.prototype._showHeader): Deleted.
(RecordTable.prototype._showEmpty): Deleted.
(RecordTable.prototype._showValue): Deleted.
(RecordTable.prototype._showSamples): Deleted.
(RecordTable.prototype._showTest): Deleted.
(RecordTable.prototype._showSuite): Deleted.
(RecordTable.prototype.showRecord): Deleted.
(RecordTable.prototype.showIterations): Deleted.

* Animometer/resources/sampler.js:
(Sampler.prototype.startSampling): Use forEach.
(Sampler.prototype.sample): Use forEach.
(Sampler.prototype.toJSON): Converts the sampler data to JSON format.

* Animometer/resources/strings.js: Added.
This new file will be used to associate the strings used by the benchmark
with IDs. A string can be changed in one place without having to change
all the instances of this string in multiple files. There two groups of
strings in this file. The first one is used by the UI elements and the second
group is used when constructing the results JSON.

* Animometer/runner/animometer.html:
* Animometer/runner/resources/animometer.css:

* Animometer/runner/resources/animometer.js:
(window.benchmarkRunnerClient.willAddTestFrame):
(window.benchmarkRunnerClient.willStartFirstIteration):
(window.benchmarkRunnerClient.didRunSuites):
(window.benchmarkRunnerClient.didFinishLastIteration):
Make benchmarkRunnerClient uses ResultsDashboard instead of _iterationsSamplers
Get the JSON from ResultsDashboard.toJSON() and pass it to ResultsTable.showIterations().
Also set the textContent of the &quot;#json&quot; textarea with the results JSON.

(showResults): Delete unneeded code.
(showJson): Shows the &quot;json&quot; section.
(showTestGraph): Rename showGraph() to be showTestGraph().
(showTestJSON): Shows the JSON of a single testResults.
(showGraph): Deleted.

* Animometer/runner/resources/tests.js:
Use the string table instead of putting literal strings.

* Animometer/tests/resources/stage.js:
(StageBenchmark.prototype.showResults):
Fix the parameters which are passed to RecordTable.showRecord().

* Animometer/tests/bouncing-particles/bouncing-canvas-images.html:
* Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html:
* Animometer/tests/bouncing-particles/bouncing-css-images.html:
* Animometer/tests/bouncing-particles/bouncing-css-shapes.html:
* Animometer/tests/bouncing-particles/bouncing-svg-images.html:
* Animometer/tests/bouncing-particles/bouncing-svg-shapes.html:
* Animometer/tests/examples/canvas-electrons.html:
* Animometer/tests/examples/canvas-stars.html:
* Animometer/tests/simple/simple-canvas-paths.html:
* Animometer/tests/template/template-canvas.html:
* Animometer/tests/template/template-css.html:
* Animometer/tests/template/template-svg.html:
* Animometer/tests/text/layering-text.html:
Include the new strings.js file in all the test files.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsAnimometerresourcesextensionsjs">trunk/PerformanceTests/Animometer/resources/extensions.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcessamplerjs">trunk/PerformanceTests/Animometer/resources/sampler.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerrunneranimometerhtml">trunk/PerformanceTests/Animometer/runner/animometer.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerrunnerresourcesanimometercss">trunk/PerformanceTests/Animometer/runner/resources/animometer.css</a></li>
<li><a href="#trunkPerformanceTestsAnimometerrunnerresourcesanimometerjs">trunk/PerformanceTests/Animometer/runner/resources/animometer.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerrunnerresourcestestsjs">trunk/PerformanceTests/Animometer/runner/resources/tests.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasimageshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasshapeshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssimageshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssshapeshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgimageshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgshapeshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsexamplescanvaselectronshtml">trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsexamplescanvasstarshtml">trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsresourcesstagejs">trunk/PerformanceTests/Animometer/tests/resources/stage.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestssimplesimplecanvaspathshtml">trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplatetemplatecanvashtml">trunk/PerformanceTests/Animometer/tests/template/template-canvas.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplatetemplatecsshtml">trunk/PerformanceTests/Animometer/tests/template/template-css.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplatetemplatesvghtml">trunk/PerformanceTests/Animometer/tests/template/template-svg.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststextlayeringtexthtml">trunk/PerformanceTests/Animometer/tests/text/layering-text.html</a></li>
<li><a href="#trunkPerformanceTestsChangeLog">trunk/PerformanceTests/ChangeLog</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsAnimometerresourcesstringsjs">trunk/PerformanceTests/Animometer/resources/strings.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkPerformanceTestsAnimometerresourcesextensionsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/resources/extensions.js (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/extensions.js        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/resources/extensions.js        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -141,42 +141,96 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function RecordTable(element)
</del><ins>+function ResultsDashboard()
</ins><span class="cx"> {
</span><ins>+    this._iterationsSamplers = [];
+}
+
+ResultsDashboard.prototype =
+{
+    push: function(suitesSamplers)
+    {
+        this._iterationsSamplers.push(suitesSamplers);        
+    },
+    
+    toJSON: function(statistics, graph)
+    {
+        var iterationsResults = [];
+        var iterationsScores = [];
+        
+        this._iterationsSamplers.forEach(function(iterationSamplers, index) {
+            var suitesResults = {};
+            var suitesScores = [];
+        
+            for (var suiteName in iterationSamplers) {
+                var suite = suiteFromName(suiteName);
+                var suiteSamplers = iterationSamplers[suiteName];
+
+                var testsResults = {};
+                var testsScores = [];
+                
+                for (var testName in suiteSamplers) {
+                    var sampler = suiteSamplers[testName];
+                    testsResults[testName] = sampler.toJSON(statistics, graph);
+                    testsScores.push(testsResults[testName][Strings[&quot;JSON_SCORE&quot;]]);
+                }
+
+                suitesResults[suiteName] =  {};
+                suitesResults[suiteName][Strings[&quot;JSON_SCORE&quot;]] = Statistics.geometricMean(testsScores);
+                suitesResults[suiteName][Strings[&quot;JSON_RESULTS&quot;][2]] = testsResults;
+                suitesScores.push(suitesResults[suiteName][Strings[&quot;JSON_SCORE&quot;]]);
+            }
+            
+            iterationsResults[index] = {};
+            iterationsResults[index][Strings[&quot;JSON_SCORE&quot;]] = Statistics.geometricMean(suitesScores);
+            iterationsResults[index][Strings[&quot;JSON_RESULTS&quot;][1]] = suitesResults;
+            iterationsScores.push(iterationsResults[index][Strings[&quot;JSON_SCORE&quot;]]);
+        });
+
+        var json = {};
+        json[Strings[&quot;JSON_SCORE&quot;]] = Statistics.sampleMean(iterationsScores.length, iterationsScores.reduce(function(a, b) { return a * b; }));
+        json[Strings[&quot;JSON_RESULTS&quot;][0]] = iterationsResults;
+        return json;
+    }
+}
+
+function ResultsTable(element, headers)
+{
</ins><span class="cx">     this.element = element;
</span><ins>+    this._headers = headers;
</ins><span class="cx">     this.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RecordTable.prototype =
</del><ins>+ResultsTable.prototype =
</ins><span class="cx"> {
</span><span class="cx">     clear: function()
</span><span class="cx">     {
</span><span class="cx">         this.element.innerHTML = &quot;&quot;;
</span><span class="cx">     },
</span><del>-    
-    _showTitles: function(row, queue, titles, message)
</del><ins>+
+    _showHeaderRow: function(row, queue, headers, message)
</ins><span class="cx">     {
</span><del>-        titles.forEach(function (title) {
</del><ins>+        headers.forEach(function (header) {
</ins><span class="cx">             var th = document.createElement(&quot;th&quot;);
</span><del>-            th.textContent = title.text;
</del><ins>+            th.textContent = header.text;
</ins><span class="cx">             if (typeof message != &quot;undefined&quot; &amp;&amp; message.length) {
</span><span class="cx">                 th.appendChild(document.createElement('br'));
</span><span class="cx">                 th.appendChild(document.createTextNode('[' + message +']'));
</span><span class="cx">                 message = &quot;&quot;;
</span><span class="cx">             }
</span><del>-            if (&quot;width&quot; in title)
-                th.width = title.width + &quot;%&quot;;
</del><ins>+            if (&quot;width&quot; in header)
+                th.width = header.width + &quot;%&quot;;
</ins><span class="cx">             row.appendChild(th);
</span><del>-            queue.push({element: th, titles: title.children });
</del><ins>+            queue.push({element: th, headers: header.children });
</ins><span class="cx">         });
</span><span class="cx">     },
</span><del>-    
-    _showHeader: function(suiteName, titles, message)
</del><ins>+
+    _showHeader: function(message)
</ins><span class="cx">     {
</span><span class="cx">         var row = document.createElement(&quot;tr&quot;);
</span><span class="cx"> 
</span><span class="cx">         var queue = [];
</span><del>-        this._showTitles(row, queue, titles, message);
</del><ins>+        this._showHeaderRow(row, queue, this._headers, message);
</ins><span class="cx">         this.element.appendChild(row);
</span><span class="cx"> 
</span><span class="cx">         while (queue.length) {
</span><span class="lines">@@ -186,7 +240,7 @@
</span><span class="cx">             for (var i = 0, len = queue.length; i &lt; len; ++i) {
</span><span class="cx">                 var entry = queue.shift();
</span><span class="cx"> 
</span><del>-                if (!entry.titles.length) {
</del><ins>+                if (!entry.headers.length) {
</ins><span class="cx">                     entries.push(entry.element);
</span><span class="cx">                     continue;
</span><span class="cx">                 }
</span><span class="lines">@@ -194,8 +248,8 @@
</span><span class="cx">                 if (!row)
</span><span class="cx">                     var row = document.createElement(&quot;tr&quot;);
</span><span class="cx"> 
</span><del>-                this._showTitles(row, queue, entry.titles, &quot;&quot;);
-                entry.element.colSpan = entry.titles.length;
</del><ins>+                this._showHeaderRow(row, queue, entry.headers, &quot;&quot;);
+                entry.element.colSpan = entry.headers.length;
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (row) {
</span><span class="lines">@@ -207,100 +261,132 @@
</span><span class="cx">         }
</span><span class="cx">     },
</span><span class="cx">     
</span><del>-    _showEmpty: function(row, testName)
</del><ins>+    _showEmpty: function(row)
</ins><span class="cx">     {
</span><span class="cx">         var td = document.createElement(&quot;td&quot;);
</span><span class="cx">         row.appendChild(td);
</span><span class="cx">     },
</span><del>-    
-    _showValue: function(row, testName, value)
</del><ins>+
+    _showText: function(row, text)
</ins><span class="cx">     {
</span><span class="cx">         var td = document.createElement(&quot;td&quot;);
</span><del>-        td.textContent = value.toFixed(2);
</del><ins>+        td.textContent = text;
</ins><span class="cx">         row.appendChild(td);
</span><span class="cx">     },
</span><ins>+
+    _showFixedNumber: function(row, value, digits)
+    {
+        var td = document.createElement(&quot;td&quot;);
+        td.textContent = value.toFixed(digits || 2);
+        row.appendChild(td);
+    },
</ins><span class="cx">     
</span><del>-    _showSamples: function(row, testName, axes, samples, samplingTimeOffset)
</del><ins>+    _showGraph: function(row, testName, testResults)
</ins><span class="cx">     {
</span><ins>+        var data = testResults[Strings[&quot;JSON_SAMPLES&quot;][0]];
+        if (!data) {
+            this._showEmpty(row);
+            return;
+        }
+        
</ins><span class="cx">         var td = document.createElement(&quot;td&quot;);
</span><span class="cx">         var button = document.createElement(&quot;div&quot;);
</span><span class="cx">         button.className = &quot;small-button&quot;;
</span><ins>+
+        button.addEventListener(&quot;click&quot;, function() {
+            var samples = data[Strings[&quot;JSON_GRAPH&quot;][0]];
+            var samplingTimeOffset = data[Strings[&quot;JSON_GRAPH&quot;][1]];
+            var axes = Strings[&quot;TEXT_EXPERIMENTS&quot;];
+            window.showTestGraph(testName, axes, samples, samplingTimeOffset);
+        });
</ins><span class="cx">             
</span><ins>+        button.textContent = Strings[&quot;TEXT_RESULTS&quot;][1] + &quot;...&quot;;
+        td.appendChild(button);
+        row.appendChild(td);
+    },
+
+    _showJSON: function(row, testName, testResults)
+    {
+        var data = testResults[Strings[&quot;JSON_SAMPLES&quot;][0]];
+        if (!data) {
+            this._showEmpty(row);
+            return;
+        }
+        
+        var td = document.createElement(&quot;td&quot;);
+        var button = document.createElement(&quot;div&quot;);
+        button.className = &quot;small-button&quot;;
+
</ins><span class="cx">         button.addEventListener(&quot;click&quot;, function() {
</span><del>-            window.showGraph(testName, axes, samples, samplingTimeOffset);
</del><ins>+            window.showTestJSON(testName, testResults);
</ins><span class="cx">         });
</span><span class="cx">             
</span><del>-        button.textContent = &quot;Graph...&quot;;
</del><ins>+        button.textContent = Strings[&quot;TEXT_RESULTS&quot;][2] + &quot;...&quot;;
</ins><span class="cx">         td.appendChild(button);
</span><span class="cx">         row.appendChild(td);
</span><span class="cx">     },
</span><del>-    
-    _showTest: function(testName, titles, sampler, finalResults)
</del><ins>+
+    _showTest: function(testName, testResults)
</ins><span class="cx">     {
</span><span class="cx">         var row = document.createElement(&quot;tr&quot;);
</span><del>-        var td = document.createElement(&quot;td&quot;);
</del><span class="cx">         
</span><del>-        td.textContent = testName;
-        row.appendChild(td);
-        
-        var axes = [];
-        sampler.experiments.forEach(function(experiment, index) {
-            this._showValue(row, testName, experiment.mean());
-            this._showValue(row, testName, experiment.concern(Experiment.defaults.CONCERN));
-            this._showValue(row, testName, experiment.standardDeviation());
-            this._showValue(row, testName, experiment.percentage());
-            axes.push(titles[index + 1].text);
-            
-        }, this);
</del><ins>+        for (var index = 0; index &lt; this._headers.length; ++index) {
</ins><span class="cx"> 
</span><del>-        this._showValue(row, testName, sampler.experiments[0].score(Experiment.defaults.CONCERN));
</del><ins>+            switch (index) {
+            case 0:
+                this._showText(row, testName);
+                break;
</ins><span class="cx"> 
</span><del>-        if (finalResults)
-            this._showSamples(row, testName, axes, sampler.samples, sampler.samplingTimeOffset);
-        else
-            this._showEmpty(row, testName);
-            
</del><ins>+            case 1:
+                var data = testResults[Strings[&quot;JSON_SCORE&quot;][0]];
+                this._showFixedNumber(row, data, 2);
+                break;
+
+            case 2:
+            case 3:
+                var data = testResults[Strings[&quot;JSON_EXPERIMENTS&quot;][index - 2]];
+                for (var measurement in data)
+                    this._showFixedNumber(row, data[measurement], 2);
+                break;
+                
+            case 4:
+                this._showGraph(row, testName, testResults);
+                this._showJSON(row, testName, testResults);
+                break;
+            }
+        }
+        
</ins><span class="cx">         this.element.appendChild(row);
</span><span class="cx">     },
</span><del>-    
-    _showSuite: function(suite, suiteSamplers)
</del><ins>+
+    _showSuite: function(suiteName, suiteResults)
</ins><span class="cx">     {
</span><del>-        var scores = [];        
-        for (var testName in suiteSamplers) {
-            var test = testFromName(suite, testName);
-            var sampler = suiteSamplers[testName]; 
-            this._showTest(testName, suite.titles, sampler, true);
-            scores.push(sampler.experiments[0].score(Experiment.defaults.CONCERN));
</del><ins>+        for (var testName in suiteResults[Strings[&quot;JSON_RESULTS&quot;][2]]) {
+            this._showTest(testName, suiteResults[Strings[&quot;JSON_RESULTS&quot;][2]][testName]);
</ins><span class="cx">         }
</span><del>-        return scores;
</del><span class="cx">     },
</span><span class="cx">     
</span><del>-    showRecord: function(suite, test, sampler, message)
</del><ins>+    _showIteration : function(iterationResults)
</ins><span class="cx">     {
</span><del>-        this.clear();        
-        this._showHeader(&quot;&quot;, suite.titles, message);
-        this._showTest(test.name, suite.titles, sampler, false);        
</del><ins>+        for (var suiteName in iterationResults[Strings[&quot;JSON_RESULTS&quot;][1]]) {
+            this._showSuite(suiteName, iterationResults[Strings[&quot;JSON_RESULTS&quot;][1]][suiteName]);
+        }
</ins><span class="cx">     },
</span><span class="cx">     
</span><del>-    showIterations: function(iterationsSamplers)
</del><ins>+    showRecord: function(testName, message, testResults)
</ins><span class="cx">     {
</span><span class="cx">         this.clear();
</span><ins>+        this._showHeader(message);
+        this._showTest(testName, testResults);
+    },
</ins><span class="cx"> 
</span><del>-        var scores = [];
-        var titles = null;
-        iterationsSamplers.forEach(function(suitesSamplers) {
-            for (var suiteName in suitesSamplers) {
-                var suite = suiteFromName(suiteName);
-                if (titles != suite.titles) {
-                    titles = suite.titles;
-                    this._showHeader(suiteName, titles, &quot;&quot;);
-                }
-
-                var suiteScores = this._showSuite(suite, suitesSamplers[suiteName]);
-                scores.push.apply(scores, suiteScores);
-            }
</del><ins>+    showIterations: function(iterationsResults)
+    {
+        this.clear();
+        this._showHeader(&quot;&quot;);
+        
+        iterationsResults.forEach(function(iterationResults) {
+            this._showIteration(iterationResults);
</ins><span class="cx">         }, this);
</span><del>-
-        return Statistics.geometricMean(scores);
</del><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcessamplerjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/resources/sampler.js (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/sampler.js        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/resources/sampler.js        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -103,22 +103,49 @@
</span><span class="cx"> 
</span><span class="cx"> Sampler.prototype =
</span><span class="cx"> {
</span><del>-    startSampling: function(timeOffset)
</del><ins>+    startSampling: function(samplingTimeOffset)
</ins><span class="cx">     {
</span><del>-        for (var index = 0; index &lt; this.experiments.length; ++index)
-            this.experiments[index].startSampling();
</del><ins>+        this.experiments.forEach(function(experiment) {
+            experiment.startSampling();
+        });
</ins><span class="cx">             
</span><del>-        this.samplingTimeOffset = timeOffset / 1000;
</del><ins>+        this.samplingTimeOffset = samplingTimeOffset / 1000;
</ins><span class="cx">     },
</span><span class="cx">     
</span><span class="cx">     sample: function(timeOffset, values)
</span><span class="cx">     {
</span><span class="cx">         if (values.length &lt; this.experiments.length)
</span><span class="cx">             throw &quot;Not enough sample points&quot;;
</span><ins>+
+        this.experiments.forEach(function(experiment, index) {
+            experiment.sample(values[index]);
+        });
</ins><span class="cx">                     
</span><del>-        for (var index = 0; index &lt; this.experiments.length; ++index)
-            this.experiments[index].sample(values[index]);
-            
</del><span class="cx">         this.samples.push({ timeOffset: timeOffset / 1000, values: values });
</span><ins>+    },
+    
+    toJSON: function(statistics, graph)
+    {
+        var results = {};
+         
+        results[Strings[&quot;JSON_SCORE&quot;]] = this.experiments[0].score(Experiment.defaults.CONCERN);
+           
+        if (statistics) {
+            this.experiments.forEach(function(experiment, index) {
+                results[Strings[&quot;JSON_EXPERIMENTS&quot;][index]] = {};
+                results[Strings[&quot;JSON_EXPERIMENTS&quot;][index]][Strings[&quot;JSON_MEASUREMENTS&quot;][0]] = experiment.mean();
+                results[Strings[&quot;JSON_EXPERIMENTS&quot;][index]][Strings[&quot;JSON_MEASUREMENTS&quot;][1]] = experiment.concern(Experiment.defaults.CONCERN);
+                results[Strings[&quot;JSON_EXPERIMENTS&quot;][index]][Strings[&quot;JSON_MEASUREMENTS&quot;][2]] = experiment.standardDeviation();
+                results[Strings[&quot;JSON_EXPERIMENTS&quot;][index]][Strings[&quot;JSON_MEASUREMENTS&quot;][3]] = experiment.percentage();
+            });
+        }
+        
+        if (graph) {
+            results[Strings[&quot;JSON_SAMPLES&quot;][0]] = {};
+            results[Strings[&quot;JSON_SAMPLES&quot;][0]][Strings[&quot;JSON_GRAPH&quot;][0]] = this.samples;
+            results[Strings[&quot;JSON_SAMPLES&quot;][0]][Strings[&quot;JSON_GRAPH&quot;][1]] = this.samplingTimeOffset;
+        }
+        
+        return results;
</ins><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesstringsjs"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/Animometer/resources/strings.js (0 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/strings.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/strings.js        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+var Strings = {
+    TEXT_TESTNAME:       [ &quot;Test Name&quot; ],
+    TEXT_EXPERIMENTS:    [ &quot;Complexity&quot;, &quot;FPS&quot; ],
+    TEXT_MEASUREMENTS:   [ &quot;Avg.&quot;, &quot;W.5%&quot;, &quot;Std.&quot;, &quot;%&quot; ],
+    TEXT_SCORE:          [ &quot;Score&quot; ],
+    TEXT_SAMPLES:        [ &quot;Samples&quot; ],
+    TEXT_RESULTS:        [ &quot;Results&quot;, &quot;Graph&quot;, &quot;JSON&quot; ],
+    
+    JSON_EXPERIMENTS:    [ &quot;complexity&quot;, &quot;frameRate&quot; ],
+    JSON_MEASUREMENTS:   [ &quot;average&quot;, &quot;concern&quot;, &quot;stdev&quot;, &quot;percent&quot; ],
+    JSON_SCORE:          [ &quot;score&quot; ],
+    JSON_SAMPLES:        [ &quot;samples&quot; ],
+    JSON_GRAPH:          [ &quot;points&quot;, &quot;samplingTimeOffset&quot; ],
+    JSON_RESULTS:        [ &quot;iterationsResults&quot;, &quot;suitesResults&quot;, &quot;testsResults&quot; ],
+};
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerrunneranimometerhtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/runner/animometer.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/runner/animometer.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/runner/animometer.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -2,6 +2,7 @@
</span><span class="cx"> &lt;html&gt;
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; href=&quot;resources/animometer.css&quot;&gt;
</span><ins>+    &lt;script src=&quot;../resources/strings.js&quot; defer&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../resources/sampler.js&quot; defer&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/extensions.js&quot; defer&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/tests.js&quot; defer=&quot;&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -43,20 +44,37 @@
</span><span class="cx">             &lt;/div&gt;
</span><span class="cx">         &lt;/section&gt;
</span><span class="cx">         &lt;section id=&quot;results&quot;&gt;
</span><del>-            &lt;h1&gt;Results&lt;/h1&gt;
</del><ins>+            &lt;h1&gt;Results:&lt;/h1&gt;
</ins><span class="cx">             &lt;table class=&quot;results-table&quot;&gt;&lt;/table&gt;
</span><span class="cx">             &lt;div class=&quot;buttons&quot;&gt;
</span><ins>+                &lt;button onclick=&quot;showJson()&quot;&gt;JSON&lt;/button&gt;
</ins><span class="cx">                 &lt;button onclick=&quot;startTest()&quot;&gt;Test Again&lt;/button&gt;
</span><span class="cx">             &lt;/div&gt;
</span><span class="cx">         &lt;/section&gt;  
</span><del>-        &lt;section id=&quot;graph&quot;&gt;
-            &lt;h1&gt;Graph&lt;/h1&gt;
</del><ins>+        &lt;section id=&quot;json&quot;&gt;
+            &lt;h1&gt;JSON:&lt;/h1&gt;
+            &lt;textarea class=&quot;results-json&quot;&gt;&lt;/textarea&gt;
+            &lt;div class=&quot;buttons&quot;&gt;
+                &lt;button onclick=&quot;showResults()&quot;&gt;Results&lt;/button&gt;
+                &lt;button onclick=&quot;startTest()&quot;&gt;Test Again&lt;/button&gt;
+            &lt;/div&gt;
+        &lt;/section&gt;  
+        &lt;section id=&quot;test-graph&quot;&gt;
+            &lt;h1&gt;Graph:&lt;/h1&gt;
</ins><span class="cx">             &lt;div id=&quot;graphContainer&quot;&gt;&lt;/div&gt;
</span><span class="cx">             &lt;div class=&quot;buttons&quot;&gt;
</span><span class="cx">                 &lt;button onclick=&quot;showResults()&quot;&gt;Results&lt;/button&gt;
</span><span class="cx">                 &lt;button onclick=&quot;startTest()&quot;&gt;Test Again&lt;/button&gt;        
</span><span class="cx">             &lt;/div&gt;
</span><span class="cx">         &lt;/section&gt;  
</span><ins>+        &lt;section id=&quot;test-json&quot;&gt;
+            &lt;h1&gt;JSON:&lt;/h1&gt;
+            &lt;textarea class=&quot;results-json&quot;&gt;&lt;/textarea&gt;
+            &lt;div class=&quot;buttons&quot;&gt;
+                &lt;button onclick=&quot;showResults()&quot;&gt;Results&lt;/button&gt;
+                &lt;button onclick=&quot;startTest()&quot;&gt;Test Again&lt;/button&gt;        
+            &lt;/div&gt;
+        &lt;/section&gt;  
</ins><span class="cx">     &lt;/main&gt;
</span><span class="cx"> &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerrunnerresourcesanimometercss"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/runner/resources/animometer.css (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/runner/resources/animometer.css        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/runner/resources/animometer.css        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -117,6 +117,17 @@
</span><span class="cx">     text-align: center;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+section#test-json &gt; textarea,
+section#json &gt; textarea {
+    width: 800px;
+    height: 460px;
+    background-color: rgb(128, 128, 128);
+    border: 1px solid rgb(235, 235, 235);
+    color: white;
+    white-space: pre;
+    overflow: scroll;
+}
+
</ins><span class="cx"> .options {
</span><span class="cx">     margin:0 auto;    
</span><span class="cx">     margin-top: 30px;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerrunnerresourcesanimometerjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/runner/resources/animometer.js (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/runner/resources/animometer.js        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/runner/resources/animometer.js        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -5,7 +5,7 @@
</span><span class="cx">     recordTable: null,
</span><span class="cx">     options: { testInterval: 30000, frameRate: 50, estimatedFrameRate: true, fixTestComplexity : false },
</span><span class="cx">     score: 0,
</span><del>-    _iterationsSamplers: [],
</del><ins>+    _resultsDashboard: null,
</ins><span class="cx">     _resultsTable: null,
</span><span class="cx">     
</span><span class="cx">     willAddTestFrame: function (frame)
</span><span class="lines">@@ -23,21 +23,31 @@
</span><span class="cx">     
</span><span class="cx">     willStartFirstIteration: function ()
</span><span class="cx">     {
</span><del>-        this._iterationsSamplers = [];
-        this._resultsTable = new RecordTable(document.querySelectorAll(&quot;.results-table&quot;)[0]);
</del><ins>+        this._resultsDashboard = new ResultsDashboard();
+        this._resultsTable = new ResultsTable(document.querySelector(&quot;.results-table&quot;), Headers);
</ins><span class="cx">         
</span><span class="cx">         this.progressBar = new ProgressBar(document.getElementById(&quot;progress-completed&quot;), this.testsCount);
</span><del>-        this.recordTable = new RecordTable(document.querySelectorAll(&quot;.record-table&quot;)[0]);
</del><ins>+        this.recordTable = new ResultsTable(document.querySelector(&quot;.record-table&quot;), Headers);
</ins><span class="cx">     },
</span><span class="cx">     
</span><span class="cx">     didRunSuites: function (suitesSamplers)
</span><span class="cx">     {
</span><del>-        this._iterationsSamplers.push(suitesSamplers);
</del><ins>+        this._resultsDashboard.push(suitesSamplers);
</ins><span class="cx">     },
</span><span class="cx">     
</span><span class="cx">     didFinishLastIteration: function ()
</span><span class="cx">     {
</span><del>-        this.score = this._resultsTable.showIterations(this._iterationsSamplers, &quot;&quot;);
</del><ins>+        var json = this._resultsDashboard.toJSON(true, true);
+        this._resultsTable.showIterations(json[Strings[&quot;JSON_RESULTS&quot;][0]]);
+        
+        var element = document.querySelector(&quot;#json &gt; textarea&quot;);
+        element.innerHTML = JSON.stringify(json[Strings[&quot;JSON_RESULTS&quot;][0]][0], function(key, value) { 
+            if (typeof value == &quot;number&quot;)
+                return value.toFixed(2);
+            return value;
+        }, 4);
+        
+        this.score = json[Strings[&quot;JSON_SCORE&quot;]];
</ins><span class="cx">         showResults();
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -92,10 +102,10 @@
</span><span class="cx">     startBenchmark();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function showResults(score)
</del><ins>+function showResults()
</ins><span class="cx"> {
</span><span class="cx">     var element = document.querySelector(&quot;#results &gt; h1&quot;);
</span><del>-    element.textContent = &quot;Results:&quot;
</del><ins>+    element.textContent = Strings[&quot;TEXT_RESULTS&quot;][0] + &quot;:&quot;;
</ins><span class="cx">     
</span><span class="cx">     var score = benchmarkRunnerClient.score.toFixed(2);
</span><span class="cx">     element.textContent += &quot; [Score = &quot; + score + &quot;]&quot;;
</span><span class="lines">@@ -103,18 +113,47 @@
</span><span class="cx">     showSection(&quot;results&quot;, true);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function showGraph(testName, axes, samples, samplingTimeOffset)
</del><ins>+function showJson()
</ins><span class="cx"> {
</span><del>-    var element = document.querySelector(&quot;#graph &gt; h1&quot;);
-    element.textContent = &quot;Graph:&quot;
</del><ins>+    var element = document.querySelector(&quot;#json &gt; h1&quot;);
+    element.textContent = Strings[&quot;TEXT_RESULTS&quot;][2] + &quot;:&quot;;
+    
+    var score = benchmarkRunnerClient.score.toFixed(2);
+    element.textContent += &quot; [Score = &quot; + score + &quot;]&quot;;
</ins><span class="cx"> 
</span><ins>+    showSection(&quot;json&quot;, true);
+}
+
+function showTestGraph(testName, axes, samples, samplingTimeOffset)
+{
+    var element = document.querySelector(&quot;#test-graph &gt; h1&quot;);
+    element.textContent = Strings[&quot;TEXT_RESULTS&quot;][1] + &quot;:&quot;;
+
</ins><span class="cx">     if (testName.length)
</span><span class="cx">         element.textContent += &quot; [test = &quot; + testName + &quot;]&quot;;
</span><span class="cx">             
</span><span class="cx">     graph(&quot;#graphContainer&quot;, new Point(700, 400), new Insets(20, 50, 20, 50), axes, samples, samplingTimeOffset);
</span><del>-    showSection(&quot;graph&quot;, true);    
</del><ins>+    showSection(&quot;test-graph&quot;, true);    
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function showTestJSON(testName, testResults)
+{
+    var element = document.querySelector(&quot;#test-json &gt; h1&quot;);
+    element.textContent = Strings[&quot;TEXT_RESULTS&quot;][2] + &quot;:&quot;;
+
+    if (testName.length)
+        element.textContent += &quot; [test = &quot; + testName + &quot;]&quot;;
+            
+    var element = document.querySelector(&quot;#test-json &gt; textarea&quot;);
+    element.innerHTML = JSON.stringify(testResults, function(key, value) { 
+        if (typeof value == &quot;number&quot;)
+            return value.toFixed(2);
+        return value;
+    }, 4);
+
+    showSection(&quot;test-json&quot;, true);    
+}
+
</ins><span class="cx"> function populateSettings() {
</span><span class="cx">     var suitesDiv = document.getElementById(&quot;suites&quot;);
</span><span class="cx">     Suites.forEach(function(suite) {
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerrunnerresourcestestsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/runner/resources/tests.js (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/runner/resources/tests.js        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/runner/resources/tests.js        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -1,46 +1,49 @@
</span><del>-var Titles = [
</del><ins>+var Headers = [
</ins><span class="cx">     {
</span><del>-        text: &quot;Test Name&quot;,
-        width: 28,
</del><ins>+        text: Strings[&quot;TEXT_TESTNAME&quot;][0],
+        width: 27,
</ins><span class="cx">         children: []
</span><span class="cx">     },
</span><span class="cx">     {
</span><del>-        text: &quot;Animated Items&quot;,
-        width: 28,
</del><ins>+        text: Strings[&quot;TEXT_SCORE&quot;][0],
+        width: 7,
+        children: []
+    },
+    {
+        text: Strings[&quot;TEXT_EXPERIMENTS&quot;][0],
+        width: 27,
</ins><span class="cx">         children:
</span><span class="cx">         [
</span><del>-            { text:   &quot;Avg.&quot;, width: 7, children: [] },
-            { text:   &quot;W.5%&quot;, width: 7, children: [] },
-            { text:   &quot;Std.&quot;, width: 7, children: [] },
-            { text:      &quot;%&quot;, width: 7, children: [] },
</del><ins>+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][0], width: 7, children: [] },
+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][1], width: 7, children: [] },
+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][2], width: 7, children: [] },
+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][3], width: 6, children: [] },
</ins><span class="cx">         ]
</span><span class="cx">     },
</span><span class="cx">     {
</span><del>-        text: &quot;FPS&quot;,
-        width: 28,
</del><ins>+        text: Strings[&quot;TEXT_EXPERIMENTS&quot;][1],
+        width: 24,
</ins><span class="cx">         children:
</span><span class="cx">         [
</span><del>-            { text:   &quot;Avg.&quot;, width: 7, children: [] },
-            { text:   &quot;W.5%&quot;, width: 7, children: [] },
-            { text:   &quot;Std.&quot;, width: 7, children: [] },
-            { text:      &quot;%&quot;, width: 7, children: [] },
</del><ins>+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][0], width: 6, children: [] },
+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][1], width: 6, children: [] },
+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][2], width: 6, children: [] },
+            { text: Strings[&quot;TEXT_MEASUREMENTS&quot;][3], width: 6, children: [] },
</ins><span class="cx">         ]
</span><span class="cx">     },
</span><span class="cx">     {
</span><del>-        text: &quot;Score&quot;,
-        width: 8,
-        children: []
-    },
-    {
-        text: &quot;Samples&quot;,
-        width: 8,
-        children: []
</del><ins>+        text: Strings[&quot;TEXT_SAMPLES&quot;][0],
+        width: 15,
+        children:
+        [
+            { text: Strings[&quot;TEXT_RESULTS&quot;][1], width: 8, children: [] },
+            { text: Strings[&quot;TEXT_RESULTS&quot;][2], width: 7, children: [] },
+        ]
</ins><span class="cx">     }
</span><span class="cx"> ];
</span><span class="cx"> 
</span><span class="cx"> var Suite = function(name, tests) {
</span><span class="cx">     this.name = name;
</span><del>-    this.titles = Titles;
</del><span class="cx">     this.tests = tests;
</span><span class="cx"> };
</span><span class="cx"> Suite.prototype.prepare = function(runner, contentWindow, contentDocument)
</span><span class="lines">@@ -54,7 +57,6 @@
</span><span class="cx">     return contentWindow.runBenchmark(this, test, options, recordTable, progressBar);
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> var Suites = [];
</span><span class="cx"> 
</span><span class="cx"> Suites.push(new Suite(&quot;HTML suite&quot;,
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasimageshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx">     &lt;/style&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasshapeshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssimageshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx">     &lt;/style&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssshapeshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -19,6 +19,7 @@
</span><span class="cx">     &lt;/style&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgimageshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgshapeshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsexamplescanvaselectronshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsexamplescanvasstarshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsresourcesstagejs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/resources/stage.js (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/resources/stage.js        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/resources/stage.js        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -174,11 +174,11 @@
</span><span class="cx"> 
</span><span class="cx"> StageBenchmark.prototype.showResults = function(message, progress)
</span><span class="cx"> {
</span><del>-    if (!this._recordTable || !this._progressBar || !this._suite || !this._test)
</del><ins>+    if (!this._recordTable || !this._progressBar || !this._test)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (this.options.showRunningResults)
</span><del>-        this._recordTable.showRecord(this._suite, this._test, this._sampler, message);
</del><ins>+        this._recordTable.showRecord(this._test.name, message, this._sampler.toJSON(true, false));
</ins><span class="cx"> 
</span><span class="cx">     this._progressBar.setPos(progress);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestssimplesimplecanvaspathshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplatetemplatecanvashtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/template-canvas.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/template-canvas.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/template/template-canvas.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplatetemplatecsshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/template-css.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/template-css.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/template/template-css.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplatetemplatesvghtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/template-svg.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/template-svg.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/template/template-svg.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -3,6 +3,7 @@
</span><span class="cx"> &lt;head&gt;
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststextlayeringtexthtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/text/layering-text.html (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/text/layering-text.html        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/Animometer/tests/text/layering-text.html        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -13,6 +13,7 @@
</span><span class="cx">     &lt;/style&gt;  
</span><span class="cx">     &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../resources/stage.css&quot;&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/algorithm.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;../../resources/strings.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ChangeLog (191585 => 191586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ChangeLog        2015-10-26 15:59:17 UTC (rev 191585)
+++ trunk/PerformanceTests/ChangeLog        2015-10-26 16:44:54 UTC (rev 191586)
</span><span class="lines">@@ -1,3 +1,105 @@
</span><ins>+2015-10-26  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        Add an option to output the results of the graphics benchmark in JSON format
+        https://bugs.webkit.org/show_bug.cgi?id=150484
+        &lt;rdar://problem/23243721&gt;
+
+        Reviewed by Darin Adler.
+
+        * Animometer/resources/extensions.js:
+        (ResultsDashboard): A new class to hold the iterations results.
+        (ResultsDashboard.prototype.push): Appends an iteration results;
+        (ResultsDashboard.prototype.toJSON): Converts the iterations results to JSON format.
+
+        (RecordTable.prototype.clear): Clears the results table.
+        (RecordTable.prototype._showTitles): Shows the header titles and appends the sub-titles to a queue.
+        (RecordTable.prototype._showHeader): Shows the table header titles.
+        (RecordTable.prototype._showEmpty): Shows an empty table cell.
+        (RecordTable.prototype._showValue): Shows a number value in the results table.
+        (RecordTable.prototype._showSamples): Shows a button for the sampled data graph.
+        (RecordTable.prototype._showTest): Shows the results of a single test.
+        (RecordTable.prototype._showSuite): Shows the results of a single suite.
+        (RecordTable.prototype.showRecord): Shows a single iteration for a single test.
+        (RecordTable.prototype.showIterations): Shows the results of all the suites of the iterations. 
+        
+        (ResultsTable): RecordTable was renamed to ResultsTable.
+        (ResultsTable.prototype.clear): Clears the table element.
+        (ResultsTable.prototype._showHeaderRow): Shows a row in the results table header.
+        (ResultsTable.prototype._showHeader): Shows the results table header.
+        (ResultsTable.prototype._showEmpty): Shows an empty table cell.
+        (ResultsTable.prototype._showText): Shows a string in a new table cell.
+        (ResultsTable.prototype._showFixedNumber): Shows a number in a new table cell.
+        (ResultsTable.prototype._showGraph): Shows a button for the sampled data graph.
+        (ResultsTable.prototype._showJSON): Shows a button for the sampled data JSON.
+        (ResultsTable.prototype._showTest): Shows the results of a single test.
+        (ResultsTable.prototype._showSuite): Shows the results of a single suite.
+        (ResultsTable.prototype._showIteration): Shows the results of a single iteration.
+        (ResultsTable.prototype.showRecord): Shows a single iteration for a single test.
+        (ResultsTable.prototype.showIterations): Shows all the results.
+        (RecordTable): Deleted.
+        (RecordTable.prototype.clear): Deleted.
+        (RecordTable.prototype._showTitles): Deleted.
+        (RecordTable.prototype._showHeader): Deleted.
+        (RecordTable.prototype._showEmpty): Deleted.
+        (RecordTable.prototype._showValue): Deleted.
+        (RecordTable.prototype._showSamples): Deleted.
+        (RecordTable.prototype._showTest): Deleted.
+        (RecordTable.prototype._showSuite): Deleted.
+        (RecordTable.prototype.showRecord): Deleted.
+        (RecordTable.prototype.showIterations): Deleted.
+        
+        * Animometer/resources/sampler.js:
+        (Sampler.prototype.startSampling): Use forEach.
+        (Sampler.prototype.sample): Use forEach.
+        (Sampler.prototype.toJSON): Converts the sampler data to JSON format.
+        
+        * Animometer/resources/strings.js: Added.
+        This new file will be used to associate the strings used by the benchmark
+        with IDs. A string can be changed in one place without having to change
+        all the instances of this string in multiple files. There two groups of
+        strings in this file. The first one is used by the UI elements and the second
+        group is used when constructing the results JSON.
+        
+        * Animometer/runner/animometer.html:
+        * Animometer/runner/resources/animometer.css:
+        
+        * Animometer/runner/resources/animometer.js:
+        (window.benchmarkRunnerClient.willAddTestFrame):
+        (window.benchmarkRunnerClient.willStartFirstIteration):
+        (window.benchmarkRunnerClient.didRunSuites):
+        (window.benchmarkRunnerClient.didFinishLastIteration):
+        Make benchmarkRunnerClient uses ResultsDashboard instead of _iterationsSamplers
+        Get the JSON from ResultsDashboard.toJSON() and pass it to ResultsTable.showIterations().
+        Also set the textContent of the &quot;#json&quot; textarea with the results JSON.
+        
+        (showResults): Delete unneeded code.
+        (showJson): Shows the &quot;json&quot; section.
+        (showTestGraph): Rename showGraph() to be showTestGraph().
+        (showTestJSON): Shows the JSON of a single testResults.
+        (showGraph): Deleted.
+        
+        * Animometer/runner/resources/tests.js:
+        Use the string table instead of putting literal strings.
+
+        * Animometer/tests/resources/stage.js:
+        (StageBenchmark.prototype.showResults):
+        Fix the parameters which are passed to RecordTable.showRecord().
+        
+        * Animometer/tests/bouncing-particles/bouncing-canvas-images.html:
+        * Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html:
+        * Animometer/tests/bouncing-particles/bouncing-css-images.html:
+        * Animometer/tests/bouncing-particles/bouncing-css-shapes.html:
+        * Animometer/tests/bouncing-particles/bouncing-svg-images.html:
+        * Animometer/tests/bouncing-particles/bouncing-svg-shapes.html:
+        * Animometer/tests/examples/canvas-electrons.html:
+        * Animometer/tests/examples/canvas-stars.html:
+        * Animometer/tests/simple/simple-canvas-paths.html:
+        * Animometer/tests/template/template-canvas.html:
+        * Animometer/tests/template/template-css.html:
+        * Animometer/tests/template/template-svg.html:
+        * Animometer/tests/text/layering-text.html:
+        Include the new strings.js file in all the test files.
+
</ins><span class="cx"> 2015-10-12  Jon Lee  &lt;jonlee@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add canvas line dash test
</span></span></pre>
</div>
</div>

</body>
</html>