<!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>[176710] 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/176710">176710</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2014-12-02 20:17:32 -0800 (Tue, 02 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>New perf dashboard's chart UI is buggy
https://bugs.webkit.org/show_bug.cgi?id=139214

Reviewed by Chris Dumez.

The bugginess was caused by weird interactions between charts and panes. Rewrote the code to fix it.

Superfluous selectionChanged and domainChanged &quot;event&quot; actions were removed from the interactive chart
component. This is not how Ember.js components should interact to begin with. The component now exposes
selectedPoints and always updates selection instead of sharedSelection.

* public/v2/app.js:
(App.ChartsController.present): Added. We can't call Date.now() in various points in our code as that
would lead to infinite mutual recursions since X-axis domain values wouldn't match up.
(App.ChartsController.updateSharedDomain): This function was completely useless. The overview's start
and end time should be completely determined by &quot;since&quot; and the present time.
(App.ChartsController._startTimeChanged): Ditto.
(App.ChartsController._scheduleQueryStringUpdate):
(App.ChartsController._updateQueryString): Set &quot;zoom&quot; only if it's different from the shared domain.

(App.domainsAreEqual): Moved from InteractiveChartComponent._xDomainsAreSame.

(App.PaneController.actions.createAnalysisTask): Use selectedPoints property set by the chart.
(App.PaneController.actions.overviewDomainChanged): Removed; only needed to call updateSharedDomain.
(App.PaneController.actions.rangeChanged): Removed. _showDetails (renamed to _updateDetails) directly
observes the changes to selectedPoints property as it gets updated by the main chart.
(App.PaneController._overviewSelectionChanged): This was previously a dead code. Now it's used again
with a bug fix. When the overview selection is cleared, we use the same domain in the main chart and
the overview chart.
(App.PaneController._sharedDomainChanged): Fixed a but that it erroneously updates the overview domain
when domain arrays aren't identical. This was causing a subtle race with other logic.
(App.PaneController._sharedZoomChanged): Ditto. Also don't set mainPlotDomain here as any changes to
overviewSelection will automatically propagate to the main plot's domain as they're aliased.
(App.PaneController._currentItemChanged): Merged into _updateDetails (renamed from _showDetails).
(App.PaneController._updateDetails): Previously, this function took points and inspected _hasRange to
see if those two points correspond to a range or a single data point. Rewrote all that logic by
directly observing selectedPoints and currentItem properties instead of taking points and relying on
an instance variable, which was a terrible API.
(App.PaneController._updateCanAnalyze): Use selectedPoints property. Since this property is only set
when the main plot has a selected range, we don't have to check this._hasRange anymore.

(App.InteractiveChartComponent._updateDomain): No longer sends domainChanged &quot;event&quot; action.
(App.InteractiveChartComponent._sharedSelectionChanged): Removed. This is a dead code.
(App.InteractiveChartComponent._updateSelection):
(App.InteractiveChartComponent._xDomainsAreSame): Moved to App.domainsAreEqual.
(App.InteractiveChartComponent._setCurrentSelection): Update the selection only if needed. Also set
selectedPoints property.

(App.AnalysisTaskController._fetchedRuns):
(App.AnalysisTaskController._rootChangedForTestSet):

