<!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>[196463] 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/196463">196463</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2016-02-11 21:14:32 -0800 (Thu, 11 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Refine v3 UI's analysis task page
https://bugs.webkit.org/show_bug.cgi?id=154152

Reviewed by Chris Dumez.

This patch makes the following refinements to the analysis task page:
 - Always show the relative different of in-progress A/B testing.
 - Make the annotations (colored bars) in the chart open other analysis tasks.
 - Order the A/B testing groups in the reverse chronological order.
 - Select the time range corresponding to the current test group.

* public/v3/components/analysis-results-viewer.js:
(AnalysisResultsViewer.cssTemplate): Fixed the bug that pending and running testing groups are no longer
colored after <a href="http://trac.webkit.org/projects/webkit/changeset/196440">r196440</a>. Use a slightly more opaque color for currently running groups compared to pending ones.

* public/v3/components/chart-pane-base.js:
(ChartPaneBase.prototype.setMainSelection): Added.
(ChartPaneBase.prototype._openAnalysisTask): Moved the code from ChartPane._openAnalysisTask so that it can be
reused in both AnalysisTaskChartPane and ChartPane (in charts page).
(ChartPaneBase.prototype.router): Added. Overridden by each subclass.

* public/v3/components/test-group-results-table.js:
(TestGroupResultsTable.prototype.buildRowGroups): Always show the summary (relative difference of A to B) as
long as there are some results in each set.

* public/v3/models/test-group.js:
(TestGroup.prototype.compareTestResults): Always set .label and .fullLabel with the relative change as long as
there are some values. Keep using &quot;pending&quot; and &quot;running&quot; in .status since that would determine the color of
stacking blocks representing those A/B testing groups. 

* public/v3/pages/analysis-task-page.js:
(AnalysisTaskChartPane):
(AnalysisTaskChartPane.prototype.setPage): Added.
(AnalysisTaskChartPane.prototype.router): Added.
(AnalysisTaskPage):
(AnalysisTaskPage.prototype.render): Show the list of A/B testing groups in the reverse chronological order.
Also set the main chart's selection to the time range of the current test group.

