<!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>[180365] trunk/Websites/perf.webkit.org</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/180365">180365</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2015-02-19 14:18:17 -0800 (Thu, 19 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Relationship between A/B testing results are unclear
https://bugs.webkit.org/show_bug.cgi?id=141810

Reviewed by Andreas Kling.

Show a &quot;reference chart&quot; indicating which two points have been tested in each test group pane.

Now the chart shown at the top of an analysis task page is called the &quot;overview pane&quot;, and we use the pane
and the domain used in this chart to show charts in each test group.

Also renamed an array of revisions used in the A/B test results tables from 'revisions' to 'revisionList'.

* public/v2/analysis.js:
(App.TestGroup._fetchTestResults): Renamed from _fetchChartData. Set 'testResults' instead of 'chartData'
since this is the results of A/B testing results, not the data for charts shown next to them.

* public/v2/app.css: Added CSS rules for reference charts.

* public/v2/app.js:
(App.AnalysisTaskController.paneDomain): Set 'overviewPane' and 'overviewDomain' on each test group pane.
(App.TestGroupPane._populate): Updated per 'chartData' to 'testResults' rename.
(App.TestGroupPane._updateReferenceChart): Get the chart data via the overview pane and find points that
identically matches root sets. If one of configuration used a set of revisions for which no measurement
was made in the original chart, don't show the reference chart as that would be misleading / confusing.
(App.TestGroupPane._computeRepositoryList): Updated per 'chartData' to 'testResults' rename.
(App.TestGroupPane._createConfigurationSummary): Ditto. Also renamed 'revisions' to 'revisionList'.
In addition, renamed 'buildNumber' to 'buildLabel' and prefixed it with &quot;Build &quot;.

* public/v2/data.js:
(Measurement.prototype.revisionForRepository): Added.
(Measurement.prototype.commitTimeForRepository): Cleanup.
(TimeSeries.prototype.findPointByRevisions): Added. Finds a point based on a set of revisions.

* public/v2/index.html: Added the reference chart. Streamlined the status label for each build request
by including the build number in the title attribute instead of in the markup.

