ee98d6b05d73428f1625a7f9243b6bca3f85c593
[WebKit.git] / Websites / perf.webkit.org / ChangeLog
1 2017-03-14  Ryosuke Niwa  <rniwa@webkit.org>
2
3         Make server tests return a promise instead of manually calling done
4         https://bugs.webkit.org/show_bug.cgi?id=169648
5
6         Rubber-stamped by Chris Dumez.
7
8         Make the existing server tests always reutrn a promise instead of manually calling "done" callback.
9         The promise tests are a lot more stable and less error prone.
10
11         Also use arrow functions everywhere and use prepareServerTest, renamed from connectToDatabaseInEveryTest,
12         in more tests instead of manually connecting to database in every test, and reset v3 models.
13
14         * server-tests/admin-platforms-tests.js:
15         * server-tests/admin-reprocess-report-tests.js:
16         * server-tests/api-build-requests-tests.js:
17         * server-tests/api-manifest.js:
18         * server-tests/api-measurement-set-tests.js:
19         (.postReports): Deleted. Not used in any test.
20         * server-tests/api-report-commits-tests.js:
21         * server-tests/api-report-tests.js:
22         * server-tests/api-update-triggerable.js:
23         * server-tests/privileged-api-upate-run-status.js:
24         * server-tests/resources/common-operations.js:
25         (prepareServerTest): Renamed from connectToDatabaseInEveryTest. Increase the timeout and reset v3 models.
26         * server-tests/tools-buildbot-triggerable-tests.js:
27
28 2017-03-12  Ryosuke Niwa  <rniwa@webkit.org>
29
30         Rename RootSet to CommitSet
31         https://bugs.webkit.org/show_bug.cgi?id=169580
32
33         Rubber-stamped by Chris Dumez.
34
35         Renamed root_sets to commit_sets and roots to commit_set_relationships in the database schema, and renamed
36         related classes in public/v3/ and tools accordingly.
37
38         RootSet, MeasurementRootSet, and CustomRootSet are respectively renamed to CommitSet, MeasurementCommitSet,
39         and CustomCommitSet.
40
41         In order to migrate the database, run:
42         ```
43         BEGIN;
44         ALTER TABLE root_sets RENAME TO commit_sets;
45         ALTER TABLE commit_sets RENAME COLUMN rootset_id TO commitset_id;
46         ALTER TABLE roots RENAME TO commit_set_relationships;
47         ALTER TABLE commit_set_relationships RENAME COLUMN root_set TO commitset_set;
48         ALTER TABLE commit_set_relationships RENAME COLUMN root_commit TO commitset_commit;
49         ALTER TABLE build_requests RENAME COLUMN request_root_set TO request_commit_set;
50         END;
51         ```
52
53         * browser-tests/index.html:
54         * init-database.sql:
55         * public/api/build-requests.php:
56         (main):
57         * public/api/test-groups.php:
58         (main):
59         (format_test_group):
60         * public/include/build-requests-fetcher.php:
61         (BuildRequestsFetcher::__construct):
62         (BuildRequestsFetcher::results_internal):
63         (BuildRequestsFetcher::commit_sets): Renamed from root_sets.
64         (BuildRequestsFetcher::commits): Renamed from roots.
65         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Renamed from fetch_roots_for_set_if_needed.
66         * public/privileged-api/create-test-group.php:
67         (main):
68         (ensure_commit_sets): Renamed from commit_sets_from_root_sets.
69         * public/v3/components/analysis-results-viewer.js:
70         (AnalysisResultsViewer.prototype.buildRowGroups):
71         (AnalysisResultsViewer.prototype._collectCommitSetsInTestGroups): Renamed from _collectRootSetsInTestGroups.
72         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
73         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
74         (AnalysisResultsViewer.CommitSetInTestGroup): Renamed from RootSetInTestGroup.
75         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.constructor):
76         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.commitSet): Renamed from rootSet.
77         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.succeedingCommitSet): Renamed from succeedingRootSet.
78         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.constructor):
79         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
80         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.isComplete):
81         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.startRowIndex):
82         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.endRowIndex):
83         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
84         * public/v3/components/chart-revision-range.js:
85         (ChartRevisionRange.prototype._revisionForPoint):
86         (ChartRevisionRange.prototype._computeRevisionList):
87         * public/v3/components/customizable-test-group-form.js:
88         (CustomizableTestGroupForm.prototype.constructor):
89         (CustomizableTestGroupForm.prototype.setCommitSetMap): Renamed from setRootSetMap.
90         (CustomizableTestGroupForm.prototype._submitted):
91         (CustomizableTestGroupForm.prototype._computeCommitSetMap): Renamed from _computeRootSetMap.
92         (CustomizableTestGroupForm.prototype.render): Renamed from render.
93         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
94         * public/v3/components/results-table.js:
95         (ResultsTable.prototype.render):
96         (ResultsTable.prototype._createRevisionListCells):
97         (ResultsTable.prototype._computeRepositoryList):
98         (ResultsTableRow.prototype.constructor):
99         (ResultsTableRow.prototype.commitSet): Renamed from rootSet.
100         * public/v3/components/test-group-results-table.js:
101         (TestGroupResultsTable.prototype.buildRowGroups):
102         * public/v3/index.html:
103         * public/v3/models/build-request.js:
104         (BuildRequest.prototype.constructor):
105         (BuildRequest.prototype.updateSingleton):
106         (BuildRequest.prototype.commitSet): Renamed from rootSet.
107         (BuildRequest.constructBuildRequestsFromData):
108         * public/v3/models/commit-set.js: Renamed from public/v3/models/root-set.js.
109         (CommitSet): Renamed from RootSet.
110         (CommitSet.containsMultipleCommitsForRepository):
111         (MeasurementCommitSet): Renamed from MeasurementRootSet.
112         (MeasurementCommitSet.prototype.namedStaticMap):
113         (MeasurementCommitSet.prototype.ensureNamedStaticMap):
114         (MeasurementCommitSet.namedStaticMap):
115         (MeasurementCommitSet.ensureNamedStaticMap):
116         (MeasurementCommitSet.ensureSingleton):
117         (CustomCommitSet): Renamed from CustomRootSet.
118         * public/v3/models/measurement-adaptor.js:
119         (MeasurementAdaptor.prototype.applyTo):
120         * public/v3/models/test-group.js:
121         (TestGroup.prototype.constructor):
122         (TestGroup.prototype.addBuildRequest):
123         (TestGroup.prototype.repetitionCount):
124         (TestGroup.prototype.requestedCommitSets): Renamed from requestedRootSets.
125         (TestGroup.prototype.requestsForCommitSet): Renamed from requestsForRootSet.
126         (TestGroup.prototype.labelForCommitSet): Renamed from labelForRootSet.
127         (TestGroup.prototype.didSetResult):
128         (TestGroup.prototype.compareTestResults):
129         (TestGroup.prototype._valuesForCommitSet): Renamed from _valuesForRootSet.
130         (TestGroup.prototype.createAndRefetchTestGroups):
131         * public/v3/pages/analysis-task-page.js:
132         (AnalysisTaskPage.prototype.render):
133         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
134         (AnalysisTaskPage.prototype._createNewTestGroupFromChart):
135         (AnalysisTaskPage.prototype._createNewTestGroupFromViewer):
136         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
137         * server-tests/api-build-requests-tests.js:
138         * server-tests/resources/mock-data.js:
139         (MockData.resetV3Models):
140         (MockData.addMockData):
141         (MockData.addAnotherMockTestGroup):
142         * tools/detect-changes.js:
143         (createAnalysisTaskAndNotify):
144         * tools/js/buildbot-syncer.js:
145         (BuildbotSyncer.prototype._propertiesForBuildRequest):
146         (BuildbotSyncer.prototype._revisionSetFromCommitSetWithExclusionList):
147         * tools/js/database.js:
148         (tableToPrefixMap):
149         * tools/js/v3-models.js:
150         * tools/sync-buildbot.js:
151         (syncLoop):
152         * tools/sync-with-buildbot.py: Deleted. No longer used.
153         * unit-tests/analysis-task-tests.js:
154         * unit-tests/build-request-tests.js:
155         (sampleBuildRequestData):
156         * unit-tests/buildbot-syncer-tests.js:
157         (sampleCommitSetData):
158         * unit-tests/measurement-adaptor-tests.js:
159         * unit-tests/measurement-set-tests.js:
160         * unit-tests/resources/mock-v3-models.js:
161         (MockModels.inject):
162         * unit-tests/test-groups-tests.js:
163         (sampleTestGroup):
164
165 2017-03-13  Ryosuke Niwa  <rniwa@webkit.org>
166
167         Database's query functions should support querying for a row with NULL value
168         https://bugs.webkit.org/show_bug.cgi?id=169504
169
170         Reviewed by Antti Koivisto.
171
172         Add the support for calling select_* with one of column values set to NULL.
173         This feature is useful in webkit.org/b/146374 and webkit.org/b/168962.
174
175         * public/include/db.php:
176         (Database::prepare_params): Added $null_columns as an optional argument.
177         (Database::select_conditions_with_null_columns): Added. Builds up a query string by appending AND x is NULL
178         to match columns whose value must be NULL.
179         (Database::_select_update_or_insert_row):
180         (Database::select_rows):
181
182 2017-03-13  Dewei Zhu  <dewei_zhu@apple.com>
183
184         Add the ability to report a commit with sub-commits.
185         https://bugs.webkit.org/show_bug.cgi?id=168962
186
187         Reviewed by Ryosuke Niwa.
188
189         Introduce 'commit_ownerships' which records ownership between commits.
190         On existing production server, run ```
191             CREATE TABLE commit_ownerships (
192                 commit_owner integer NOT NULL REFERENCES commits ON DELETE CASCADE,
193                 commit_ownee integer NOT NULL REFERENCES commits ON DELETE CASCADE,
194                 PRIMARY KEY (commit_owner, commit_ownee)
195             );
196             ALTER TABLE repositories RENAME repository_parent TO repository_owner;
197             ALTER TABLE repositories DROP repository_name_must_be_unique;
198             CREATE UNIQUE INDEX repository_name_owner_unique_index ON repositories (repository_owner, repository_name) WHERE repository_owner IS NOT NULL;
199             CREATE UNIQUE INDEX repository_name_unique_index ON repositories (repository_name) WHERE repository_owner IS NULL;
200         ``` to update database.
201         Add unit-tests to cover this change.
202
203         * init-database.sql:
204         * public/api/report-commits.php:
205         * public/include/commit-log-fetcher.php:
206         * public/include/db.php:
207         * public/include/manifest-generator.php:
208         * public/include/report-processor.php:
209         * public/v3/models/repository.js:
210         (Repository):
211         (Repository.prototype.owner):
212         * server-tests/admin-reprocess-report-tests.js:
213         (addBuilderForReport.simpleReportWithRevisions.0.then):
214         (then):
215         * server-tests/api-manifest.js:
216         (then):
217         * server-tests/api-report-commits-tests.js:
218         (addSlaveForReport.sameRepositoryNameInSubCommitAndMajorCommit.then):
219         (then):
220         (addSlaveForReport.systemVersionCommitWithSubcommits.then):
221         (addSlaveForReport.multipleSystemVersionCommitsWithSubcommits.then):
222         (addSlaveForReport.systemVersionCommitWithEmptySubcommits.then):
223         (addSlaveForReport.systemVersionCommitAndSubcommitWithTimestamp.then):
224         * tools/js/database.js:
225
226 2017-03-07  Ryosuke Niwa  <rniwa@webkit.org>
227
228         Update ReadMe.md to use directory format for backing up & restoring the database
229         https://bugs.webkit.org/show_bug.cgi?id=169263
230
231         Reviewed by Joseph Pecoraro.
232
233         Update ReadMe.md's instruction to backup and restore the database to use directory format instead of
234         piping it to gzip. The new command will backup and restore the database with multiple concurrent processes
235         with a custom compression level.
236
237         * ReadMe.md:
238
239 2017-03-02  Ryosuke Niwa  <rniwa@webkit.org>
240
241         Make baseline data points selectable
242         https://bugs.webkit.org/show_bug.cgi?id=169069
243         <rdar://problem/29209427>
244
245         Reviewed by Antti Koivisto.
246
247         Add the capability to select data points other than "current" configuration type.
248
249         This patch refactors the way the "chart status" is computed. Before this patch, ChartStatusView was
250         responsible for determining two data points for which to compute the status, and computing the status
251         between two data points. ChartPaneStatusView which inherits from ChartStatusView and used in the charts
252         page relied upon ChartStatusView to compute these values, and computed the list of revision ranges for
253         each relevant repository between the data points. ChartPane then had callbacks on ChartPaneStatusView
254         to know whenever these values changed. Because of this entangled mess, ChartStatusView had to be aware
255         of InteractiveTimeSeriesChart even though only ChartPaneStatusView could be used with it.
256
257         This patch dramatically simplifies the situation by adding referencePoints() on TimeSeriesChart and
258         InteractiveTimeSeriesChart which returns the current point, the previous point if there is any, and
259         their time series view. It also extracts ChartStatusEvaluator which computes the current status values
260         and ChartRevisionRange which computes a list of revision differences both based on the referencePoints.
261         As a result, ChartPaneStatusView no longer inherits from ChartStatusView, and ChartStatusView has been
262         renamed to DashboardChartStatusView to reflect its purpose. Furthermore, ChartPane which used to rely on
263         ChartPaneStatusView's revisionCallback to update the commit log viewer simply uses another instance of
264         ChartRevisionRange, eliminating the need for the callback.
265
266         To implement these classes easily, this patch also introduces a new class, LazilyEvaluatedFunction to
267         memoize the return value of a function when called with the same arguments. Delaying the computation of
268         a value and avoiding the work when the values are the same is a very common pattern in the perf dashboard
269         so I expect this class would be used in a lot more places in the future.
270
271         * browser-tests/chart-revision-range-tests.js: Added. Tests for ChartRevisionRange.
272         * browser-tests/chart-status-evaluator-tests.js: Added. Tests for ChartStatusEvaluator.
273
274         * browser-tests/index.html:
275         (BrowsingContext):
276         (BrowsingContext.importScripts): Fixed the bug that calling importScripts twice results in MockRemoteAPI
277         being loaded twice.
278         (ChartTest.importChartScripts): Import more model objects.
279         (ChartTest.sampleCluster): Made this a getter.
280         (ChartTest.makeModelObjectsForSampleCluster):
281         (ChartTest.makeSampleCluster): Added. Cutomizes the valus of baseline / target based on options.
282         (ChartTest.respondWithSampleCluster): Now takes an options argument for makeSampleCluster.
283
284         * public/v3/components/chart-pane-base.js:
285         (ChartPaneBase): Added _openRepository to keep track of the currently open repository instead of relying
286         on _mainChartStatus or _commitLogViewer to keep track of it.
287         (ChartPaneBase.prototype.configure):  The callback for when the user clicked on a repository name in
288         ChartPaneStatusView has been replaced by "openRepository" action.
289         (ChartPaneBase.prototype.setOpenRepository): Moved from ChartPane.
290         (ChartPaneBase.prototype._mainSelectionDidChange):
291         (ChartPaneBase.prototype._indicatorDidChange):
292         (ChartPaneBase.prototype._didFetchData):
293         (ChartPaneBase.prototype._updateCommitLogViewer): Renamed from _updateStatus.
294         (ChartPaneBase.prototype.openNewRepository): Renamed from _requestOpeningCommitViewer. Fixed a bug that
295         clicking on the repository name inside ChartPaneStatusView would not focus the pane, which resulted in
296         arrow keys to be ignored instead of moving the main chart's indicator or the currently open repository.
297         (ChartPaneBase.prototype._keyup):
298         (ChartPaneBase.prototype._moveOpenRepository): Moved from ChartPaneStatusView's
299         moveRepositoryWithNotification. Used when changing the open repository by up/down arrow keys.
300
301         * public/v3/components/chart-revision-range.js: Added. Extracted from ChartPaneStatusView.
302         (ChartRevisionRange): Added.
303         (ChartRevisionRange.prototype.revisionList): Added.
304         (ChartRevisionRange.prototype.rangeForRepository): Added.
305         (ChartRevisionRange._revisionForPoint): Added. Extracted from ChartPaneStatusView's
306         _updateRevisionListForNewCurrentRepository.
307         (ChartRevisionRange._computeRevisionList): Ditto from computeChartStatusLabels.
308
309         * public/v3/components/chart-status-evaluator.js: Added.
310         (ChartStatusEvaluator): Added.
311         (ChartStatusEvaluator.prototype.status): Added.
312         (ChartStatusEvaluator.computeChartStatus): Added. Extracted from ChartStatusView's updateStatusIfNeeded.
313
314         * public/v3/components/chart-status-view.js: Removed.
315         (ChartStatusView): Deleted. Split into ChartStatusEvaluator and DashboardChartStatusView.
316
317         * public/v3/components/chart-styles.js:
318         (ChartStyles.baselineStyle): Make baseline data points interactive. This single line change is what
319         enables the user to interact with the data points. The rest of changes in this patch mostly deals with
320         the status text such as "5% worse than baseline" and the list of revisions shown in the commit log viewer
321         which would have shown the wrong range without these changes.
322
323         * public/v3/components/dashboard-chart-status-view.js: Added. Extracted from ChartStatusView.
324         (DashboardChartStatusView): Added.
325         (DashboardChartStatusView.prototype.render): Added.
326         (DashboardChartStatusView.htmlTemplate): Added.
327         (DashboardChartStatusView.cssTemplate): Added.
328
329         * public/v3/components/interactive-time-series-chart.js:
330         (InteractiveTimeSeriesChart.prototype.referencePoints): Added. Return the first point and the last point
331         as the reference points when there is a selection. Only report the previous point if they are distinct as
332         showing a range of revisions from a data point to itself makes no sense. When there is a indicator simply
333         return it and its previous point as reference points. Otherwise return null unlike TimeSeriesChart's
334         referencePoints which always returns the latest point as the reference point.
335
336         * public/v3/components/time-series-chart.js:
337         (TimeSeriesChart.prototype.referencePoints): Added. Return the latest point as the reference point. It
338         never returns the previous point even if there were more data points as there is no way for the user to
339         specify which data points to compare.
340
341         * public/v3/index.html: Include newly added files.
342
343         * public/v3/lazily-evaluated-function.js: Added.
344         (LazilyEvaluatedFunction): Added.
345         (LazilyEvaluatedFunction.prototype.evaluate): Added.
346
347         * public/v3/models/commit-log.js:
348         (CommitLog.prototype.diff): Fixed a bug that computing the diff of two Subversion-like revisions results
349         in "from" field to be unexpectedly an integer instead of a string.
350
351         * public/v3/models/metric.js:
352         (Metric): Moved the code to compute the unit from the metric name from v2's RunsData class. This makes
353         writing tests easier since it eliminates the need to load v2's data.js.
354         (Metric.prototype.unit):
355         (Metric.prototype.isSmallerBetter): Ditto for determining whether the unit is smaller-is-better.
356
357         * public/v3/pages/analysis-task-page.js:
358         (AnalysisTaskChartPane.prototype._updateStatus): Deleted the unused code.
359
360         * public/v3/pages/chart-pane-status-view.js:
361         (ChartPaneStatusView): No longer inherits from ChartStatusView. Uses ChartStatusEvaluator and
362         ChartRevisionRange to to compute the chart status and the list of revision changes.
363         (ChartPaneStatusView.prototype.pointsRangeForAnalysis): Deleted.
364         (ChartPaneStatusView.prototype.render): Split it into _renderStatus and _renderBuildRevisionTable using
365         LazilyEvaluatedFunction.
366         (ChartPaneStatusView.prototype._renderStatus): Added.
367         (ChartPaneStatusView.prototype._renderBuildRevisionTable): Added.
368         (ChartPaneStatusView.prototype.setCurrentRepository): _updateRevisionListForNewCurrentRepository has been
369         moved into ChartRevisionRange. Just enqueue itself to re-render.
370         (ChartPaneStatusView.prototype._setRevisionRange): Deleted.
371         (ChartPaneStatusView.prototype.moveRepositoryWithNotification): Deleted.
372         (ChartPaneStatusView.prototype.updateRevisionList): Deleted.
373         (ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Deleted.
374         (ChartPaneStatusView.prototype.computeChartStatusLabels): Deleted.
375         (ChartPaneStatusView.htmlTemplate):
376         (ChartPaneStatusView.cssTemplate):
377
378         * public/v3/pages/chart-pane.js:
379         (ChartPane.prototype.openNewRepository): Overrides the one in ChartPaneBase, which has been renamed from
380         _requestOpeningCommitViewer.
381         (ChartPane.prototype._analyzeRange):
382         (ChartPane.prototype._renderActionToolbar): Use the main chart's selection directly to determine whether
383         an analysis task can be created for the currenty selected range.
384
385         * public/v3/pages/dashboard-page.js:
386         (DashboardPage.prototype._createChartForCell):
387
388         * unit-tests/lazily-evaluated-function-tests.js: Added. Tests for LazilyEvaluatedFunction.
389
390 2017-03-01  Ryosuke Niwa  <rniwa@webkit.org>
391
392         Build fix after r212853. Make creating an analysis task work again.
393
394         * public/v3/pages/analysis-task-page.js:
395         (AnalysisTaskPage.prototype.render):
396
397 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
398
399         Fix tests after r213119 and r213120.
400
401         * browser-tests/time-series-chart-tests.js:
402         (return.ChartTest.importChartScripts.context.then):
403         (string_appeared_here.then): Deleted.
404
405 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
406
407         Removed the unused code that was supposed to be removed in the previous commit.
408
409         * browser-tests/time-series-chart-tests.js:
410
411 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
412
413         Split tests for InteractiveTimeSeriesChart into a separate test file.
414         https://bugs.webkit.org/show_bug.cgi?id=168960
415
416         Reviewed by Joseph Pecoraro.
417
418         Extracted the test cases for InteractiveTimeSeriesChart charts from time-series-chart-tests.js
419         into interactive-time-series-chart-tests.js now that the former file has gotten really big over time.
420
421         Also extracted a bunch of helper functions time-series-chart-tests.js as ChartTest in index.html.
422         Any test which instantiates a time series chart can use this helper class.
423
424         * browser-tests/index.html:
425         (ChartTest.importChartScripts): Ditto.
426         (ChartTest.posixTime): Moved from time-series-chart-tests.js.
427         (ChartTest.sampleCluster): Ditto.
428         (ChartTest.createChartWithSampleCluster): Ditto.
429         (ChartTest.createInteractiveChartWithSampleCluster): Ditto.
430         (ChartTest.respondWithSampleCluster):
431         * browser-tests/interactive-time-series-chart-tests.js: Extracted from time-series-chart-tests.js.
432         * browser-tests/time-series-chart-tests.js:
433         (posixTime): Moved.
434         (dayInMilliseconds): Moved.
435         (sampleCluster): Moved.
436         (createChartWithSampleCluster): Moved.
437         (createInteractiveChartWithSampleCluster): Moved.
438         (respondWithSampleCluster): Moved.
439         * unit-tests/analysis-task-tests.js: Fixed a typo. s/adopter/adapter/.
440
441 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
442
443         Calling build() on a baseline point results in an exception
444         https://bugs.webkit.org/show_bug.cgi?id=168959
445
446         Reviewed by Joseph Pecoraro.
447
448         Some baseline points may lack the build information. e.g. A custom data point made by an user.
449         Only instantiate Build object in a point object returned by MeasurementAdaptor when the builder id
450         is available so that we don't hit an assertion inside Build's constructor.
451
452         * public/v3/models/measurement-adaptor.js:
453         (MeasurementAdaptor.prototype.applyTo..build): Only instantiate Build when builderId is set.
454         * unit-tests/measurement-adaptor-tests.js: Added a test case.
455
456 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
457
458         Arrow key shouldn't move the indicator beyond the visible points
459         https://bugs.webkit.org/show_bug.cgi?id=168956
460
461         Reviewed by Joseph Pecoraro.
462
463         The bug was caused by moveLockedIndicatorWithNotification using the full sampled time series view
464         instead of the one constrained by the domain. Since the time series chart expands the visible domain
465         to include at least one point before the start time and one point after the end tiem to draw lines
466         extending beyond the visible region (otherwise it looks as though the graph ends there), we need to
467         use a view constrained by the start time and the end time before looking for a next/previous point.
468
469         * browser-tests/time-series-chart-tests.js: Added test cases for moveLockedIndicatorWithNotification.
470         * public/v3/components/interactive-time-series-chart.js:
471         (InteractiveTimeSeriesChart.prototype.moveLockedIndicatorWithNotification): Fixed the bug. Also
472         enqueue itself to render instead of relying on a parent component to do it.
473
474 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
475
476         A Locked indicator should be visually distinct from an unlocked indicator
477         https://bugs.webkit.org/show_bug.cgi?id=168868
478         <rdar://problem/29666054>
479
480         Reviewed by Antti Koivisto.
481
482         Added the support for specifying options.lockedIndicator in addition to options.indicator to style
483         an locked indicator differently from an unlocked one.
484
485         * browser-tests/time-series-chart-tests.js: Added new test cases for indicators.
486         (createChartWithSampleCluster): Renamed and swapped the order of arguments to better match
487         TimeSeriesChart's constructor. Now the second argument is an array of source as is in the constructor.
488         (createInteractiveChartWithSampleCluster): Added.
489
490         * public/v3/components/chart-styles.js:
491         (ChartStyles.overviewChartOptions): Changed the color of a selection to blue.
492         (ChartStyles.mainChartOptions): Ditto. Also use a different style for a locked indicator.
493
494         * public/v3/components/interactive-time-series-chart.js:
495         (InteractiveTimeSeriesChart.prototype._layout): Removed the unused variable.
496         (InteractiveTimeSeriesChart.prototype._renderChartContent): Use options.lockedIndicator when rendering
497         a locked indicator. Also stroke the circle in addition to filling it so that we can use a blue circle
498         with a white hole for a locked indicator to make it even more visually distinctive from an unlocked one.
499
500 2017-02-25  Dewei Zhu  <dewei_zhu@apple.com>
501
502         Commit should order by 'commit_order' as secondary key.
503         https://bugs.webkit.org/show_bug.cgi?id=168866
504
505         Reviewed by Ryosuke Niwa.
506
507         Currently, commits are sorted by 'commit_time' only.
508         We should use 'commit_order' as secondary key when 'commit_time' is equal or null.
509
510         * public/include/commit-log-fetcher.php:
511         * public/include/db.php:
512         * server-tests/api-commits.js:
513         (return.addSlaveForReport.subversionCommits.then):
514         (then):
515
516 2017-02-24  Ryosuke Niwa  <rniwa@webkit.org>
517
518         REGRESSION(r212853): Comparisons to baseline no longer shows up
519         https://bugs.webkit.org/show_bug.cgi?id=168863
520
521         Reviewed by Joseph Pecoraro.
522
523         The bug was caused by ChartStatusView's code not being updated to use TimeSeriesView's.
524         Updated the code to use TimeSeriesView's methods to fix the bug.
525
526         Also made InteractiveTimeSeriesChart's currentPoint to return a (TimeSeriesView, point, isLocked) tuple
527         to consolidate it with lockedIndicator() to work towards making the baseline data points selectable.
528
529         * browser-tests/time-series-chart-tests.js: Updated the test cases to use currentIndicator, and added
530         test cases for newly added lastPointInTimeRange.
531
532         * public/v3/components/chart-pane.js:
533         (ChartPane.prototype.serializeState): Updated to use currentIndicator.
534         (ChartPane.prototype._renderFilteringPopover): Ditto.
535
536         * public/v3/components/chart-status-view.js:
537         (ChartStatusView.prototype.updateStatusIfNeeded): Use currentIndicator for an interative time series.
538         Fixed the non-interactive chart's code path for TimeSeriesView.
539         (ChartStatusView.prototype._computeChartStatus): Modernized the code.
540         (ChartStatusView.prototype._findLastPointPriorToTime): Deleted. Replaced by TimeSeriesView's
541         lastPointInTimeRange.
542
543         * public/v3/components/interactive-time-series-chart.js:
544         (InteractiveTimeSeriesChart.prototype.currentIndicator):
545         (InteractiveTimeSeriesChart.prototype.moveLockedIndicatorWithNotification):
546         (InteractiveTimeSeriesChart.prototype._renderChartContent):
547         (InteractiveTimeSeriesChart):
548
549         * public/v3/models/time-series.js:
550         (TimeSeriesView.prototype.lastPointInTimeRange): Added.
551         (TimeSeriesView.prototype._reverse): Added. Traverses the view in the reverse order.
552         * unit-tests/time-series-tests.js:
553
554 2017-02-23  Dewei Zhu  <dewei_zhu@apple.com>
555
556         Rename 'commit_parent' in 'commits' table to 'commit_previous_commit'.
557         https://bugs.webkit.org/show_bug.cgi?id=168816
558
559         Reviewed by Ryosuke Niwa.
560
561         Rename 'commit_parent' to avoid ambiguity in the coming feature.
562         For exisiting database, run
563             "ALTER TABLE commits RENAME commit_parent TO commit_previous_commit;"
564         to update the database.
565
566         * init-database.sql:
567         * public/api/report-commits.php:
568         * public/include/commit-log-fetcher.php:
569         * server-tests/api-commits.js:
570         (then):
571         * server-tests/api-report-commits-tests.js:
572         (then):
573         * tools/sync-commits.py:
574         (main):
575         (Repository.fetch_commits_and_submit):
576         (GitRepository._revision_from_tokens):
577         * unit-tests/analysis-task-tests.js:
578         (sampleAnalysisTask):
579
580 2017-02-23  Ryosuke Niwa  <rniwa@webkit.org>
581
582         New sampling algorithm shows very few points when zoomed out
583         https://bugs.webkit.org/show_bug.cgi?id=168813
584
585         Reviewed by Saam Barati.
586
587         When a chart is zoomed out to a large time interval, the new sampling algorithm introduced in r212853 can
588         hide most of the data points because the difference between the preceding point's time and the succeeding
589         point's time of most points will be below the threshold we computed.
590
591         Instead, rank each data point based on the aforementioned time interval difference, and pick the first M data
592         points when M data points are to be shown.
593
594         This makes the new algorithm behave like our old algorithm while keeping it stable still. Note that this
595         algorithm still biases data points without a close neighboring point but this seems to work out in practice
596         because such a point tends to be an important sample anyway, and we don't have a lot of space between
597         data points since we aim to show about one point per pixel.
598
599         * browser-tests/index.html:
600         (CanvasTest.canvasContainsColor): Extracted from one of the test cases and generalized. Returns true when
601         the specified region of the canvas contains a specified color (alpha is optional).
602         * browser-tests/time-series-chart-tests.js: Added a test case for sampling. It checks that sampling happens
603         and that we always show some data point even when zoomed out to a large time interval.
604         (createChartWithSampleCluster):
605
606         * public/v3/components/interactive-time-series-chart.js:
607         (InteractiveTimeSeriesChart.prototype._sampleTimeSeries):
608         * public/v3/components/time-series-chart.js:
609         (TimeSeriesChart.prototype._ensureSampledTimeSeries): M, the number of data points we pick must be computed
610         based on the width of data points we're about to draw constrained by the canvas size. e.g. when the canvas
611         is only half filled, we shouldn't be showing two points per pixel in the filled region.
612         (TimeSeriesChart.prototype._sampleTimeSeries): Refined the algorithm. First, compute the time difference or
613         the rank for each N data points. Sort those ranks in descending order (in the order we prefer), and include
614         all data points above the M-th rank in the sample.
615         (TimeSeriesChart.prototype.computeTimeGrid): Revert the inadvertent change in r212935.
616
617         * public/v3/models/time-series.js:
618         (TimeSeriesView.prototype.filter): Fixed a bug that the indices passed onto the callback were shifted by the
619         starting index.
620         * unit-tests/time-series-tests.js: Added a test case to ensure callbacks are called with correct data points
621         and indices.
622
623 2017-02-23  Ryosuke Niwa  <rniwa@webkit.org>
624
625         REGRESSION(r212542): Make TimeSeriesChart.computeTimeGrid stops x-axis grid prematurely
626         https://bugs.webkit.org/show_bug.cgi?id=168812
627
628         Reviewed by Joseph Pecoraro.
629
630         Add time iterator of two months, three months, and four months with some tests.
631
632         Also for one-month time iterator, round the day of month to 1 or 15 whichever is closer.
633
634         * browser-tests/time-series-chart-tests.js: Added more tests.
635         * public/v3/components/time-series-chart.js:
636         (TimeSeriesChart._timeIterators.next):
637         (TimeSeriesChart._timeIterators):
638
639 2017-02-22  Ryosuke Niwa  <rniwa@webkit.org>
640
641         Add tests for InteractiveTimeSeriesChart and adopt actions
642         https://bugs.webkit.org/show_bug.cgi?id=168750
643
644         Reviewed by Chris Dumez.
645
646         Added tests for InteractiveTimeSeriesChart.
647
648         Also replaced selection.onchange, selection.onzoom, indicator.onchange, annotations.onclick callbacks
649         by "selectionChange", "zoom", "indicatorChange", and "annotationClick" actions respectively.
650
651         Also fixed various bugs and bad code I encountered while writing these tests.
652
653         * browser-tests/index.html:
654         (waitForComponentsToRender): Delay the call to enqueueToRender until the next run loop because there
655         might be outstanding promises that just got resolved. e.g. for fetching measurement sets JSONs. Let
656         all those promises get resolved first. Otherwise, some tests become racy.
657         (canvasImageData): Extracted from time-series-chart-tests.js.
658         (canvasRefTest): Ditto.
659         (CanvasTest): Ditto.
660         (CanvasTest.fillCanvasBeforeRedrawCheck): Ditto.
661         (CanvasTest.hasCanvasBeenRedrawn): Ditto.
662         (CanvasTest.canvasImageData): Ditto.
663         (CanvasTest.expectCanvasesMatch): Ditto.
664         (CanvasTest.expectCanvasesMismatch): Ditto.
665
666         * browser-tests/time-series-chart-tests.js: Fixed some test cases where dpr multipler was not doing
667         the right thing anymore in Safari under a high DPI screen. Also added a lot of test cases for interactive
668         time series chart and one for rendering annotations.
669         (scripts): Moved.
670         (posixTime): Added. A helper function for sampleCluster.
671         (dayInMilliseconds): Ditto.
672         (sampleCluster): Moved here. Made the same cluster more artifical for an easier testing.
673         (createChartWithSampleCluster): Moved out of one of the tests.
674         (respondWithSampleCluster): Ditto.
675
676         * public/v3/components/chart-pane-base.js:
677         (ChartPaneBase.prototype.configure): Adopted new actions in InteractiveTimeSeriesChart.
678
679         * public/v3/components/chart-status-view.js:
680         (ChartStatusView.prototype.updateStatusIfNeeded): Removed a superflous console.log.
681
682         * public/v3/components/chart-styles.js:
683         (ChartStyles.mainChartOptions): Set zoomButton to true. InteractiveTimeSeriesChart used to determine
684         whether to show the zoom button or not based on the precense of the zoom callback. We made it explicit.
685
686         * public/v3/components/interactive-time-series-chart.js:
687         (InteractiveTimeSeriesChart.prototype.setIndicator): Explicitly call _notifySelectionChanged with false
688         instead of relying on undefined to be treated as falsey.
689         (InteractiveTimeSeriesChart.prototype._createCanvas): Use id instead of selector to find elements.
690         (InteractiveTimeSeriesChart.htmlTemplate):
691         (InteractiveTimeSeriesChart.cssTemplate):
692         (InteractiveTimeSeriesChart.prototype._mouseMove): Explicitly call _startOrContinueDragging with false
693         instead of relying on undefined treated as falsey. Also added the missing call to enqueueToRender found
694         by new tests. This was working fine on the dashboard due to other components invoking enqueueToRender
695         but won't work in a standalone instance of InteractiveTimeSeriesChart.
696         (InteractiveTimeSeriesChart.prototype._mouseLeave): Ditto, adding the missing call to enqueueToRender.
697         (InteractiveTimeSeriesChart.prototype._click): Removed the assignment to _forceRender when calling
698         _mouseMove in an early exist, which does set this flag and invokes enqueueToRender, and added the missing
699         call to enqueueToRender in the other code path.
700         (InteractiveTimeSeriesChart.prototype._startOrContinueDragging): Replaced annotations.onclick callback
701         by the newly added "annotationClick" action, and added the missing call to enqueueToRender.
702         (InteractiveTimeSeriesChart.prototype._endDragging): Use arrow function.
703         (InteractiveTimeSeriesChart.prototype._notifyIndicatorChanged): Replaced indicator.onchange callback by
704         the newly added "indicatorChange" action.
705         (InteractiveTimeSeriesChart.prototype._notifySelectionChanged): Replaced selection.onchange callback by
706         the newly added "selectionChange" action.
707         (InteractiveTimeSeriesChart.prototype._renderChartContent): Show the zoom button when options.zoomButton
708         is set instead of relying on the presence of selection.onzoom especially now that the callback has been
709         replaced by the "zoom" action.
710
711         * public/v3/components/time-series-chart.js:
712         (TimeSeriesChart.prototype.setAnnotations): Added the missing call to enqueueToRender.
713
714         * public/v3/main.js:
715
716 2017-02-21  Ryosuke Niwa  <rniwa@webkit.org>
717
718         Make sampling algorithm more stable and introduce an abstraction for sampled data
719         https://bugs.webkit.org/show_bug.cgi?id=168693
720
721         Reviewed by Chris Dumez.
722
723         Before this patch, TimeSeriesChart's resampling resulted in some points poping up and disappearing as
724         the width of a chart is changed. e.g. when resizing the browser window. The bug was by caused by
725         the sample for a given width not always including all points for a smaller width so as the width is
726         expanded, some point may be dropped.
727
728         Fixed this by using a much simpler algorithm of always picking a point when the time interval between
729         the preceding point and the succeeding point is larger than the minimum space we allow for a given width.
730
731         Also introduced a new abstraction around the sample data: TimeSeriesView. A TimeSeriesView provides
732         a similar API to TimeSeries for a subset of the time series filtered by a time range a custom function.
733         This paves a way to adding the ability to select baseline, etc... on the chart status view.
734
735         TimeSeriesView can be in two modes:
736         Mode 1. The view represents a contiguous subrange of TimeSeries - In this mode, this._data references
737                 the underlying TimeSeries's _data directly, and we use _startingIndex to adjust index given to
738                 find the relative index. Finding the next point or the previous point of a given point is done
739                 via looking up the point's seriesIndex and doing a simple arithmetic. In general, an index is
740                 converted to the absolute index in the underlying TimeSeries's _data array.
741
742         Mode 2. The view represents a filtered non-contiguous subset of TimeSeries -  In this mode, this._data is
743                 its own array. Finding the next point or the previous point of a given point requires finding
744                 a sibling point in the underlying TimeSeries which is in this view. Since this may result in O(n)
745                 traversal and a hash lookup, we lazily build a map of each point to its position in _data instead.
746
747         * public/v3/components/chart-status-view.js:
748         (ChartStatusView.prototype.updateStatusIfNeeded): Call selectedPoints instead of sampledDataBetween for
749         clarity. This function now returns a TimeSeriesView instead of a raw array.
750
751         * public/v3/components/interactive-time-series-chart.js:
752         (InteractiveTimeSeriesChart.prototype.currentPoint): Updated now that _sampledTimeSeriesData contains
753         an array of TimeSeriesView's. Note that diff is either 0, -1, or 1.
754         (InteractiveTimeSeriesChart.prototype.selectedPoints): Ditto. sampledDataBetween no longer exists since
755         we can simply call viewTimeRange on TimeSeriesView returned by sampledDataBetween.
756         (InteractiveTimeSeriesChart.prototype.firstSelectedPoint): Ditto.
757         (InteractiveTimeSeriesChart.prototype._sampleTimeSeries): Use add since excludedPoints is now a Set.
758
759         * public/v3/components/time-series-chart.js:
760         (TimeSeriesChart.prototype.sampledDataBetween): Deleted.
761         (TimeSeriesChart.prototype.firstSampledPointBetweenTime): Deleted.
762         (TimeSeriesChart.prototype._ensureSampledTimeSeries): Modernized the code. Use the the time interval of
763         the chart divided by the number of allowed points as the time interval used in the new sampling algorithm.
764         (TimeSeriesChart.prototype._sampleTimeSeries): Rewritten. We also create TimeSeriesView here.
765         (TimeSeriesChart.prototype._sampleTimeSeries.findMedian): Deleted.
766         (TimeSeriesChart.prototype._updateCanvasSizeIfClientSizeChanged): Fixed a bug that the canvas size wasn't
767         set to the correct value on Chrome when a high DPI screen is used.
768
769         * public/v3/models/time-series.js:
770         (TimeSeries.prototype.viewBetweenPoints): Renamed from dataBetweenPoints. Now returns a TimeSeriesView.
771         (TimeSeriesView): Added. This constructor is to be called by viewBetweenPoints, viewTimeRange, and filter.
772         (TimeSeriesView.prototype._buildPointIndexMap): Added. Used in mode (2).
773         (TimeSeriesView.prototype.length): Added.
774         (TimeSeriesView.prototype.firstPoint): Added.
775         (TimeSeriesView.prototype.lastPoint): Added.
776         (TimeSeriesView.prototype.nextPoint): Added. Note index is always a position in this._data. In mode (1),
777         this is the position of the point in the underlying TimeSeries' _data. In mode (2), this is the position
778         of the point in this._data which is dictinct from the underlying TimeSeries' _data.
779         (TimeSeriesView.prototype.previousPoint): Ditto.
780         (TimeSeriesView.prototype.findPointByIndex): Added. Finds the point using the positional index from the
781         beginning of this view. findPointByIndex(0) on one view may not be same as findPointByIndex(0) of another.
782         (TimeSeriesView.prototype.findById): Added. This is O(n).
783         (TimeSeriesView.prototype.values): Added. Returns the value of each point in this view.
784         (TimeSeriesView.prototype.filter): Added. Creates a new view with a subset of data points the predicate
785         function returned true.
786         (TimeSeriesView.prototype.viewTimeRange): Added. Creates a new view with a subset of data points for the
787         given time ragne. When the resultant view would include all points of this view, it simply returns itself
788         as an optimization.
789         (TimeSeriesView.prototype.firstPointInTimeRange): Added. Returns the first point in the view which lies
790         within the specified time range.
791         (TimeSeriesView.prototype.Symbol.iterator): Added. Iterates over each point in the view.
792
793         * public/v3/pages/analysis-task-page.js:
794         (AnalysisTaskChartPane.prototype.selectedPoints): Use selectedPoints in lieu of getting selection and then
795         calling sampledDataBetween with that range.
796
797         * public/v3/pages/summary-page.js:
798         (SummaryPageConfigurationGroup.set _medianForTimeRange): Modernized.
799
800         * unit-tests/time-series-tests.js: Added tests for TimeSeries and TimeSeriesView. Already caught bugs!
801         (addPointsToSeries):
802
803 2017-02-17  Ryosuke Niwa  <rniwa@webkit.org>
804
805         Add tests for the time series chart and fix bugs I found along the way
806         https://bugs.webkit.org/show_bug.cgi?id=168499
807
808         Reviewed by Antti Koivisto.
809
810         Add basic tests for the time series chart.
811
812         Replaced the "ondata" callback set in the options by "dataChange" action now that ComponentBase provides
813         a facility for defining event-like actions.
814
815         Also fixed bugs I encountered while writing these tests see below for descriptions.
816
817         * browser-tests/editable-text-tests.js:
818         (waitToRender): Moved to index.html
819         * browser-tests/index.html:
820         (waitToRender): Moved from editable-text-tests.js.
821         (wait): Added.
822         * browser-tests/time-series-chart-tests.js: Added.
823         * public/v3/components/chart-pane-base.js:
824         (ChartPaneBase.prototype.configure):
825         * public/v3/components/time-series-chart.js:
826         (TimeSeriesChart): Removed the code to set display and position inline properties. This is now done inside
827         cssTemplate with :host pseudo class.
828         (TimeSeriesChart.prototype._ensureCanvas): Don't strech the canvas to 100% of width and height. This was
829         causing a flush of contents where the canvas is momentarily streched by the browser and the script later
830         updates with the content with the correct aspect ratio.
831         (TimeSeriesChart.cssTemplate): Added :host rule to set display: block and position: relative.
832         (TimeSeriesChart._updateAllCharts): Deleted.
833         (TimeSeriesChart.prototype.render): Only run the code for axis when options.axis is defined. Also, avoid
834         setting the fill style because we never fill for axis drawing.
835         (TimeSeriesChart.prototype._computeHorizontalRenderingMetrics): Ditto. Fallback to sensible values when
836         options.axis is not defined.
837         (TimeSeriesChart.prototype._renderYAxis): Now computeValueGrid generates a sequence of {time, label}.
838         (TimeSeriesChart.prototype._renderTimeSeries): Don't draw the shades for confidence intervals unless its
839         fill style is defined. Otherwise, we'd end up drawing black shade and mask the actual data points.
840         (TimeSeriesChart.prototype._ensureSampledTimeSeries): Dispatch newly added "dataChange" action instead of
841         calling "ondata" callback in options dictionary.
842         (TimeSeriesChart.computeTimeGrid): Modernized to use const/let. Also fixed the bug that we were emitting
843         the date even when the entire time range fit within a 24-hour interval.
844         (TimeSeriesChart.computeValueGrid): Rewritten to make MB/GB use a nice round number instead of 0.98GB.
845         We were using a power of 10 to round up the stepping value but the value formatter used a power of 1024
846         to divide byte measurements (e.g. for memory). Use formatter.divisor to find the right scaling factor for
847         each kind.
848         * public/v3/models/metric.js:
849         (Metric.prototype.makeFormatter):
850         (Metric.makeFormatter): Extracted from the one on the prototype so that tests don't need a metric object
851         just to test TimeSeriesChart. Added the second argument which specifies the maximum absolute value of the
852         range we're formatting. This is needed to use the same number of decimal points when the most significant
853         digit of some value is smaller than that of the biggest one. For example, we were emitting 0.50GB instead
854         of 0.5G along with 2.0GB. The "adjustment" reduces the number of significant figures in these cases.
855         * public/v3/pages/dashboard-page.js:
856         (DashboardPage.prototype._createChartForCell):
857
858 2017-02-16  Ryosuke Niwa  <rniwa@webkit.org>
859
860         Use expect.js instead of expect in browser tests
861         https://bugs.webkit.org/show_bug.cgi?id=168492
862
863         Reviewed by Joseph Pecoraro.
864
865         Use expect.js (https://github.com/Automattic/expect.js) instead of expect (https://github.com/mjackson/expect).
866
867         * browser-tests/close-button-tests.js:
868         * browser-tests/component-base-tests.js:
869         * browser-tests/editable-text-tests.js:
870         * browser-tests/index.html:
871
872 2017-02-16  Ryosuke Niwa  <rniwa@webkit.org>
873
874         Modernize and fix measurement-set tests
875         https://bugs.webkit.org/show_bug.cgi?id=168484
876
877         Reviewed by Joseph Pecoraro.
878
879         Modernized and fixed the tests in measurement-set-tests.js.
880
881         1. Return a promise instead of manually calling done in then/catch hanlders.
882         2. Use arrow function everywhere.
883         3. Explicitly assert the number of calls to callbacks instead of asserting never reached.
884
885         The test case labled "should return false when the range ends after the fetched cluster"
886         was incorrectly asserting that hasFetchedRange returns false when the end time is after
887         the primary cluster's end time. Test an interval before the primary cluster instead.
888
889         Added a test case for hasFetchedRange returning true when the end time appears after
890         the end of the primary cluster and fixed hasFetchedRange to that end. Since there are
891         no data points after the primary cluster which is chronologically the last cluster,
892         there is nothing to fetch beyond its end time.
893
894         * public/v3/models/measurement-set.js:
895         (MeasurementSet.prototype.hasFetchedRange): Fixed the bug that this function returned
896         false when the end time was after the primary cluster's end by truncating the range by
897         the end of the primary cluster.
898         * unit-tests/measurement-set-tests.js:
899         * unit-tests/resources/mock-remote-api.js:
900         (assert.notReached.assert.notReached): Deleted. It's no longer used by any tests.
901
902 2017-02-15  Ryosuke Niwa  <rniwa@webkit.org>
903
904         Update ReadMe.md and merge it with Install.md
905         https://bugs.webkit.org/show_bug.cgi?id=168405
906
907         Reviewed by Michael Catanzaro.
908
909         Merged Install.md and ReadMe.md into one file.
910
911         * Install.md: Removed.
912         * ReadMe.md: Merged Install.md at the top and updated the rest of the content.
913
914 2017-01-24  Ryosuke Niwa  <rniwa@webkit.org>
915
916         Modernize editable-text component and add tests
917         https://bugs.webkit.org/show_bug.cgi?id=167398
918
919         Reviewed by Yusuke Suzuki.
920
921         Modernized EditableText component to use the action feature added in r210938.
922
923         * browser-tests/editable-text-tests.js: Added. Added tests for EditableText component.
924         (.waitToRender):
925         * browser-tests/index.html:
926         * public/v3/components/base.js:
927         (ComponentBase.prototype.dispatchAction): Return the result from the callback.
928         * public/v3/components/editable-text.js:
929         (EditableText): Removed a bunch of instance variables that are no longer needed.
930         (EditableText.prototype.didConstructShadowTree): Added. Add event listeners on the Edit/Save button and the host.
931         (EditableText.prototype.editedText): Return the text field's value directly.
932         (EditableText.prototype.text): Added.
933         (EditableText.prototype.setText): Call enqueueToRender automatically instead of relying on the parent component
934         to do so in _startedEditingCallback, which has been removed.
935         (EditableText.prototype.render): Modernized the code.
936         (EditableText.prototype._didClick): No longer prevents the default action manually since that's automatically done
937         in createEventHandler. Handle the case where the update action is not handled.
938         (EditableText.prototype._endEditingMode): Renamed from _didUpdate.
939         (EditableText.htmlTemplate): Added ids on various elements in the shadow tree.
940         (EditableText.cssTemplate): Updated the CSS selectors per above change.
941         * public/v3/main.js:
942         (main): Fixed a typo.
943         * public/v3/pages/analysis-task-page.js:
944         (AnalysisTaskPage): Use the action listener instead of manually setting callbacks.
945         (AnalysisTaskPage.prototype._createTestGroupListItem): Ditto.
946         (AnalysisTaskPage.prototype._didStartEditingTaskName): Deleted.
947
948 2017-01-20  Ryosuke Niwa  <rniwa@webkit.org>
949
950         Build fix after r210783. Didn't mean to require custom elements API.
951
952         * public/v3/main.js:
953         (main):
954
955 2017-01-20  Ryosuke Niwa  <rniwa@webkit.org>
956
957         Make sync-commits.py robust against missing Subversion authors and missing parent Git commits
958         https://bugs.webkit.org/show_bug.cgi?id=167231
959
960         Reviewed by Antti Koivisto.
961
962         Fixed a bug that a subversion commit that's missing author name (anonymous commit) results in an out of bound
963         exception, and a bug that syncing a git repository starts failing once there was a merge commit which pulled
964         in a commit data earlier than that of the last reported commit.
965
966         For the latter fix, added --max-ancestor-fetch-count to specify the number of maximum commits to look back.
967
968         * tools/sync-commits.py:
969         (main): Added --max-ancestor-fetch-count.
970         (Repository.fetch_commits_and_submit): If submit_commits fails with FailedToFindParentCommit, fetch the parent
971         commit's information until we've resolved them all.
972         (Repository.fetch_next_commit): Renamed from fetch_commit.
973         (SVNRepository.fetch_next_commit): Renamed from fetch_commit. Don't try to get the author name if it's missing
974         due to an anonymous commit. It's important to never include the "author" field in the JSON submitted to
975         a dashboard since it rejects when "author" field is not an array (e.g. null). 
976         (GitRepository.fetch_next_commit): Renamed from fetch_commit.
977         (GitRepository.fetch_commit): Added. Fetches the commit information for a given git hash. Used to retrieve
978         missing parent commits.
979         (GitRepository._revision_from_tokens): Extracted from fetch_commit.
980
981         * tools/util.py:
982         (submit_commits): Optionally takes status_to_accept to avoid throwing in the case of FailedToFindParentCommit
983         and returns the response JSON.
984
985 2017-01-20  Ryosuke Niwa  <rniwa@webkit.org>
986
987         REGRESSION(r198234): /api/commits/%revision% always fails
988         https://bugs.webkit.org/show_bug.cgi?id=167235
989
990         Reviewed by Antti Koivisto.
991
992         The bug was caused by a typo in CommitLogFetcher::fetch_revision, which was calling commit_for_revision on
993         $this->db instead of $this. This had been monkey-patched in the internal dashboard so it was working there.
994
995         Also fixed a bug that /latest wasn't doing what it claimed to do, and a bug that /oldest /latest,
996         and /last-reported would return a commit with all values set to null instead of an empty list.
997
998         Finally, added server API tests for /api/commits.
999
1000         * public/api/commits.php:
1001         (main): Add a comment for APIs that only exist for v2 UI.
1002
1003         * public/include/commit-log-fetcher.php:
1004         (CommitLogFetcher::fetch_latest): Fixed the bug that this function was returning the oldest commit, not the
1005         the latest commit as desired.
1006         (CommitLogFetcher::fetch_revision): Fixed the bug that this function would always encounter an exception
1007         because commit_for_revision is defined on $this, not $this->db.
1008         (CommitLogFetcher::format_single_commit): Return an empty list instead of an array with a single commit with
1009         all values set to null.
1010
1011         * server-tests/api-commits.js: Added. Added tests for the JSON API at /api/commits.
1012         (.assertCommitIsSameAsOneSubmitted): Added. A helper function to compare a commit returned by /api/commits
1013         to one sent to /api/report-commits.
1014
1015 2017-01-19  Ryosuke Niwa  <rniwa@webkit.org>
1016
1017         measurement-sets API can incorrectly order points with OS version without commit time
1018         https://bugs.webkit.org/show_bug.cgi?id=167227
1019
1020         Reviewed by Chris Dumez.
1021
1022         Ignore revision_order for the purpose of ordering data points in /api/measurement-sets.
1023
1024         These orderings are used in some UI (e.g A/B testing) to order OS build numbers which do not have a timestamp
1025         associated with each "revision".
1026
1027         The baseline measurements made in our internal dashboard were using these ordering numbers before ordering
1028         results with build time. Because those data points don't have an associated Webkit revisions, all data points
1029         were ordered first by macOS's revision_order, then build time. Because v3 UI completely ignores revision_order
1030         for the purpose of plotting data points, this resulted in some data points being plotted in a wrong order
1031         with some lines going backwards in time.
1032
1033         This patch addresses this discrepancy by stop ordering data points with revision_order in the JSON API.
1034
1035         * public/api/measurement-set.php:
1036         (MeasurementSetFetcher::execute_query): Fixed the bug.
1037         * server-tests/api-measurement-set-tests.js: Added a test.
1038
1039 2017-01-19  Ryosuke Niwa  <rniwa@webkit.org>
1040
1041         Build fix after r210626. We need to clear Triggerable's static map in each iteration.
1042
1043         * tools/sync-buildbot.js:
1044         (syncLoop):
1045
1046 2017-01-18  Ryosuke Niwa  <rniwa@webkit.org>
1047
1048         Add a mechanism to dispatch and listen to an action
1049         https://bugs.webkit.org/show_bug.cgi?id=167191
1050
1051         Reviewed by Antti Koivisto.
1052
1053         Added the notion of an action to components. Like DOM events, it can be dispatched or listen to.
1054
1055         Also added ComponentBase.prototype.part which finds a sub-component inside a component's shadow tree,
1056         and made ComponentBase.prototype.content take an id to find an element that matches it.
1057
1058         * browser-tests/close-button-tests.js: Added. Tests for CloseButton.
1059         * browser-tests/component-base-tests.js: Added tests for ComponentBase's part(~), content(id), dispatchEvent.
1060         * browser-tests/index.html:
1061         * public/v3/components/base.js:
1062         (ComponentBase): Added this._actionCallbacks, which is a map of an action name to a callback to be invoked.
1063         (ComponentBase.prototype.content): Return an element of the given id if one is specified.
1064         (ComponentBase.prototype.part): Find a component whose element has the matching id.
1065         (ComponentBase.prototype.dispatchAction): Added.
1066         (ComponentBase.prototype.listenToAction): Added.
1067         (ComponentBase.prototype._ensureShadowTree): Call didConstructShadowTree.
1068         (ComponentBase.prototype.didConstructShadowTree): Added.
1069         (ComponentBase.prototype._recursivelyReplaceUnknownElementsByComponents): Copy attributes when instantiating
1070         an element for a component when the browser doesn't support custom elements API.
1071         (ComponentBase.createLink):
1072         (ComponentBase.prototype.createEventHandler): Added.
1073         (ComponentBase.createEventHandler): Renamed from createActionHandler.
1074         * public/v3/components/button-base.js:
1075         (ButtonBase.prototype.didConstructShadowTree): Added. Dispatch "activate" action when the button is clicked.
1076         (ButtonBase.prototype.setCallback): Deleted.
1077         (ButtonBase.htmlTemplate): Use id instead of class so that this.content() can find it.
1078         (ButtonBase.cssTemplate): Updated style rules.
1079         * public/v3/pages/chart-pane.js:
1080         (ChartPane):
1081         (ChartPane.prototype.didConstructShadowTree): Added. Listen to "activate" action on the close button.
1082         (ChartPane.prototype.render): Fixed a bug that we were never calling enqueueToRender on the close button.
1083         (ChartPane.htmlTemplate): Add the id on the close button.
1084
1085 2017-01-18  Dewei Zhu  <dewei_zhu@apple.com>
1086
1087         'buildbot-syncer.js' should be able to determine force build argument from a list of possible repositories.
1088         https://bugs.webkit.org/show_bug.cgi?id=167152
1089
1090         Reviewed by Ryosuke Niwa.
1091
1092         Add 'rootOptions' key which maps to a list of possible repositories.
1093         For a build request, only one of the repositories in the list is valid.
1094
1095         * tools/js/buildbot-syncer.js:
1096         (BuildbotSyncer.prototype._propertiesForBuildRequest):
1097         (BuildbotSyncer._validateAndMergeProperties):
1098         (BuildbotSyncer):
1099         * unit-tests/buildbot-syncer-tests.js:
1100         (sampleiOSConfig):
1101         (sampleiOSConfigWithExpansions):
1102         (createSampleBuildRequest):
1103         (Promise.resolve.then):
1104         * unit-tests/resources/mock-v3-models.js:
1105         (MockModels.inject):
1106
1107 2017-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1108
1109         Make calls to render() functions async
1110         https://bugs.webkit.org/show_bug.cgi?id=167151
1111
1112         Reviewed by Andreas Kling.
1113
1114         Make calls to render() async by coalescing calls inside enqueueToRender(), which has been renamed from
1115         updateRendering(). We now queue up all the components and wait until the next animation frame to invoke
1116         render() on all those components.
1117
1118         This reduces render() calls in the summary page of our internal dashboard by 15x from ~9400 to ~600 by
1119         eliminating pathological O(n^2) behavior between render() calls.
1120
1121         Consolidated TimeSeriesChart's enqueueRender into this newly added feature of ComponentBase along with
1122         the support to call render() on a resize event. New implementation makes use of connectedCallback and
1123         disconnectedCallback to avoid the work when the component is not in a document tree.
1124
1125         The rest of the patch concerns with renaming updateRendering to enqueueToRender and fixing a few minor bugs
1126         that I encountered while working on this patch.
1127
1128         * browser-tests/component-base-tests.js: Added tests for ComponentBase.enqueueToRender().
1129         * browser-tests/index.html:
1130         (BrowserContext.prototype.importScripts): Renamed from importScript; Now supports loading multiple scripts.
1131         (BrowserContext.prototype.importScript): Added.
1132         (BrowserContext): Removed the unused createWithScripts.
1133
1134         * public/v3/components/analysis-results-viewer.js:
1135         (AnalysisResultsViewer.prototype._expandBetween):
1136         * public/v3/components/bar-graph-group.js:
1137         (BarGraphGroup.prototype.updateGroupRendering):
1138
1139         * public/v3/components/base.js:
1140         (ComponentBase): When the browser doesn't support custom elements and 
1141         (ComponentBase.prototype.enqueueToRender): Renamed from updateRendering. Queues up the component to call
1142         render() instead of immediately invoking it.
1143         (ComponentBase.renderingTimerDidFire): Call render(). Since render() function often calls enqueueToRender
1144         on child components, go ahead and invoke render() on any components enqueued during render() calls.
1145         (ComponentBase._connectedComponentToRenderOnResize): Added.
1146         (ComponentBase._disconnectedComponentToRenderOnResize): Added.
1147         (ComponentBase.defineElement.elementClass.prototype.connectedCallback): Added. This is an optimization to
1148         avoid the work when the component is not in the document; e.g. because the entire page component has been
1149         detached from the document. The old implementation in TimeSeriesChart was not doing this.
1150         (ComponentBase.defineElement.elementClass.prototype.disconnectedCallback): Added.
1151         (ComponentBase): Replaced unused static variables with _componentsToRender and _componentsToRenderOnResize.
1152
1153         * public/v3/components/chart-pane-base.js:
1154         (ChartPaneBase.prototype.fetchAnalysisTasks):
1155         (ChartPaneBase.prototype.didUpdateAnnotations): Added. Addresses the bug that the annotation bars in the
1156         charts shown an an analysis task doesn't update its color when the state is updated in the UI. 
1157         (ChartPaneBase.prototype._mainSelectionDidZoom):
1158         (ChartPaneBase.prototype._updateStatus):
1159         (ChartPaneBase.prototype._requestOpeningCommitViewer):
1160         (ChartPaneBase.prototype._keyup):
1161         (ChartPaneBase.prototype.render):
1162         * public/v3/components/commit-log-viewer.js:
1163         * public/v3/components/customizable-test-group-form.js:
1164         (CustomizableTestGroupForm):
1165         (CustomizableTestGroupForm.prototype._customize):
1166         * public/v3/components/editable-text.js:
1167         (EditableText.prototype._didUpdate):
1168         * public/v3/components/interactive-time-series-chart.js:
1169         * public/v3/components/pane-selector.js:
1170         (PaneSelector.prototype._selectedItem):
1171         * public/v3/components/time-series-chart.js:
1172         (TimeSeriesChart): Removed the logic to update upon resize. See _connectedComponentToRenderOnResize above.
1173         (TimeSeriesChart.prototype.get enqueueToRenderOnResize): Added. Returns true.
1174         (TimeSeriesChart.prototype.enqueueToRender): Deleted.
1175         (TimeSeriesChart._renderEnqueuedCharts): Deleted.
1176         (TimeSeriesChart): Call ComponentBase.defineElement to make this a proper component so that the logic in
1177         connectedCallback to update upon resize event would work.
1178         * public/v3/instrumentation.js:
1179         (Instrumentation.dumpStatistics): Sort results by the key names.
1180         * public/v3/models/time-series.js:
1181         (TimeSeries.prototype.values): Added. This method was never ported to v3 in r198462, and broke the feature
1182         to show moving averages, etc... on the charts page.
1183         * public/v3/pages/analysis-category-page.js:
1184         (AnalysisCategoryPage.prototype.open):
1185         (AnalysisCategoryPage.prototype.updateFromSerializedState):
1186         (AnalysisCategoryPage.prototype.filterDidChange):
1187         (AnalysisCategoryPage.prototype.render):
1188         * public/v3/pages/analysis-task-page.js:
1189         (AnalysisTaskChartPane.prototype._updateStatus):
1190         (AnalysisTaskPage.prototype.updateFromSerializedState):
1191         (AnalysisTaskPage.prototype._didFetchTask):
1192         (AnalysisTaskPage.prototype._didFetchRelatedAnalysisTasks):
1193         (AnalysisTaskPage.prototype._didFetchMeasurement):
1194         (AnalysisTaskPage.prototype._didFetchTestGroups):
1195         (AnalysisTaskPage.prototype._showAllTestGroups):
1196         (AnalysisTaskPage.prototype._didFetchAnalysisResults):
1197         (AnalysisTaskPage.prototype.render):
1198         (AnalysisTaskPage.prototype._renderTestGroupList.):
1199         (AnalysisTaskPage.prototype._renderTestGroupList):
1200         (AnalysisTaskPage.prototype._createTestGroupListItem):
1201         (AnalysisTaskPage.prototype._showTestGroup):
1202         (AnalysisTaskPage.prototype._didStartEditingTaskName):
1203         (AnalysisTaskPage.prototype._updateTaskName):
1204         (AnalysisTaskPage.prototype._updateTestGroupName):
1205         (AnalysisTaskPage.prototype._hideCurrentTestGroup):
1206         (AnalysisTaskPage.prototype._updateChangeType): Fixed the bug that we were never updating annotation bars
1207         in the main chart by calling didUpdateAnnotations.
1208         (AnalysisTaskPage.prototype._associateBug):
1209         (AnalysisTaskPage.prototype._dissociateBug):
1210         (AnalysisTaskPage.prototype._associateCommit):
1211         (AnalysisTaskPage.prototype._dissociateCommit):
1212         (AnalysisTaskPage.prototype._chartSelectionDidChange):
1213         (AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer):
1214         * public/v3/pages/build-request-queue-page.js:
1215         (BuildRequestQueuePage.prototype.open.):
1216         (BuildRequestQueuePage.prototype.open):
1217         * public/v3/pages/chart-pane.js:
1218         (ChartPane.prototype.setOpenRepository):
1219         (ChartPane.prototype._renderTrendLinePopover): Fixed a race condition. Insert a select element as needed
1220         before trying to assign the current value on it.
1221         (ChartPane.prototype._trendLineTypeDidChange):
1222         (ChartPane.prototype._updateTrendLine):
1223         * public/v3/pages/charts-page.js:
1224         (ChartsPage.prototype.updateFromSerializedState):
1225         (ChartsPage.prototype._updateDomainsFromSerializedState):
1226         (ChartsPage.prototype.setNumberOfDaysFromToolbar):
1227         (ChartsPage.prototype._didMutatePaneList):
1228         (ChartsPage.prototype.render):
1229         * public/v3/pages/charts-toolbar.js:
1230         (ChartsToolbar.prototype.render):
1231         * public/v3/pages/create-analysis-task-page.js:
1232         (CreateAnalysisTaskPage.prototype.updateFromSerializedState):
1233         * public/v3/pages/dashboard-page.js:
1234         (DashboardPage.prototype.updateFromSerializedState):
1235         (DashboardPage.prototype._fetchedData):
1236         * public/v3/pages/heading.js:
1237         (Heading.prototype.render):
1238         * public/v3/pages/page-with-heading.js:
1239         (PageWithHeading.prototype.render):
1240         * public/v3/pages/page.js:
1241         (Page.prototype.open):
1242         * public/v3/pages/summary-page.js:
1243         (SummaryPage.prototype.open):
1244         (SummaryPage.prototype.this._renderQueue.push):
1245         (SummaryPage):
1246         (SummaryPage.prototype._renderCell):
1247
1248 2017-01-15  Ryosuke Niwa  <rniwa@webkit.org>
1249
1250         Add the build fix for browsers that don't yet support custom elements SPI.
1251         It was supposedly to be a part of the previous commit.
1252
1253         * public/v3/components/base.js:
1254         (ComponentBase.defineElement):
1255
1256 2017-01-12  Ryosuke Niwa  <rniwa@webkit.org>
1257
1258         Adopt custom elements API in perf dashboard
1259         https://bugs.webkit.org/show_bug.cgi?id=167045
1260
1261         Reviewed by Darin Adler.
1262
1263         Adopt custom elements API in ComponentBase, and create the shadow tree lazily in content() and render()
1264         instead of eagerly creating it inside the constructor.
1265
1266         For now, create a separate element class for each component in ComponentBase.defineElement instead of
1267         making ComponentBase inherit from HTMLElement to preserve the semantics we have as well as to test
1268         the boundaries of what custom elements API allows for framework authors.
1269
1270         In order to ensure one-to-one correspondence between elements and their components, we use a static map,
1271         ComponentBase._currentlyConstructedByInterface, to remember which element or component is being created
1272         and use that in custom element's constructor to update element.component() and this._element.
1273
1274         Also dropped the support for not having attachShadow as we've shipped this feature in Safari 10.
1275
1276         Finally, added tests to be ran inside a browser to test the front end code in browser-tests.
1277
1278         * browser-tests/component-base-tests.js: Added. Basic tests for ComponentBase.
1279         * browser-tests/index.html: Added.
1280
1281         * public/v3/components/base.js:
1282         (ComponentBase): Don't create the shadow tree. Use the currently constructed element as this._element if
1283         there is one (the custom element's constructor is getting called). Otherwise create a new element but
1284         store this component in the map to avoid creating a new component in the custom element's constructor.
1285         (ComponentBase.prototype.content): Lazily create the shadow tree now.
1286         (ComponentBase.prototype.render): Ditto.
1287         (ComponentBase.prototype._ensureShadowTree): Renamed from _constructShadowTree. Dropped the support for
1288         not having shadow DOM API. This is now required. Also use importNode instead of cloneNode in cloning
1289         the template content since the latter would not get upgraded.
1290         (ComponentBase.prototype._recursivelyReplaceUnknownElementsByComponents): Modernized the code. Don't
1291         re-create a component if its element had already been upgraded by its custom element constructor.
1292         (ComponentBase.defineElement): Add this component to the static maps. _componentByName is used by
1293         _recursivelyReplaceUnknownElementsByComponents to instantiate new components in the browsers that don't
1294         support custom elements API and _componentByClass is used by ComponentBase's constructor to lookup the
1295         element name. The latter should go away once all components fully adopt ComponentBase.defineElement.
1296         (ComponentBase.defineElement.elementClass): A class to define a custom element for the component.
1297         We need to reconfigure the property since class's name is not writable but configurable.
1298
1299         * public/v3/components/button-base.js:
1300         (ButtonBase.htmlTemplate): Added. Extracted the common code from CloseButton and WarningIcon.
1301         (ButtonBase.buttonContent): Added. An abstract method overridden by CloseButton and WarningIcon.
1302         (ButtonBase.sizeFactor): Added. Overridden by WarningIcon.
1303         (ButtonBase.cssTemplate): Updated to use :host.
1304         * public/v3/components/close-button.js:
1305         (CloseButton.buttonContent): Renamed from htmlTemplate.
1306         * public/v3/components/spinner-icon.js:
1307         (SpinnerIcon.cssTemplate): Removed webkit prefixed properties, and updated it to animate stroke instead
1308         of opacity to reduce the power usage.
1309         (SpinnerIcon.htmlTemplate): Factored stroke, stroke-width, and stroke-linecap into cssTemplate.
1310         * public/v3/components/warning-icon.js:
1311         (WarningIcon.cssTemplate): Deleted.
1312         (WarningIcon.sizeFactor): Added.
1313         (WarningIcon.buttonContent): Renamed from htmlTemplate.
1314         * public/v3/pages/summary-page.js:
1315         (SummaryPage._constructRatioGraph): Fixed a bug that we were not never calling spinner.updateRendering().
1316         (SummaryPage.prototype._renderCell):
1317
1318 2017-01-13  Ryosuke Niwa  <rniwa@webkit.org>
1319
1320         Instrument calls to render()
1321         https://bugs.webkit.org/show_bug.cgi?id=167037
1322
1323         Reviewed by Sam Weinig.
1324
1325         Wrap every call to render() by newly added ComponentBase.updateRendering() to instrument it.
1326         Also, use arrow functions instead of this.render.bind or regular closures for simplicity.
1327
1328         Currently, we're making 5100 calls to render() while opening the summary page, and that's way too high.
1329
1330         * public/v3/components/analysis-results-viewer.js:
1331         (AnalysisResultsViewer.prototype._expandBetween):
1332         * public/v3/components/bar-graph-group.js:
1333         (BarGraphGroup.prototype.updateGroupRendering): Renamed form render() as BarGraphGroup is not a component.
1334         * public/v3/components/base.js:
1335         (ComponentBase.prototype.updateRendering): Added. Instruments render() call.
1336         * public/v3/components/chart-pane-base.js:
1337         (ChartPaneBase.prototype.fetchAnalysisTasks):
1338         (ChartPaneBase.prototype._mainSelectionDidZoom):
1339         (ChartPaneBase.prototype._updateStatus):
1340         (ChartPaneBase.prototype._requestOpeningCommitViewer):
1341         (ChartPaneBase.prototype._keyup):
1342         (ChartPaneBase.prototype.render):
1343         * public/v3/components/commit-log-viewer.js:
1344         * public/v3/components/customizable-test-group-form.js:
1345         (CustomizableTestGroupForm):
1346         (CustomizableTestGroupForm.prototype._customize):
1347         * public/v3/components/editable-text.js:
1348         (EditableText.prototype._didUpdate):
1349         * public/v3/components/pane-selector.js:
1350         (PaneSelector.prototype._selectedItem):
1351         * public/v3/components/results-table.js:
1352         (ResultsTable.prototype.render):
1353         * public/v3/components/time-series-chart.js:
1354         (TimeSeriesChart._renderEnqueuedCharts):
1355         * public/v3/pages/analysis-category-page.js:
1356         (AnalysisCategoryPage.prototype.open):
1357         (AnalysisCategoryPage.prototype.updateFromSerializedState):
1358         (AnalysisCategoryPage.prototype.filterDidChange):
1359         (AnalysisCategoryPage.prototype.render):
1360         * public/v3/pages/analysis-task-page.js:
1361         (AnalysisTaskChartPane.prototype._updateStatus):
1362         (AnalysisTaskPage.prototype.updateFromSerializedState):
1363         (AnalysisTaskPage.prototype._didFetchTask):
1364         (AnalysisTaskPage.prototype._didFetchRelatedAnalysisTasks):
1365         (AnalysisTaskPage.prototype._didFetchMeasurement):
1366         (AnalysisTaskPage.prototype._didFetchTestGroups):
1367         (AnalysisTaskPage.prototype._showAllTestGroups):
1368         (AnalysisTaskPage.prototype._didFetchAnalysisResults):
1369         (AnalysisTaskPage.prototype.render):
1370         (AnalysisTaskPage.prototype._renderTestGroupList.):
1371         (AnalysisTaskPage.prototype._renderTestGroupList):
1372         (AnalysisTaskPage.prototype._createTestGroupListItem):
1373         (AnalysisTaskPage.prototype._showTestGroup):
1374         (AnalysisTaskPage.prototype._didStartEditingTaskName):
1375         (AnalysisTaskPage.prototype._updateTaskName):
1376         (AnalysisTaskPage.prototype._updateTestGroupName):
1377         (AnalysisTaskPage.prototype._hideCurrentTestGroup):
1378         (AnalysisTaskPage.prototype._updateChangeType):
1379         (AnalysisTaskPage.prototype._associateBug):
1380         (AnalysisTaskPage.prototype._dissociateBug):
1381         (AnalysisTaskPage.prototype._associateCommit):
1382         (AnalysisTaskPage.prototype._dissociateCommit):
1383         (AnalysisTaskPage.prototype._chartSelectionDidChange):
1384         (AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer):
1385         * public/v3/pages/build-request-queue-page.js:
1386         (BuildRequestQueuePage.prototype.open.):
1387         (BuildRequestQueuePage.prototype.open):
1388         * public/v3/pages/chart-pane.js:
1389         (ChartPane.prototype.setOpenRepository):
1390         (ChartPane.prototype._trendLineTypeDidChange):
1391         (ChartPane.prototype._updateTrendLine):
1392         * public/v3/pages/charts-page.js:
1393         (ChartsPage.prototype.updateFromSerializedState):
1394         (ChartsPage.prototype._updateDomainsFromSerializedState):
1395         (ChartsPage.prototype.setNumberOfDaysFromToolbar):
1396         (ChartsPage.prototype._didMutatePaneList):
1397         (ChartsPage.prototype.render):
1398         * public/v3/pages/charts-toolbar.js:
1399         (ChartsToolbar.prototype.render):
1400         * public/v3/pages/create-analysis-task-page.js:
1401         (CreateAnalysisTaskPage.prototype.updateFromSerializedState):
1402         * public/v3/pages/dashboard-page.js:
1403         (DashboardPage.prototype.updateFromSerializedState):
1404         (DashboardPage.prototype._fetchedData):
1405         * public/v3/pages/heading.js:
1406         (Heading.prototype.render):
1407         * public/v3/pages/page-with-heading.js:
1408         (PageWithHeading.prototype.render):
1409         * public/v3/pages/page.js:
1410         (Page.prototype.open):
1411         * public/v3/pages/summary-page.js:
1412         (SummaryPage.prototype.open):
1413         (SummaryPage.prototype.this._renderQueue.push):
1414         (SummaryPage):
1415         (SummaryPage.prototype._renderCell):
1416
1417 2017-01-12  Ryosuke Niwa  <rniwa@webkit.org>
1418
1419         Outliers are not hidden in v3 UI
1420         https://bugs.webkit.org/show_bug.cgi?id=166966
1421
1422         Reviewed by Andreas Kling.
1423
1424         Fixed the typo in addToSeries. An outlier has markedOutlier set to true, not isOutlier.
1425
1426         Also fixed a bug unveiled by new tests in MeasurementRootSet.ensureSingleton. It was was creating
1427         a new MeasurementRootSet each time it was called instead of finding an existing instance. Fixed the bug
1428         by merging the static maps of MeasurementRootSet and RootSet.
1429
1430         * public/v3/models/measurement-cluster.js:
1431         (MeasurementCluster.prototype.addToSeries): Fixed the bug.
1432         * public/v3/models/root-set.js:
1433         (MeasurementRootSet.prototype.namedStaticMap): Added.
1434         (MeasurementRootSet.prototype.ensureNamedStaticMap): Added.
1435         (MeasurementRootSet.namedStaticMap): Added.
1436         (MeasurementRootSet.ensureNamedStaticMap): Added.
1437         * unit-tests/measurement-set-tests.js: Added tests for adopting time series data from a cluster.
1438
1439 2017-01-12  Ryosuke Niwa  <rniwa@webkit.org>
1440
1441         Hide the UI to trigger an A/B testing when there are no triggerables
1442         https://bugs.webkit.org/show_bug.cgi?id=166964
1443
1444         Reviewed by Yusuke Suzuki.
1445
1446         Hide the "Start A/B Testing" button on analysis task pages instead of showing it and failing later
1447         when the user tries to create one it with a TriggerableNotFound error.
1448
1449         Added the list of triggerables to the manifest JSON so that we can determine this condition without
1450         having to fetch /api/triggerable for each analysis task as done in v2 UI.
1451
1452         * public/admin/reprocess-report.php:
1453         * public/api/manifest.php:
1454         * public/api/report.php:
1455         * public/include/admin-header.php:
1456         * public/include/manifest-generator.php: Moved from public/include/manifest.php.
1457         (ManifestGenerator::generate):
1458         (ManifestGenerator::triggerables): Added. Include the list of repositories this triggerable accepts
1459         as well as the list of (test, platform) pairs on which this triggerable is available.
1460         Use [testId, platformId] instead of a dictionary to reduce the file size.
1461         * public/v3/components/customizable-test-group-form.js:
1462         (CustomizableTestGroupForm): Removed this._disabled. This variable was used in TestGroupFrom to
1463         disable the "Start A/B Testing" button when no range is selected but this ended up racy. Compute
1464         the visibility of the button in render() function instead.
1465         (CustomizableTestGroupForm.prototype.setRootSetMap):
1466         (CustomizableTestGroupForm.prototype._submitted):
1467         (CustomizableTestGroupForm.prototype.render): Hide the customize link and the button as needed.
1468         The "Start A/B Testing" button must be hidden when either no range is selected or no title is typed.
1469         "Customize" button must be hidden when no range is selected.
1470         * public/v3/components/test-group-form.js:
1471         (TestGroupForm): Removed _disabled since it's no longer used.
1472         (TestGroupForm.prototype.setDisabled): Ditto.
1473         (TestGroupForm.prototype.render): Ditto.
1474         * public/v3/index.html: Include triggerable.js.
1475         * public/v3/models/manifest.js:
1476         (Manifest._didFetchManifest): Modernized. Create Triggerable objects from the manifest JSON.
1477         * public/v3/models/triggerable.js: Added.
1478         (Triggerable): Add this triggerable object to the static map of (test id, platform id) pair.
1479         (Triggerable.prototype.acceptedRepositories): Added.
1480         (Triggerable.findByTestConfiguration): Added. Finds a triggerable in the aforementioned static map.
1481         * public/v3/pages/analysis-task-page.js:
1482         (AnalysisTaskChartPane.prototype._updateStatus): Added. Re-render the page since time series data
1483         points that were previously not available may have become available. The lack of this update was
1484         causing a race condition in which the "Start A/B Testing" button for the charts is disabled even
1485         after a group name had been specified because setRootSetMap was never called with a valid set.
1486         (AnalysisTaskPage): Added this._triggerable.
1487         (AnalysisTaskPage.prototype._didFetchTask): Find the triggerable now that we've fetched the task.
1488         (AnalysisTaskPage.prototype.render): Hide the group view (the table of A/B testing results) entirely
1489         when there are no groups to show. Also hide the forms to start A/B testing when there are no matching
1490         triggerable, which is the main feature of this patch.
1491         * server-tests/api-manifest.js: Added a test for including a list of triggerables in the manifest JSON.
1492         * server-tests/resources/mock-data.js:
1493         (MockData.resetV3Models): Reset Triggerable's static map.
1494         * server-tests/tools-buildbot-triggerable-tests.js: Assert that Triggerable objects are  constructed
1495         with appropriate list of repositories and (test, platform) associations.
1496         * tools/js/database.js:
1497         (tableToPrefixMap): Added triggerable_repositories's prefix.
1498         * tools/js/remote.js:
1499         (RemoteAPI.prototype.getJSON): Log the entire response to stderr when JSON.parse fails to aid debugging.
1500         * tools/js/v3-models.js: Import triggerable.js.
1501
1502 2017-01-11  Ryosuke Niwa  <rniwa@webkit.org>
1503
1504         fetch-from-remote doesn’t work with some websites
1505         https://bugs.webkit.org/show_bug.cgi?id=166963
1506
1507         Reviewed by Yusuke Suzuki.
1508
1509         Apparently file_get_contents is not compatible with some SSL/TLS connections.
1510         Use curl_* functions to access remote servers instead.
1511
1512         * public/admin/fetch-from-remote.php:
1513         (fetch_remote):
1514
1515 2017-01-10  Ryosuke Niwa  <rniwa@webkit.org>
1516
1517         Another build fix. Always use UTC when expressing commit times in UNIX-epoch timestamps.
1518
1519         * public/api/measurement-set.php:
1520
1521 2017-01-10  Ryosuke Niwa  <rniwa@webkit.org>
1522
1523         Fix a typo in the previous commit.
1524
1525         * public/api/measurement-set.php:
1526
1527 2017-01-10  Ryosuke Niwa  <rniwa@webkit.org>
1528
1529         Build fixes for older versions of Postgres.
1530
1531         Also redirect / and /# to /v3/ as intended in r200820.
1532
1533         * public/api/measurement-set.php:
1534         * public/api/runs.php:
1535         * public/index.html:
1536
1537 2016-10-18  Dewei Zhu  <dewei_zhu@apple.com>
1538
1539         Update test cases for change r206465.
1540         https://bugs.webkit.org/show_bug.cgi?id=163618
1541
1542         Reviewed by Ryosuke Niwa.
1543
1544         Update test case for change r206465 which added support for multiple summary pages.
1545         Use deepStrictEqual instead of deepEqual as deepEqual will not complain in the case like 'deepEqual([],{})'.
1546         Fix a test failure in tools-buildbot-triggerable-tests.js.
1547         Fix a bug in generating manifest.
1548
1549         * config.json:
1550         * public/include/manifest.php:
1551         * server-tests/api-manifest.js:
1552         (TestServer.remoteAPI.getJSON.string_appeared_here.then):
1553         * server-tests/tools-buildbot-triggerable-tests.js:
1554         (then):
1555
1556 2016-09-27  Dewei Zhu  <dewei_zhu@apple.com>
1557
1558         Extend perf dashboard to support multiple summary pages.
1559         https://bugs.webkit.org/show_bug.cgi?id=162594
1560
1561         Reviewed by Ryosuke Niwa.
1562
1563         Start support multiple summary pages instead of one.
1564         Specify 'summaryPages' as key that map to a list of summaries which follows
1565         current 'summary' format in 'config.json' but with 2 more properties:
1566            'name': specifying the name shows on perf dashboard,
1567            'route': specifying the path to this page.
1568
1569         * public/include/manifest.php:
1570         * public/v3/main.js:
1571         (main):
1572         (main.): Deleted.
1573         * public/v3/models/manifest.js:
1574         (Manifest._didFetchManifest):
1575         (Manifest):
1576         * public/v3/pages/summary-page.js:
1577         (SummaryPage):
1578         (SummaryPage.prototype.routeName):
1579
1580 2016-08-09  Ryosuke Niwa  <rniwa@webkit.org>
1581
1582         Don't filter out the latest data point in chart data sampling
1583         https://bugs.webkit.org/show_bug.cgi?id=160714
1584
1585         Reviewed by Chris Dumez.
1586
1587         Exclude the last data point from sampling so that it's always included in the "sampled" charts data.
1588         Without this, the last data point can change as we zoom out the time domain.
1589
1590         Luckily, we already had a mechanism to exclude the user selected point from sampling. Extend this
1591         feature by supporting an array of point IDs instead of a single ID to exclude from filering.
1592
1593         * public/v3/components/interactive-time-series-chart.js:
1594         (InteractiveTimeSeriesChart.prototype._sampleTimeSeries): Replaced exclusionPointID by excludedPoints. 
1595
1596         * public/v3/components/time-series-chart.js:
1597         (TimeSeriesChart.prototype._ensureSampledTimeSeries): Put the last data point in excludedPoints.
1598         (TimeSeriesChart.prototype._sampleTimeSeries): Check point's id against the list of IDs.
1599
1600 2016-08-09  Ryosuke Niwa  <rniwa@webkit.org>
1601
1602         Build fix after r204187. interval has to be a getter, not a method.
1603
1604         * public/v3/components/time-series-chart.js:
1605         (TimeSeriesChart.prototype._renderTimeSeries):
1606         * public/v3/models/measurement-adaptor.js:
1607         (MeasurementAdaptor.prototype.applyTo):
1608
1609 2016-08-09  Ryosuke Niwa  <rniwa@webkit.org>
1610
1611         Fix a typo that was supposed to be fixed in r204296 before landing.
1612
1613         * public/v3/pages/chart-pane.js:
1614         (ChartPane):
1615         (ChartPane.prototype.updateFromSerializedState):
1616         (ChartPane.prototype._analyzeRange):
1617         (ChartPane.prototype._renderTrendLinePopover):
1618         (ChartPane.prototype._trendLineTypeDidChange):
1619
1620 2016-08-08  Ryosuke Niwa  <rniwa@webkit.org>
1621
1622         Always show segmentation on v3 charts page
1623         https://bugs.webkit.org/show_bug.cgi?id=160576
1624
1625         Rubber-stamped by Chris Dumez.
1626
1627         Added "Trend Lines" popover to select and customize a moving average or a segmentation to show on charts page
1628         and made Schwarz criterion segmentation the default trend line for all charts.
1629
1630         Because computing the segmentation is expensive, we use WebWorker to parallelize the computation via AsyncTask.
1631         We also compute and cache the segmentation for each cluster separately to avoid processing the entire measurement
1632         set as that could take 10-20s total, which was a huge problem in v2 UI. v3 UI's approach is more incremental and
1633         even opens up an opportunity to cache the results in the server side.
1634
1635         Also brought back "shading" for the confidence interval drawing as done in v1 and v2 UI.
1636
1637         * public/shared/statistics.js:
1638         (Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion): Added segmentCountWeight and gridSize as arguments
1639         to customize the algorithm.
1640         (Statistics.splitIntoSegmentsUntilGoodEnough): Takes segmentCountWeight as BirgeAndMassartC.
1641
1642         * public/v3/async-task.js: Added.
1643         (AsyncTask): Added. This class represents a task such as computing segmentation to be executed in a worker.
1644         (AsyncTask.prototype.execute): Added. Returns a promise that gets resolved when the specified task completes.
1645         (AsyncTaskWorker.waitForAvailableWorker): Added. Calls the given callback with the first available worker. When
1646         all workers are processing some tasks, it waits until one becomes available by putting the callback into a queue.
1647         _didRecieveMessage pops an item out of this queue when a worker completes a task. We don't use a promise here
1648         because calling this function multiple times synchronously could result in all the returned promises getting
1649         resolved with the same worker as none of the callers get to lock away the first available worker until the end
1650         of the current micro-task.
1651         (AsyncTaskWorker._makeWorkerEventuallyAvailable): Added. A helper function for waitForAvailableWorker. Start
1652         a new worker if the number of workers we've started is less than the number of extra cores (e.g. 7 if there are
1653         8 cores on the machine). Avoid starting a new worker if we've started a new worker within the last 50 ms since
1654         starting a new worker takes some time.
1655         (AsyncTaskWorker._findAvailableWorker): Added. Finds a worker that's available right now if there is any.
1656         (AsyncTaskWorker): Added. An instance of AsyncTaskWorker represents a Web worker.
1657         (AsyncTaskWorker.prototype.id): Added.
1658         (AsyncTaskWorker.prototype.sendTask): Added. Sends a task represented by AsyncTask to the worker.
1659         (AsyncTaskWorker.prototype._didRecieveMessage): Added. This function gets called when the current task completes
1660         in the worker. Pop the next callback if some caller of waitForAvailableWorker is still waiting. Otherwise stop
1661         the worker after one second of waiting to avoid worker churning.
1662         (AsyncTaskWorker.workerDidRecieveMessage): Added. Called by onmessage on the worker. Executes the specified task
1663         and sends back a message upon completion with the appropriate timing data.
1664
1665         * public/v3/components/chart-pane-base.js:
1666         (ChartPaneBase.prototype.configure): Uses _createSourceList.
1667         (ChartPaneBase.prototype._createSourceList): Added. Extracted from configure to customize the source list for
1668         the main chart and the overview chart.
1669         (ChartPaneBase.prototype._updateSourceList): Uses _createSourceList.
1670
1671         * public/v3/components/chart-styles.js:
1672         (ChartStyles.createSourceList): Added a boolean showPoint as an extra argument. This specifies whether circles
1673         are drawn for each data point.
1674         (ChartStyles.baselineStyle): Added styles for foreground lines and background lines. They're used for trend lines
1675         and underlying raw data respectively when trend lines are shown.
1676         (ChartStyles.targetStyle): Ditto.
1677         (ChartStyles.currentStyle): Ditto.
1678
1679         * public/v3/components/time-series-chart.js:
1680         (TimeSeriesChart): Added _trendLines, _renderedTrendLines, and _fetchedTimeSeries as instance variables.
1681         (TimeSeriesChart.prototype.setSourceList): Clear _fetchedTimeSeries before calling setSourceList for consistency.
1682         (TimeSeriesChart.prototype.sourceList): Added.
1683         (TimeSeriesChart.prototype.clearTrendLines): Added.
1684         (TimeSeriesChart.prototype.setTrendLine): Added. Preserves the existing trend lines for other sources. This is
1685         necessary because segmentation for "current" and "baseline" lines may become available at different times, and we
1686         don't want to clear one or the other when setting one.
1687         (TimeSeriesChart.prototype._layout): Added a call to _ensureTrendLines.
1688         (TimeSeriesChart.prototype._renderChartContent): Call _renderTimeSeries for trend lines. Trend lines are always
1689         foreground lines and "regular" raw data points are drawn as background if there are trend lines.
1690         (TimeSeriesChart.prototype._renderTimeSeries): Added layerName as an argument. It could be an empty string,
1691         "foreground", or "background". Draw a "shade" just like v1 and v2 UI instead of vertical lines for the confidence
1692         intervals. Pick "foreground", "background", or "regular" chart style based on layerName. Also avoid drawing data
1693         points when *PointRadius is set to zero to reduce the runtime of this function.
1694         (TimeSeriesChart.prototype._sourceOptionWithFallback): Added.
1695         (TimeSeriesChart.prototype._ensureSampledTimeSeries): When *PointRadius is 0, show as many points as there are x
1696         coordinates as a fallback instead of showing every point.
1697         (TimeSeriesChart.prototype._ensureTrendLines): Added. Returns true if the chart contents haven't been re-rendered
1698         since the last update to trend lines. This flag is unset by setTrendLine.
1699
1700         * public/v3/index.html:
1701
1702         * public/v3/models/measurement-cluster.js:
1703         (MeasurementCluster.prototype.addToSeries): Store the data points' index to idMap to help aid MeasurementSet's
1704         _cachedClusterSegmentation efficiently re-create the segmentation from the cache.
1705
1706         * public/v3/models/measurement-set.js:
1707         (MeasurementSet): Added _segmentationCache as an instance variable.
1708         (MeasurementSet.prototype.fetchSegmentation): Added. Calls _cachedClusterSegmentation on each cluster, and
1709         constructs the time series representation of the segmentation from the results.
1710         (MeasurementSet.prototype._cachedClusterSegmentation): Computes and caches the segmentation for each cluster.
1711         The cache of segmentation stores ID of each measurement set at which segment changes instead of its index since
1712         the latter could change in any moment when a new test result is reported, or an existing test result is removed
1713         from the time series; e.g. when it's marked as an outlier.
1714         (MeasurementSet.prototype._validateSegmentationCache): Added. Checks whether the cached segmentation's name and
1715         its parameters match that of the requested one.
1716         (MeasurementSet.prototype._invokeSegmentationAlgorithm): Added. Invokes the segmentation algorithm either in the
1717         main thread or in a Web worker via AsyncTask API based on the size of the time series. While parallelizing the
1718         work is beneficial when the data set is large, the overhead can add up if we keep processing a very small data
1719         set in a worker.
1720
1721         * public/v3/models/time-series.js: Made the file compatible with Node.
1722         (TimeSeries.prototype.length): Added.
1723         (TimeSeries.prototype.valuesBetweenRange): Added.
1724
1725         * public/v3/pages/chart-pane.js:
1726         (createTrendLineExecutableFromAveragingFunction): Added.
1727         (ChartTrendLineTypes): Added. Similar to StatisticsStrategies (statistics-strategies.js) in v2 UI.
1728         (ChartPane): Added _trendLineType, _trendLineParameters, _trendLineVersion, and _renderedTrendLineOptions as
1729         instance variables.
1730         (ChartPane.prototype.serializeState): Serialize the trend line option. This format is compatible with v2 UI.
1731         (ChartPane.prototype.updateFromSerializedState): Ditto. Parsing is compatible with v2 UI except that we now have
1732         the default trend line set when the specified ID doesn't match an existing type ID.
1733         (ChartPane.prototype._renderActionToolbar): Added a call to _renderTrendLinePopover. This is the popover that
1734         specifies the type of a trend line to show as well as its parameters.
1735         (ChartPane.prototype._renderTrendLinePopover): Added. A popover for specifying and customizing a trend line.
1736         (ChartPane.prototype._trendLineTypeDidChange): Added. Called when a new trend line is selected.
1737         (ChartPane.prototype._defaultParametersForTrendLine): Added.
1738         (ChartPane.prototype._trendLineParameterDidChange): Added. Called when the trend lines' parameters are changed.
1739         (ChartPane.prototype._didFetchData): Added. Overrides the one in ChartPaneBase to trigger a trend line update.
1740         (ChartPane.prototype._updateTrendLine): Added. Update the trend line. Since segmentation can take an arbitrary
1741         long time, avoid updating trend lines if this function had been called again (possibly for a different trend line
1742         type or with different parameters) before the results become available; hence the versioning.
1743         (ChartPane.paneHeaderTemplate): Added the trend line popover.
1744         (ChartPane.cssTemplate): Added styles for the trend line popover. Also use a more opaque background color behind
1745         popovers when the -webkit-backdrop-filter property is not supported.
1746
1747         * public/v3/pages/dashboard-page.js:
1748         (DashboardPage.prototype._createChartForCell): Call createSourceList with showPoints set to true to preserve the
1749         existing behavior.
1750
1751         * tools/js/v3-models.js: Include TimeSeries object.
1752
1753         * unit-tests/measurement-set-tests.js: Added two test cases for MeasurementSet's fetchSegmentation.
1754
1755         * unit-tests/resources/almost-equal.js: Added.
1756         (almostEqual): Extracted out of statistics-tests.js.
1757
1758         * unit-tests/statistics-tests.js:
1759
1760 2016-08-05  Ryosuke Niwa  <rniwa@webkit.org>
1761
1762         segmentTimeSeriesByMaximizingSchwarzCriterion returns a bogus result on empty charts
1763         https://bugs.webkit.org/show_bug.cgi?id=160575
1764
1765         Rubber-stamped by Chris Dumez.
1766
1767         The bug was caused by an early return in segmentTimeSeriesByMaximizingSchwarzCriterion.
1768         Removed this early return as the one in splitIntoSegmentsUntilGoodEnough was sufficient.
1769
1770         Also factored out a few functions in findOptimalSegmentation so that they can be better
1771         optimized in JSC's DFG and FTL tiers, and removed unused debuggingTestingRangeNomination.
1772
1773         * public/shared/statistics.js:
1774         (Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion): Removed an early return.
1775         (Statistics.splitIntoSegmentsUntilGoodEnough):
1776         (.allocateCostUpperTriangularForSegmentation): Extracted from findOptimalSegmentation.
1777         (.allocatePreviousNodeForSegmentation): Ditto.
1778         (.findOptimalSegmentationInternal): Ditto.
1779         (.findOptimalSegmentation):
1780
1781         * unit-tests/statistics-tests.js: Added a test case.
1782
1783 2016-08-05  Ryosuke Niwa  <rniwa@webkit.org>
1784
1785         Perf dashboard sometimes tries to fetch a non-existent measurement-set JSON
1786         https://bugs.webkit.org/show_bug.cgi?id=160577
1787
1788         Rubber-stamped by Chris Dumez.
1789
1790         The bug was caused by findClusters computing the first cluster's endTime incorrectly. Namely, we were
1791         multiplying the number of clusters by clusterStart instead of clusterSize with an off-by-one error.
1792
1793         * public/v3/models/measurement-set.js:
1794         (MeasurementSet.prototype.findClusters): Folded computeClusterStart into where clusterEnd is computed
1795         for clarity. Also fixed a bug that we were not computing the first cluster to fetch correctly when
1796         the fetched time range started before clusterStart (i.e. when startTime - clusterStart is negative).
1797         Finally, fixed the main bug by multiplying the number of clusters by clusterSize instead of
1798         clusterStart to compute the end time of the very first cluster in this measurement set. Because what
1799         we're computing here is the end time of the first cluster, not the start time, we also need to subtract
1800         one from the number of clusters. e.g. if there was exactly one cluster, then firstClusterEndTime is
1801         identically equal to lastClusterEndTime.
1802         (MeasurementSet.prototype.fetchedTimeSeries): Removed the unused argument to TimeSeries's constructor.
1803
1804         * unit-tests/analysis-task-tests.js: Fixed the tests for the latest version of Mocha which complains if
1805         we returned a promise in unit tests when "done" function is used.
1806         * unit-tests/checkconfig.js: Ditto.
1807         * unit-tests/measurement-set-tests.js: Added a test case for findClusters and a test to make sure
1808         fetchBetween doesn't try to fetch a cluster before the first cluster in the set. Also fixed other test
1809         cases which were relying on the bug this patch fixed.
1810
1811 2016-08-04  Ryosuke Niwa  <rniwa@webkit.org>
1812
1813         MeasurementCluster's addToSeries is slow
1814         https://bugs.webkit.org/show_bug.cgi?id=160581
1815
1816         Rubber-stamped by Chris Dumez.
1817
1818         The bulk of time was spent in MeasurementAdaptor.prototype.applyTo where we computed the interval.
1819
1820         Since some of data points are filtered out by TimeSeriesChart component before intervals are used,
1821         we can significantly reduce the CPU time by lazily compute them. This patch reduces the runtime of
1822         applyTo from ~60ms to ~30ms on my machine.
1823
1824         * public/v3/models/measurement-adaptor.js:
1825         (MeasurementAdaptor.prototype.applyTo): Lazily compute and cache the interval. Also cache the build
1826         object instead of always creating a new object.
1827         * public/v3/models/measurement-cluster.js:
1828         (MeasurementCluster.prototype.addToSeries): Call applyTo first before checking whether the point is
1829         an outlier or its id to avoid extracting those values twice since they show up in the profiler. Also
1830         use "of" instead "forEach" since "of" seems to be faster here.
1831
1832 2016-08-04  Ryosuke Niwa  <rniwa@webkit.org>
1833
1834         Syncing script's configuration duplicates a lot of boilerplate
1835         https://bugs.webkit.org/show_bug.cgi?id=160574
1836
1837         Rubber-stamped by Chris Dumez.
1838
1839         This patch makes each configuration accept an array of platforms and types so that we can write:
1840
1841         {"type": "speedometer", "builder": "mba", "platform": "Trunk El Capitan MacBookAir"},
1842         {"type": "speedometer", "builder": "mbp", "platform": "Trunk El Capitan MacBookPro"},
1843         {"type": "speedometer", "builder": "mba", "platform": "Trunk Sierra MacBookAir"},
1844         {"type": "speedometer", "builder": "mbp", "platform": "Trunk Sierra MacBookPro"},
1845         {"type": "jetstream", "builder": "mba", "platform": "Trunk El Capitan MacBookAir"},
1846         {"type": "jetstream", "builder": "mbp", "platform": "Trunk El Capitan MacBookPro"},
1847         {"type": "jetstream", "builder": "mba", "platform": "Trunk Sierra MacBookAir"},
1848         {"type": "jetstream", "builder": "mbp", "platform": "Trunk Sierra MacBookPro"},
1849
1850         more concisely as:
1851
1852         {"builder": "mba", "types": ["speedometer", "jetstream"],
1853             "platforms": ["Trunk El Capitan MacBookAir", "Trunk Sierra MacBookAir"]},
1854         {"builder": "mbp", "types": ["speedometer", "jetstream"],
1855             "platforms": ["Trunk El Capitan MacBookPro", "Trunk Sierra MacBookPro"]},
1856
1857         * tools/js/buildbot-syncer.js:
1858         (BuildbotSyncer._loadConfig):
1859         (BuildbotSyncer._expandTypesAndPlatforms): Added. Clones a new configuration entry for each type
1860         and platform.
1861         (BuildbotSyncer._createTestConfiguration): Extracted from _loadConfig.
1862         (BuildbotSyncer._validateAndMergeConfig): Added a new argument that specifies a property that
1863         shouldn't be merged into the configuration. Also added the support for 'types' and 'platforms',
1864         and merged the code for verify an array of strings. Finally, allow the appearance of 'properties'
1865         since this function can now be called on a cloned configuration in which 'arguments' had already
1866         been renamed to 'properties'.
1867
1868         * unit-tests/buildbot-syncer-tests.js: Added a test case to parse a consolidated configuration.
1869         (sampleiOSConfigWithExpansions): Added.
1870
1871         * unit-tests/resources/mock-v3-models.js:
1872         (MockModels.inject): Added a few more mock models for the newly added test.
1873
1874 2016-07-26  Ryosuke Niwa  <rniwa@webkit.org>
1875
1876         REGRESSION: Tooltip for analysis tasks doesn't show up on charts
1877         https://bugs.webkit.org/show_bug.cgi?id=160221
1878
1879         Rubber-stamped by Chris Dumez.
1880
1881         The bug was caused by ChartPaneBase resetting annotation bars every time the current point has moved.
1882         Avoid doing this in ChartPaneBase's _renderAnnotations().
1883
1884         * public/v3/components/chart-pane-base.js:
1885         (ChartPaneBase):
1886         (ChartPaneBase.prototype.fetchAnalysisTasks):
1887         (ChartPaneBase.prototype._renderAnnotations):
1888
1889 2016-07-26  Ryosuke Niwa  <rniwa@webkit.org>
1890
1891         REGRESSION: The arrow indicating the current page doesn't get updated
1892         https://bugs.webkit.org/show_bug.cgi?id=160185
1893
1894         Reviewed by Chris Dumez.
1895
1896         The bug was caused by Heading's render() function not updating the DOM more than once. I don't understand
1897         how this has ever worked. Fixed the bug by rendering DOM whenever the current page has changed.
1898
1899         * public/v3/pages/heading.js:
1900         (Heading):
1901         (Heading.prototype.render):
1902
1903 2016-07-25  Ryosuke Niwa  <rniwa@webkit.org>
1904
1905         Build fix for Safari 9.
1906
1907         * public/v3/models/build-request.js:
1908         (BuildRequest.prototype.waitingTime): Don't use "const" in strict mode.
1909
1910 2016-07-23  Ryosuke Niwa  <rniwa@webkit.org>
1911
1912         Perf dashboard should show the list of a pending A/B testing jobs
1913         https://bugs.webkit.org/show_bug.cgi?id=160138
1914
1915         Rubber-stamped by Chris Dumez.
1916
1917         Add a page to show the list of A/B testing build requests per triggerable. Ideally, we would like to
1918         see a queue per builder but that would require changes to database tables and syncing scripts.
1919
1920         Because this page is most useful when the analysis task with which each build request is associated,
1921         JSON API at /api/build-requests/ has been modified to return the analysis task ID for each request.
1922
1923         Also streamlined the page that shows the list of analysis tasks per Chris' feedback by consolidating
1924         "Bisecting" and "Identified" into "Investigated" and moving the toolbar from the upper left corner
1925         inside the heading to right beneath the heading above the table. Also made the category page serialize
1926         the filter an user had typed in so that reloading the page doesn't clear it.
1927
1928         * public/api/analysis-tasks.php:
1929         (fetch_associated_data_for_tasks): Removed 'category' from the list of columns returned as the notion
1930         of 'category' is only relevant in UI, and it's better computed in the front-end.
1931         (format_task): Ditto.
1932         (determine_category): Deleted.
1933
1934         * public/api/test-groups.php:
1935         (main):
1936
1937         * public/include/build-requests-fetcher.php:
1938         (BuildRequestsFetcher::fetch_for_task): Include the analysis task ID in the rows.
1939         (BuildRequestsFetcher::fetch_for_group): Ditto. Ditto.
1940         (BuildRequestsFetcher::fetch_incomplete_requests_for_triggerable): Ditto.
1941         (BuildRequestsFetcher::results_internal): Ditto.
1942
1943         * public/v3/index.html:
1944
1945         * public/v3/main.js:
1946         (main): Create a newly introduced BuildRequestQueuePage as a subpage of AnalysisCategoryPage.
1947
1948         * public/v3/components/ratio-bar-graph.js:
1949         (RatioBarGraph.prototype.update): Fixed a bogus assertion here. ratio can be any number. The coercion
1950         into [-1, 1] is done inside RatioBarGraph's render() function.
1951
1952         * public/v3/models/analysis-task.js:
1953         (AnalysisTask.prototype.category): Moved the code to compute the analysis task's category from
1954         determine_category in analysis-tasks.php. Also merged "bisecting" and "identified" into "investigated".
1955         (AnalysisTask.categories): Merged "bisecting" and "identified" into "investigated".
1956
1957         * public/v3/models/build-request.js:
1958         (BuildRequest): Remember the triggerable and the analysis task associated with this request as well as
1959         the time at when this request was created.        
1960         (BuildRequest.prototype.analysisTaskId): Added.
1961         (BuildRequest.prototype.statusLabel): Use a shorter label: "Waiting" for "pending" status.
1962         (BuildRequest.prototype.createdAt): Added.
1963         (BuildRequest.prototype.waitingTime): Added. Returns a human readable time duration since the creation
1964         of this build request such as "2 hours 21 minutes" against a reference time.
1965         (BuildRequest.fetchTriggerables): Added.
1966         (BuildRequest.cachedRequestsForTriggerableID): Added. Used when navigating back to 
1967
1968         * public/v3/pages/analysis-category-page.js:
1969         (AnalysisCategoryPage): Construct AnalysisCategoryToolbar and store it in this._categoryToolbar since it
1970         no longer inherits from Toolbar class, which PageWithHeading recognizes and stores.
1971         (AnalysisCategoryPage.prototype.title):
1972         (AnalysisCategoryPage.prototype.serializeState): Added.
1973         (AnalysisCategoryPage.prototype.stateForCategory): Added. Include the filter in the serialization.
1974         (AnalysisCategoryPage.prototype.updateFromSerializedState): Restore the filter from the URL state.
1975         (AnalysisCategoryPage.prototype.filterDidChange): Added. Called by AnalysisCategoryToolbar to update
1976         the URL state in addition to calling render() as done previously via setFilterCallback.
1977         (AnalysisCategoryPage.prototype.render): Always call _categoryToolbar.render() since the hyperlinks for
1978         the category pages now include the filter, which can be updated in each call.
1979         (AnalysisCategoryPage.cssTemplate):
1980
1981         * public/v3/pages/analysis-category-toolbar.js:
1982         (AnalysisCategoryToolbar): Inherits from ComponentBase instead of Toolbar since AnalysisCategoryToolbar
1983         no longer works with Heading class unlike other subclasses of Toolbar class.
1984         (AnalysisCategoryToolbar.prototype.setCategoryPage): Added.
1985         (AnalysisCategoryToolbar.prototype.setFilterCallback): Deleted.
1986         (AnalysisCategoryToolbar.prototype.setFilter): Added. Used to restore from a serialized URL state.
1987         (AnalysisCategoryToolbar.prototype.render): Don't recreate the input element as it clears the value as
1988         well as the selection of the element. Also use AnalysisCategoryPage's stateForCategory to serialize the
1989         category name and the current filter for each hyperlink.
1990         (AnalysisCategoryToolbar.prototype._filterMayHaveChanged): Now takes an boolean argument specifying
1991         whether the URL state should be updated or not. We update the URL only when a change event is fired to
1992         avoid constantly updating it while an user is still typing.
1993         (AnalysisCategoryToolbar.cssTemplate): Added.
1994         (AnalysisCategoryToolbar.htmlTemplate): Added a button to open the newly added queue page.
1995
1996         * public/v3/pages/build-request-queue-page.js:
1997         (BuildRequestQueuePage): Added.
1998         (BuildRequestQueuePage.prototype.routeName): Added.
1999         (BuildRequestQueuePage.prototype.pageTitle): Added.
2000         (BuildRequestQueuePage.prototype.open): Added. Fetch open build requests for every triggerables using
2001         the same API as the syncing scripts.
2002         (BuildRequestQueuePage.prototype.render): Added.
2003         (BuildRequestQueuePage.prototype._constructBuildRequestTable): Added. Construct a table for the list of
2004         pending, scheduled or running build requests in the order syncing scripts would see. Note that the list
2005         of build requests returned by /api/build-requests/* can contain completed, canceled, or failed requests
2006         since the JSON returns all build requests associated with each test group if one of the requests of the
2007         group have not finished. This helps syncing scripts picking the right builder for A/B testing when it
2008         had previously been unloaded or crashed in the middle of processing a test group. This characteristics
2009         of the API actually helps us here because we can reliably compute the total number of build requests in
2010         the group. The first half of this function does this counting as well as collapses all but the first
2011         unfinished build requests into a "contraction" row, which just shows the number of build requests that
2012         are remaining in the group.
2013         (BuildRequestQueuePage.cssTemplate): Added.
2014         (BuildRequestQueuePage.htmlTemplate): Added.
2015
2016         * public/v3/pages/summary-page.js:
2017         (SummaryPage.prototype.open): Use one-day median instead of seven-day median to compute the status.
2018         (SummaryPageConfigurationGroup): Initialize _ratio to NaN. This was causing assertion failures in
2019         RatioBarGraph's update() while measurement sets are being fetched.
2020
2021         * server-tests/api-build-requests-tests.js: Updated the tests per change in BuildRequest's statusLabel.
2022         * unit-tests/analysis-task-tests.js: Ditto.
2023         * unit-tests/test-groups-tests.js: Ditto.
2024         * unit-tests/build-request-tests.js: Added tests for BuildRequest's waitingTime.
2025
2026 2016-07-22  Ryosuke Niwa  <rniwa@webkit.org>
2027
2028         REGRESSION(r203035): Marking points as an outlier no longer updates charts
2029         https://bugs.webkit.org/show_bug.cgi?id=160106
2030
2031         Reviewed by Darin Adler.
2032
2033         The bug was caused by MeasurementSet's fetchBetween clearing previously registered callbacks when noCache
2034         option is specified.
2035
2036         * public/v3/components/time-series-chart.js:
2037         (TimeSeriesChart.prototype.setSourceList): Clear this._fetchedTimeSeries when changing chart options.
2038         e.g. need to start including or excluding outliers.
2039         (TimeSeriesChart.prototype.fetchMeasurementSets): Don't skip the fetching when noCache is true.
2040
2041         * public/v3/models/measurement-set.js:
2042         (MeasurementSet): Added this._callbackMap as an instance variable to keep track of all callbacks on every
2043         cluster since we may need to call each callback multiple times per cluster when noCache option is used.
2044         (MeasurementSet.prototype.fetchBetween): Moved the code to add _primaryClusterPromise to _allFetches here
2045         so that now this function and _ensureClusterPromise are only functions that touch _allFetches.
2046         (MeasurementSet.prototype._ensureClusterPromise): Extracted out of fetchBetween. Queue up all callbacks
2047         for each cluster when creating a new promise.
2048         (MeasurementSet.prototype._fetchPrimaryCluster): Removed the code to add _primaryClusterPromise now that
2049         it's done in fetchBetween.
2050
2051         * public/v3/remote.js:
2052         (RemoteAPI.postJSONWithStatus): Removed superfluous call to console.log.
2053
2054         * unit-tests/measurement-set-tests.js: Updated the test case for noCache. The callback registered before
2055         fetchBetween is called with noCache=true is now invoked so callCount must be 3 instead of 2.
2056
2057 2016-07-19  Ryosuke Niwa  <rniwa@webkit.org>
2058
2059         Perf dashboard always re-generate measurement set JSON
2060         https://bugs.webkit.org/show_bug.cgi?id=159951
2061
2062         Reviewed by Chris Dumez.
2063
2064         The bug was caused by manifest.json reporting the last modified date of a measurement set in floating point,
2065         and a measurement set JSON reporting it as an integer. Fixed the bug by always using an integer.
2066
2067         * public/api/measurement-set.php:
2068         (main): Return 404 when the results is empty.
2069         (MeasurementSetFetcher::execute_query): Use "extract(epoch from commit_time)" like ManifestGenerator to improve
2070         the generation speed. This is ~10% runtime improvement.
2071         (MeasurementSetFetcher::format_map): Updated to reflect the above change.
2072         (MeasurementSetFetcher::parse_revisions_array): Ditto.
2073
2074         * public/include/manifest.php:
2075         (ManifestGenerator::platforms): Fixed the bug by coercing lastModified to integer (instead of float).
2076
2077         * server-tests/api-measurement-set-tests.js: Added a test case for returning empty results, and a test case for
2078         making sure lastModified dates in manifest.json and measurement sets match.
2079
2080         * tools/js/remote.js:
2081         (RemoteAPI.prototype.sendHttpRequest): Reject the promise when HTTP status code is not 200.
2082
2083 2016-07-09  Ryosuke Niwa  <rniwa@webkit.org>
2084
2085         Perf dashboard can consume 50-70% of CPU on MacBook even if user is not interacting at all
2086         https://bugs.webkit.org/show_bug.cgi?id=159597
2087
2088         Reviewed by Chris Dumez.
2089
2090         TimeSeriesChart and InteractiveTimeSeriesChart had been relying on continually polling on requestAnimationFrame
2091         to update itself in response to its canvas resizing. Even though there as an early exit in the case there was
2092         nothing to update, this is still causing a significant power drain when the user is not interacting at all.
2093
2094         Let TimeSeriesChart use the regular top-down render path like other components with exceptions of listening to
2095         window's resize eventas well as when new JSONs are fetched from the server. The render() call to the latter case
2096         will be coerced into a single callback on requestAnimationFrame to avoid DOM-mutation-layout churn.
2097
2098         * public/v3/components/base.js:
2099         (ComponentBase.isElementInViewport): Deleted.
2100         * public/v3/components/chart-pane-base.js:
2101         (ChartPaneBase.prototype.render): Enqueue charts to render.
2102         * public/v3/components/chart-styles.js:
2103         (ChartStyles.dashboardOptions): Removed updateOnRequestAnimationFrame which is no longer an available option.
2104         * public/v3/components/time-series-chart.js:
2105         (TimeSeriesChart): Replaced the code to register itself for rAF by the code to listen to resize events on window.
2106         (TimeSeriesChart._updateOnRAF): Deleted.
2107         (TimeSeriesChart._updateAllCharts): Added.
2108         (TimeSeriesChart.prototype._enqueueToRender): Added.
2109         (TimeSeriesChart._renderEnqueuedCharts): Added.
2110         (TimeSeriesChart.prototype.fetchMeasurementSets): Avoid calling fetchBetween when the range had been fetched.
2111         Without this change, we can incur a significant number of redundant calls to render() when adjusting the domain
2112         in charts page by the slider. When no new JSON is fetched, simply enqueue this chart to render on rAF.
2113         (TimeSeriesChart.prototype._didFetchMeasurementSet): Enqueue this chart to render on rAF.
2114         (TimeSeriesChart.prototype.render): Removed the check for isElementInViewport since we no longer get render() call
2115         when this chart moves into the viewport (as we no longer listen to every rAF or scroll event).
2116         * public/v3/models/measurement-set.js:
2117         (MeasurementSet.prototype.hasFetchedRange): Fixed various bugs revealed by the new use in fetchMeasurementSets.
2118         * public/v3/pages/chart-pane-status-view.js:
2119         (ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Removed the dead code. It was probably
2120         copied from when this code was in InteractiveTimeSeries chart. There is no this._forceRender in this component.
2121         * public/v3/pages/dashboard-page.js:
2122         (DashboardPage.prototype.render): Enqueue charts to render. 
2123         * public/v3/pages/heading.js:
2124         (SummaryPage.prototype.open): Removed the call to isElementInViewport. This wasn't really doing anything useful in
2125         this component.
2126         * unit-tests/measurement-set-tests.js: Added tests for hasFetchedRange.
2127         (.waitForMeasurementSet): Moved to be used in a newly added test case.
2128
2129 2016-07-09  Ryosuke Niwa  <rniwa@webkit.org>
2130
2131         REGRESSION: manifest.json generation takes multiple seconds on perf dashboard
2132         https://bugs.webkit.org/show_bug.cgi?id=159596
2133
2134         Reviewed by Chris Dumez.
2135
2136         The most of CPU time was spent looking for a duplicate entry in an array of metrics by array_search.
2137         This patch moves to postgres by using aggregate functions in the query. Also moved the code to convert
2138         datetime to UNIX epoch timestamp from PHP to within postgres query.
2139
2140         These improvements reduce total runtime of Manifest::generate from ~4s to ~350ms on my machine.
2141
2142         * public/include/manifest.php:
2143         (Manifest::generate): No longer fetches test_configurations table as this is done in Manifest::platforms now.
2144         Also moved calls to each method in the class to separate lines for easier instrumentation.
2145         (Manifest::platforms): Group test configurations (current, baseline, target) by platform and metric.
2146         Use the max of the last modified dates in UNIX epoch timestamps (ms to be compatible with JS's representation).
2147         A given platform, metric pair is considered to be in the v1 dashboard if any test configuration is in.
2148
2149 2016-07-08  Ryosuke Niwa  <rniwa@webkit.org>
2150
2151         bundle-v3-scripts.py should compress HTML/CSS templates
2152         https://bugs.webkit.org/show_bug.cgi?id=159582
2153
2154         Reviewed by Joseph Pecoraro.
2155
2156         Strip leading and trailing whitespaces from HTML and CSS templates. This is a 8% progression on the file size.
2157
2158         * Install.md: Updated the list of MIME types to apply deflate for newer versions of Apache.
2159         * tools/bundle-v3-scripts.py:
2160         (main):
2161         (compress_template): Added.
2162
2163 2016-06-13  Ryosuke Niwa  <rniwa@webkit.org>
2164
2165         Build fix. Strip out "use strict" everywhere so that the perf dashboard works on the shipping Safari.
2166
2167         * tools/bundle-v3-scripts.py:
2168         (main):
2169
2170 2016-06-13  Ryosuke Niwa  <rniwa@webkit.org>
2171
2172         Invalid token error when trying to create an A/B analysis for a range
2173         https://bugs.webkit.org/show_bug.cgi?id=158679
2174
2175         Reviewed by Chris Dumez.
2176
2177         The problem in this particular case was due to another website overriding cookies for our subdomain.
2178         Make PrivilegedAPI robust against its token becoming invalid in general to fix the bug since the cookie
2179         is only available under /privileged-api/ and the v3 UI can't access it for security reasons.
2180
2181         This patch factors out PrivilegedAPI out of remote.js so that it can be tested separately in server tests
2182         as well as unit tests even though RemoteAPI itself is implemented differently in each case.
2183
2184         * init-database.sql: Added a forgotten default value "false" to run_marked_outlier.
2185         * public/v3/index.html:
2186         * public/v3/privileged-api.js: Added. Extracted out of public/v3/remote.js.
2187         (PrivilegedAPI.sendRequest): Fixed the bug. When the initial request fails with "InvalidToken" error,
2188         re-generate the token and re-issue the request.
2189         (PrivilegedAPI.requestCSRFToken):
2190         * public/v3/remote.js:
2191         (RemoteAPI.postJSON): Added to match tools/js/remote.js.
2192         (RemoteAPI.postJSONWithStatus): Ditto.
2193         (PrivilegedAPI): Moved to privileged-api.js.
2194         * server-tests/api-measurement-set-tests.js: Removed the unused require for crypto.
2195         * server-tests/privileged-api-upate-run-status.js: Added tests for /privileged-api/update-run-status.
2196         * server-tests/resources/test-server.js:
2197         (TestServer.prototype.inject): Clear the cookies as well as tokens in PrivilegedAPI.
2198         * tools/js/remote.js:
2199         (RemoteAPI): Added the support for PrivilegedAPI by making cookie set by the server persist.
2200         (RemoteAPI.prototype.clearCookies): Added for tests.
2201         (RemoteAPI.prototype.postJSON): Make sure sendHttpRequest always sends a valid JSON.
2202         (RemoteAPI.prototype.postJSONWithStatus): Added since this API is used PrivilegedAPI.
2203         (RemoteAPI.prototype.sendHttpRequest): Retain the cookie set by the server and send it back in each request.
2204         * tools/js/v3-models.js:
2205         * unit-tests/privileged-api-tests.js: Added unit tests for PrivilegedAPI.
2206         * unit-tests/resources/mock-remote-api.js:
2207         (MockRemoteAPI.postJSON): Added for unit testing.
2208         (MockRemoteAPI.postJSONWithStatus): Ditto.
2209
2210 2016-06-13  Ryosuke Niwa  <rniwa@webkit.org>
2211
2212         /admin/tests is very slow
2213         https://bugs.webkit.org/show_bug.cgi?id=158682
2214
2215         Reviewed by Chris Dumez.
2216
2217         The slowness came from TestNameResolver::__construct, which was fetching the entire table of test_configurations,
2218         which at this point contains more than 32,000 rows. Don't fetch the entire table in the constructor. Instead,
2219         fetch a subset of rows as needed in configurations_for_metric_and_platform. Even though this results in many SQL
2220         queries being issued, that's a lot more efficient in practice because we only fetch a few dozen rows in practice.
2221
2222         Also removed a whole bunch of features from /admin/tests to simplify the page. In particular, the ability to update
2223         the list of triggerables has been removed now that sync-buildbot.js automatically updates that for us. This removed
2224         the last use of test_exists_on_platform, which was also dependent on fetching test_configurations upfront.
2225
2226         * public/admin/tests.php:
2227         * public/include/test-name-resolver.php:
2228         (TestNameResolver::__construct): Don't fetch the entire table of test_configurations.
2229         (TestNameResolver::configurations_for_metric_and_platform): Just issue a SQL query for the specified platform and metric.
2230         (TestNameResolver::test_exists_on_platform): Removed.
2231
2232 2016-06-08  Ryosuke Niwa  <rniwa@webkit.org>
2233
2234         sync-buildbot.js should update the list of tests and platforms associated with a triggerable
2235         https://bugs.webkit.org/show_bug.cgi?id=158406
2236
2237         Reviewed by Chris Dumez.
2238
2239         Add /api/update-triggerable and a test for it, which were supposed to be added in r201718
2240         but for which I forgot to run svn add.
2241
2242         * public/api/update-triggerable.php: Added.
2243         (main):
2244         * server-tests/api-update-triggerable.js: Added.
2245
2246 2016-06-07  Ryosuke Niwa  <rniwa@webkit.org>
2247
2248         Build fix after r201739. attachShadow was throwing an exception on this component.
2249
2250         * public/v3/pages/analysis-category-toolbar.js:
2251         (AnalysisCategoryToolbar):
2252
2253 2016-06-06  Ryosuke Niwa  <rniwa@webkit.org>
2254
2255         sync-buildbot.js should update the list of tests and platforms associated with a triggerable
2256         https://bugs.webkit.org/show_bug.cgi?id=158406
2257         <rdar://problem/26185737>
2258
2259         Reviewed by Darin Adler.
2260
2261         Added /api/update-triggerable to update the list of configurations (platform and test pairs)
2262         associated with a given triggerable, and make sync-buildbot.js use this JSON API before each
2263         syncing cycle so that the association gets updated automatically by simply updating the JSON.
2264
2265         * server-tests/api-manifest.js: Use const for imported modules.
2266         * server-tests/api-report-commits-tests.js: Removed unnecessary importing of crypto.
2267         * server-tests/resources/mock-data.js:
2268         (MockData.someTestId): Added.
2269         (MockData.somePlatformId): Added.
2270         (MockData.addMockData):
2271         * server-tests/tools-buildbot-triggerable-tests.js: Use const for imported modules. Also added
2272         a test for BuildbotTriggerable's updateTriggerable.
2273         * tools/js/buildbot-triggerable.js:
2274         (BuildbotTriggerable.prototype.updateTriggerable): Added. Find the list of all configurations
2275         associated with this triggeerable and post it to /api/update-triggerable.
2276         * tools/js/database.js: Added triggerable_configurations to the list of tables.
2277         * tools/js/remote.js:
2278         (RemoteAPI.prototype.postJSON): Print the whole response when JSON parsing fails for debugging.
2279         * tools/sync-buildbot.js:
2280         (syncLoop): Call BuildbotTriggerable's updateTriggerable before syncing.
2281
2282 2016-06-02  Ryosuke Niwa  <rniwa@webkit.org>
2283
2284         Build fix after r201564.
2285
2286         * public/v3/pages/analysis-category-page.js:
2287         (AnalysisCategoryPage.prototype.updateFromSerializedState):
2288         * public/v3/pages/create-analysis-task-page.js:
2289         (CreateAnalysisTaskPage.prototype.updateFromSerializedState):
2290         (CreateAnalysisTaskPage.prototype.render):
2291
2292 2016-05-31  Ryosuke Niwa  <rniwa@webkit.org>
2293
2294         v3 UI should support marking and unmarking outliers as well as hiding them
2295         https://bugs.webkit.org/show_bug.cgi?id=158248
2296
2297         Rubber-stamped by Chris Dumez.
2298
2299         Added the support for marking and unmarking a sequence of points as outliers. Unlike v2, we now support marking
2300         multiple points as outliers in a single click. Also fixed a bug that outliers are never explicitly hidden in v3 UI.
2301
2302         This patch splits ChartStyles.createChartSourceList into two functions: resolveConfiguration and createSourceList
2303         to separate the work of resolving platform and metric IDs to their respective model objects, and creating a source
2304         list used by TimeSeriesChart to fetch measurement sets. createSourceList is called again when filtering options are
2305         changed.
2306
2307         It also adds noCache option to TimeSeriesChart's fetchMeasurementSets, MeasurementSet's fetchBetween and
2308         _fetchPrimaryCluster to update the measurement sets after marking or unmarking points as outliers. In addition, it
2309         fixes a bug that the annotation bars for analysis tasks are not updated in charts page after creating an analysis
2310         task by adding noCache option to ChartPaneBase's fetchAnalysisTasks, AnalysisTask's fetchByPlatformAndMetric and
2311         _fetchSubset.
2312
2313         Finally, this patch splits ChartPane._makeAnchorToOpenPane into _makePopoverActionItem, _makePopoverOpenOnHover and
2314         _setPopoverVisibility for clarity.
2315
2316         * public/v3/components/chart-pane-base.js:
2317         (ChartPaneBase): Added _disableSampling and _showOutliers as instance variables.
2318         (ChartPaneBase.prototype.configure):
2319         (ChartPaneBase.prototype.isSamplingEnabled): Added.
2320         (ChartPaneBase.prototype.setSamplingEnabled): Added. When a filtering option is updated, recreate the source list
2321         so that TimeSeriesChart.setSourceList can re-fetch the measurement set JSONs.
2322         (ChartPaneBase.prototype.isShowingOutliers): Added.
2323         (ChartPaneBase.prototype.setShowOutliers): Added. Ditto for calling _updateSourceList.
2324         (ChartPaneBase.prototype._updateSourceList): Added.
2325         (ChartPaneBase.prototype.fetchAnalysisTasks): Renamed from _fetchAnalysisTasks. Now takes noCache as an argument
2326         instead of platform and metric IDs since they're on instance variables.
2327
2328         * public/v3/components/chart-styles.js:
2329         (ChartStyles.resolveConfiguration): Renamed from createChartSourceList. Just resolves platform and metric IDs.
2330         (ChartStyles.createSourceList): Extracted from createChartSourceList since it needs to be called when a filtering
2331         option is changed as well as when ChartPaneBase.prototype.configure is called.
2332         (ChartStyles.baselineStyle): Now takes filtering options.
2333         (ChartStyles.targetStyle): Ditto.
2334         (ChartStyles.currentStyle): Ditto.
2335
2336         * public/v3/components/interactive-time-series-chart.js:
2337         (InteractiveTimeSeriesChart.prototype.currentPoint): Find the point in _fetchedTimeSeries when
2338         _sampledTimeSeriesData hasn't been computed yet as a fallback (e.g. when the chart hasn't been rendered yet).
2339         (InteractiveTimeSeriesChart.prototype.selectedPoints): Added.
2340         (InteractiveTimeSeriesChart.prototype.firstSelectedPoint): Added.
2341         (InteractiveTimeSeriesChart.prototype.lockedIndicator): Added. Returns the current point if it's locked.
2342
2343         * public/v3/components/time-series-chart.js:
2344         (TimeSeriesChart.prototype.setDomain):
2345         (TimeSeriesChart.prototype.setSourceList): Added. Re-create _fetchedTimeSeries when filtering options have changed.
2346         Don't re-fetch measurement set JSONs here since showing outliers can be done entirely in the front end.
2347         (TimeSeriesChart.prototype.fetchMeasurementSets): Extracted out of setDomain. Now takes noCache as an argument.
2348         ChartPane._markAsOutlier
2349         (TimeSeriesChart.prototype.firstSampledPointBetweenTime): Added.
2350
2351         * public/v3/models/analysis-task.js:
2352         (AnalysisTask.fetchByPlatformAndMetric): Added noCache as an argument.
2353         (AnalysisTask._fetchSubset): Ditto.
2354
2355         * public/v3/models/measurement-adaptor.js:
2356         (MeasurementAdaptor.prototype.isOutlier): Added.
2357         (MeasurementAdaptor.prototype.applyToAnalysisResults): Add markedOutlier as a property on each point.
2358
2359         * public/v3/models/measurement-cluster.js:
2360         (MeasurementCluster.prototype.addToSeries): Fixed the bug that filtering outliers was broken as _markedOutlierIndex
2361         is undefined here. Use MeasurementAdaptor's isOutlier instead.
2362
2363         * public/v3/models/measurement-set.js:
2364         (MeasurementSet.prototype.fetchBetween): Added noCache as an argument. Reset _primaryClusterPromise and _allFetches
2365         when noCache is true since we need to re-fetch the primary cluster as well as all secondary clusters now.
2366         (MeasurementSet.prototype._fetchPrimaryCluster): Added noCache as an argument. Directly invoke the JSON API at
2367         /api/measurement-set to re-generate all clusters' JSON files instead of first fetching the cached version.
2368         (MeasurementSet.prototype._fetchSecondaryCluster):
2369         (MeasurementSet.prototype._didFetchJSON): Removed a bogus assertion since this function is called on secondary
2370         clusters as well as primary clusters.
2371         (MeasurementSet.prototype._addFetchedCluster): Reimplemented this function using an insertion sort. Also remove the
2372         existing entry if the fetch cluster should replace it.
2373
2374         * public/v3/models/time-series.js:
2375         (TimeSeries.prototype.dataBetweenPoints): Removed the dead code to filter out outliers. This is done in addToSeries
2376         of MeasurementCluster instead.
2377
2378         * public/v3/pages/chart-pane.js:
2379         (ChartPane): Renamed pane to popover since it was confusing to have a pane inside a pane class. As such, renamed
2380         _paneOpenedByClick to _lockedPopover.
2381         (ChartPane.prototype.serializeState): Added the code to serialize filtering options in the serialized state URL.
2382         (ChartPane.prototype.updateFromSerializedState): Ditto for parsing.
2383         (ChartPane.prototype._analyzeRange): Extracted out of render(). Also fixed a bug that the charts page don't show
2384         the newly created analysis task by invoking fetchAnalysisTasks with noCache set to true.
2385         (ChartPane.prototype._markAsOutlier): Added.
2386         (ChartPane.prototype._renderActionToolbar): A bunch of changes due to pane -> popover rename. Also added a popover
2387         for filtering options.
2388         (ChartPane.prototype._makePopoverActionItem): Extracted from _makeAnchorToOpenPane.
2389         (ChartPane.prototype._makePopoverOpenOnHover): Ditto.
2390         (ChartPane.prototype._setPopoverVisibility): Ditto.
2391         (ChartPane.prototype._renderFilteringPopover): Added.
2392         (ChartPane.htmlTemplate): Added a popover for specifying filtering options. Also added .popover on each popover.
2393         (ChartPane.cssTemplate): Updated the style to make use of .popover.
2394
2395         * public/v3/pages/charts-page.js:
2396         (ChartsPage.prototype.graphOptionsDidChange): Added. Updates the URL state when a filtering option is modified.
2397
2398         * public/v3/pages/dashboard-page.js:
2399         (DashboardPage.prototype._createChartForCell):
2400
2401         * public/v3/pages/page-router.js:
2402         (PageRouter.prototype._serializeHashQueryValue): Serialize a set of strings as | separated tokens.
2403         (PageRouter.prototype._deserializeHashQueryValue): Rewrote the function as the serialized URL can no longer be
2404         parsed as a JSON as | separated tokens can't be converted into a valid JSON construct with a simple regex.
2405
2406         * unit-tests/measurement-set-tests.js: Added a test case for fetchBetween with noCache=true.
2407
2408 2016-05-24  Ryosuke Niwa  <rniwa@webkit.org>
2409
2410         Another build fix after r201307.
2411
2412         * public/v3/pages/page-router.js:
2413         (PageRouter.prototype._deserializeHashQueryValue):
2414         (PageRouter.prototype._countOccurrences): Moved from _deserializeHashQueryValue.
2415
2416 2016-05-23  Ryosuke Niwa  <rniwa@webkit.org>
2417
2418         Build fix after r201307.
2419
2420         * public/v3/pages/chart-pane.js:
2421         (ChartPane.prototype.serializeState):
2422
2423 2016-05-23  Ryosuke Niwa  <rniwa@webkit.org>
2424
2425         Some applications truncates the last closing parenthesis in perf dashboard URL
2426         https://bugs.webkit.org/show_bug.cgi?id=157976
2427
2428         Reviewed by Tim Horton.
2429
2430         Unfortunately, different applications use different heuristics to determine the end of each URL. Two trailing
2431         parentheses, for example, is just fine in Radar as well as Apple Mail if the URL is short enough. Using other
2432         characters such as ] and } wouldn't work either because they would be %-escaped. At that point, we might as well
2433         as %-escape everything.
2434
2435         Work around the bug by parsing the URL as if it had one extra ')' if the parsing had failed. Also shorten the charts
2436         page's URL by avoid emitting "-null" for each pane when the pane doesn't have a currently selected point or selection.
2437         This improves the odds of the entire URL being recognized by various applications.
2438
2439         We could, in theory, implement some sort of a URL shorter but that can wait until when we support real user accounts.
2440
2441         * public/v3/pages/chart-pane.js:
2442         (ChartPane.prototype.serializeState): Don't serialize the selection or the current point if nothing is selected.
2443         * public/v3/pages/page-router.js:
2444         (PageRouter.prototype._deserializeHashQueryValue): Try parsing the value again with one extra ] at the end if
2445         the JSON parsing had failed.
2446
2447 2016-05-18  Ryosuke Niwa  <rniwa@webkit.org>
2448
2449         Perf dashboard "Add pane" should list first by test, then by machine
2450         https://bugs.webkit.org/show_bug.cgi?id=157880
2451
2452         Reviewed by Stephanie Lewis.
2453
2454         Reversed the order which tests and platforms are selected. Also split .pane-selector-container into #tests and
2455         #platform for the ease of DOM node manipulations.
2456
2457         * public/v3/components/pane-selector.js:
2458         (PaneSelector):
2459         (PaneSelector.prototype._renderPlatformList): Renamed from _renderPlatformLists since there is a single list
2460         for platforms. This list now disappears while a non-metric item is selected in the collection of test lists.
2461         e.g. "Speedometer" instead of its "Score" metric. Remember the last metric we rendered to avoid churning.
2462         (PaneSelector.prototype._renderTestLists): Render the top level tests once. The index of lists have been
2463         decreased by one since test lists are now inside #tests instead of appearing after the platform list.
2464         (PaneSelector.prototype._buildTestList): Don't filter tests since platform is chosen after tests now.
2465         (PaneSelector.prototype._replaceList):
2466         (PaneSelector.prototype._selectedItem): Don't reset the test path (specifies which subtest or metric is picked)
2467         when a platform is selected since it happens after a test metric is chosen now.
2468         (PaneSelector.prototype._clickedItem): Add a pane when a platform is clicked, not when a metric is clicked.
2469         (PaneSelector.cssTemplate):
2470
2471 2016-05-18  Ryosuke Niwa  <rniwa@webkit.org>
2472
2473         Analysis task should look for a git commit based on abridged hashes
2474         https://bugs.webkit.org/show_bug.cgi?id=157877
2475         <rdar://problem/26254374>
2476
2477         Reviewed by Chris Dumez.
2478
2479         Made /privileged-api/associate-commit look for commits using LIKE instead of an exact match.
2480         Associate the commit when there is exactly one match.
2481
2482         * public/include/commit-log-fetcher.php:
2483         (CommitLogFetcher::fetch_between):
2484         * public/include/db.php:
2485         (Database::escape_for_like): Extracted from CommitLogFetcher::fetch_between.
2486         * public/privileged-api/associate-commit.php:
2487         (main): Look for the commits using LIKE. Reject whenever there are multiple commits. We limit the number of
2488         matches to two for performance when the user specifies something that almost thousands of commits: e.g. "1".
2489         * public/v3/pages/analysis-task-page.js:
2490         (AnalysisTaskPage.prototype._associateCommit): Added human friendly error messages for mismatching commits.
2491
2492 2016-05-18  Ryosuke Niwa  <rniwa@webkit.org>
2493
2494         Unreviewed build fix. Use --date-order so that every child commit appears after its parent.
2495         Otherwise we'll hit a FailedToFindParentCommit error while submitting a commit that appears before its parent.
2496
2497         * tools/sync-commits.py:
2498         (GitRepository._fetch_all_hashes):
2499
2500 2016-05-18  Ryosuke Niwa  <rniwa@webkit.org>
2501
2502         Removed the erroneously committed debug code.
2503
2504         * tools/sync-commits.py:
2505         (GitRepository.fetch_commit):
2506
2507 2016-05-18  Ryosuke Niwa  <rniwa@webkit.org>
2508
2509         Perf dashboard should have a script to sync git commits
2510         https://bugs.webkit.org/show_bug.cgi?id=157867
2511
2512         Reviewed by Chris Dumez.
2513
2514         Added the support to pull from a Git repo to pull-svn.py and renamed it to sync-commits.py.
2515
2516         Added two classes SVNRepository and GitRepository which inherits from an abstract class, Repository.
2517         The code that fetches commit and format revision number / git hash is specialized in each.
2518
2519         * Install.md:
2520         * tools/pull-svn.py: Removed.
2521         * tools/sync-commits.py: Renamed from Websites/perf.webkit.org/tools/pull-svn.py.
2522         (main): Renamed --svn-config-json to --repository-config-json. Also made it robust against exceptions
2523         inside fetch_commits_and_submit of each Repository class.
2524         (load_repository): A factory function for SVNRepository and GitRepository.
2525         (Repository): Added.
2526         (Repository.__init__): Added.
2527         (Repository.fetch_commits_and_submit): Extracted from standalone fetch_commits_and_submit.
2528         (Repository.fetch_commit): Added. Implemented by a subclass.
2529         (Repository.format_revision): Ditto.
2530         (Repository.determine_last_reported_revision): Extracted from alonealone
2531         determine_first_revision_to_fetch. The fallback to use "oldest" has been moved to SVNRepository's
2532         fetch_commit since it doesn't work in Git.
2533         (Repository.fetch_revision_from_dasbhoard): Extracted from fetch_revision_from_dasbhoard.
2534         (SVNRepository): Added.
2535         (SVNRepository.__init__): Added.
2536         (SVNRepository.fetch_commit): Extracted from standalone fetch_commit_and_resolve_author and fetch_commit.
2537         (SVNRepository._resolve_author_name): Renamed from resolve_author_name_from_account.
2538         (SVNRepository.format_revision): Added.
2539         (GitRepository): Added.
2540         (GitRepository.__init__):
2541         (GitRepository.fetch_commit): Added. Fetches the list of all git hashes if needed, and finds the next hash.
2542         (GitRepository._find_next_hash): Added. Finds the first commit that appears after the specified hash.
2543         (GitRepository._fetch_all_hashes): Added. Gets the list of all git hashs chronologically (old to new).
2544         (GitRepository._run_git_command): Added.
2545         (GitRepository.format_revision): Added. Use the first 8 characters of the hash.
2546
2547 2016-05-17  Ryosuke Niwa  <rniwa@webkit.org>
2548
2549         Add a subtitle under platform name in the summary page
2550         https://bugs.webkit.org/show_bug.cgi?id=157809
2551
2552         Reviewed by Chris Dumez.
2553
2554         Add a description beneath the platform names.
2555
2556         * public/v3/pages/summary-page.js:
2557         (SummaryPage.prototype._constructTable): Add a br and a span if subtitle is present.
2558         (SummaryPage.cssTemplate): Added CSS rules for .subtitle.
2559
2560 2016-05-13  Ryosuke Niwa  <rniwa@webkit.org>
2561
2562         v3 UI shows full git hash instead of the first 8 characters for a blame range
2563         https://bugs.webkit.org/show_bug.cgi?id=157691
2564
2565         Reviewed by Stephanie Lewis.
2566
2567         Fixed the bug that v3 UI shows the full 40 character git hash instead of the first 8 character as done in v2 UI.
2568
2569         * public/v3/models/commit-log.js:
2570         (CommitLog.prototype.diff): Fixed the bug.
2571         * tools/run-tests.py:
2572         (main): Add the support for running a subset of tests as mocha does.
2573         * unit-tests/commit-log-tests.js: Added.
2574
2575 2016-05-13  Ryosuke Niwa  <rniwa@webkit.org>
2576
2577         Unreviewed. Added the missing executable bits.
2578
2579         * tools/bundle-v3-scripts.py: Added property svn:executable.
2580         * tools/detect-changes.js: Added property svn:executable.
2581         * tools/process-maintenance-backlog.py: Added property svn:executable.
2582
2583 2016-05-13  Ryosuke Niwa  <rniwa@webkit.org>
2584
2585         Summary page doesn't report some missing platforms
2586         https://bugs.webkit.org/show_bug.cgi?id=157670
2587
2588         Reviewed by Darin Adler.
2589
2590         This patch improves the warning text for missing platforms and fixes the bug that platforms that don't have
2591         any data reported for a given test would not be reported as missing.
2592
2593         * public/v3/pages/summary-page.js:
2594         (SummaryPage.prototype.render): Added instrumentations.
2595         (SummaryPage.prototype._constructRatioGraph): Always create both the ratio bar graph and the spinner icon.
2596         (SummaryPage.prototype._renderCell): Extracted from _constructRatioGraph. Toggle the displayed-ness of the
2597         spinner and the ratio bar graph in the cell by CSS for better performance.
2598         (SummaryPage.prototype._warningTextForGroup): Extracted from _constructRatioGraph. Rephrased warning text
2599         for clarity and adopted new API of SummaryPageConfigurationGroup.
2600         (SummaryPage.prototype._warningTextForGroup.mapAndSortByName): Added.
2601         (SummaryPage.prototype._warningTextForGroup.pluralizeIfNeeded): Added.
2602         (SummaryPage.cssTemplate): Added rules to toggle the visibility of spinner icons and bar graphs.
2603         (SummaryPageConfigurationGroup): Replaced this._warnings by more explicitly named this._missingPlatforms
2604         and this._platformsWithoutBaseline. Also add a platform to this._missingPlatforms if it didn't appear in
2605         any metrics. Note that adding a platform whenever it doesn't in any one metric would be incorrect since
2606         some tests uses a different test name on different platforms: e.g. PLT-Mac and PLT-iPhone.
2607         (SummaryPageConfigurationGroup.prototype.missingPlatforms): Added.
2608         (SummaryPageConfigurationGroup.prototype.platformsWithoutBaseline): Added.
2609         (SummaryPageConfigurationGroup.prototype._fetchAndComputeRatio):
2610
2611 2016-05-13  Ryosuke Niwa  <rniwa@webkit.org>
2612
2613         Always use v3 UI for dashboards and analysis task pages
2614         https://bugs.webkit.org/show_bug.cgi?id=157647
2615
2616         Reviewed by Darin Adler.
2617
2618         Redirect dashboard pages from v1 and v2 to v3's summary page. Also redirect v1 UI's charts page and v2 UI's
2619         analysis task pages to the corresponding v3 pages.
2620
2621         Keep v2's charts page accessible since some features such as segmentation is still only available on v2 UI.
2622
2623         * public/index.html:
2624         (init.showCharts): Redirect to v3 UI once the chart list has been parsed.
2625         (init.redirectChartsToV3): Added.
2626         * public/v2/index.html:
2627
2628 2016-05-13  Ryosuke Niwa  <rniwa@webkit.org>
2629
2630         Show a spinner while fetching data on summary page
2631         https://bugs.webkit.org/show_bug.cgi?id=157658
2632
2633         Reviewed by Darin Adler.
2634
2635         Show a spinner while fetching JSON files on the summary page.
2636
2637         * public/v3/components/base.js:
2638         (ComponentBase.prototype.renderReplace): Added a new implementation that simply calls the static version.
2639         (ComponentBase.renderReplace): Made this static.
2640
2641         * public/v3/pages/summary-page.js:
2642         (SummaryPage.prototype._constructRatioGraph): Show a spinner icon when SummaryPageConfigurationGroup's
2643         isFetching returns true.
2644         (SummaryPage.cssTemplate): Force the height of each cell to be 2.5rem so that the height of cell doesn't
2645         change when a spinner is replaced by a ratio bar graph.
2646
2647         (SummaryPageConfigurationGroup): Added this._isFetching as an instance variable.
2648         (SummaryPageConfigurationGroup.prototype.isFetching): Added.
2649         (SummaryPageConfigurationGroup.prototype.fetchAndComputeSummary): Set this._isFetching while waiting for
2650         the promises to resolve after 50ms. We don't immediately set this._isFetching to avoid FOC when all JSON
2651         files have been cached.
2652
2653 2016-05-07  Ryosuke Niwa  <rniwa@webkit.org>
2654
2655         Add horizontal between categories of tests
2656         https://bugs.webkit.org/show_bug.cgi?id=157386
2657
2658         Reviewed by Darin Adler.
2659
2660         Wrap tests in each category by tbody and add a horizontal bar between each category.
2661
2662         * public/v3/pages/summary-page.js:
2663         (SummaryPage.prototype._constructTable):
2664         (SummaryPage.cssTemplate):
2665
2666 2016-05-04  Dewei Zhu  <dewei_zhu@apple.com>
2667
2668         Summary page should show warnings when current or baseline data is missing.
2669         https://bugs.webkit.org/show_bug.cgi?id=157339
2670
2671         Reviewed by Ryosuke Niwa.
2672
2673         Set summary page to be the default page of v3 UI.
2674         Show warning icon when either baseline or current data is missing.
2675         Make fetchBetween returns a promise.
2676         Update unit tests for MeasurementSet.fetchBetween since it returns a promise now.
2677         Add a workaround to skip some platform and metric configurations.
2678
2679         * public/v3/components/ratio-bar-graph.js:
2680         (RatioBarGraph):
2681         (RatioBarGraph.prototype.update): Add showWarningIcon flag to indicate whether we should show warning icon.
2682         (RatioBarGraph.prototype.render): Show warning icon when showWarningIcon is true.
2683         (RatioBarGraph.cssTemplate): Add style for warning icon.
2684         * public/v3/components/warning-icon.js: Add warning icon.
2685         (WarningIcon):
2686         (WarningIcon.cssTemplate):
2687         * public/v3/index.html:
2688         * public/v3/main.js:
2689         (main): Set summary page to be the default page of v3 UI.
2690         * public/v3/models/measurement-set.js:
2691         (MeasurementSet):
2692         (MeasurementSet.prototype.fetchBetween): Returns a promise. Fix the bug in previous implementation that we miss
2693         some callbacks sometimes. Basically, we will fetch primary cluster first, then secondary clusters. For each
2694         secondary cluster fetch, we will always invoke callback even when it fails.
2695         (MeasurementSet.prototype._fetchSecondaryClusters): Deleted.
2696         (MeasurementSet.prototype._fetch.else.url.api.measurement.set platform): Deleted.
2697         * public/v3/pages/summary-page.js:
2698         (SummaryPage): Add a variable for excluded configurations.
2699         (SummaryPage.prototype._createConfigurationGroup): Pass excluded configurations while building config groups.
2700         (SummaryPage.prototype._constructTable): Remove the logic for unified header since it breaks consistency of the table appearance.
2701         (SummaryPage.prototype.this._renderQueue.push): Show warning message when baseline/current data is missing.
2702         (SummaryPageConfigurationGroup): Add a variable to keep track of the warnings while computing summary.
2703         (SummaryPageConfigurationGroup.prototype.warnings): A getter for warnings.
2704         (SummaryPageConfigurationGroup._computeSummary): Fix a bug in calculating ratios. We should always use
2705         current/baseline for ratio and present the difference between ratio and 1 in the summary page.
2706         (SummaryPageConfigurationGroup.set then): Deleted.
2707         (SummaryPageConfigurationGroup.set var): Deleted.
2708         * unit-tests/measurement-set-tests.js: Add a helper function to wait for fetchBetween. Update unit tests since fetchBetween returns a promise now.
2709         (promise.set fetchBetween):
2710         (set MeasurementSet):
2711         (set fetchBetween): Deleted.
2712
2713 2016-04-26  Ryosuke Niwa  <rniwa@webkit.org>
2714
2715         Chart status should always be computed against prior values
2716         https://bugs.webkit.org/show_bug.cgi?id=157014
2717
2718         Reviewed by Darin Adler.
2719
2720         Compare the current value against the last baseline or target value that appear before the current value in time
2721         so that the comparison stay the same even when new baseline and target values are reported. Also include the compared
2722         baseline or target value in the label for clarity.
2723
2724         * public/v3/components/chart-status-view.js:
2725         (ChartStatusView.prototype._computeChartStatus):
2726         (ChartStatusView.prototype._computeChartStatus.labelForDiff):
2727         (ChartStatusView.prototype._findLastPointPriorToTime): Extracted from _relativeDifferenceToLaterPointInTimeSeries.
2728         Now finds the last point before the current point's time if there is any, or the last point in baseline / target.
2729         (ChartStatusView.prototype._relativeDifferenceToLaterPointInTimeSeries): Deleted.
2730         * public/v3/models/metric.js:
2731         (Metric.prototype.makeFormatter): Don't use SI units for unit-less metrics.
2732
2733 2016-04-13  Ryosuke Niwa  <rniwa@webkit.org>
2734
2735         REGRESSION(r199444): Perf dashboard always fetches all measurement sets
2736         https://bugs.webkit.org/show_bug.cgi?id=156534
2737
2738         Reviewed by Darin Adler.
2739
2740         The bug was cased by SummaryPage's constructor fetching all measurement sets. Since each page is always
2741         constructed in main(), this resulted in all measurement sets being fetched on all pages.
2742
2743         * public/v3/pages/summary-page.js:
2744         (SummaryPage):
2745         (SummaryPage.prototype.open): Fetch measurement set JSONs here.
2746         (SummaryPage.prototype._createConfigurationGroup): Renamed from _createConfigurationGroupAndStartFetchingData.
2747
2748 2016-04-12  Ryosuke Niwa  <rniwa@webkit.org>
2749
2750         Add a summary page to v3 UI
2751         https://bugs.webkit.org/show_bug.cgi?id=156531
2752
2753         Reviewed by Stephanie Lewis.
2754
2755         Add new "Summary" page, which shows the average difference (better or worse) from the baseline across
2756         multiple platforms and tests by a single number.
2757
2758         * public/include/manifest.php:
2759         (ManifestGenerator::generate): Include "summary" in manifest.json.
2760         * public/shared/statistics.js:
2761         (Statistics.mean): Added.
2762         (Statistics.median): Added.
2763         * public/v3/components/ratio-bar-graph.js: Added.
2764         (RatioBarGraph): Shows a horizontal bar graph that visualizes the relative difference (e.g. 3% better).
2765         (RatioBarGraph.prototype.update):
2766         (RatioBarGraph.prototype.render):
2767         (RatioBarGraph.cssTemplate):
2768         (RatioBarGraph.htmlTemplate):
2769         * public/v3/index.html:
2770         * public/v3/main.js:
2771         (main): Instantiate SummaryPage and add it to the navigation bar and the router.
2772         * public/v3/models/manifest.js:
2773         (Manifest._didFetchManifest): Let "summary" pass through from manifest.json to main().
2774         * public/v3/models/measurement-set.js:
2775         (MeasurementSet.prototype._failedToFetchJSON): Invoke the callback with an error or true in order for
2776         the callback can detect a failure.
2777         (MeasurementSet.prototype._invokeCallbacks): Ditto.
2778         * public/v3/pages/charts-page.js:
2779         (ChartsPage.createStateForConfigurationList): Added to add a hyperlink from summary page to charts page.
2780         * public/v3/pages/summary-page.js: Added.
2781         (SummaryPage): Added.
2782         (SummaryPage.prototype.routeName): Added.
2783         (SummaryPage.prototype.open): Added.
2784         (SummaryPage.prototype.render): Added.
2785         (SummaryPage.prototype._createConfigurationGroupAndStartFetchingData): Added.
2786         (SummaryPage.prototype._constructTable): Added.
2787         (SummaryPage.prototype._constructRatioGraph): Added.
2788         (SummaryPage.htmlTemplate): Added.
2789         (SummaryPage.cssTemplate): Added.
2790         (SummaryPageConfigurationGroup): Added. Represents a set of platforms and tests shown in a single cell.
2791         (SummaryPageConfigurationGroup.prototype.ratio): Added.
2792         (SummaryPageConfigurationGroup.prototype.label): Added.
2793         (SummaryPageConfigurationGroup.prototype.changeType): Added.
2794         (SummaryPageConfigurationGroup.prototype.configurationList): Added.
2795         (SummaryPageConfigurationGroup.prototype.fetchAndComputeSummary): Added.
2796         (SummaryPageConfigurationGroup.prototype._computeSummary): Added.
2797         (SummaryPageConfigurationGroup.prototype._fetchAndComputeRatio): Added. Invoked for each time series in
2798         the set, and stores the computed ratio of the current values to the baseline in this._setToRatio.
2799         The results are aggregated by _computeSummary as a single number later.
2800         (SummaryPageConfigurationGroup._medianForTimeRange): Added.
2801         (SummaryPageConfigurationGroup._fetchData): A thin wrapper to make MeasurementSet.fetchBetween promise
2802         friendly since MeasurementSet doesn't support Promise at the moment (but it should!).
2803         * server-tests/api-manifest.js: Updated a test case.
2804
2805 2016-04-12  Ryosuke Niwa  <rniwa@webkit.org>
2806
2807         Make sync-buildbot.js fault safe
2808         https://bugs.webkit.org/show_bug.cgi?id=156498
2809
2810         Reviewed by Chris Dumez.
2811
2812         Fixed a bug that sync-buildbot.js will continue to schedule build requests from multiple test groups
2813         if multiple test groups are simultaneously in-progress on the same builder. Also fixed a bug that if
2814         a build request had failed without leaving a trace (i.e. no entry on any of the builders we know of),
2815         sync-buildbot.js throws an exception.
2816
2817         * server-tests/tools-buildbot-triggerable-tests.js: Added test cases.
2818         * tools/js/buildbot-syncer.js:
2819         (BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Renamed. Optionally takes the slave name.
2820         When this parameter is specified, schedule the request only if the specified slave is available.
2821         * tools/js/buildbot-triggerable.js:
2822         (BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Always use
2823         scheduleRequestInGroupIfAvailable to schedule a new build request. Using scheduleRequest for non-first
2824         build requests was problematic when there were multiple test groups with pending requests because then
2825         we would schedule those pending requests without checking whether there is already a pending job or if
2826         we have previously scheduled a job. Also fallback to use any syncer / builder when groupInfo.syncer is
2827         not set even if the next request was not the first one in the test group since we can't determine on
2828         which builder preceding requests are processed in such cases.
2829         * unit-tests/buildbot-syncer-tests.js:
2830
2831 2016-04-11  Ryosuke Niwa  <rniwa@webkit.org>
2832
2833         Replace script runner to use mocha.js tests
2834         https://bugs.webkit.org/show_bug.cgi?id=156490
2835
2836         Reviewed by Chris Dumez.
2837
2838         Replaced run-tests.js, which was a whole test harness for running legacy tests by tools/run-tests.py
2839         which is a thin wrapper around mocha.js.
2840
2841         * run-tests.js: Removed.
2842         * tests: Removed.
2843         * tools/run-tests.py: Added.
2844         (main):
2845
2846 2016-04-11  Ryosuke Niwa  <rniwa@webkit.org>
2847
2848         New syncing script sometimes schedules a build request on a wrong builder
2849         https://bugs.webkit.org/show_bug.cgi?id=156489
2850
2851         Reviewed by Stephanie Lewis.
2852
2853         The bug was caused by _scheduleNextRequestInGroupIfSlaveIsAvailable scheduling the next build request on
2854         any available syncer regardless of whether the request is the first one in the test group or not because
2855         BuildRequest.order was returning a string instead of a number.
2856
2857         Also fixed a bug that BuildbotTriggerable.syncOnce was re-ordering test groups by their id's instead of
2858         respecting the order in which the perf dashboard returned.
2859
2860         * public/v3/models/build-request.js:
2861         (BuildRequest.prototype.order): Force the order to be a number.
2862         * server-tests/api-build-requests-tests.js: Assert the order as numbers.
2863         * server-tests/resources/mock-data.js:
2864         (MockData.addAnotherMockTestGroup): Changed the test group id to 601, which is after the first mock data.
2865         The old number was masking a bug in BuildbotTriggerable that it was re-ordering test groups by their id's
2866         instead of using the order set forth by the perf dashboard.
2867         (MockData.mockTestSyncConfigWithSingleBuilder):
2868         * server-tests/tools-buildbot-triggerable-tests.js: Added a test case for scheduling two build requests in
2869         a single call to syncOnce. Each build request should be scheduled on the same builder as the previous build
2870         requests in the same test group.
2871         * tools/js/buildbot-triggerable.js:
2872         (BuildbotTriggerable.prototype.syncOnce): Order test groups by groupOrder, which is the index at which first
2873         build request in the group appeared.
2874         (BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Don't re-order build requests
2875         as they're already sorted on the server side.
2876         (BuildbotTriggerable._testGroupMapForBuildRequests): Added groupOrder to test group info 
2877
2878 2016-04-09  Ryosuke Niwa  <rniwa@webkit.org>
2879
2880         Build fix. Don't treat a build number 0 as a pending build.
2881
2882         * tools/js/buildbot-syncer.js:
2883         (BuildbotBuildEntry.prototype.isPending):
2884
2885 2016-04-08  Ryosuke Niwa  <rniwa@webkit.org>
2886
2887         Escape builder names in url* and pathFor* methods of BuildbotSyncer
2888         https://bugs.webkit.org/show_bug.cgi?id=156427
2889
2890         Reviewed by Darin Adler.
2891
2892         The build fix in r199251 breaks other usage of RemoteAPI. Fix it properly by escaping builder names in
2893         various methods of BuildbotSyncer.
2894
2895         Also fixed a typo in the logging and a bug that the new syncing script never updated "scheduled" to "running".
2896
2897         * server-tests/resources/mock-data.js:
2898         (MockData.mockTestSyncConfigWithTwoBuilders): Renamed "some-builder-2" to "some builder 2" to test the
2899         new escaping behavior in tools-buildbot-triggerable-tests.js and buildbot-syncer-tests.js.
2900
2901         * server-tests/tools-buildbot-triggerable-tests.js: Added tests for status url, and added a new test case
2902         for updating "scheduled" to "running".
2903
2904         * tools/js/buildbot-syncer.js:
2905         (BuildbotBuildEntry.buildRequestStatusIfUpdateIsNeeded): Update the status to "running" when the request's
2906         status is "scheduled" and the buildbot's build is currently in progress.
2907         (BuildbotSyncer.prototype.pathForPendingBuildsJSON): Escape the builder name.
2908         (BuildbotSyncer.prototype.pathForBuildJSON): Ditto.
2909         (BuildbotSyncer.prototype.pathForForceBuild): Ditto.
2910         (BuildbotSyncer.prototype.url): Ditto.
2911         (BuildbotSyncer.prototype.urlForBuildNumber): Ditto.
2912
2913         * tools/js/buildbot-triggerable.js:
2914         (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers):
2915         (BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Fixed a typo. We are
2916         scheduling new build requests, not syncing them.
2917         * tools/js/remote.js:
2918         (RemoteAPI.sendHttpRequest): Reverted r199251.
2919         * unit-tests/buildbot-syncer-tests.js:
2920
2921 2016-04-08  Ryosuke Niwa  <rniwa@webkit.org>
2922
2923         Build fix. We need to escape the path or http.request would fail.
2924
2925         * tools/js/remote.js:
2926
2927 2016-04-08  Ryosuke Niwa  <rniwa@webkit.org>
2928
2929         Fix various bugs in the new syncing script
2930         https://bugs.webkit.org/show_bug.cgi?id=156393
2931
2932         Reviewed by Darin Adler.
2933
2934         * server-tests/resources/common-operations.js: Added. This file was supposed to be added in r199191.
2935         (addBuilderForReport):
2936         (addSlaveForReport):
2937         (connectToDatabaseInEveryTest):
2938         (submitReport):
2939         * tools/js/buildbot-triggerable.js:
2940         (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Don't log every time we pull from buildbot
2941         builder as this dramatically increases the amount of log we generate.
2942         * tools/js/parse-arguments.js:
2943         (parseArguments): Fixed a typo. This should be parseArgument*s*, not parseArgument.
2944         * tools/js/remote.js:
2945         (RemoteAPI.prototype.url): Fixed a bug that portSuffix wasn't being expanded in the template literal.
2946         (RemoteAPI.prototype.configure): Added more validations with nice error messages.
2947         (RemoteAPI.prototype.sendHttpRequest): Falling back to port 80 isn't right when scheme is https. Compute
2948         the right port in configure instead based on the scheme.
2949         * tools/sync-buildbot.js:
2950         (syncLoop): Fixed the bug that syncing multiple times fail because Manifest.fetch() create new Platform
2951         and Test objects. This results in various references in BuildRequest objects to get outdated. Fixing this
2952         properly in Manifest.fetch() because we do need to "forget" about some tests and platforms in some cases.
2953         For now, delete all v3 model objects and start over in each syncing cycle.
2954         * unit-tests/tools-js-remote-tests.js: Added. Unit tests for the aforementioned changes to RemoteAPI.
2955
2956 2016-04-07  Ryosuke Niwa  <rniwa@webkit.org>
2957
2958         sync-buildbot.js doesn't mark disappeared builds as failed
2959         https://bugs.webkit.org/show_bug.cgi?id=156386
2960
2961         Reviewed by Chris Dumez.
2962
2963         Fix a bug that new syncing script doesn't mark builds that it scheduled but doesn't appear when queried
2964         by buildbot's JSON API. These are builds that got canceled by humans (e.g. buildbot was restarted, data
2965         loss, pending build was canceled, etc...)
2966
2967         * server-tests/tools-buildbot-triggerable-tests.js: Added a test case.
2968         * tools/js/buildbot-triggerable.js:
2969         (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Added a set of build requests we've matched
2970         against BuildbotBuildEntry's. Mark build requests that didn't have any entry but supposed to be in either
2971         'scheduled' or 'running' status as failed.
2972
2973 2016-04-07  Ryosuke Niwa  <rniwa@webkit.org>
2974
2975         A/B testing bots should prioritize user created test groups
2976         https://bugs.webkit.org/show_bug.cgi?id=156375
2977
2978         Reviewed by Chris Dumez.
2979
2980         Order build requests preferring user created ones over ones automatically created by detect-changes.js.
2981
2982         Also fixed a bug in BuildbotSyncer.scheduleFirstRequestInGroupIfAvailable that it was scheduling a new
2983         build request on a builder/slave even when we had previously scheduled another build request.
2984
2985         * public/include/build-requests-fetcher.php:
2986         (BuildRequestsFetcher::fetch_incomplete_requests_for_triggerable): Order build requested based on
2987         author_order which is 0 when it's created by an user and 1 when it's created by detect-changes.js.
2988         Since we're using ascending order, this would put user created test groups first.
2989         * server-tests/api-build-requests-tests.js: Updated an existing test case and added a new test case
2990         for testing that build requests for an user created test group shows up first.
2991         * server-tests/resources/mock-data.js:
2992         (MockData.addAnotherMockTestGroup): Takes an extra argument to specify the author name.
2993         * server-tests/tools-buildbot-triggerable-tests.js: Added a test case for testing that build requests
2994         for an user created test group shows up first.
2995         * tools/js/buildbot-syncer.js:
2996         (BuildbotSyncer): Added _slavesWithNewRequests to keep track of build slaves on which we have already
2997         scheduled new build requests. Don't schedule more requests on these slaves.
2998         (BuildbotSyncer.prototype.scheduleRequest):
2999         (BuildbotSyncer.prototype.scheduleFirstRequestInGroupIfAvailable): Add the specified slave name (or null
3000         when slaveList is not specified) to _slavesWithNewRequests.
3001         (BuildbotSyncer.prototype.pullBuildbot): Clear the set after pulling buildbot since any build request
3002         we have previously scheduled should be included in one of the entires now.
3003         * unit-tests/buildbot-syncer-tests.js: Added test cases for the aforementioned bug.
3004         (sampleiOSConfig): Added a second slave for new test cases.
3005
3006 2016-04-07  Ryosuke Niwa  <rniwa@webkit.org>
3007
3008         Migrate legacy perf dashboard tests to mocha.js based tests
3009         https://bugs.webkit.org/show_bug.cgi?id=156335
3010
3011         Reviewed by Chris Dumez.
3012
3013         Migrated all legacy run-tests.js tests to mocha.js based tests. Since the new harness uses Promise
3014         for most of asynchronous operations, refactored the tests to use Promises as well, and added more
3015         assertions where appropriate.
3016
3017         Also consolidated common helper functions into server-tests/resources/common-operations.js.
3018         Unfortunately there were multiple inconsistent implementations of addBuilder/addSlave. Some were
3019         taking an array of reports while others were taking a single report. New shared implementation in
3020         common-operations.js now takes a single report.
3021
3022         Also decreased the timeout in most tests from 10s to 1s so that tests fail early when they timeout.
3023         Most of tests are passing under 100ms on my computer so 1s should be plenty still.
3024
3025         * run-tests.js: Removed.
3026         * server-tests/admin-platforms-tests.js: Moved from tests/admin-platforms.js.
3027         (reportsForDifferentPlatforms):
3028         * server-tests/admin-reprocess-report-tests.js: Moved from tests/admin-reprocess-report.js.
3029         (.addBuilder): Moved to common-operations.js.
3030         * server-tests/api-build-requests-tests.js:
3031         * server-tests/api-manifest.js: Use MockData.resetV3Models() instead of manually clearing maps.
3032         * server-tests/api-measurement-set-tests.js: Moved from tests/api-measurement-set.js.
3033         (.queryPlatformAndMetric):
3034         (.format):
3035         * server-tests/api-report-commits-tests.js: Moved from tests/api-report-commits.js.
3036         * server-tests/api-report-tests.js: Moved from tests/api-report.js.
3037         (.emptyReport):
3038         (.emptySlaveReport):
3039         (.reportWithSameSubtestName):
3040         * server-tests/resources/common-operations.js: Added.
3041         (addBuilderForReport): Extracted from tests.
3042         (addSlaveForReport): Ditto.
3043         (connectToDatabaseInEveryTest): Added.
3044         (submitReport): Extracted from admin-platforms-tests.js.
3045         * server-tests/resources/test-server.js:
3046         (TestServer): Make TestServer a singleton since it doesn't make any sense for each module to start
3047         its own Apache instance (that would certainly will fail).
3048         * server-tests/tools-buildbot-triggerable-tests.js:
3049         * tests: Removed.
3050         * tools/js/database.js:
3051         (Database.prototype.selectAll): Added.
3052         (Database.prototype.selectFirstRow): Added.
3053         (Database.prototype.selectRows): Added. Dynamically construct a query string based on arguments.
3054
3055 2016-04-05  Ryosuke Niwa  <rniwa@webkit.org>
3056
3057         New buildbot syncing scripts that supports multiple builders and slaves
3058         https://bugs.webkit.org/show_bug.cgi?id=156269
3059
3060         Reviewed by Chris Dumez.
3061
3062         Add sync-buildbot.js that supports scheduling A/B testing jobs on multiple builders and slaves.
3063         The old python script (sync-with-buildbot.py) could only support a single builder and slave
3064         for each platform, test pair.
3065
3066         The main logic is implemented in BuildbotTriggerable.syncOnce. Various helper methods are added
3067         throughout the codebase and tests have been refactored.
3068
3069         BuildbotSyncer has been updated to support multiple platform, test pairs. It's now responsible
3070         for syncing everything on each builder (on a buildbot).
3071
3072         Added more unit tests for BuildbotSyncer and server tests for BuildbotTriggerable, and refactored
3073         test helpers and mocks as needed.
3074
3075         * public/v3/models/build-request.js:
3076         (BuildRequest.prototype.status): Added.
3077         (BuildRequest.prototype.isScheduled): Added.
3078         * public/v3/models/metric.js:
3079         (Metric.prototype.fullName): Added.
3080         * public/v3/models/platform.js:
3081         (Platform): Added the map based on platform name.
3082         (Platform.findByName): Added.
3083         * public/v3/models/test.js:
3084         (Test.topLevelTests):
3085         (Test.findByPath): Added. Finds a test based on an array of test names; e.g. ['A', 'B'] would
3086         find the test whose name is "B" which has a parent test named "A".
3087         (Test.prototype.fullName): Added.
3088         * server-tests/api-build-requests-tests.js:
3089         (addMockData): Moved to resources/mock-data.js.
3090         (addAnotherMockTestGroup): Ditto.
3091         * server-tests/resources/mock-data.js: Added.
3092         (MockData.resetV3Models): Added.
3093         (MockData.addMockData): Moved from api-build-requests-tests.js.
3094         (MockData.addAnotherMockTestGroup): Ditto.
3095         (MockData.mockTestSyncConfigWithSingleBuilder): Added.
3096         (MockData.mockTestSyncConfigWithTwoBuilders): Added.
3097         (MockData.pendingBuild): Added.
3098         (MockData.runningBuild): Added.
3099         (MockData.finishedBuild): Added.
3100         * server-tests/resources/test-server.js:
3101         (TestServer):
3102         (TestServer.prototype.remoteAPI):
3103         (TestServer.prototype._ensureTestDatabase): Don't fail even if the test database doesn't exit.
3104         (TestServer.prototype._startApache): Create a RemoteAPI instance to access the test sever.
3105         (TestServer.prototype._waitForPid): Increase the timeout.
3106         (TestServer.prototype.inject): Replace global.RemoteAPI during the test and restore it afterwards.
3107         * server-tests/tools-buildbot-triggerable-tests.js: Added. Tests BuildbotTriggerable.syncOnce.
3108         (MockLogger): Added.
3109         (MockLogger.prototype.log): Added.
3110         (MockLogger.prototype.error): Added.
3111         * tools/detect-changes.js:
3112         (parseArgument): Moved to js/parse-arguments.js.
3113         * tools/js/buildbot-syncer.js:
3114         (BuildbotBuildEntry):
3115         (BuildbotBuildEntry.prototype.syncer): Added.
3116         (BuildbotBuildEntry.prototype.buildRequestStatusIfUpdateIsNeeded): Added. Returns a new status
3117         for a build request (of the matching build request ID) if it needs to be updated in the server.
3118         (BuildbotSyncer): This class 
3119         (BuildbotSyncer.prototype.addTestConfiguration): Added.
3120         (BuildbotSyncer.prototype.testConfigurations): Returns the list of test configurations.
3121         (BuildbotSyncer.prototype.matchesConfiguration): Returns true iff the request can be scheduled on
3122         this builder.
3123         (BuildbotSyncer.prototype.scheduleRequest): Added. Schedules a new job on buildbot for a request.
3124         (BuildbotSyncer.prototype.scheduleFirstRequestInGroupIfAvailable): Added. Schedules a new job for
3125         the specified build request on the first slave that's available.
3126         (BuildbotSyncer.prototype.pullBuildbot): Return a list of BuildbotBuildEntry instead of an object.
3127         Also store it on an instance variable so that scheduleFirstRequestInGroupIfAvailable could use it.
3128         (BuildbotSyncer.prototype._pullRecentBuilds):
3129         (BuildbotSyncer.prototype.pathForPendingBuildsJSON): Renamed from urlForPendingBuildsJSON and now
3130         only returns the path instead of the full URL since RemoteAPI takes a path, not full URL.
3131         (BuildbotSyncer.prototype.pathForBuildJSON): Ditto from pathForBuildJSON.
3132         (BuildbotSyncer.prototype.pathForForceBuild): Added.
3133         (BuildbotSyncer.prototype.url): Use RemoteAPI's url method instead of manually constructing URL.
3134         (BuildbotSyncer.prototype.urlForBuildNumber): Ditto.
3135         (BuildbotSyncer.prototype._propertiesForBuildRequest): Now that each syncer can have multiple test
3136         configurations associated with it, find the one matching for this request.
3137         (BuildbotSyncer._loadConfig): Create a syncer per builder and add all test configurations to it.
3138         (BuildbotSyncer._validateAndMergeConfig): Added the support for 'SlaveList', which is a list of
3139         slave names present on this builder.
3140         * tools/js/buildbot-triggerable.js: Added.
3141         (BuildbotTriggerable): Added.
3142         (BuildbotTriggerable.prototype.name): Added.
3143         (BuildbotTriggerable.prototype.syncOnce): Added. The main logic for the syncing script. It pulls
3144         existing build requests from the perf dashboard, pulls buildbot for pending and running/completed
3145         builds on each builder (represented by each syncer), schedules build requests on buildbot if there
3146         is any builder/slave available, and updates the status of build requests in the database.
3147         (BuildbotTriggerable.prototype._validateRequests): Added.
3148         (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Added.
3149         (BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Added.
3150         (BuildbotTriggerable._testGroupMapForBuildRequests): Added.
3151         * tools/js/database.js:
3152         * tools/js/parse-arguments.js: Added. Extracted out of tools/detect-changes.js.
3153         (parseArguments):
3154         * tools/js/remote.js:
3155         (RemoteAPI): Now optionally takes the server configuration.
3156         (RemoteAPI.prototype.url): Added.
3157         (RemoteAPI.prototype.getJSON): Removed the code for specifying request content.
3158         (RemoteAPI.prototype.getJSONWithStatus): Ditto.
3159         (RemoteAPI.prototype.postJSON): Added.
3160         (RemoteAPI.prototype.postFormUrlencodedData): Added.
3161         (RemoteAPI.prototype.sendHttpRequest): Fixed the code to specify auth.
3162         * tools/js/v3-models.js: Don't include RemoteAPI here as they require a configuration for each host.
3163         * tools/sync-buildbot.js: Added.
3164         (main): Added. Parse the arguments and start the loop.
3165         (syncLoop): Added.
3166         * unit-tests/buildbot-syncer-tests.js: Added tests for pullBuildbot, scheduleRequest, as well as
3167         scheduleFirstRequestInGroupIfAvailable. Refactored helper functions as needed.
3168         (sampleiOSConfig):
3169         (smallConfiguration): Added.
3170         (smallPendingBuild): Added.
3171         (smallInProgressBuild): Added.
3172         (smallFinishedBuild): Added.
3173         (createSampleBuildRequest): Create a unique build request for each platform.
3174         (samplePendingBuild): Optionally specify build time and slave name.
3175         (sampleInProgressBuild): Optionally specify slave name.
3176         (sampleFinishedBuild): Ditto.
3177         * unit-tests/resources/mock-remote-api.js:
3178         (assert.notReached.assert.notReached):
3179         (MockRemoteAPI.url): Added.
3180         (MockRemoteAPI.postFormUrlencodedData): Added.
3181         (MockRemoteAPI._addRequest): Extracted from getJSONWithStatus.
3182         (MockRemoteAPI.waitForRequest): Extracted from inject. For tools-buildbot-triggerable-tests.js, we
3183         need to instantiate a RemoteAPI for buildbot without replacing global.RemoteAPI.
3184         (MockRemoteAPI.inject):
3185         (MockRemoteAPI.reset): Added.
3186
3187 2016-03-30  Ryosuke Niwa  <rniwa@webkit.org>
3188
3189         Simplify API of Test model by removing Test.setParentTest
3190         https://bugs.webkit.org/show_bug.cgi?id=156055
3191
3192         Reviewed by Joseph Pecoraro.
3193
3194         Removed Test.setParentTest. Keep track of the child-parent relationship using the static map instead.
3195
3196         Now each test only stores parent's id and uses the ID static map in Test.parentTest().
3197
3198         * public/v3/models/manifest.js:
3199         (Manifest._didFetchManifest.buildObjectsFromIdMap): Removed the code to create the map of child-parent
3200         relationship and call setParentTest.
3201         * public/v3/models/test.js:
3202         (Test): Updated a static map by the name of "childTestMap" to store itself. We should probably sort
3203         child tests using some fixed criteria in the future instead of relying on the creation order but
3204         preserve the old code's ordering for now.
3205         (Test.prototype.parentTest): Look up the static map by the parent test's id.
3206         (Test.prototype.onlyContainsSingleMetric):
3207         (Test.prototype.setParentTest): Deleted.
3208         (Test.prototype.childTests): Look up the child test map.
3209
3210 2016-03-30  Ryosuke Niwa  <rniwa@webkit.org>
3211
3212         BuildRequest should have associated platform and test
3213         https://bugs.webkit.org/show_bug.cgi?id=156054
3214
3215         Reviewed by Joseph Pecoraro.
3216
3217         Added methods to retrieve the platform and the test associated with a build request with tests.
3218
3219         * public/v3/models/build-request.js:
3220         (BuildRequest):
3221         (BuildRequest.prototype.platform): Added.
3222         (BuildRequest.prototype.test): Added.
3223         * server-tests/api-build-requests-tests.js:
3224         * server-tests/api-manifest.js: Fixed a typo. This tests /api/manifest, not /api/build-requests.
3225         * unit-tests/buildbot-syncer-tests.js:
3226         (.createSampleBuildRequest): Now takes Platform and Test objects to avoid hitting assertions in
3227         BuildRequest's constructor.
3228
3229 2016-03-30  Ryosuke Niwa  <rniwa@webkit.org>
3230
3231         BuildRequest should have a method to fetch all in-progress and pending requests for a triggerable
3232         https://bugs.webkit.org/show_bug.cgi?id=156008
3233
3234         Reviewed by Darin Adler.
3235
3236         Add a method to BuildRequest that fetches all pending and in-progress requests for a triggerable.
3237
3238         Now, new syncing scripts must be able to figure out the build slave the first build requests in
3239         a given test group had used in order to schedule subsequent build requests in the test group.
3240
3241         For this purpose, /api/build-requests has been modified to return all build requests whose test
3242         group had not finished yet. A test group is finished if all build requests in the test group had
3243         finished (completed, failed, or canceled).
3244
3245         * public/include/build-requests-fetcher.php:
3246         (BuildRequestFetcher::fetch_incomplete_requests_for_triggerable): Return all build requests in test
3247         groups that have not been finished.
3248         * public/v3/models/build-request.js:
3249         (BuildRequest):
3250         (BuildRequest.prototype.testGroupId): Added.
3251         (BuildRequest.prototype.isPending): Renamed from hasPending to fix a bad grammar.
3252         (BuildRequest.fetchForTriggerable): Added.
3253         (BuildRequest.constructBuildRequestsFromData): Extracted from _createModelsFromFetchedTestGroups in
3254         TestGroup.
3255         * public/v3/models/manifest.js:
3256         (Manifest.fetch): Use the full path from root so that it works in server tests.
3257         * public/v3/models/test-group.js:
3258         (TestGroup.hasPending):
3259         (TestGroup._createModelsFromFetchedTestGroups):
3260         * server-tests/api-build-requests-tests.js: Added tests to ensure all build requests for a test group
3261         is present in the response returned by /api/build-requests iff any build request in the group had not
3262         finished yet.
3263         (.addMockData):
3264         (.addAnotherMockTestGroup): Added.
3265         * unit-tests/test-groups-tests.js:
3266
3267 2016-03-29  Ryosuke Niwa  <rniwa@webkit.org>
3268
3269         Make dependency injection in unit tests more explicit
3270         https://bugs.webkit.org/show_bug.cgi?id=156006
3271
3272         Reviewed by Joseph Pecoraro.
3273
3274         Make the dependency injection of model objects in unit tests explicit so that server tests that create
3275         "real" model objects won't create these mock objects. Now each test that uses mock model objects would call
3276         MockModels.inject() to inject before / beforeEach and access each object using a property on MockModels
3277         instead of them being implicitly defined on the global object.
3278
3279         Similarly, MockRemoteAPI now only replaces global.RemoteAPI during each test so that server tests can use
3280         real RemoteAPI to access the test Apache server.
3281
3282         * unit-tests/analysis-task-tests.js:
3283         * unit-tests/buildbot-syncer-tests.js:
3284         (createSampleBuildRequest):
3285         * unit-tests/measurement-adaptor-tests.js:
3286         * unit-tests/measurement-set-tests.js:
3287         * unit-tests/resources/mock-remote-api.js:
3288         (MockRemoteAPI.getJSONWithStatus):
3289         (MockRemoteAPI.inject): Added. Override RemoteAPI on the global object during each test.
3290         * unit-tests/resources/mock-v3-models.js:
3291         (MockModels.inject): Added. Create mock model objects before each test, and clear all static maps of
3292         various v3 model classes (to remove all singleton objects for those model classes).
3293         * unit-tests/test-groups-tests.js:
3294
3295 2016-03-29  Ryosuke Niwa  <rniwa@webkit.org>
3296
3297         BuildbotSyncer should be able to fetch JSON from buildbot
3298         https://bugs.webkit.org/show_bug.cgi?id=155921
3299
3300         Reviewed by Joseph Pecoraro.
3301
3302         Added BuildbotSyncer.pullBuildbot which fetches pending, in-progress, and finished builds from buildbot
3303         with lots of unit tests as this has historically been a source of subtle bugs in the old script.
3304
3305         New implementation fixes a subtle bug in the old pythons script which overlooked the possibility that
3306         the state of some builds may change between each HTTP request. In the old script, we fetched the list
3307         of the pending builds, and requested -1, -2, etc... builds for N times. But between each request,
3308         a pending build may start running or an in-progress build finish and shift the offset by one. The new
3309         script avoids this problem by first requesting all pending builds, then all in-progress and finished
3310         builds in a single HTTP request. The results are then merged so that entries for in-progress and
3311         finished builds would override the entries for pending builds if they overlap.
3312
3313         Also renamed RemoteAPI.fetchJSON to RemoteAPI.getJSON to match v3 UI's RemoteAPI. This change makes
3314         the class interchangeable between frontend (public/v3/remote.js) and backend (tools/js/remote.js).
3315
3316         * server-tests/api-build-requests-tests.js:
3317         * server-tests/api-manifest.js:
3318         * tools/js/buildbot-syncer.js:
3319         (BuildbotBuildEntry): Removed the unused argument "type". Store the syncer as an instance variable as
3320         we'd need to query for the buildbot URL. Also fixed a bug that _isInProgress was true for finished
3321         builds as 'currentStep' is always defined but null in those builds.
3322         (BuildbotBuildEntry.prototype.buildNumber): Added.
3323         (BuildbotBuildEntry.prototype.isPending): Added.
3324         (BuildbotBuildEntry.prototype.hasFinished): Added.
3325         (BuildbotSyncer.prototype.pullBuildbot): Added. Fetches pending builds first and then finished builds.
3326         (BuildbotSyncer.prototype._pullRecentBuilds): Added. Fetches in-progress and finished builds.
3327         (BuildbotSyncer.prototype.urlForPendingBuildsJSON): Added.
3328         (BuildbotSyncer.prototype.urlForBuildJSON): Added.
3329         (BuildbotSyncer.prototype.url): Added.
3330         (BuildbotSyncer.prototype.urlForBuildNumber): Added.
3331         * tools/js/remote.js:
3332         (RemoteAPI.prototype.getJSON): Renamed from fetchJSON.
3333         (RemoteAPI.prototype.getJSONWithStatus): Renamed from fetchJSONWithStatus.
3334         * tools/js/v3-models.js: Load tools/js/remote.js instead of public/v3/remote.js inside node.
3335         * unit-tests/buildbot-syncer-tests.js: Added a lot of unit tests for BuildbotSyncer.pullBuildbot
3336         (samplePendingBuild):
3337         (sampleInProgressBuild): Added.
3338         (sampleFinishedBuild): Added.
3339         * unit-tests/resources/mock-remote-api.js:
3340         (global.RemoteAPI.getJSON): Use the same mock as getJSONWithStatus.
3341
3342 2016-03-24  Ryosuke Niwa  <rniwa@webkit.org>
3343
3344         Migrate admin-regenerate-manifest.js to mocha.js and test v3 UI code
3345         https://bugs.webkit.org/show_bug.cgi?id=155863
3346
3347         Reviewed by Joseph Pecoraro.
3348
3349         Replaced admin-regenerate-manifest.js by a new mocha.js tests using the new server testing capability
3350         added in r198642 and tested v3 UI code (parsing manifest.json and creating models). Also removed
3351         /admin/regenerate-manifest since it has been superseded by /api/manifest.
3352
3353         This patch also extracts manifest.js out of main.js so that it could be used and tested without the
3354         DOM support in node.
3355
3356         * public/admin/regenerate-manifest.php: Deleted.
3357         * public/include/db.php: Fixed a regression from r198642 since CONFIG_DIR now doesn't end with
3358         a trailing backslash.
3359         * public/include/manifest.php:
3360         (ManifestGenerator::bug_trackers): Avoid a warning message when there are no repositories.
3361         * public/v3/index.html:
3362         * public/v3/main.js:
3363         (main):
3364         * public/v3/models/bug-tracker.js:
3365         (BugTracker.prototype.newBugUrl): Added.
3366         (BugTracker.prototype.repositories): Added.
3367         * public/v3/models/manifest.js: Added. Extracted from main.js.
3368         (Manifest.fetch): Moved from main.js' fetchManifest.
3369         (Manifest._didFetchManifest): Moved from main.js' didFetchManifest.
3370         * public/v3/models/platform.js:
3371         (Platform.prototype.hasTest): Fixed the bug that "test" here was shadowing the function parameter of
3372         the same name. This is tested by the newly added test cases.
3373         * server-tests/api-build-requests-tests.js:
3374         * server-tests/api-manifest.js: Added. Migrated test cases from tests/admin-regenerate-manifest.js
3375         with additional assertions for v3 UI model objects.
3376         * server-tests/resources/test-server.js:
3377         (TestServer.prototype.start):
3378         (TestServer.prototype.testConfig): Renamed from _constructTestConfig now that this is a public API.
3379         Also no longer takes dataDirectory as an argument since it's always the same.
3380         (TestServer.prototype._ensureDataDirectory): Fixed a bug that we weren't making public/data.
3381         (TestServer.prototype.cleanDataDirectory): Added. Remove all files inside public/data between tests.
3382         (TestServer.prototype.inject): Added. Calls before, etc... because always calling before had an
3383         unintended side effect of slowing down unit tests even through they don't need Postgres or Apache.
3384         * tests/admin-regenerate-manifest.js: Removed.
3385         * tools/js/database.js:
3386         * tools/js/v3-models.js:
3387
3388 2016-03-23  Ryosuke Niwa  <rniwa@webkit.org>
3389
3390         Add mocha server tests for /api/build-requests
3391         https://bugs.webkit.org/show_bug.cgi?id=155831
3392
3393         Reviewed by Chris Dumez.
3394
3395         Added the new mocha.js based server-tests for /api/build-requests. The new harness automatically:
3396          - starts a new Apache instance
3397          - switches the database during testing via setting an environmental variable 
3398          - backups and restores public/data directory during testing
3399
3400         As a result, developer no longer has to manually setup Apache, edit config.json manually to use
3401         a testing database, or run /api/manifest.php to re-generate the manifest file after testing.
3402
3403         This patch also makes ID resolution optional on /api/build-requests so that v3 model based syncing
3404         scripts can re-use the same code as the v3 UI to process the JSON. tools/sync-with-buildbot.py has
3405         been modified to use this option (useLegacyIdResolution).
3406
3407         * config.json: Added configurations for the test httpd server.
3408         * init-database.sql: Don't error when tables and types don't exist (when database is empty).
3409         * public/api/build-requests.php:
3410         (main): Made the ID resolution optional with useLegacyIdResolution. Also removed "updates" from the
3411         results JSON since it's never used.
3412         * public/include/build-requests-fetcher.php:
3413         (BuildRequestsFetcher::__construct):
3414         (BuildRequestsFetcher::fetch_roots_for_set_if_needed): Fixed the bug that we would include the same
3415         commit multiple times for each root set.
3416         * public/include/db.php:
3417         (config): If present, use ORG_WEBKIT_PERF_CONFIG_PATH instead of Websites/perf.webkit.org/config.json.
3418         * server-tests: Added.
3419         * server-tests/api-build-requests-tests.js: Added. Tests for /api/build-requests.
3420         (.addMockData):
3421         * server-tests/resources: Added.
3422         * server-tests/resources/test-server.conf: Added. Apache configuration file for testing.
3423         * server-tests/resources/test-server.js: Added.
3424         (TestSever): Added.
3425         (TestSever.prototype.start): Added.
3426         (TestSever.prototype.stop): Added.
3427         (TestSever.prototype.remoteAPI): Added. Configures RemoteAPI to be used with the test sever.
3428         (TestSever.prototype.database): Added. Returns Database configured to use the test database.
3429         (TestSever.prototype._constructTestConfig): Creates config.json for testing. The file is generated by
3430         _start and db.php's config() reads it from the environmental variable: ORG_WEBKIT_PERF_CONFIG_PATH.
3431         (TestSever.prototype._ensureDataDirectory): Renames public/data to public/original-data if exists,
3432         and creates a new empty public/data.
3433         (TestSever.prototype._restoreDataDirectory): Deletes public/data and renames public/original-data
3434         back to public/data.
3435         (TestSever.prototype._ensureTestDatabase): Drops the test database if exists and creates a new one.
3436         (TestSever.prototype.initDatabase): Run init-database.sql to start each test with a consistent state.
3437         (TestSever.prototype._executePgsqlCommand): Executes a postgres command line tool such as psql.
3438         (TestSever.prototype._determinePgsqlDirectory): Finds the directory that contains psql.
3439         (TestSever.prototype._startApache): Starts an Apache instance for testing.
3440         (TestSever.prototype._stopApache): Stops the Apache instance for testing.
3441         (TestSever.prototype._waitForPid): Waits for the Apache pid file to appear or disappear.
3442         (before): Start the test server at the beginning.
3443         (beforeEach): Re-initialize all tables before each test.
3444         (after): Stop the test server at the end.
3445         * tools/js/config.js:
3446         (Config.prototype.path):
3447         (Config.prototype.serverRoot): Added. The path to Websites/perf.webkit.org/public/.
3448         (Config.prototype.pathFromRoot): Added. Resolves a path from Websites/perf.webkit.org.
3449         * tools/js/database.js:
3450         (Database): Now optionally takes the database name to use a different database during testing.
3451         (Database.prototype.connect):
3452         (Database.prototype.query): Added.
3453         (Database.prototype.insert): Added.
3454         (tableToPrefixMap): Maps table name to its prefix. Used by Database.insert.
3455         * tools/js/remote.js: Added.
3456         (RemoteAPI): Added. This is node.js equivalent of RemoteAPI in public/v3/remote.js.
3457         (RemoteAPI.prototype.configure): Added.
3458         (RemoteAPI.prototype.fetchJSON): Added.
3459         (RemoteAPI.prototype.fetchJSONWithStatus): Added.
3460         (RemoteAPI.prototype.sendHttpRequest): Added.
3461         * tools/sync-with-buildbot.py:
3462         (main): Use useLegacyIdResolution as this script relies on the legacy behavior.
3463         * unit-tests/checkconfig.js: pg was never directly used in this test.
3464
3465 2016-03-23  Ryosuke Niwa  <rniwa@webkit.org>
3466
3467         Delete a file that was supposed to be removed in r198614 for real.
3468
3469         * unit-tests/resources/v3-models.js: Removed.
3470
3471 2016-03-23  Ryosuke Niwa  <rniwa@webkit.org>
3472
3473         Add a model for parsing buildbot JSON with unit tests
3474         https://bugs.webkit.org/show_bug.cgi?id=155814
3475
3476         Reviewed by Joseph Pecoraro.
3477
3478         Added BuildbotSyncer and BuildbotBuildEntry classes to parse buildbot JSON files with unit tests.
3479         They will be used in the new syncing scripts to improve A/B testing.
3480
3481         * public/v3/models/build-request.js:
3482         (BuildRequest):
3483         * tools/js/buildbot-syncer.js: Added.
3484         (BuildbotBuildEntry): Added.
3485         (BuildbotBuildEntry.prototype.slaveName): Added.
3486         (BuildbotBuildEntry.prototype.buildRequestId): Added.
3487         (BuildbotBuildEntry.prototype.isInProgress): Added.
3488         (BuildbotSyncer): Added.
3489         (BuildbotSyncer.prototype.testPath): Added.
3490         (BuildbotSyncer.prototype.builderName): Added.
3491         (BuildbotSyncer.prototype.platformName): Added.
3492         (BuildbotSyncer.prototype.fetchPendingRequests): Added.
3493         (BuildbotSyncer.prototype._propertiesForBuildRequest): Added.
3494         (BuildbotSyncer.prototype._revisionSetFromRootSetWithExclusionList): Added.
3495         (BuildbotSyncer._loadConfig): Added.
3496         (BuildbotSyncer._validateAndMergeConfig): Added.
3497         (BuildbotSyncer._validateAndMergeProperties): Added.
3498         * tools/js/v3-models.js: Copied from unit-tests/resources/v3-models.js.
3499         (beforeEach): Deleted since this only defined inside mocha.
3500         * unit-tests/analysis-task-tests.js:
3501         * unit-tests/buildbot-syncer-tests.js: Added.
3502         (sampleiOSConfig):
3503         (createSampleBuildRequest):
3504         (.smallConfiguration):
3505         * unit-tests/measurement-adaptor-tests.js:
3506         * unit-tests/measurement-set-tests.js:
3507         * unit-tests/resources/mock-v3-models.js: Renamed from unit-tests/resources/v3-models.js.
3508         (beforeEach):
3509         * unit-tests/test-groups-tests.js:
3510         (sampleTestGroup):
3511
3512 2016-03-22  Ryosuke Niwa  <rniwa@webkit.org>
3513
3514         Add unit tests for test-group.js
3515         https://bugs.webkit.org/show_bug.cgi?id=155781
3516
3517         Reviewed by Joseph Pecoraro.
3518
3519         Added unit tests for test-group.js that would have caught regressions fixed in r198503.
3520
3521         * public/v3/components/chart-pane-base.js:
3522         (ChartPaneBase.prototype._renderAnnotations): Added a forgotten break statement.
3523         * public/v3/models/build-request.js:
3524         (BuildRequest.prototype.setResult):
3525         (BuildRequest):
3526         * public/v3/models/test-group.js:
3527         * unit-tests/measurement-set-tests.js: Use ./resources/v3-models.js to reduce the code duplication.
3528         * unit-tests/resources/v3-models.js: Import more stuff from v3 models.
3529         (beforeEach):
3530         * unit-tests/test-groups-tests.js: Added. Added some unit tests for TestGroup.
3531         (sampleTestGroup):
3532         (.testGroupWithStatusList):
3533
3534 2016-03-22  Ryosuke Niwa  <rniwa@webkit.org>
3535
3536         Fix a typo.
3537
3538         * config.json:
3539
3540 2016-03-21  Ryosuke Niwa  <rniwa@webkit.org>
3541
3542         Commit log viewer repaints too frequently after r198499
3543         https://bugs.webkit.org/show_bug.cgi?id=155732
3544
3545         Reviewed by Joseph Pecoraro.
3546
3547         The bug was caused by InteractiveTimeSeriesChart invoking onchange callback whenever mouse moved even
3548         if the current point didn't change. Fixed the bug by avoiding the work if the indicator hadn't changed
3549         and avoiding work in the commit log viewer when the requested repository and the revision range were
3550         the same as those of the last request.
3551
3552         * public/v3/components/commit-log-viewer.js:
3553         (CommitLogViewer):
3554         (CommitLogViewer.prototype.currentRepository): Exit early when repository and the revision range are
3555         identical to the one we already have to avoid repaints and issuing multiple network requests.
3556         * public/v3/components/interactive-time-series-chart.js:
3557         (InteractiveTimeSeriesChart.prototype._mouseMove): Don't invoke _notifyIndicatorChanged if the current
3558         indicator hadn't changed.
3559         * public/v3/pages/chart-pane.js:
3560         (ChartPane.prototype._indicatorDidChange): Fixed the bug that unlocking the indicator wouldn't update
3561         the URL. We need to check whether the lock state had changed. The old condition was also redundant
3562         since _mainChartIndicatorWasLocked is always identically equal to isLocked per the prior assignment.
3563
3564 2016-03-21  Ryosuke Niwa  <rniwa@webkit.org>
3565
3566         Fix A/B testing after r198503.
3567
3568         * public/include/build-requests-fetcher.php:
3569
3570 2016-03-21  Ryosuke Niwa  <rniwa@webkit.org>
3571
3572         Analysis task page is broken after r198479
3573         https://bugs.webkit.org/show_bug.cgi?id=155735
3574
3575         Rubber-stamped by Chris Dumez.
3576
3577         * public/api/measurement-set.php:
3578         (AnalysisResultsFetcher::fetch_commits): We need to emit the commit ID as done for regular data.
3579         * public/include/build-requests-fetcher.php:
3580         (BuildRequestsFetcher::fetch_roots_for_set_if_needed): Ditto. Don't use a fake ID after r198479.
3581         * public/v3/models/commit-log.js:
3582         (CommitLog): Assert that all commit log IDs are integers to catch regressions like this in future.
3583         * public/v3/models/root-set.js:
3584         (RootSet): Don't resolve Repository here as doing so would modify the shared "root" entry in the JSON
3585         we fetched, and subsequent construction of RootSet would fail since this line would blow up trying to
3586         find the repository with "[object]" as the ID.
3587         * public/v3/models/test-group.js:
3588         (TestGroup._createModelsFromFetchedTestGroups): Resolve Repository here.
3589
3590 2016-03-21  Ryosuke Niwa  <rniwa@webkit.org>
3591
3592         v3 UI sometimes don't update the list of revisions on the commit log viewer
3593         https://bugs.webkit.org/show_bug.cgi?id=155729
3594
3595         Rubber-stamped by Chris Dumez.
3596
3597         Fixed multiple bugs that were affecting the list of blame range and commit logs for the range weren't
3598         updated in some cases on v3 UI. Also, the commit log viewer state is now a part of the URL state so
3599         opening and closing the commit log viewer will persist across page loads.
3600
3601         Also fixed a regression from r198479 that Test object can't be created for a top level test.
3602
3603         * public/v3/components/chart-pane-base.js:
3604         (ChartPaneBase.prototype.configure):
3605         (ChartPaneBase.prototype._mainSelectionDidChange): Fixed the bug that the list of blame range nor the
3606         commit log viewer don't get updated when the selected range changes.
3607         (ChartPaneBase.prototype._indicatorDidChange):
3608         (ChartPaneBase.prototype._didFetchData):
3609         (ChartPaneBase.prototype._updateStatus): Extracted from _indicatorDidChange and _didFetchData.
3610         (ChartPaneBase.prototype._requestOpeningCommitViewer): Renamed from _openCommitViewer.
3611
3612         * public/v3/components/chart-status-view.js:
3613         (ChartStatusView.prototype.updateStatusIfNeeded): Fixed the bug that the blame range doesn't get set
3614         on the initial page load when the selection range is set but the chart data hadn't been fetched yet.
3615
3616         * public/v3/components/commit-log-viewer.js:
3617         (CommitLogViewer.prototype.view): Fixed the bug that we don't clear out the old list of commits while
3618         loading the next set of commits to show as it looked as if the list was never updated.
3619         (CommitLogViewer.prototype.render): Fixed the bug that the view always show the last repository name
3620         even if there were nothing being fetched or commits to show.
3621
3622         * public/v3/components/pane-selector.js:
3623         (PaneSelector.prototype.focus): Removed superfluous call to console.log.
3624
3625         * public/v3/models/data-model.js:
3626         (DataModelObject.listForStaticMap): Generalized the code for all to fix the bug in Test.
3627         (DataModelObject.all):
3628
3629         * public/v3/models/test.js:
3630         (Test): Fixed the bug that this code was relying on the static map to be an array.
3631         (Test.topLevelTests): Use newly added listForStaticMap to convert the dictionary to an array.
3632
3633         * public/v3/pages/chart-pane-status-view.js:
3634         (ChartPaneStatusView): Always initialize _usedRevisionRange as a triple to simplify code elsewhere.
3635         (ChartPaneStatusView.prototype.render): Invoke _revisionCallback when user clicks on a repository
3636         expansion mark (>>). Also fixed click handler from the row since this made selecting revision range
3637         on the view cumbersome. Now user has to explicitly click on the expansion mark (>>).
3638         (ChartPaneStatusView.prototype._setRevisionRange): Now takes shouldNotify, from, and to as arguments
3639         as this function must not invoke_revisionCallback inside _updateRevisionListForNewCurrentRepository.
3640         (ChartPaneStatusView.prototype.moveRepositoryWithNotification): Use newly added setCurrentRepository
3641         instead of manually invoking setCurrentRepository and updateRevisionListWithNotification.
3642         (ChartPaneStatusView.prototype.setCurrentRepository): Fixed the bug that we weren't updating the
3643         blame list here.
3644         (ChartPaneStatusView.prototype.updateRevisionList): Renamed from updateRevisionListWithNotification