* public/v2/index.html:
Removed non-functional sharedSelection and superfluous selectionChanged and domainChanged actions.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2appjs">trunk/Websites/perf.webkit.org/public/v2/app.js</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv2indexhtml">trunk/Websites/perf.webkit.org/public/v2/index.html</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 (176709 => 176710)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2014-12-03 04:14:49 UTC (rev 176709)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2014-12-03 04:17:32 UTC (rev 176710)
</span><span class="lines">@@ -1,3 +1,59 @@
</span><ins>+2014-12-02  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        New perf dashboard's chart UI is buggy
+        https://bugs.webkit.org/show_bug.cgi?id=139214
+
+        Reviewed by Chris Dumez.
+
+        The bugginess was caused by weird interactions between charts and panes. Rewrote the code to fix it.
+
+        Superfluous selectionChanged and domainChanged &quot;event&quot; actions were removed from the interactive chart
+        component. This is not how Ember.js components should interact to begin with. The component now exposes
+        selectedPoints and always updates selection instead of sharedSelection.
+
+        * public/v2/app.js:
+        (App.ChartsController.present): Added. We can't call Date.now() in various points in our code as that
+        would lead to infinite mutual recursions since X-axis domain values wouldn't match up.
+        (App.ChartsController.updateSharedDomain): This function was completely useless. The overview's start
+        and end time should be completely determined by &quot;since&quot; and the present time.
+        (App.ChartsController._startTimeChanged): Ditto.
+        (App.ChartsController._scheduleQueryStringUpdate):
+        (App.ChartsController._updateQueryString): Set &quot;zoom&quot; only if it's different from the shared domain.
+
+        (App.domainsAreEqual): Moved from InteractiveChartComponent._xDomainsAreSame.
+
+        (App.PaneController.actions.createAnalysisTask): Use selectedPoints property set by the chart.
+        (App.PaneController.actions.overviewDomainChanged): Removed; only needed to call updateSharedDomain.
+        (App.PaneController.actions.rangeChanged): Removed. _showDetails (renamed to _updateDetails) directly
+        observes the changes to selectedPoints property as it gets updated by the main chart.
+        (App.PaneController._overviewSelectionChanged): This was previously a dead code. Now it's used again
+        with a bug fix. When the overview selection is cleared, we use the same domain in the main chart and
+        the overview chart.
+        (App.PaneController._sharedDomainChanged): Fixed a but that it erroneously updates the overview domain
+        when domain arrays aren't identical. This was causing a subtle race with other logic.
+        (App.PaneController._sharedZoomChanged): Ditto. Also don't set mainPlotDomain here as any changes to
+        overviewSelection will automatically propagate to the main plot's domain as they're aliased.
+        (App.PaneController._currentItemChanged): Merged into _updateDetails (renamed from _showDetails).
+        (App.PaneController._updateDetails): Previously, this function took points and inspected _hasRange to
+        see if those two points correspond to a range or a single data point. Rewrote all that logic by
+        directly observing selectedPoints and currentItem properties instead of taking points and relying on
+        an instance variable, which was a terrible API.
+        (App.PaneController._updateCanAnalyze): Use selectedPoints property. Since this property is only set
+        when the main plot has a selected range, we don't have to check this._hasRange anymore.
+
+        (App.InteractiveChartComponent._updateDomain): No longer sends domainChanged &quot;event&quot; action.
+        (App.InteractiveChartComponent._sharedSelectionChanged): Removed. This is a dead code.
+        (App.InteractiveChartComponent._updateSelection):
+        (App.InteractiveChartComponent._xDomainsAreSame): Moved to App.domainsAreEqual.
+        (App.InteractiveChartComponent._setCurrentSelection): Update the selection only if needed. Also set
+        selectedPoints property.
+
+        (App.AnalysisTaskController._fetchedRuns):
+        (App.AnalysisTaskController._rootChangedForTestSet):
+
+        * public/v2/index.html:
+        Removed non-functional sharedSelection and superfluous selectionChanged and domainChanged actions.
+
</ins><span class="cx"> 2014-11-21  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed. Fixed syntax errors.
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2appjs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/app.js (176709 => 176710)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/app.js        2014-12-03 04:14:49 UTC (rev 176709)
+++ trunk/Websites/perf.webkit.org/public/v2/app.js        2014-12-03 04:17:32 UTC (rev 176710)
</span><span class="lines">@@ -399,6 +399,7 @@
</span><span class="cx">     platforms: null,
</span><span class="cx">     sharedZoom: null,
</span><span class="cx">     startTime: null,
</span><ins>+    present: Date.now(),
</ins><span class="cx">     defaultSince: Date.now() - 7 * 24 * 3600 * 1000,
</span><span class="cx"> 
</span><span class="cx">     addPane: function (pane)
</span><span class="lines">@@ -450,35 +451,8 @@
</span><span class="cx"> 
</span><span class="cx">     }.observes('zoom').on('init'),
</span><span class="cx"> 
</span><del>-    updateSharedDomain: function ()
-    {
-        var panes = this.get('panes');
-        if (!panes.length)
-            return;
-
-        var union = [undefined, undefined];
-        for (var i = 0; i &lt; panes.length; i++) {
-            var domain = panes[i].intrinsicDomain;
-            if (!domain)
-                continue;
-            if (!union[0] || domain[0] &lt; union[0])
-                union[0] = domain[0];
-            if (!union[1] || domain[1] &gt; union[1])
-                union[1] = domain[1];
-        }
-        if (union[0] === undefined)
-            return;
-
-        var startTime = this.get('startTime');
-        var zoom = this.get('sharedZoom');
-        if (startTime)
-            union[0] = zoom ? Math.min(zoom[0], startTime) : startTime;
-
-        this.set('sharedDomain', union);
-    }.observes('panes.@each'),
-
</del><span class="cx">     _startTimeChanged: function () {
</span><del>-        this.updateSharedDomain();
</del><ins>+        this.set('sharedDomain', [this.get('startTime'), this.get('present')]);
</ins><span class="cx">         this._scheduleQueryStringUpdate();
</span><span class="cx">     }.observes('startTime'),
</span><span class="cx"> 
</span><span class="lines">@@ -536,9 +510,8 @@
</span><span class="cx"> 
</span><span class="cx">     _scheduleQueryStringUpdate: function ()
</span><span class="cx">     {
</span><del>-        Ember.run.debounce(this, '_updateQueryString', 500);
-    }.observes('sharedZoom')
-        .observes('panes.@each.platform', 'panes.@each.metric', 'panes.@each.selectedItem',
</del><ins>+        Ember.run.debounce(this, '_updateQueryString', 1000);
+    }.observes('sharedZoom', 'panes.@each.platform', 'panes.@each.metric', 'panes.@each.selectedItem',
</ins><span class="cx">         'panes.@each.timeRange', 'panes.@each.timeRangeIsLocked'),
</span><span class="cx"> 
</span><span class="cx">     _updateQueryString: function ()
</span><span class="lines">@@ -547,9 +520,9 @@
</span><span class="cx">         this.set('paneList', this._currentEncodedPaneList);
</span><span class="cx"> 
</span><span class="cx">         var zoom = undefined;
</span><del>-        var selection = this.get('sharedZoom');
-        if (selection)
-            zoom = (selection[0] - 0) + '-' + (selection[1] - 0);
</del><ins>+        var sharedZoom = this.get('sharedZoom');
+        if (sharedZoom &amp;&amp; !App.domainsAreEqual(sharedZoom, this.get('sharedDomain')))
+            zoom = +sharedZoom[0] + '-' + +sharedZoom[1];
</ins><span class="cx">         this.set('zoom', zoom);
</span><span class="cx"> 
</span><span class="cx">         if (this.get('startTime') - this.defaultSince)
</span><span class="lines">@@ -635,6 +608,10 @@
</span><span class="cx">     }.property('childTests', 'metrics'),
</span><span class="cx"> });
</span><span class="cx"> 
</span><ins>+App.domainsAreEqual = function (domain1, domain2) {
+    return (!domain1 &amp;&amp; !domain2) || (domain1 &amp;&amp; domain2 &amp;&amp; !(domain1[0] - domain2[0]) &amp;&amp; !(domain1[1] - domain2[1]));
+}
+
</ins><span class="cx"> App.PaneController = Ember.ObjectController.extend({
</span><span class="cx">     needs: ['charts'],
</span><span class="cx">     sharedTime: Ember.computed.alias('parentController.sharedTime'),
</span><span class="lines">@@ -657,7 +634,7 @@
</span><span class="cx">         createAnalysisTask: function ()
</span><span class="cx">         {
</span><span class="cx">             var name = this.get('newAnalysisTaskName');
</span><del>-            var points = this._selectedPoints;
</del><ins>+            var points = this.get('selectedPoints');
</ins><span class="cx">             Ember.assert('The analysis name should not be empty', name);
</span><span class="cx">             Ember.assert('There should be at least two points in the range', points &amp;&amp; points.length &gt;= 2);
</span><span class="cx"> 
</span><span class="lines">@@ -695,24 +672,6 @@
</span><span class="cx">             this.set('mainPlotDomain', selection ? selection : this.get('overviewDomain'));
</span><span class="cx">             Ember.run.debounce(this, 'propagateZoom', 100);
</span><span class="cx">         },
</span><del>-        overviewDomainChanged: function (domain, intrinsicDomain)
-        {
-            this.set('overviewDomain', domain);
-            this.set('intrinsicDomain', intrinsicDomain);
-            this.get('parentController').updateSharedDomain();
-        },
-        rangeChanged: function (extent, points)
-        {
-            if (!points) {
-                this._hasRange = false;
-                this.set('details', null);
-                this.set('timeRange', null);
-                return;
-            }
-            this._hasRange = true;
-            this._showDetails(points);
-            this.set('timeRange', extent);
-        },
</del><span class="cx">     },
</span><span class="cx">     _detailsChanged: function ()
</span><span class="cx">     {
</span><span class="lines">@@ -721,13 +680,13 @@
</span><span class="cx">     _overviewSelectionChanged: function ()
</span><span class="cx">     {
</span><span class="cx">         var overviewSelection = this.get('overviewSelection');
</span><del>-        this.set('mainPlotDomain', overviewSelection);
</del><ins>+        this.set('mainPlotDomain', overviewSelection || this.get('overviewDomain'));
</ins><span class="cx">         Ember.run.debounce(this, 'propagateZoom', 100);
</span><span class="cx">     }.observes('overviewSelection'),
</span><span class="cx">     _sharedDomainChanged: function ()
</span><span class="cx">     {
</span><span class="cx">         var newDomain = this.get('parentController').get('sharedDomain');
</span><del>-        if (newDomain == this.get('overviewDomain'))
</del><ins>+        if (App.domainsAreEqual(newDomain, this.get('overviewDomain')))
</ins><span class="cx">             return;
</span><span class="cx">         this.set('overviewDomain', newDomain);
</span><span class="cx">         if (!this.get('overviewSelection'))
</span><span class="lines">@@ -740,28 +699,30 @@
</span><span class="cx">     _sharedZoomChanged: function ()
</span><span class="cx">     {
</span><span class="cx">         var newSelection = this.get('parentController').get('sharedZoom');
</span><del>-        if (newSelection == this.get('mainPlotDomain'))
</del><ins>+        if (App.domainsAreEqual(newSelection, this.get('mainPlotDomain')))
</ins><span class="cx">             return;
</span><span class="cx">         this.set('overviewSelection', newSelection);
</span><del>-        this.set('mainPlotDomain', newSelection);
</del><span class="cx">     }.observes('parentController.sharedZoom').on('init'),
</span><del>-    _currentItemChanged: function ()
</del><ins>+    _updateDetails: function ()
</ins><span class="cx">     {
</span><del>-        if (this._hasRange)
-            return;
-        var point = this.get('currentItem');
-        if (!point || !point.measurement)
</del><ins>+        var selectedPoints = this.get('selectedPoints');
+        var currentPoint = this.get('currentItem');
+        if (!selectedPoints &amp;&amp; !currentPoint) {
</ins><span class="cx">             this.set('details', null);
</span><del>-        else {
-            var previousPoint = point.series.previousPoint(point);
-            this._showDetails(previousPoint ? [previousPoint, point] : [point]);
</del><ins>+            return;
</ins><span class="cx">         }
</span><del>-    }.observes('currentItem'),
-    _showDetails: function (points)
-    {
-        var isShowingEndPoint = !this._hasRange;
-        var currentMeasurement = points[points.length - 1].measurement;
-        var oldMeasurement = points[0].measurement;
</del><ins>+
+        var currentMeasurement;
+        var oldMeasurement;
+        if (currentPoint) {
+            currentMeasurement = currentPoint.measurement;
+            var previousPoint = currentPoint.series.previousPoint(currentPoint);
+            oldMeasurement = previousPoint ? previousPoint.measurement : null;
+        } else {
+            currentMeasurement = selectedPoints[selectedPoints.length - 1].measurement;
+            oldMeasurement = selectedPoints[0].measurement;            
+        }
+
</ins><span class="cx">         var formattedRevisions = currentMeasurement.formattedRevisions(oldMeasurement);
</span><span class="cx">         var revisions = App.Manifest.get('repositories')
</span><span class="cx">             .filter(function (repository) { return formattedRevisions[repository.get('id')]; })
</span><span class="lines">@@ -778,28 +739,27 @@
</span><span class="cx"> 
</span><span class="cx">         var buildNumber = null;
</span><span class="cx">         var buildURL = null;
</span><del>-        if (isShowingEndPoint) {
</del><ins>+        if (currentPoint) {
</ins><span class="cx">             buildNumber = currentMeasurement.buildNumber();
</span><span class="cx">             var builder = App.Manifest.builder(currentMeasurement.builderId());
</span><span class="cx">             if (builder)
</span><span class="cx">                 buildURL = builder.urlFromBuildNumber(buildNumber);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        this._selectedPoints = points;
</del><span class="cx">         this.set('details', Ember.Object.create({
</span><span class="cx">             currentValue: currentMeasurement.mean().toFixed(2),
</span><del>-            oldValue: oldMeasurement &amp;&amp; !isShowingEndPoint ? oldMeasurement.mean().toFixed(2) : null,
</del><ins>+            oldValue: oldMeasurement &amp;&amp; selectedPoints ? oldMeasurement.mean().toFixed(2) : null,
</ins><span class="cx">             buildNumber: buildNumber,
</span><span class="cx">             buildURL: buildURL,
</span><span class="cx">             buildTime: currentMeasurement.formattedBuildTime(),
</span><span class="cx">             revisions: revisions,
</span><span class="cx">         }));
</span><span class="cx">         this._updateCanAnalyze();
</span><del>-    },
</del><ins>+    }.observes('currentItem', 'selectedPoints'),
</ins><span class="cx">     _updateCanAnalyze: function ()
</span><span class="cx">     {
</span><del>-        var points = this._selectedPoints;
-        this.set('cannotAnalyze', !this.get('newAnalysisTaskName') || !this._hasRange || !points || points.length &lt; 2);
</del><ins>+        var points = this.get('selectedPoints');
+        this.set('cannotAnalyze', !this.get('newAnalysisTaskName') || !points || points.length &lt; 2);
</ins><span class="cx">     }.observes('newAnalysisTaskName'),
</span><span class="cx"> });
</span><span class="cx"> 
</span><span class="lines">@@ -994,13 +954,12 @@
</span><span class="cx">         if (!xDomain)
</span><span class="cx">             xDomain = intrinsicXDomain;
</span><span class="cx">         var currentDomain = this._x.domain();
</span><del>-        if (currentDomain &amp;&amp; this._xDomainsAreSame(currentDomain, xDomain))
</del><ins>+        if (currentDomain &amp;&amp; App.domainsAreEqual(currentDomain, xDomain))
</ins><span class="cx">             return currentDomain;
</span><span class="cx"> 
</span><span class="cx">         var yDomain = this._computeYAxisDomain(xDomain[0], xDomain[1]);
</span><span class="cx">         this._x.domain(xDomain);
</span><span class="cx">         this._y.domain(yDomain);
</span><del>-        this.sendAction('domainChanged', xDomain, intrinsicXDomain);
</del><span class="cx">         return xDomain;
</span><span class="cx">     },
</span><span class="cx">     _updateDimensionsIfNeeded: function (newSelection)
</span><span class="lines">@@ -1180,23 +1139,17 @@
</span><span class="cx">     {
</span><span class="cx">         this._updateSelection(this.get('selection'));
</span><span class="cx">     }.observes('selection'),
</span><del>-    _sharedSelectionChanged: function ()
-    {
-        if (this.get('selectionIsLocked'))
-            return;
-        this._updateSelection(this.get('sharedSelection'));
-    }.observes('sharedSelection'),
</del><span class="cx">     _updateSelection: function (newSelection)
</span><span class="cx">     {
</span><span class="cx">         if (!this._brush)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         var currentSelection = this._currentSelection();
</span><del>-        if (newSelection &amp;&amp; currentSelection &amp;&amp; this._xDomainsAreSame(newSelection, currentSelection))
</del><ins>+        if (newSelection &amp;&amp; currentSelection &amp;&amp; App.domainsAreEqual(newSelection, currentSelection))
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         var domain = this._x.domain();
</span><del>-        if (!newSelection || this._xDomainsAreSame(domain, newSelection))
</del><ins>+        if (!newSelection || App.domainsAreEqual(domain, newSelection))
</ins><span class="cx">             this._brush.clear();
</span><span class="cx">         else
</span><span class="cx">             this._brush.extent(newSelection);
</span><span class="lines">@@ -1204,10 +1157,6 @@
</span><span class="cx"> 
</span><span class="cx">         this._setCurrentSelection(newSelection);
</span><span class="cx">     },
</span><del>-    _xDomainsAreSame: function (domain1, domain2)
-    {
-        return !(domain1[0] - domain2[0]) &amp;&amp; !(domain1[1] - domain2[1]);
-    },
</del><span class="cx">     _brushChanged: function ()
</span><span class="cx">     {
</span><span class="cx">         if (this._brush.empty()) {
</span><span class="lines">@@ -1557,8 +1506,9 @@
</span><span class="cx">         this._setCurrentItem(undefined);
</span><span class="cx">         this._updateSelectionToolbar();
</span><span class="cx"> 
</span><del>-        this.set('sharedSelection', newSelection);
-        this.sendAction('selectionChanged', newSelection, points);
</del><ins>+        if (!App.domainsAreEqual(this.get('selection'), newSelection))
+            this.set('selection', newSelection);
+        this.set('selectedPoints', points);
</ins><span class="cx">     },
</span><span class="cx">     _updateSelectionToolbar: function ()
</span><span class="cx">     {
</span><span class="lines">@@ -1675,7 +1625,8 @@
</span><span class="cx">             });
</span><span class="cx">         }));
</span><span class="cx">     },
</span><del>-    _fetchedRuns: function (data) {
</del><ins>+    _fetchedRuns: function (data)
+    {
</ins><span class="cx">         var runs = data.runs;
</span><span class="cx"> 
</span><span class="cx">         var currentTimeSeries = runs.current.timeSeriesByCommitTime();
</span><span class="lines">@@ -1718,7 +1669,8 @@
</span><span class="cx">             Ember.Object.create({name: &quot;B&quot;, options: pointOptions, selection: pointOptions[pointOptions.length - 1]}),
</span><span class="cx">         ];
</span><span class="cx">     }.property('analysisPoints'),
</span><del>-    _rootChangedForTestSet: function () {
</del><ins>+    _rootChangedForTestSet: function ()
+    {
</ins><span class="cx">         var sets = this.get('testSets');
</span><span class="cx">         var roots = this.get('roots');
</span><span class="cx">         if (!sets || !roots)
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv2indexhtml"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v2/index.html (176709 => 176710)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v2/index.html        2014-12-03 04:14:49 UTC (rev 176709)
+++ trunk/Websites/perf.webkit.org/public/v2/index.html        2014-12-03 04:17:32 UTC (rev 176710)
</span><span class="lines">@@ -156,8 +156,7 @@
</span><span class="cx">                             highlightedItems=highlightedItems
</span><span class="cx">                             rangeRoute=&quot;analysisTask&quot;
</span><span class="cx">                             selection=timeRange
</span><del>-                            sharedSelection=sharedSelection
-                            selectionChanged=&quot;rangeChanged&quot;
</del><ins>+                            selectedPoints=selectedPoints
</ins><span class="cx">                             selectionIsLocked=timeRangeIsLocked
</span><span class="cx">                             markedPoints=markedPoints
</span><span class="cx">                             zoom=&quot;zoomed&quot;}}
</span><span class="lines">@@ -176,9 +175,7 @@
</span><span class="cx">                                 chartData=chartData
</span><span class="cx">                                 showYAxis=false
</span><span class="cx">                                 domain=overviewDomain
</span><del>-                                domainChanged=&quot;overviewDomainChanged&quot;
-                                selection=mainPlotDomain
-                                selectionChanged=&quot;zoomed&quot;}}
</del><ins>+                                selection=overviewSelection}}
</ins><span class="cx">                         {{/if}}
</span><span class="cx">                         &lt;/div&gt;
</span><span class="cx">                         {{#if details}}
</span></span></pre>
</div>
</div>

</body>
</html>