* public/v2/interactive-chart.js:
(App.InteractiveChartComponent._updateDomain): Fixed a typo introduced as a consequence of <a href="http://trac.webkit.org/projects/webkit/changeset/179913">r179913</a>.
(App.InteractiveChartComponent._computeYAxisDomain): Expand the y-axis to show the highlighted points.
(App.InteractiveChartComponent._highlightedItemsChanged): Adjust the y-axis as needed.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2analysisjs">trunk/Websites/perf.webkit.org/public/v2/analysis.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2appcss">trunk/Websites/perf.webkit.org/public/v2/app.css</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2appjs">trunk/Websites/perf.webkit.org/public/v2/app.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2datajs">trunk/Websites/perf.webkit.org/public/v2/data.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2indexhtml">trunk/Websites/perf.webkit.org/public/v2/index.html</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2interactivechartjs">trunk/Websites/perf.webkit.org/public/v2/interactive-chart.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebsitesperfwebkitorgChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/ChangeLog (180364 => 180365)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2015-02-19 21:42:21 UTC (rev 180364)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2015-02-19 22:18:17 UTC (rev 180365)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2015-02-19  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        Relationship between A/B testing results are unclear
+        https://bugs.webkit.org/show_bug.cgi?id=141810
+
+        Reviewed by Andreas Kling.
+
+        Show a &quot;reference chart&quot; indicating which two points have been tested in each test group pane.
+
+        Now the chart shown at the top of an analysis task page is called the &quot;overview pane&quot;, and we use the pane
+        and the domain used in this chart to show charts in each test group.
+
+        Also renamed an array of revisions used in the A/B test results tables from 'revisions' to 'revisionList'.
+
+        * public/v2/analysis.js:
+        (App.TestGroup._fetchTestResults): Renamed from _fetchChartData. Set 'testResults' instead of 'chartData'
+        since this is the results of A/B testing results, not the data for charts shown next to them.
+
+        * public/v2/app.css: Added CSS rules for reference charts.
+
+        * public/v2/app.js:
+        (App.AnalysisTaskController.paneDomain): Set 'overviewPane' and 'overviewDomain' on each test group pane.
+        (App.TestGroupPane._populate): Updated per 'chartData' to 'testResults' rename.
+        (App.TestGroupPane._updateReferenceChart): Get the chart data via the overview pane and find points that
+        identically matches root sets. If one of configuration used a set of revisions for which no measurement
+        was made in the original chart, don't show the reference chart as that would be misleading / confusing.
+        (App.TestGroupPane._computeRepositoryList): Updated per 'chartData' to 'testResults' rename.
+        (App.TestGroupPane._createConfigurationSummary): Ditto. Also renamed 'revisions' to 'revisionList'.
+        In addition, renamed 'buildNumber' to 'buildLabel' and prefixed it with &quot;Build &quot;.
+
+        * public/v2/data.js:
+        (Measurement.prototype.revisionForRepository): Added.
+        (Measurement.prototype.commitTimeForRepository): Cleanup.
+        (TimeSeries.prototype.findPointByRevisions): Added. Finds a point based on a set of revisions.
+
+        * public/v2/index.html: Added the reference chart. Streamlined the status label for each build request
+        by including the build number in the title attribute instead of in the markup.
+
+        * public/v2/interactive-chart.js:
+        (App.InteractiveChartComponent._updateDomain): Fixed a typo introduced as a consequence of r179913.
+        (App.InteractiveChartComponent._computeYAxisDomain): Expand the y-axis to show the highlighted points.
+        (App.InteractiveChartComponent._highlightedItemsChanged): Adjust the y-axis as needed.
+
</ins><span class="cx"> 2015-02-18  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Analysis task pages are unusable
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2analysisjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/analysis.js (180364 => 180365)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/analysis.js        2015-02-19 21:42:21 UTC (rev 180364)
+++ trunk/Websites/perf.webkit.org/public/v2/analysis.js        2015-02-19 22:18:17 UTC (rev 180365)
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx">     createdAt: DS.attr('date'),
</span><span class="cx">     buildRequests: DS.hasMany('buildRequests'),
</span><span class="cx">     rootSets: DS.hasMany('rootSets'),
</span><del>-    _fetchChartData: function ()
</del><ins>+    _fetchTestResults: function ()
</ins><span class="cx">     {
</span><span class="cx">         var task = this.get('task');
</span><span class="cx">         if (!task)
</span><span class="lines">@@ -95,7 +95,7 @@
</span><span class="cx">         var self = this;
</span><span class="cx">         return App.Manifest.fetchRunsWithPlatformAndMetric(this.store,
</span><span class="cx">             task.get('platform').get('id'), task.get('metric').get('id'), this.get('id')).then(
</span><del>-            function (result) { self.set('chartData', result.data); },
</del><ins>+            function (result) { self.set('testResults', result.data); },
</ins><span class="cx">             function (error) {
</span><span class="cx">                 // FIXME: Somehow this never gets called.
</span><span class="cx">                 alert('Failed to fetch the results:' + error);
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2appcss"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/app.css (180364 => 180365)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/app.css        2015-02-19 21:42:21 UTC (rev 180364)
+++ trunk/Websites/perf.webkit.org/public/v2/app.css        2015-02-19 22:18:17 UTC (rev 180365)
</span><span class="lines">@@ -472,6 +472,29 @@
</span><span class="cx">     display: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+.analysis-group {
+    display: block;
+    position: relative;
+    min-height: 6.5rem;
+}
+
+.analysis-group .results {
+    margin-right: 20rem;
+}
+
+.analysis-group .reference-chart {
+    position: absolute;
+    top: 1.2rem;
+    right: -0.7rem;
+    width: 19rem;
+    height: 5rem;
+}
+
+.analysis-group .reference-chart .chart {
+    width: 100%;
+    height: 100%;
+}
+
</ins><span class="cx"> .box-plot {
</span><span class="cx">     display: inline-block;
</span><span class="cx">     width: 100px;
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2appjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/app.js (180364 => 180365)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/app.js        2015-02-19 21:42:21 UTC (rev 180364)
+++ trunk/Websites/perf.webkit.org/public/v2/app.js        2015-02-19 22:18:17 UTC (rev 180365)
</span><span class="lines">@@ -1048,8 +1048,16 @@
</span><span class="cx">         this.set('highlightedItems', highlightedItems);
</span><span class="cx">         this.set('analysisPoints', formatedPoints);
</span><span class="cx"> 
</span><del>-        return [start.time - margin, +end.time + margin];
-    }.property('pane.chartData', 'model', 'model'),
</del><ins>+        var paneDomain = [start.time - margin, +end.time + margin];
+
+        var testGroupPanes = this.get('testGroupPanes');
+        if (testGroupPanes) {
+            testGroupPanes.setEach('overviewPane', pane);
+            testGroupPanes.setEach('overviewDomain', paneDomain);
+        }
+
+        return paneDomain;
+    }.property('pane.chartData'),
</ins><span class="cx">     testSets: function ()
</span><span class="cx">     {
</span><span class="cx">         var analysisPoints = this.get('analysisPoints');
</span><span class="lines">@@ -1166,8 +1174,8 @@
</span><span class="cx">     _populate: function ()
</span><span class="cx">     {
</span><span class="cx">         var buildRequests = this.get('buildRequests');
</span><del>-        var chartData = this.get('chartData');
-        if (!buildRequests || !chartData)
</del><ins>+        var testResults = this.get('testResults');
+        if (!buildRequests || !testResults)
</ins><span class="cx">             return [];
</span><span class="cx"> 
</span><span class="cx">         var repositories = this._computeRepositoryList();
</span><span class="lines">@@ -1188,7 +1196,41 @@
</span><span class="cx">         range.min -= margin;
</span><span class="cx"> 
</span><span class="cx">         this.set('configurations', configurations);
</span><del>-    }.observes('chartData', 'buildRequests'),
</del><ins>+    }.observes('testResults', 'buildRequests'),
+    _updateReferenceChart: function ()
+    {
+        var configurations = this.get('configurations');
+        var chartData = this.get('overviewPane') ? this.get('overviewPane').get('chartData') : null;
+        if (!configurations || !chartData || this.get('referenceChart'))
+            return;
+
+        var currentTimeSeries = chartData.current;
+        if (!currentTimeSeries)
+            return;
+
+        var repositories = this.get('repositories');
+        var highlightedItems = {};
+        var failedToFindPoint = false;
+        configurations.forEach(function (config) {
+            var revisions = {};
+            config.get('rootSet').get('roots').forEach(function (root) {
+                revisions[root.get('repository').get('id')] = root.get('revision');
+            });
+            var point = currentTimeSeries.findPointByRevisions(revisions);
+            if (!point) {
+                failedToFindPoint = true;
+                return;
+            }
+            highlightedItems[point.measurement.id()] = true;
+        });
+        if (failedToFindPoint)
+            return;
+
+        this.set('referenceChart', {
+            data: chartData,
+            highlightedItems: highlightedItems,
+        });
+    }.observes('configurations', 'overviewPane.chartData'),
</ins><span class="cx">     _computeRepositoryList: function ()
</span><span class="cx">     {
</span><span class="cx">         var specifiedRepositories = new Ember.Set();
</span><span class="lines">@@ -1198,9 +1240,9 @@
</span><span class="cx">             });
</span><span class="cx">         });
</span><span class="cx">         var reportedRepositories = new Ember.Set();
</span><del>-        var chartData = this.get('chartData');
</del><ins>+        var testResults = this.get('testResults');
</ins><span class="cx">         (this.get('buildRequests') || []).forEach(function (request) {
</span><del>-            var point = chartData.current.findPointByBuild(request.get('build'));
</del><ins>+            var point = testResults.current.findPointByBuild(request.get('build'));
</ins><span class="cx">             if (!point)
</span><span class="cx">                 return;
</span><span class="cx"> 
</span><span class="lines">@@ -1228,19 +1270,19 @@
</span><span class="cx">     _createConfigurationSummary: function (buildRequests, configLetter, range)
</span><span class="cx">     {
</span><span class="cx">         var repositories = this.get('repositories');
</span><del>-        var chartData = this.get('chartData');
</del><ins>+        var testResults = this.get('testResults');
</ins><span class="cx">         var requests = buildRequests.map(function (originalRequest) {
</span><del>-            var point = chartData.current.findPointByBuild(originalRequest.get('build'));
</del><ins>+            var point = testResults.current.findPointByBuild(originalRequest.get('build'));
</ins><span class="cx">             var revisionByRepositoryId = point ? point.measurement.formattedRevisions() : {};
</span><span class="cx">             return Ember.ObjectProxy.create({
</span><span class="cx">                 content: originalRequest,
</span><del>-                revisions: repositories.map(function (repository, index) {
</del><ins>+                revisionList: repositories.map(function (repository, index) {
</ins><span class="cx">                     return (revisionByRepositoryId[repository.get('id')] || {label:null}).label;
</span><span class="cx">                 }),
</span><span class="cx">                 value: point ? point.value : null,
</span><span class="cx">                 valueRange: range,
</span><del>-                formattedValue: point ? chartData.formatWithUnit(point.value) : null,
-                buildNumber: point ? point.measurement.buildNumber() : null,
</del><ins>+                formattedValue: point ? testResults.formatWithUnit(point.value) : null,
+                buildLabel: point ? 'Build ' + point.measurement.buildNumber() : null,
</ins><span class="cx">             });
</span><span class="cx">         });
</span><span class="cx"> 
</span><span class="lines">@@ -1248,15 +1290,15 @@
</span><span class="cx">         var summaryRevisions = repositories.map(function (repository, index) {
</span><span class="cx">             var revision = rootSet ? rootSet.revisionForRepository(repository) : null;
</span><span class="cx">             if (!revision)
</span><del>-                return requests[0].get('revisions')[index];
</del><ins>+                return requests[0].get('revisionList')[index];
</ins><span class="cx">             return Measurement.formatRevisionRange(revision).label;
</span><span class="cx">         });
</span><span class="cx"> 
</span><span class="cx">         requests.forEach(function (request) {
</span><del>-            var revisions = request.get('revisions');
</del><ins>+            var revisionList = request.get('revisionList');
</ins><span class="cx">             repositories.forEach(function (repository, index) {
</span><del>-                if (revisions[index] == summaryRevisions[index])
-                    revisions[index] = null;
</del><ins>+                if (revisionList[index] == summaryRevisions[index])
+                    revisionList[index] = null;
</ins><span class="cx">             });
</span><span class="cx">         });
</span><span class="cx"> 
</span><span class="lines">@@ -1275,15 +1317,15 @@
</span><span class="cx">         var summary = Ember.Object.create({
</span><span class="cx">             isAverage: true,
</span><span class="cx">             configLetter: configLetter,
</span><del>-            revisions: summaryRevisions,
-            formattedValue: isNaN(mean) ? null : chartData.formatWithDeltaAndUnit(mean, ciDelta),
</del><ins>+            revisionList: summaryRevisions,
+            formattedValue: isNaN(mean) ? null : testResults.formatWithDeltaAndUnit(mean, ciDelta),
</ins><span class="cx">             value: mean,
</span><span class="cx">             confidenceIntervalDelta: ciDelta,
</span><span class="cx">             valueRange: range,
</span><span class="cx">             statusLabel: App.BuildRequest.aggregateStatuses(requests),
</span><span class="cx">         });
</span><span class="cx"> 
</span><del>-        return Ember.Object.create({summary: summary, items: requests});
</del><ins>+        return Ember.Object.create({summary: summary, items: requests, rootSet: rootSet});
</ins><span class="cx">     },
</span><span class="cx"> });
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2datajs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/data.js (180364 => 180365)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/data.js        2015-02-19 21:42:21 UTC (rev 180364)
+++ trunk/Websites/perf.webkit.org/public/v2/data.js        2015-02-19 22:18:17 UTC (rev 180365)
</span><span class="lines">@@ -152,13 +152,18 @@
</span><span class="cx">     this._formattedRevisions = undefined;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Measurement.prototype.revisionForRepository = function (repositoryId)
+{
+    var revisions = this._raw['revisions'];
+    var rawData = revisions[repositoryId];
+    return rawData ? rawData[0] : null;
+}
+
</ins><span class="cx"> Measurement.prototype.commitTimeForRepository = function (repositoryId)
</span><span class="cx"> {
</span><span class="cx">     var revisions = this._raw['revisions'];
</span><span class="cx">     var rawData = revisions[repositoryId];
</span><del>-    if (!rawData)
-        return null;
-    return new Date(rawData[1]);
</del><ins>+    return rawData ? new Date(rawData[1]) : null;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Measurement.prototype.formattedRevisions = function (previousMeasurement)
</span><span class="lines">@@ -368,6 +373,17 @@
</span><span class="cx">     return this._series.find(function (point) { return point.measurement.buildId() == buildId; })
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TimeSeries.prototype.findPointByRevisions = function (revisions)
+{
+    return this._series.find(function (point, index) {
+        for (var repositoryId in revisions) {
+            if (point.measurement.revisionForRepository(repositoryId) != revisions[repositoryId])
+                return false;
+        }
+        return true;
+    });
+}
+
</ins><span class="cx"> TimeSeries.prototype.findPointByMeasurementId = function (measurementId)
</span><span class="cx"> {
</span><span class="cx">     return this._series.find(function (point) { return point.measurement.id() == measurementId; });
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2indexhtml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/index.html (180364 => 180365)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/index.html        2015-02-19 21:42:21 UTC (rev 180364)
+++ trunk/Websites/perf.webkit.org/public/v2/index.html        2015-02-19 22:18:17 UTC (rev 180365)
</span><span class="lines">@@ -591,11 +591,22 @@
</span><span class="cx">                     &lt;/tbody&gt;
</span><span class="cx">                 {{/each}}
</span><span class="cx">             &lt;/table&gt;
</span><ins>+            &lt;div class=&quot;reference-chart&quot;&gt;
+                {{#if referenceChart}}
+                    {{interactive-chart
+                        chartData=referenceChart.data
+                        domain=overviewDomain
+                        chartPointRadius=2
+                        showYAxis=false
+                        enableSelection=false
+                        highlightedItems=referenceChart.highlightedItems}}
+                {{/if}}
+            &lt;/div&gt;
</ins><span class="cx">         &lt;/section&gt;
</span><span class="cx">     &lt;/script&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;script type=&quot;text/x-handlebars&quot; data-template-name=&quot;testGroupRow&quot;&gt;
</span><del>-        {{#each revisions}}
</del><ins>+        {{#each revisionList}}
</ins><span class="cx">             &lt;td&gt;{{this}}&lt;/td&gt;
</span><span class="cx">         {{/each}}
</span><span class="cx">         &lt;td&gt;
</span><span class="lines">@@ -605,11 +616,7 @@
</span><span class="cx">             {{formattedValue}}
</span><span class="cx">         &lt;/td&gt;
</span><span class="cx">         &lt;td&gt;
</span><del>-            {{#if buildNumber}}
-                 {{statusLabel}} / &lt;a {{bind-attr href=url}}&gt;Build {{buildNumber}}&lt;/a&gt;
-            {{else}}
-                &lt;a {{bind-attr href=url}}&gt;{{statusLabel}}&lt;/a&gt;
-            {{/if}}
</del><ins>+            &lt;a {{bind-attr href=url title=buildLabel}}&gt;{{statusLabel}}&lt;/a&gt;
</ins><span class="cx">         &lt;/td&gt;
</span><span class="cx">     &lt;/script&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2interactivechartjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/interactive-chart.js (180364 => 180365)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/interactive-chart.js        2015-02-19 21:42:21 UTC (rev 180364)
+++ trunk/Websites/perf.webkit.org/public/v2/interactive-chart.js        2015-02-19 22:18:17 UTC (rev 180365)
</span><span class="lines">@@ -208,7 +208,7 @@
</span><span class="cx">         var currentYDomain = this._y.domain();
</span><span class="cx">         if (currentXDomain &amp;&amp; App.domainsAreEqual(currentXDomain, xDomain)
</span><span class="cx">             &amp;&amp; currentYDomain &amp;&amp; App.domainsAreEqual(currentYDomain, yDomain))
</span><del>-            return currentDomain;
</del><ins>+            return currentXDomain;
</ins><span class="cx"> 
</span><span class="cx">         this._x.domain(xDomain);
</span><span class="cx">         this._y.domain(yDomain);
</span><span class="lines">@@ -343,6 +343,16 @@
</span><span class="cx">         var range = this._minMaxForAllTimeSeries(startTime, endTime, !shouldShowFullYAxis);
</span><span class="cx">         var min = range[0];
</span><span class="cx">         var max = range[1];
</span><ins>+
+        var highlightedItems = this.get('highlightedItems');
+        if (highlightedItems) {
+            var data = this._currentTimeSeriesData
+                .filter(function (point) { return startTime &lt;= point.time &amp;&amp; point.time &lt;= endTime &amp;&amp; highlightedItems[point.measurement.id()]; })
+                .map(function (point) { return point.value });
+            min = Math.min(min, Statistics.min(data));
+            max = Math.max(max, Statistics.max(data));
+        }
+
</ins><span class="cx">         if (max &lt; min)
</span><span class="cx">             min = max = 0;
</span><span class="cx">         else if (shouldShowFullYAxis)
</span><span class="lines">@@ -615,7 +625,7 @@
</span><span class="cx">                 .attr(&quot;class&quot;, &quot;highlight&quot;)
</span><span class="cx">                 .attr(&quot;r&quot;, (this.get('chartPointRadius') || 1) * 1.8);
</span><span class="cx"> 
</span><del>-        this._updateHighlightPositions();
</del><ins>+        this._domainChanged();
</ins><span class="cx">     }.observes('highlightedItems'),
</span><span class="cx">     _rangesChanged: function ()
</span><span class="cx">     {
</span></span></pre>
</div>
</div>

</body>
</html>