* public/v3/pages/chart-pane.js:
(ChartPane.prototype.router): Added.
(ChartPane.prototype._openAnalysisTask): Moved to ChartPaneBase.prototype._openAnalysisTask.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3componentsanalysisresultsviewerjs">trunk/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3componentschartpanebasejs">trunk/Websites/perf.webkit.org/public/v3/components/chart-pane-base.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3componentstestgroupresultstablejs">trunk/Websites/perf.webkit.org/public/v3/components/test-group-results-table.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3modelstestgroupjs">trunk/Websites/perf.webkit.org/public/v3/models/test-group.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3pagesanalysistaskpagejs">trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3pageschartpanejs">trunk/Websites/perf.webkit.org/public/v3/pages/chart-pane.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 (196462 => 196463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2016-02-12 03:24:49 UTC (rev 196462)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2016-02-12 05:14:32 UTC (rev 196463)
</span><span class="lines">@@ -1,5 +1,49 @@
</span><span class="cx"> 2016-02-11  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Refine v3 UI's analysis task page
+        https://bugs.webkit.org/show_bug.cgi?id=154152
+
+        Reviewed by Chris Dumez.
+
+        This patch makes the following refinements to the analysis task page:
+         - Always show the relative different of in-progress A/B testing.
+         - Make the annotations (colored bars) in the chart open other analysis tasks.
+         - Order the A/B testing groups in the reverse chronological order.
+         - Select the time range corresponding to the current test group.
+
+        * public/v3/components/analysis-results-viewer.js:
+        (AnalysisResultsViewer.cssTemplate): Fixed the bug that pending and running testing groups are no longer
+        colored after r196440. Use a slightly more opaque color for currently running groups compared to pending ones.
+
+        * public/v3/components/chart-pane-base.js:
+        (ChartPaneBase.prototype.setMainSelection): Added.
+        (ChartPaneBase.prototype._openAnalysisTask): Moved the code from ChartPane._openAnalysisTask so that it can be
+        reused in both AnalysisTaskChartPane and ChartPane (in charts page).
+        (ChartPaneBase.prototype.router): Added. Overridden by each subclass.
+
+        * public/v3/components/test-group-results-table.js:
+        (TestGroupResultsTable.prototype.buildRowGroups): Always show the summary (relative difference of A to B) as
+        long as there are some results in each set.
+
+        * public/v3/models/test-group.js:
+        (TestGroup.prototype.compareTestResults): Always set .label and .fullLabel with the relative change as long as
+        there are some values. Keep using &quot;pending&quot; and &quot;running&quot; in .status since that would determine the color of
+        stacking blocks representing those A/B testing groups. 
+
+        * public/v3/pages/analysis-task-page.js:
+        (AnalysisTaskChartPane):
+        (AnalysisTaskChartPane.prototype.setPage): Added.
+        (AnalysisTaskChartPane.prototype.router): Added.
+        (AnalysisTaskPage):
+        (AnalysisTaskPage.prototype.render): Show the list of A/B testing groups in the reverse chronological order.
+        Also set the main chart's selection to the time range of the current test group.
+
+        * public/v3/pages/chart-pane.js:
+        (ChartPane.prototype.router): Added.
+        (ChartPane.prototype._openAnalysisTask): Moved to ChartPaneBase.prototype._openAnalysisTask.
+
+2016-02-11  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         Add a script to process backlogs created while perf dashboard was in the maintenance mode
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=154140
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3componentsanalysisresultsviewerjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js (196462 => 196463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js        2016-02-12 03:24:49 UTC (rev 196462)
+++ trunk/Websites/perf.webkit.org/public/v3/components/analysis-results-viewer.js        2016-02-12 05:14:32 UTC (rev 196463)
</span><span class="lines">@@ -272,7 +272,10 @@
</span><span class="cx">             .analysis-view .stacking-block.unchanged {
</span><span class="cx">                 background: rgba(128, 128, 128, 0.5);
</span><span class="cx">             }
</span><del>-            .analysis-view .stacking-block.incomplete {
</del><ins>+            .analysis-view .stacking-block.pending {
+                background: rgba(204, 204, 51, 0.2);
+            }
+            .analysis-view .stacking-block.running {
</ins><span class="cx">                 background: rgba(204, 204, 51, 0.5);
</span><span class="cx">             }
</span><span class="cx">             .analysis-view .stacking-block.worse {
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3componentschartpanebasejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/components/chart-pane-base.js (196462 => 196463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/components/chart-pane-base.js        2016-02-12 03:24:49 UTC (rev 196462)
+++ trunk/Websites/perf.webkit.org/public/v3/components/chart-pane-base.js        2016-02-12 05:14:32 UTC (rev 196463)
</span><span class="lines">@@ -107,6 +107,12 @@
</span><span class="cx">             this._mainChart.setDomain(startTime, endTime);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    setMainSelection(selection)
+    {
+        if (this._mainChart)
+            this._mainChart.setSelection(selection);
+    }
+
</ins><span class="cx">     _overviewSelectionDidChange(domain, didEndDrag) { }
</span><span class="cx"> 
</span><span class="cx">     _mainSelectionDidChange(selection, didEndDrag)
</span><span class="lines">@@ -133,9 +139,15 @@
</span><span class="cx">         this.render();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _openAnalysisTask()
-    { }
</del><ins>+    _openAnalysisTask(annotation)
+    {
+        var router = this.router();
+        console.assert(router);
+        window.open(router.url(`analysis/task/${annotation.task.id()}`), '_blank');
+    }
</ins><span class="cx"> 
</span><ins>+    router() { return null; }
+
</ins><span class="cx">     _openCommitViewer(repository, from, to)
</span><span class="cx">     {
</span><span class="cx">         this._mainChartStatus.setCurrentRepository(repository);
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3componentstestgroupresultstablejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/components/test-group-results-table.js (196462 => 196463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/components/test-group-results-table.js        2016-02-12 03:24:49 UTC (rev 196462)
+++ trunk/Websites/perf.webkit.org/public/v3/components/test-group-results-table.js        2016-02-12 05:14:32 UTC (rev 196463)
</span><span class="lines">@@ -61,7 +61,7 @@
</span><span class="cx">                 var endConfig = testGroup.labelForRootSet(rootSets[j]);
</span><span class="cx"> 
</span><span class="cx">                 var result = this._testGroup.compareTestResults(rootSets[i], rootSets[j]);
</span><del>-                if (result.status == 'pending' || result.status == 'running' || result.status == 'failed')
</del><ins>+                if (result.changeType == null)
</ins><span class="cx">                     continue;
</span><span class="cx"> 
</span><span class="cx">                 var row = new ResultsTableRow(`${startConfig} to ${endConfig}`, null);
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3modelstestgroupjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/models/test-group.js (196462 => 196463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/models/test-group.js        2016-02-12 03:24:49 UTC (rev 196462)
+++ trunk/Websites/perf.webkit.org/public/v3/models/test-group.js        2016-02-12 05:14:32 UTC (rev 196463)
</span><span class="lines">@@ -107,30 +107,37 @@
</span><span class="cx">         console.assert(metric);
</span><span class="cx"> 
</span><span class="cx">         var result = {changeType: null, status: 'failed', label: 'Failed', fullLabel: 'Failed', isStatisticallySignificant: false};
</span><del>-        if (beforeValues.length &amp;&amp; afterValues.length) {
-            var diff = afterMean - beforeMean;
-            var smallerIsBetter = metric.isSmallerBetter();
-            result.changeType = diff &lt; 0 == smallerIsBetter ? 'better' : 'worse';
-            result.label = Math.abs(diff / beforeMean * 100).toFixed(2) + '% ' + result.changeType;
-            result.isStatisticallySignificant = Statistics.testWelchsT(beforeValues, afterValues);
-            result.status = result.isStatisticallySignificant ? result.changeType : 'unchanged';
-        }
</del><span class="cx"> 
</span><del>-        if (!this.hasCompleted()) {
</del><ins>+        var hasCompleted = this.hasCompleted();
+        if (!hasCompleted) {
</ins><span class="cx">             if (this.hasStarted()) {
</span><span class="cx">                 result.status = 'running';
</span><span class="cx">                 result.label = 'Running';
</span><span class="cx">                 result.fullLabel = 'Running';
</span><span class="cx">             } else {
</span><ins>+                console.assert(result.changeType === null);
</ins><span class="cx">                 result.status = 'pending';
</span><span class="cx">                 result.label = 'Pending';
</span><span class="cx">                 result.fullLabel = 'Pending';
</span><span class="cx">             }
</span><del>-        } else if (result.changeType) {
-            var significance = result.isStatisticallySignificant ? 'significant' : 'insignificant';
-            result.fullLabel = `${result.label} (statistically ${significance})`;
</del><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (beforeValues.length &amp;&amp; afterValues.length) {
+            var diff = afterMean - beforeMean;
+            var smallerIsBetter = metric.isSmallerBetter();
+            var changeType = diff &lt; 0 == smallerIsBetter ? 'better' : 'worse';
+            var changeLabel = Math.abs(diff / beforeMean * 100).toFixed(2) + '% ' + changeType;
+            var isSignificant = Statistics.testWelchsT(beforeValues, afterValues);
+            var significanceLabel = isSignificant ? 'significant' : 'insignificant';
+
+            result.changeType = changeType;
+            result.label = changeLabel;
+            if (hasCompleted)
+                result.status = isSignificant ? result.changeType : 'unchanged';
+            result.fullLabel = `${result.label} (statistically ${significanceLabel})`;
+            result.isStatisticallySignificant = isSignificant;
+        }
+
</ins><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3pagesanalysistaskpagejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js (196462 => 196463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js        2016-02-12 03:24:49 UTC (rev 196462)
+++ trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js        2016-02-12 05:14:32 UTC (rev 196463)
</span><span class="lines">@@ -1,6 +1,13 @@
</span><span class="cx"> 
</span><span class="cx"> class AnalysisTaskChartPane extends ChartPaneBase {
</span><del>-    constructor() { super('analysis-task-chart-pane'); }
</del><ins>+    constructor()
+    {
+        super('analysis-task-chart-pane');
+        this._page = null;
+    }
+
+    setPage(page) { this._page = page; }
+    router() { return this._page.router(); }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ComponentBase.defineElement('analysis-task-chart-pane', AnalysisTaskChartPane);
</span><span class="lines">@@ -21,6 +28,7 @@
</span><span class="cx">         this._errorMessage = null;
</span><span class="cx">         this._currentTestGroup = null;
</span><span class="cx">         this._chartPane = this.content().querySelector('analysis-task-chart-pane').component();
</span><ins>+        this._chartPane.setPage(this);
</ins><span class="cx">         this._analysisResultsViewer = this.content().querySelector('analysis-results-viewer').component();
</span><span class="cx">         this._analysisResultsViewer.setTestGroupCallback(this._showTestGroup.bind(this));
</span><span class="cx">         this._testGroupResultsTable = this.content().querySelector('test-group-results-table').component();
</span><span class="lines">@@ -166,7 +174,7 @@
</span><span class="cx">                     return element('li', {class: 'test-group-list-' + group.id()}, link(group.label(), function () {
</span><span class="cx">                         self._showTestGroup(group);
</span><span class="cx">                     }));
</span><del>-                }));
</del><ins>+                }).reverse());
</ins><span class="cx">             this._renderedCurrentTestGroup = null;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -182,6 +190,15 @@
</span><span class="cx">                     element.classList.add('selected');
</span><span class="cx">             }
</span><span class="cx"> 
</span><ins>+            this._chartPane.setMainSelection(null);
+            if (this._currentTestGroup) {
+                var rootSetsInTestGroup = this._currentTestGroup.requestedRootSets();
+                var startTime = rootSetsInTestGroup[0].latestCommitTime();
+                var endTime = rootSetsInTestGroup[rootSetsInTestGroup.length - 1].latestCommitTime();
+                if (startTime != endTime)
+                    this._chartPane.setMainSelection([startTime, endTime]);
+            }
+
</ins><span class="cx">             this.content().querySelector('.test-group-retry-button').textContent = this._currentTestGroup ? 'Retry' : 'Confirm the change';
</span><span class="cx"> 
</span><span class="cx">             var repetitionCount = this._currentTestGroup ? this._currentTestGroup.repetitionCount() : 4;
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3pageschartpanejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/pages/chart-pane.js (196462 => 196463)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/pages/chart-pane.js        2016-02-12 03:24:49 UTC (rev 196462)
+++ trunk/Websites/perf.webkit.org/public/v3/pages/chart-pane.js        2016-02-12 05:14:32 UTC (rev 196463)
</span><span class="lines">@@ -63,10 +63,7 @@
</span><span class="cx">         this._chartsPage.setMainDomainFromZoom(selection, this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _openAnalysisTask(annotation)
-    {
-        window.open(this._chartsPage.router().url(`analysis/task/${annotation.task.id()}`), '_blank');
-    }
</del><ins>+    router() { return this._chartsPage.router(); }
</ins><span class="cx"> 
</span><span class="cx">     _indicatorDidChange(indicatorID, isLocked)
</span><span class="cx">     {
</span></span></pre>
</div>
</div>

</body>
</html>