Yet another build fix after r214502. Workaround webkit.org/b/169907 for now.
[WebKit.git] / Websites / perf.webkit.org / ChangeLog
1 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2
3         Yet another build fix after r214502. Workaround webkit.org/b/169907 for now.
4
5         * public/v3/pages/analysis-task-page.js:
6         (AnalysisTaskPage.cssTemplate):
7
8 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
9
10         Revert an erronously change in the previous commit.
11
12         * public/v3/components/base.js:
13
14 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
15
16         Build fix after r214280. Don't render components until its element is inserted into a document.
17
18         * public/v3/components/base.js:
19         (ComponentBase):
20
21 2017-03-29  Ryosuke Niwa  <rniwa@webkit.org>
22
23         Another build fix after r214502.
24
25         * public/v3/components/analysis-results-viewer.js:
26         (AnalysisResultsViewer.prototype.render): this._groupToCellMap.get may not contain the cell when startPoint
27         or metric had not been fetched yet even if currentTestGroup is set.
28
29 2017-03-29  Ryosuke Niwa  <rniwa@webkit.org>
30
31         Build fix after r214502. Analysis tasks without any test groups are throwing exceptions.
32
33         * public/v3/components/results-table.js:
34         (ResultsTable.prototype.renderTable): Don't show the header row when there are no content to show. 
35         (ResultsTable.prototype._computeRepositoryList): Return a pair of arrays. The caller expects the repository
36         list to be an array, not undefined.
37
38 2017-03-28  Ryosuke Niwa  <rniwa@webkit.org>
39
40         Modernize AnalysisTaskPage
41         https://bugs.webkit.org/show_bug.cgi?id=170165
42
43         Reviewed by Antti Koivisto.
44
45         Modernized AnalysisTaskPage and related components. The main refactoring happened in AnalysisTaskPage
46         from which AnalysisTaskResultsPane and AnalysisTaskTestGroupPane have been extracted.
47
48         Decoupled BuildRequest from its results. AnalysisResultsViewer and TestGroupResultsTable now stores
49         a reference to AnalysisResultsView and Metric to find the results for each build request.
50         This refactoring is necessary in order to view results of an arbitrary metric in the future.
51
52         Also refactored ResultsTable and its subclasses extensively. Instead of making its render() to invoke
53         subclass' methods such as buildRowGroups, heading, and additionalHeading, rely on each subclass call
54         to invoke renderTable(), renamed from render(), with callbacks to add extra headers and columns.
55
56         This patch also fixes a number of usability issues found by the user such as changing the test name
57         resets the customized revisions by the virtue of the modern code being naturally more correct.
58
59         * public/v3/components/analysis-results-viewer.js:
60         (AnalysisResultsViewer):
61         (AnalysisResultsViewer.prototype.setTestGroupCallback): Deleted. Replaced by "testGroupClick" action.
62         (AnalysisResultsViewer.prototype.setRangeSelectorLabels): Moved here from ResultsTable since it's
63         never used in ResultsTable or TestGroupResultsTable.
64         (AnalysisResultsViewer.prototype.selectedRange): Ditto.
65         (AnalysisResultsViewer.prototype.setPoints): Now takes metric as the third argument.
66         (AnalysisResultsViewer.prototype.setTestGroups): Now takes the current test group.
67         (AnalysisResultsViewer.prototype.didUpdateResults): Deleted.
68         (AnalysisResultsViewer.prototype.setAnalysisResultsView): Added.
69         (AnalysisResultsViewer.prototype.render): Invoke _renderTestGroups lazily. Also simplified the logic
70         to find the selected list item. Since we always use a shadow DOM now, we can simply look for an element
71         with ".seleted" instead of crafting a unique class name.
72         (AnalysisResultsViewer.prototype.renderTestGroups): Renamed from buildRowGroups. Specify callbacks to
73         insert headers for A/B radio buttons, which has been moved from ResultsTable.prototype.render, and the
74         stacked blocks of testing results.
75         (AnalysisResultsViewer.prototype._classForTestGroup): Deleted.
76         (AnalysisResultsViewer.prototype._openStackingBlock): Deleted.
77         (AnalysisResultsViewer.prototype._expandBetween): Create a new set for expandedPoints to make
78         _renderTestGroupsLazily.evaluate do the work.
79         (AnalysisResultsViewer._layoutBlocks): Moved from TestGroupStackingGrid.layout.
80         (AnalysisResultsViewer._sortBlocksByRow): Moved from AnalysisResultsViewer.TestGroupStackingGrid.
81         (AnalysisResultsViewer._insertAfterBlockWithSameRange): Ditto.
82         (AnalysisResultsViewer._insertBlockInFirstAvailableColumn): Ditto.
83         (AnalysisResultsViewer._createCellsForRow): Ditto.
84
85         (AnalysisResultsViewer.TestGroupStackingBlock):
86         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
87         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.createStackingCell): No longer creates a unique
88         class name here. See the inline comment for AnalysisResultsViewer.prototype.render.
89         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.isThin): Deleted. We used to collapse "failed"
90         test groups as a thin vertical line, and we wanted to show them next to each other in _layoutBlock but
91         we don't do that anymore.
92         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet): Added. Uses
93         this._analysisResultsView to extract the results for the current metrics.
94         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
95
96         * public/v3/components/analysis-task-bug-list.js: Added.
97         (AnalysisTaskBugList): Added. Extracted from AnalysisTaskChartPane.
98         (AnalysisTaskBugList.prototype.setTask): Added.
99         (AnalysisTaskBugList.prototype.didConstructShadowTree): Added.
100         (AnalysisTaskBugList.prototype.render): Added.
101         (AnalysisTaskBugList.prototype._associateBug): Added.
102         (AnalysisTaskBugList.prototype._dissociateBug): Added.
103         (AnalysisTaskBugList.htmlTemplate): Added.
104
105         * public/v3/components/chart-pane-base.js:
106         (ChartPaneBase.htmlTemplate): Added a hook to insert more content at the end in AnalysisTaskChartPane.
107         (ChartPaneBase.paneFooterTemplate): Added.
108
109         * public/v3/components/customizable-test-group-form.js:
110         (CustomizableTestGroupForm):
111         (CustomizableTestGroupForm.prototype.setCommitSetMap):
112         (CustomizableTestGroupForm.prototype.startTesting): Renamed from _submitted. Now dispatches an action
113         by the name of "startTesting" instead of calling this._startCallback.
114         (CustomizableTestGroupForm.prototype.didConstructShadowTree): Added. Moved the logic to attach event
115         handlers here to avoid eagerly creating the shadow tree in the constructor.
116         (CustomizableTestGroupForm.prototype._computeCommitSetMap): Use the newly added this._revisionEditorMap
117         to find the relevant input element instead of running a querySelector.
118         (CustomizableTestGroupForm.prototype.render): Lazily invoke _renderCustomRevisionTable. This avoids
119         overriding the customized revisions when the user finally types in the test group name.
120         (CustomizableTestGroupForm.prototype._renderCustomRevisionTable): Extracted from render.
121         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons): Made this a non-static method
122         since it needs to update this._revisionEditorMap now. Merged _constructRevisionRadioButtons.
123         (CustomizableTestGroupForm.prototype._createRadioButton): Deleted. See above.
124         (CustomizableTestGroupForm.cssTemplate):
125         (CustomizableTestGroupForm.formContent): Use IDs instead of classes to make this.content(ID) work.
126
127         * public/v3/components/mutable-list-view.js:
128         (MutableListView.prototype.setList):
129         (MutableListView.prototype.setKindList):
130         (MutableListView.prototype.setAddCallback): Deleted. Replaced by "addItem" action.
131         (MutableListView.prototype.render):
132         (MutableListItem.prototype.content):
133
134         * public/v3/components/results-table.js:
135         (ResultsTable): Removed this._rangeSelectorLabels, this._rangeSelectorCallback, and this._selectedRange
136         as they are only used by AnalysisResultsViewer. Also replaced this._valueFormatter by
137         this._analysisResultsView which knows a metric.
138         (ResultsTable.prototype.setValueFormatter): Deleted.
139         (ResultsTable.prototype.setRangeSelectorLabels): Deleted.
140         (ResultsTable.prototype.setRangeSelectorCallback): Deleted.
141         (ResultsTable.prototype.selectedRange): Deleted.
142         (ResultsTable.prototype._rangeSelectorClicked): Deleted.
143         (ResultsTable.prototype.setAnalysisResultsView): Added.
144         (ResultsTable.prototype.renderTable): Added. Removed the logic to add _rangeSelectorLabels since it has
145         been moved to AnalysisResultsViewer.prototype.render inside buildColumns, which also inserts additional
146         columns which used to be stored on each ResultsTableRow. Use the same technique to insert additional
147         headers. Also take the name (thead tr th) of row header (tbody tr td) as an argument and automatically
148         create a table cell of an appropriate colspan.
149         (ResultsTable.prototype._createRevisionListCells):
150         (ResultsTable.prototype.heading): Deleted. Superseded by buildHeaders callback.
151         (ResultsTable.prototype.additionalHeading): Ditto.
152         (ResultsTable.prototype.buildRowGroups): Deleted. It is now the responsibility of each subclass to call
153         ResultsTable's renderTable() in the subclass' render() function.
154         (ResultsTable.prototype._computeRepositoryList): No longer takes extraRepositories as an argument.
155         Instead, this function now returns a pair of the repository list and the list of constant commits.
156         (ResultsTable.htmlTemplate):
157         (ResultsTable.cssTemplate):
158
159         * public/v3/components/test-group-form.js:
160         (TestGroupForm): Avoid eagerly creating the shadow tree. Also removed the removed the dead code.
161         (TestGroupForm.prototype.setRepetitionCount): Simply override the value of the select element.
162         (TestGroupForm.prototype.didConstructShadowTree): Added. Attach event handlers here to avoid eagerly
163         creating the shadow tree in the constructor.
164         (TestGroupForm.prototype.startTesting): Renamed from _submitted. Dispatch "startTesting" action instead
165         of invoking _startCallback which has been removed.
166         (TestGroupForm.htmlTemplate):
167         (TestGroupForm.formContent):
168
169         * public/v3/components/test-group-results-table.js:
170         (TestGroupResultsTable):
171         (TestGroupResultsTable.prototype.didUpdateResults): Deleted. No longer neeed per setAnalysisResultsView
172         in ResultsTable.
173         (TestGroupResultsTable.prototype.setTestGroup):
174         (TestGroupResultsTable.prototype.heading): Deleted.
175         (TestGroupResultsTable.prototype.render):
176         (TestGroupResultsTable.prototype._renderTestGroup): Extracted from render.
177         (TestGroupResultsTable.prototype._buildRowGroups): Renamed from buildRowGroups.
178         (TestGroupResultsTable.prototype._buildRowGroupForCommitSet): Extracted from buildRowGroups.
179         (TestGroupResultsTable.prototype._buildComparisonRow): Extracted from buildRowGroups.buildRowGroups
180
181         * public/v3/index.html: Include analysis-task-bug-list.js.
182
183         * public/v3/models/analysis-results.js:
184         (AnalysisResults): Inverted the map so that we can easily create a view based on metric.
185         (AnalysisResults.prototype.find): Ditto.
186         (AnalysisResults.prototype.add): Ditto.
187         (AnalysisResults.prototype.viewForMetric): Added.
188         (AnalysisResults.fetch):
189         (AnalysisResultsView): Added.
190         (AnalysisResultsView.prototype.metric): Added.
191         (AnalysisResultsView.prototype.resultForBuildId): Added.
192
193         * public/v3/models/build-request.js:
194         (BuildRequest.result): Deleted.
195         (BuildRequest.setResult): Deleted.
196
197         * public/v3/models/test-group.js:
198         (TestGroup): Removed this._allCommitSets since it was never used.
199         (TestGroup.prototype.didSetResult): Deleted since it was never used.
200         (TestGroup.prototype.compareTestResults): Now takes an array of measurement set values.
201         (TestGroup.prototype._valuesForCommitSet): Deleted.
202
203         * public/v3/pages/analysis-task-page.js:
204         (AnalysisTaskChartPane): This class now includes the form to cutomize the revisions.
205         (AnalysisTaskChartPane.prototype.setShowForm): Added.
206         (AnalysisTaskChartPane.prototype._mainSelectionDidChange):
207         (AnalysisTaskChartPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action when
208         the user presses the button to start a new A/B testing from the chart.
209         (AnalysisTaskChartPane.prototype.render): Added.
210         (AnalysisTaskChartPane.prototype.paneFooterTemplate): Added.
211         (AnalysisTaskChartPane.cssTemplate):
212
213         (AnalysisTaskResultsPane): Added. Encapsulates AnalysisResultsViewer and CustomizableTestGroupForm.
214         (AnalysisTaskResultsPane.prototype.setPoints): Added.
215         (AnalysisTaskResultsPane.prototype.setTestGroups): Added.
216         (AnalysisTaskResultsPane.prototype.setAnalysisResultsView): Added.
217         (AnalysisTaskResultsPane.prototype.setShowForm): Added.
218         (AnalysisTaskResultsPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action
219         when the user presses the button to start a new A/B testing from the chart.
220         (AnalysisTaskResultsPane.prototype.render): Added.
221         (AnalysisTaskResultsPane.htmlTemplate): Added.
222         (AnalysisTaskResultsPane.cssTemplate): Added.
223
224         (AnalysisTaskTestGroupPane): Added. Encapsulates TestGroupResultsTable and CustomizableTestGroupForm.
225         (AnalysisTaskTestGroupPane.prototype.didConstructShadowTree): Added.
226         (AnalysisTaskTestGroupPane.prototype.setTestGroups): Added.
227         (AnalysisTaskTestGroupPane.prototype.setAnalysisResultsView): Added.
228         (AnalysisTaskTestGroupPane.prototype.render): Added.
229         (AnalysisTaskTestGroupPane.prototype._renderTestGroups): Added. Updates the list of test groups. Hide
230         the hidden groups unless showHiddenGroups is set. Updates this._testGroupMap so that the visibility of
231         groups and their names can be updated without having to re-render the entire list.
232         (AnalysisTaskTestGroupPane.prototype._renderTestGroupVisibility): Added.
233         (AnalysisTaskTestGroupPane.prototype._renderTestGroupNames): Added.
234         (AnalysisTaskTestGroupPane.prototype._renderCurrentTestGroup): Added. Update TestGroupResultsTable with
235         the selected test group. Also highlight the list view, and update the hide-unhide toggle button's label
236         as needed.
237         (AnalysisTaskTestGroupPane.htmlTemplate): Added.
238         (AnalysisTaskTestGroupPane.cssTemplate): Added.
239
240         (AnalysisTaskPage): Deleted a massive number of instance variables. They are now manged by newly added
241         AnalysisTaskChartPane, AnalysisTaskResultsPane, and AnalysisTaskTestGroupPane
242         (AnalysisTaskPage.prototype.didConstructShadowTree): Added. Attach various event handlers here to avoid
243         eagerly creating the shadow tree in the constructor.
244         (AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId):
245         (AnalysisTaskPage.prototype._didFetchTask): No longer sets the value formatter to the results viewer
246         and the results table as they now recieve AnalysisResultsView later in _assignTestResultsIfPossible.
247         (AnalysisTaskPage.prototype._didFetchMeasurement): Set the metric to the results viewer.
248         (AnalysisTaskPage.prototype._didUpdateTestGroupHiddenState):
249         (AnalysisTaskPage.prototype._assignTestResultsIfPossible): Create AnalysisResultsView from the newly
250         retrieved AnalysisResults and pass it to AnalysisTaskResultsPane and AnalysisTaskTestGroupPane.
251         (AnalysisTaskPage.prototype.render): Dramatically simplified.
252         (AnalysisTaskPage.prototype._renderTaskNameAndStatus): Extracted from render.
253         (AnalysisTaskPage.prototype._renderRelatedTasks): Ditto.
254         (AnalysisTaskPage.prototype._renderCauseAndFixes): Ditto.
255         (AnalysisTaskPage.prototype._showTestGroup):
256         (AnalysisTaskPage.prototype._updateTaskName): Now takes the new name as an argument.
257         (AnalysisTaskPage.prototype._updateTestGroupName): Now takes the new name as the second argument.
258         (AnalysisTaskPage.prototype._hideCurrentTestGroup): Now takes the test group to hide.
259         (AnalysisTaskPage.prototype._associateCommit): Moved to AnalysisTaskBugList.
260         (AnalysisTaskPage.prototype._dissociateCommit): Ditto.
261         (AnalysisTaskPage.prototype._retryCurrentTestGroup): Now takes the test group as the first argument.
262         (AnalysisTaskPage.prototype._chartSelectionDidChange): Deleted.
263         (AnalysisTaskPage.prototype._createNewTestGroupFromChart): Deleted.
264         (AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer): Deleted.
265         (AnalysisTaskPage.prototype._createNewTestGroupFromViewer): Deleted.
266         (AnalysisTaskPage.htmlTemplate):
267         (AnalysisTaskPage.cssTemplate):
268
269         * unit-tests/test-groups-tests.js: Updated a test case which was expecting BuildReqeust's result, which
270         has been removed, to exist.
271
272 2017-03-23  Ryosuke Niwa  <rniwa@webkit.org>
273
274         Share more code between ManifestGenerator and /api/triggerables
275         https://bugs.webkit.org/show_bug.cgi?id=169993
276
277         Reviewed by Chris Dumez.
278
279         Shared the code to fetch the list of triggerables from the database between ManifestGenerator
280         and /api/triggerables.
281
282         * public/api/triggerables.php:
283         (main):
284         * public/include/manifest-generator.php:
285         (ManifestGenerator::fetch_triggerables): Extracted as a static function. Also include the ID
286         in the triggerable data.
287
288 2017-03-23  Ryosuke Niwa  <rniwa@webkit.org>
289
290         create-test-group should allow a different set of repositories to be used in each configuration
291         https://bugs.webkit.org/show_bug.cgi?id=169992
292
293         Rubber-stamped by Antti Koivisto.
294
295         Added the support for new POST parameter, revisionSets, to /privileged-api/create-test-group.
296         This new parameter now specifies an array of repository id to revision dictionaries, and allows
297         different set of repositories' revisions to be specified in each dictionary.
298
299         We keep the old API for v2 UI and detect-changes.js compatibility for now.
300
301         * public/privileged-api/create-test-group.php:
302         (main):
303         (commit_sets_from_revision_sets): Added.
304         (ensure_commit_sets): Only fetch the top-level repository per r213788 and r213976.
305
306         * public/v3/models/test-group.js:
307         (TestGroup.createAndRefetchTestGroups): Use the newly added revisionSets parameter instead of
308         the now depreacted commitSets parameter.
309
310         * public/v3/pages/analysis-task-page.js:
311         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList): Simplified this code
312         by simply verifying the consistency of commit sets now that createAndRefetchTestGroups takes
313         an array of commit sets instead of a dictionary of repository name to a list of revisions.
314
315         * server-tests/privileged-api-create-test-group-tests.js: Added test cases for new parameter.
316
317 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
318
319         /api/uploaded-file should return createdAt as a POSIX timestamp
320         https://bugs.webkit.org/show_bug.cgi?id=169980
321
322         Rubber-stamped by Antti Koivisto.
323
324         Call Database::to_js_time on createdAt to return it as a POSIX timestamp.
325
326         * public/include/uploaded-file-helpers.php:
327         (format_uploaded_file): Fixed the bug.
328         * server-tests/api-manifest-tests.js: Renamed from api-manifest.js.
329         * server-tests/api-uploaded-file-tests.js: Renamed from api-uploaded-file.js. Added a test case.
330
331 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
332
333         UploadedFile should support a callback for upload progress
334         https://bugs.webkit.org/show_bug.cgi?id=169977
335
336         Reviewed by Andreas Kling.
337
338         Added a new option dictionary to CommonRemoteAPI.sendHttpRequest with uploadProgressCallback
339
340         Moved request headers and responseHandler callback in NodeRemoteAPI to this dictionary,
341         and updated the tests which relied on this code.
342
343         * public/shared/common-remote.js:
344         (CommonRemoteAPI.prototype.postJSON):
345         (CommonRemoteAPI.prototype.postJSONWithStatus):
346         (CommonRemoteAPI.prototype.postFormData):
347         (CommonRemoteAPI.prototype.postFormDataWithStatus):
348         * public/v3/privileged-api.js:
349         (PrivilegedAPI.prototype.sendRequest):
350         * public/v3/remote.js:
351         (BrowserRemoteAPI.prototype.sendHttpRequest):
352         (BrowserRemoteAPI.prototype.sendHttpRequestWithFormData):
353         (BrowserRemoteAPI):
354         * server-tests/api-uploaded-file.js:
355         * tools/js/remote.js:
356         (NodeRemoteAPI.prototype.sendHttpRequest):
357         (NodeRemoteAPI.prototype.sendHttpRequestWithFormData):
358         (NodeRemoteAPI):
359
360 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
361
362         ComponentBase should enqueue itself to render when it becomes connected
363         https://bugs.webkit.org/show_bug.cgi?id=169905
364
365         Reviewed by Antti Koivisto.
366
367         When a component becomes connected to a document, enqueue itself to render automatically.
368         Also added the support for boolean attribute to ComponentBase.createElement.
369
370         * ReadMe.md: Added an instruction to raise the upload limit per r214065.
371         * browser-tests/component-base-tests.js: Added tests for the new behavior and createElement. Also moved
372         the tests related to enqueueToRenderOnResize out of defineElement tests.
373
374         * browser-tests/index.html:
375         (BrowsingContext.prototype.constructor): Override requestAnimationFrame so that the callback would be
376         involved immediately durign testing.
377
378         * public/v3/components/base.js:
379         (ComponentBase): Enqueue itself to render during construction if custom elements is not available.
380         (ComponentBase.defineElement):
381         (ComponentBase.defineElement.elementClass.prototype.connectedCallback): Enqueue itself to render when
382         the component's element became connected.
383         (ComponentBase.createElement): Use Array.isArray instead of instanceof to make it work with arrays made
384         in other realms (global objects) during testing. Added the support for boolean attributes. Setting an
385         attribute value to true would set the attribute, and setting it to false would not set the attribute.
386         (ComponentBase.useNativeCustomElements): Added. True iff window.customElements is defined.
387
388         * public/v3/components/chart-pane-base.js:
389         (ChartPaneBase.prototype.render): No longer need to call enqueueToRender on the commit log viewer.
390
391         * public/v3/components/commit-log-viewer.js:
392         (CommitLogViewer.prototype.render): No longer need to call enqueueToRender on the spinner icon.
393
394         * public/v3/models/time-series.js:
395         (TimeSeries): Made this a proper class declaration now that we don't include data.js after r213300.
396
397         * public/v3/pages/chart-pane.js:
398         (ChartPane.prototype._renderActionToolbar): No longer need to call enqueueToRender on the close icon.
399
400         * public/v3/pages/summary-page.js:
401         (SummaryPage.prototype._renderCell): No longer need to call enqueueToRender on the spinner icon.
402
403 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
404
405         Delete another function that was supposed to be removed in the previous commit.
406
407         * public/v3/models/build-request.js:
408         (BuildRequest.cachedRequestsForTriggerableID): Deleted.
409
410 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
411
412         Modernize BuildRequestQueuePage
413         https://bugs.webkit.org/show_bug.cgi?id=169903
414
415         Reviewed by Antti Koivisto.
416
417         Modernized the code for /v3/#/analysis/queue.
418
419         * public/v3/models/build-request.js:
420         (BuildRequest.fetchTriggerables): Deleted since the manifest JSON now contains all the triggerables.
421
422         * public/v3/pages/build-request-queue-page.js:
423         (BuildRequestQueuePage): Deleted this._triggerables. Added this._buildRequestsByTriggerable.
424         (BuildRequestQueuePage.prototype.open): Modernized the code.
425         (BuildRequestQueuePage.prototype.render): Ditto.
426         (BuildRequestQueuePage.prototype._constructBuildRequestTable): Ditto.
427
428 2017-03-19  Ryosuke Niwa  <rniwa@webkit.org>
429
430         Charts page show an inconsistent list of revisions for Git and Subversion
431         https://bugs.webkit.org/show_bug.cgi?id=169888
432
433         Reviewed by Andreas Kling.
434
435         With Git, CommitLogViewer was showing the list of revisions including the starting hash,
436         which was the last data point's revision instead of all revisions after the last data point.
437
438         Fixed the bug by always specifying the revision at the last data point in both Subversion
439         and Git and then making /api/commits/<repository>/?from=X&to=Y exclude the first revision.
440         For clarity, "from" and "to" query parameters have been renamed to "precedingRevision" and
441         "lastRevision" respectively.
442
443         We also no longer adds 1 to the starting revision of Subversion-like starting revisions. e.g.
444         when the last data point was at r1234, new data point is at r1250, the label is now "r1234-r1250"
445         instead of "r1235-r1250".
446
447         * browser-tests/chart-revision-range-tests.js: Fixed the tests since revisionList no longer
448         specifies from/to revisions.
449         * browser-tests/commit-log-viewer-tests.js: Added. Added tests for CommitLogViewer.
450         * browser-tests/index.html: Include the new test. Also use a local copy of mocha.js/css.
451
452         * public/api/commits.php:
453         (main): Renamed "from" and "to" query parameters.
454
455         * public/include/commit-log-fetcher.php:
456         (CommitLogFetcher::fetch_between): Added a check that commit time should either be specified
457         in both rows or not specified in either. Also reject when before_first_revision is identical
458         or after last_revision instead of re-ordering them since it no longer makes sense to do so with
459         new query parameter names.
460
461         * public/v3/components/base.js:
462         (ComponentBase._addContentToElement): Use Array.isArray instead of instanceof. It's resilient
463         againt realm (global object) differences.
464
465         * public/v3/components/chart-pane-base.js:
466         (ChartPaneBase.prototype._updateCommitLogViewer): No longer calls enqueueToRender on this since
467         CommitLogViewer does that on its own now.
468         (ChartPaneBase.prototype.render): Juse use this._openRepository instead of relying on CommitLogViewer
469         to remember which repository is current. This was the only use of currentRepository.
470
471         * public/v3/components/commit-log-viewer.js:
472         (CommitLogViewer):
473         (CommitLogViewer.prototype.currentRepository): Deleted.
474         (CommitLogViewer.prototype.view):
475         (CommitLogViewer.prototype._fetchCommitLogs): Modernized and extracted from view to make it lazy.
476         Call fetchForSingleRevision when precedingRevision is not specified or it's identical to lastRevision
477         since the generic JSON API no longer supports being called with the identical revisions.
478         (CommitLogViewer.prototype.render): Modernized & simplified the code.
479         (CommitLogViewer.prototype._renderCommitList): Extracted from render to make it lazy.
480         (CommitLogViewer.htmlTemplate): Add ID on caption & tbody so that they're more easily addressable.
481         (CommitLogViewer.cssTemplate):
482
483         * public/v3/models/commit-log.js:
484         (CommitLog.prototype.diff): No longer includes from/to revisions in the result. Also avoid adding
485         1 to a Subversion-like starting revision for creating the label. See above. But we still do this
486         for forming URLs due to the way tools like Trac work with Subversion revisions.
487         (CommitLog.fetchBetweenRevisions): Rewritten using DataModel.prototype.cachedFetch with FIXME for
488         what this function is supposed to be doing.
489         (CommitLog._cachedCommitLogs): Deleted.
490         (CommitLog.fetchForSingleRevision): Added.
491         (CommitLog._constructFromRawData): Added.
492
493         * public/v3/models/data-model.js:
494         (DataModelObject.cachedFetch): Don't parse query values as an integer. Just URL-escape them.
495
496         * public/v3/remote.js:
497         (BrowserRemoteAPI.prototype.sendHttpRequest): Fixed a typo.
498
499         * server-tests/api-commits-tests.js: Renamed from api-commits.js. Updated the existing tests to
500         use new query parameters and added more test cases.
501
502         * unit-tests/commit-log-tests.js: Updated the test cases now that CommitLog.prototype.diff no longer
503         includes from/to values. They're computed in ChartRevisionRange instead.
504
505 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
506
507         Fix os-build-fetcher.js and subprocess.js to make them work
508         https://bugs.webkit.org/show_bug.cgi?id=169844
509
510         Reviewed by Antti Koivisto.
511
512         The script added in r213976 has a bug that it can execute commands to fetch subcommits in parallel.
513         Some commands to poll the lsit of system components is not desirable to be ran in parallel.
514
515         * server-tests/resources/mock-subprocess.js:
516         (MockSubprocess): Use const declaration.
517         (MockSubprocess.resetAndWaitForInvocation): Added.
518         (MockSubprocess.waitForInvocation): Renamed from waitingForInvocation. A function name must be a verb.
519         See https://webkit.org/code-style-guidelines/#names-verb
520         (MockSubprocess.reset): Set invocations.length to 0 so that tests can store a reference to the array
521         regardless of whether reset is called or when it's called.
522
523         * server-tests/tools-os-build-fetcher-tests.js: Updated tests per the code change. Most of codes now
524         expect each command to be ran seprately. e.g. if there were two commands to run, instead of expecting
525         them to be both ran, and resolving invocation promises, we'd wait for one command to run, resolve,
526         its subcommand to run, and then move onto the second top-level command. Also use a local reference
527         to MockSubprocess.invocations instead of using the fully qualified name.
528
529         * tools/js/os-build-fetcher.js:
530         (mapInSerialPromiseChain): Added. Calling a closure that returns a promise on each item in an array
531         in serial (not asynchronous) is a very common pattern in this class.
532         (OSBuildFetcher.fetchAndReportAllInOrder): Added.
533         (OSBuildFetcher.prototype.fetchAndReportNewBuilds): Log what the number of builds being submitted.
534         (OSBuildFetcher.prototype._fetchAvailableBuilds): Fixed the main bug. Using Promise.all would result
535         in each top-level command to be execued in parallel. Since each subcommand is executed as soon as
536         its parent command is executed, this results in commands to be executed in parallel.
537         Added a whole bunch of logging so that we can at least detect a bug like this in the future.
538         (OSBuildFetcher.prototype._commitsForAvailableBuilds): Cleanup the coding style.
539         (OSBuildFetcher.prototype._addSubCommitsForBuild): Use mapInSerialPromiseChain. Tightened the assertion
540         about the content returned by a subcommand.
541
542         * tools/js/subprocess.js: Fixed the bug that we were importing require('child_process').ChildProcess.
543         execFile is defined on require('child_process') itself.
544         (Subprocess.prototype.execute): Fixed a typo. this._childProcess doesn't exist.
545         (Subprocess):
546
547         * tools/sync-os-versions.js: Renamed from tools/pull-os-versions.js.
548         (syncLoop): Cleaned up the coding style a little. Also added logging about how long we're about to sleep.
549
550 2017-03-16  Ryosuke Niwa  <rniwa@webkit.org>
551
552         Add the file uploading capability to the perf dashboard.
553         https://bugs.webkit.org/show_bug.cgi?id=169737
554
555         Reviewed by Chris Dumez.
556
557         Added /privileged-api/upload-file to upload a file, and /api/uploaded-file/ to download the file
558         and retrieve its meta data based on its SHA256. We treat two files with the identical SHA256 as
559         identical since anyone who can upload a file using this mechanism can execute arbitrary code in
560         our bots anyway. This is important for avoiding uploading a large darwinup roots multiple times
561         to the server, saving both user's time/bandwidth and server's disk space.
562
563         * config.json: Added uploadDirectory, uploadFileLimitInMB, and uploadUserQuotaInMB as options.
564         * init-database.sql: Added uploaded_files table.
565
566         * public/api/uploaded-file.php: Added.
567         (main): /api/uploaded-file/N would download uploaded_file with id=N. /api/uploaded-file/?sha256=X
568         would return the meta data for uploaded_file with sha256=X.
569         (stream_file_content): Streams the file content in 64KB chunks. We support Range & If-Range HTTP
570         request headers so that browsers can pause and resume downloading of a large root file.
571         (parse_range_header): Parses Range HTTP request header.
572
573         * public/include/json-header.php:
574         (remote_user_name): Use the default argument of NULL.
575
576         * public/include/manifest-generator.php:
577         (ManifestGenerator::generate): Include the maximum upload size in the manifest file to let the
578         frontend code preemptively check the file size before attempting to submit a file.
579
580         * public/include/uploaded-file-helpers.php: Added.
581         (format_uploaded_file):
582         (uploaded_file_path_for_row):
583
584         * public/privileged-api/upload-file-form.html: Added. For debugging purposes.
585         (fetchCSRFfToken):
586         (upload):
587
588         * public/privileged-api/upload-file.php: Added.
589         (main):
590         (query_total_file_size):
591         (create_uploaded_file_from_form_data):
592
593         * public/shared/common-remote.js:
594         (CommonRemoteAPI.prototype.postFormData): Added.
595         (CommonRemoteAPI.prototype.postFormDataWithStatus): Added.
596         (CommonRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
597         (CommonRemoteAPI.prototype._asJSON): Throw an exception instead of calling a non-existent reject.
598
599         * public/v3/models/uploaded-file.js: Added.
600         (UploadedFile): Added.
601         (UploadedFile.uploadFile): Added.
602         (UploadedFile.fetchUnloadedFileWithIdenticalHash): Added. Finds the file with the same SHA256 in
603         the server to avoid uploading a large custom root multiple times.
604         (UploadedFile._computeSHA256Hash): Added.
605
606         * public/v3/privileged-api.js:
607         (PrivilegedAPI.prototype.sendRequest): Added the options dictionary as a third argument. For now,
608         only support useFormData boolean.
609
610         * public/v3/remote.js:
611         (BrowserRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
612
613         * server-tests/api-manifest.js: Updated per the inclusion of fileUploadSizeLimit in the manifest.
614         * server-tests/api-uploaded-file.js: Added.
615         * server-tests/privileged-api-upload-file-tests.js: Added.
616
617         * server-tests/resources/temporary-file.js: Added.
618         (TemporaryFile): Added. A helper class for creating a temporary file to upload.
619         (TemporaryFile.makeTemporaryFileOfSizeInMB):
620         (TemporaryFile.makeTemporaryFile):
621         (TemporaryFile.inject):
622
623         * server-tests/resources/test-server.conf: Set upload_max_filesize and post_max_size for testing.
624         * server-tests/resources/test-server.js:
625         (TestServer.prototype.testConfig): Use uploadFileLimitInMB and uploadUserQuotaInMB of 2MB and 5MB.
626         (TestServer.prototype._ensureDataDirectory): Create a directory to store uploaded files inside
627         the data directory. In a production server, we can place it outside ServerRoot / DocumentRoot.
628         (TestServer.prototype.cleanDataDirectory): Delete the aforementioned directory as needed.
629
630         * tools/js/database.js:
631         (tableToPrefixMap): Added uploaded_files.
632
633         * tools/js/remote.js:
634         (NodeRemoteAPI.prototype.sendHttpRequest): Added a dictionary to specify request headers and
635         a callback to process the response as arguments. Fixed the bug that any 2xx code other than 200
636         was resulting in a rejected promise. Also include the response headers in the result for tests.
637         Finally, when content is a function, call that instead of writing the content since FormData
638         requires a custom logic.
639         (NodeRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
640
641         * tools/js/v3-models.js: Include uploaded-file.js.
642
643         * tools/run-tests.py:
644         (main): Add form-data as a new dependency.
645
646 2017-03-15  Dewei Zhu  <dewei_zhu@apple.com>
647
648         Fix unit test and bug fix for 'pull-os-versions.js' script.
649         https://bugs.webkit.org/show_bug.cgi?id=169701
650
651         Reviewed by Ryosuke Niwa.
652
653         Fix unit tests warnings on node-6.10.0.
654         Fix 'pull-os-versions.js' does not fetch new builds and report.
655
656         * server-tests/tools-os-build-fetcher-tests.js:
657         (then):
658         (beforeEach):
659         (afterEach):
660         * tools/pull-os-versions.js:
661         (syncLoop):
662
663 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
664
665         In-browser and node.js implementations of RemoteAPI should share some code
666         https://bugs.webkit.org/show_bug.cgi?id=169695
667
668         Rubber-stamped by Antti Koivisto.
669
670         Extracted CommonRemoteAPI out of RemoteAPI implementations for node.js and browser. 
671
672         * public/shared/common-remote.js: Added.
673         (CommonRemoteAPI): Added.
674         (CommonRemoteAPI.prototype.postJSON): Extracted from RemoteAPI.
675         (CommonRemoteAPI.prototype.postJSONWithStatus): Ditto.
676         (CommonRemoteAPI.prototype.getJSON): Ditto.
677         (CommonRemoteAPI.prototype.getJSONWithStatus): Ditto.
678         (CommonRemoteAPI.prototype.sendHttpRequest): Added. Needs to implemented by a subclass.
679         (CommonRemoteAPI.prototype._asJSON): Added.
680         (CommonRemoteAPI.prototype._checkStatus): Added.
681
682         * public/v3/index.html: Include common-remote.js.
683
684         * public/v3/privileged-api.js:
685         (PrivilegedAPI): Use class now that we don't include data.js.
686         (PrivilegedAPI.sendRequest): Modernized the code.
687         (PrivilegedAPI.requestCSRFToken): Ditto.
688
689         * public/v3/remote.js:
690         (BrowserRemoteAPI): Renamed from RemoteAPI. window.RemoteAPI is now an instance of this class.
691         (BrowserRemoteAPI.prototype.sendHttpRequest): Moved from RemoteAPI.sendHttpRequest.
692         (BrowserRemoteAPI.prototype.sendHttpRequest):
693
694         * server-tests/privileged-api-create-analysis-task-tests.js: Updated tests since NodeJSRemoteAPI
695         now throws the JSON status as an error to be consistent with BrowserRemoteAPI.
696         * server-tests/privileged-api-create-test-group-tests.js: Ditto.
697         * server-tests/privileged-api-upate-run-status.js: Ditto.
698
699         * tools/js/buildbot-triggerable.js:
700         (BuildbotTriggerable.prototype.syncOnce): Just use postJSONWithStatus instead of manually
701         checking the status.
702
703         * tools/js/remote.js:
704         (NodeRemoteAPI): Renamed from RemoteAPI. Still exported as RemoteAPI.
705         (NodeRemoteAPI.prototype.constructor):
706         (NodeRemoteAPI.prototype.sendHttpRequest): Modernized the code.
707
708 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
709
710         Fix server tests after r213998 and r213969
711         https://bugs.webkit.org/show_bug.cgi?id=169690
712
713         Reviewed by Antti Koivisto.
714
715         Fixed the existing server tests.
716
717         * public/v3/models/analysis-task.js:
718         (AnalysisTask.prototype._updateRemoteState): Use the relative path from the root so that it works inside tests.
719         (AnalysisTask.prototype.associateBug): Ditto.
720         (AnalysisTask.prototype.dissociateBug): Ditto.
721         (AnalysisTask.prototype.associateCommit): Ditto.
722         (AnalysisTask.prototype.dissociateCommit): Ditto.
723         (AnalysisTask._fetchSubset): Ditto.
724         (AnalysisTask.fetchAll): Ditto.
725         * public/v3/models/test-group.js:
726         (TestGroup.prototype.updateName): Ditto.
727         (TestGroup.prototype.updateHiddenFlag): Ditto.
728         (TestGroup.createAndRefetchTestGroups): Ditto.
729         (TestGroup.cachedFetch): Ditto.
730         * server-tests/api-manifest.js: Reverted an inadvertant change in r213969.
731         * tools/js/database.js:
732         (tableToPrefixMap): Added analysis_strategies.
733         * unit-tests/analysis-task-tests.js: Updated expectations per changes to AnalysisTask.
734
735 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
736
737         Add tests for privileged-api/create-analysis-task and privileged-api/create-test-group
738         https://bugs.webkit.org/show_bug.cgi?id=169688
739
740         Rubber-stamped by Antti Koivisto.
741
742         Added tests for privileged-api/create-analysis-task and privileged-api/create-test-group, and fixed newly found bugs.
743
744         * public/privileged-api/create-analysis-task.php:
745         (main): Fixed the bug that we were not explicitly checking whether start_run and end_run were integers or not.
746         Also return InvalidTimeRange when start and end times are identical as that makes no sense for an analysis task.
747
748         * public/privileged-api/create-test-group.php:
749         (main): Fixed a bug that we were not explicitly checking task and repetitionCount to be an integer.
750         (ensure_commit_sets): Fixed the bug that the number of commit sets weren't checked. 
751
752         * server-tests/privileged-api-create-analysis-task-tests.js: Added.
753         * server-tests/privileged-api-create-test-group-tests.js: Added.
754
755         * server-tests/resources/common-operations.js:
756         (prepareServerTest): Increase the timeout from 1s to 5s.
757
758         * server-tests/resources/mock-data.js:
759         (MockData.addMockData): Use a higher database ID of 20 for a mock build_slave to avoid a conflict with auto-generated IDs.
760
761 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
762
763         Make unit tests return a promise instead of manually calling done
764         https://bugs.webkit.org/show_bug.cgi?id=169663
765
766         Reviewed by Antti Koivisto.
767
768         Make the existing unit tests always reutrn a promise instead of manually calling "done" callback as done
769         in r213969. The promise tests are a lot more stable and less error prone.
770
771         Also use MockRemoteAPI.waitForRequest() instead of chaining two resolved promises where appropriate.
772
773         * unit-tests/analysis-task-tests.js:
774         * unit-tests/buildbot-syncer-tests.js:
775         * unit-tests/checkconfig.js:
776         * unit-tests/privileged-api-tests.js:
777
778 2017-03-15  Dewei Zhu  <dewei_zhu@apple.com>
779
780         Rewrite 'pull-os-versions' script in Javascript to add support for reporting os revisions with sub commits.
781         https://bugs.webkit.org/show_bug.cgi?id=169542
782
783         Reviewed by Ryosuke Niwa.
784
785         Extend '/api/commits/<repository>/last-reported' to accept a range and return last reported commits in given range.
786         Rewrite 'pull-os-versions' in JavaScript and add unit tests for it.
787         Instead of writing query manually while searching criteria contains null columns, use the methods provided in 'db.php'.
788         Add '.gitignore' file to ommit files generated by while running tests/instances locally.
789
790         * .gitignore: Added.
791         * public/api/commits.php:
792         * public/api/report-commits.php:
793         * public/include/commit-log-fetcher.php:
794         * public/include/db.php: 'null_columns' of prepare_params should be a reference.
795         * public/include/report-processor.php:
796         * server-tests/api-commits.js:
797         (then):
798         * server-tests/api-report-commits-tests.js:
799         * server-tests/resources/mock-logger.js: Added.
800         (MockLogger):
801         (MockLogger.prototype.log):
802         (MockLogger.prototype.error):
803         * server-tests/resources/mock-subprocess.js: Added.
804         (MockSubprocess.call):
805         (MockSubprocess.waitingForInvocation):
806         (MockSubprocess.inject):
807         (MockSubprocess.reset):
808         * server-tests/tools-buildbot-triggerable-tests.js:
809         (MockLogger): Deleted.
810         (MockLogger.prototype.log): Deleted.
811         (MockLogger.prototype.error): Deleted.
812         * server-tests/tools-os-build-fetcher-tests.js: Added.
813         (beforeEach):
814         (return.waitingForInvocationPromise.then):
815         (then):
816         (string_appeared_here.return.waitingForInvocationPromise.then):
817         (return.addSlaveForReport.emptyReport.then):
818         * tools/js/os-build-fetcher.js: Added.
819         (OSBuildFetcher):
820         (OSBuildFetcher.prototype._fetchAvailableBuilds):
821         (OSBuildFetcher.prototype._computeOrder):
822         (OSBuildFetcher.prototype._commitsForAvailableBuilds.return.this._subprocess.call.then.):
823         (OSBuildFetcher.prototype._commitsForAvailableBuilds):
824         (OSBuildFetcher.prototype._addSubCommitsForBuild):
825         (OSBuildFetcher.prototype._submitCommits):
826         (OSBuildFetcher.prototype.fetchAndReportNewBuilds):
827         * tools/js/subprocess.js: Added.
828         (const.childProcess.require.string_appeared_here.Subprocess.prototype.call):
829         (const.childProcess.require.string_appeared_here.Subprocess):
830         * tools/pull-os-versions.js: Added.
831         (main):
832         (syncLoop):
833         * tools/sync-commits.py:
834         (Repository.fetch_commits_and_submit):
835
836 2017-03-14  Ryosuke Niwa  <rniwa@webkit.org>
837
838         Make server tests return a promise instead of manually calling done
839         https://bugs.webkit.org/show_bug.cgi?id=169648
840
841         Rubber-stamped by Chris Dumez.
842
843         Make the existing server tests always reutrn a promise instead of manually calling "done" callback.
844         The promise tests are a lot more stable and less error prone.
845
846         Also use arrow functions everywhere and use prepareServerTest, renamed from connectToDatabaseInEveryTest,
847         in more tests instead of manually connecting to database in every test, and reset v3 models.
848
849         * server-tests/admin-platforms-tests.js:
850         * server-tests/admin-reprocess-report-tests.js:
851         * server-tests/api-build-requests-tests.js:
852         * server-tests/api-manifest.js:
853         * server-tests/api-measurement-set-tests.js:
854         (.postReports): Deleted. Not used in any test.
855         * server-tests/api-report-commits-tests.js:
856         * server-tests/api-report-tests.js:
857         * server-tests/api-update-triggerable.js:
858         * server-tests/privileged-api-upate-run-status.js:
859         * server-tests/resources/common-operations.js:
860         (prepareServerTest): Renamed from connectToDatabaseInEveryTest. Increase the timeout and reset v3 models.
861         * server-tests/tools-buildbot-triggerable-tests.js:
862
863 2017-03-12  Ryosuke Niwa  <rniwa@webkit.org>
864
865         Rename RootSet to CommitSet
866         https://bugs.webkit.org/show_bug.cgi?id=169580
867
868         Rubber-stamped by Chris Dumez.
869
870         Renamed root_sets to commit_sets and roots to commit_set_relationships in the database schema, and renamed
871         related classes in public/v3/ and tools accordingly.
872
873         RootSet, MeasurementRootSet, and CustomRootSet are respectively renamed to CommitSet, MeasurementCommitSet,
874         and CustomCommitSet.
875
876         In order to migrate the database, run:
877         ```
878         BEGIN;
879         ALTER TABLE root_sets RENAME TO commit_sets;
880         ALTER TABLE commit_sets RENAME COLUMN rootset_id TO commitset_id;
881         ALTER TABLE roots RENAME TO commit_set_relationships;
882         ALTER TABLE commit_set_relationships RENAME COLUMN root_set TO commitset_set;
883         ALTER TABLE commit_set_relationships RENAME COLUMN root_commit TO commitset_commit;
884         ALTER TABLE build_requests RENAME COLUMN request_root_set TO request_commit_set;
885         END;
886         ```
887
888         * browser-tests/index.html:
889         * init-database.sql:
890         * public/api/build-requests.php:
891         (main):
892         * public/api/test-groups.php:
893         (main):
894         (format_test_group):
895         * public/include/build-requests-fetcher.php:
896         (BuildRequestsFetcher::__construct):
897         (BuildRequestsFetcher::results_internal):
898         (BuildRequestsFetcher::commit_sets): Renamed from root_sets.
899         (BuildRequestsFetcher::commits): Renamed from roots.
900         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Renamed from fetch_roots_for_set_if_needed.
901         * public/privileged-api/create-test-group.php:
902         (main):
903         (ensure_commit_sets): Renamed from commit_sets_from_root_sets.
904         * public/v3/components/analysis-results-viewer.js:
905         (AnalysisResultsViewer.prototype.buildRowGroups):
906         (AnalysisResultsViewer.prototype._collectCommitSetsInTestGroups): Renamed from _collectRootSetsInTestGroups.
907         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
908         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
909         (AnalysisResultsViewer.CommitSetInTestGroup): Renamed from RootSetInTestGroup.
910         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.constructor):
911         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.commitSet): Renamed from rootSet.
912         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.succeedingCommitSet): Renamed from succeedingRootSet.
913         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.constructor):
914         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
915         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.isComplete):
916         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.startRowIndex):
917         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.endRowIndex):
918         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
919         * public/v3/components/chart-revision-range.js:
920         (ChartRevisionRange.prototype._revisionForPoint):
921         (ChartRevisionRange.prototype._computeRevisionList):
922         * public/v3/components/customizable-test-group-form.js:
923         (CustomizableTestGroupForm.prototype.constructor):
924         (CustomizableTestGroupForm.prototype.setCommitSetMap): Renamed from setRootSetMap.
925         (CustomizableTestGroupForm.prototype._submitted):
926         (CustomizableTestGroupForm.prototype._computeCommitSetMap): Renamed from _computeRootSetMap.
927         (CustomizableTestGroupForm.prototype.render): Renamed from render.
928         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
929         * public/v3/components/results-table.js:
930         (ResultsTable.prototype.render):
931         (ResultsTable.prototype._createRevisionListCells):
932         (ResultsTable.prototype._computeRepositoryList):
933         (ResultsTableRow.prototype.constructor):
934         (ResultsTableRow.prototype.commitSet): Renamed from rootSet.
935         * public/v3/components/test-group-results-table.js:
936         (TestGroupResultsTable.prototype.buildRowGroups):
937         * public/v3/index.html:
938         * public/v3/models/build-request.js:
939         (BuildRequest.prototype.constructor):
940         (BuildRequest.prototype.updateSingleton):
941         (BuildRequest.prototype.commitSet): Renamed from rootSet.
942         (BuildRequest.constructBuildRequestsFromData):
943         * public/v3/models/commit-set.js: Renamed from public/v3/models/root-set.js.
944         (CommitSet): Renamed from RootSet.
945         (CommitSet.containsMultipleCommitsForRepository):
946         (MeasurementCommitSet): Renamed from MeasurementRootSet.
947         (MeasurementCommitSet.prototype.namedStaticMap):
948         (MeasurementCommitSet.prototype.ensureNamedStaticMap):
949         (MeasurementCommitSet.namedStaticMap):
950         (MeasurementCommitSet.ensureNamedStaticMap):
951         (MeasurementCommitSet.ensureSingleton):
952         (CustomCommitSet): Renamed from CustomRootSet.
953         * public/v3/models/measurement-adaptor.js:
954         (MeasurementAdaptor.prototype.applyTo):
955         * public/v3/models/test-group.js:
956         (TestGroup.prototype.constructor):
957         (TestGroup.prototype.addBuildRequest):
958         (TestGroup.prototype.repetitionCount):
959         (TestGroup.prototype.requestedCommitSets): Renamed from requestedRootSets.
960         (TestGroup.prototype.requestsForCommitSet): Renamed from requestsForRootSet.
961         (TestGroup.prototype.labelForCommitSet): Renamed from labelForRootSet.
962         (TestGroup.prototype.didSetResult):
963         (TestGroup.prototype.compareTestResults):
964         (TestGroup.prototype._valuesForCommitSet): Renamed from _valuesForRootSet.
965         (TestGroup.prototype.createAndRefetchTestGroups):
966         * public/v3/pages/analysis-task-page.js:
967         (AnalysisTaskPage.prototype.render):
968         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
969         (AnalysisTaskPage.prototype._createNewTestGroupFromChart):
970         (AnalysisTaskPage.prototype._createNewTestGroupFromViewer):
971         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
972         * server-tests/api-build-requests-tests.js:
973         * server-tests/resources/mock-data.js:
974         (MockData.resetV3Models):
975         (MockData.addMockData):
976         (MockData.addAnotherMockTestGroup):
977         * tools/detect-changes.js:
978         (createAnalysisTaskAndNotify):
979         * tools/js/buildbot-syncer.js:
980         (BuildbotSyncer.prototype._propertiesForBuildRequest):
981         (BuildbotSyncer.prototype._revisionSetFromCommitSetWithExclusionList):
982         * tools/js/database.js:
983         (tableToPrefixMap):
984         * tools/js/v3-models.js:
985         * tools/sync-buildbot.js:
986         (syncLoop):
987         * tools/sync-with-buildbot.py: Deleted. No longer used.
988         * unit-tests/analysis-task-tests.js:
989         * unit-tests/build-request-tests.js:
990         (sampleBuildRequestData):
991         * unit-tests/buildbot-syncer-tests.js:
992         (sampleCommitSetData):
993         * unit-tests/measurement-adaptor-tests.js:
994         * unit-tests/measurement-set-tests.js:
995         * unit-tests/resources/mock-v3-models.js:
996         (MockModels.inject):
997         * unit-tests/test-groups-tests.js:
998         (sampleTestGroup):
999
1000 2017-03-13  Ryosuke Niwa  <rniwa@webkit.org>
1001
1002         Database's query functions should support querying for a row with NULL value
1003         https://bugs.webkit.org/show_bug.cgi?id=169504
1004
1005         Reviewed by Antti Koivisto.
1006
1007         Add the support for calling select_* with one of column values set to NULL.
1008         This feature is useful in webkit.org/b/146374 and webkit.org/b/168962.
1009
1010         * public/include/db.php:
1011         (Database::prepare_params): Added $null_columns as an optional argument.
1012         (Database::select_conditions_with_null_columns): Added. Builds up a query string by appending AND x is NULL
1013         to match columns whose value must be NULL.
1014         (Database::_select_update_or_insert_row):
1015         (Database::select_rows):
1016
1017 2017-03-13  Dewei Zhu  <dewei_zhu@apple.com>
1018
1019         Add the ability to report a commit with sub-commits.
1020         https://bugs.webkit.org/show_bug.cgi?id=168962
1021
1022         Reviewed by Ryosuke Niwa.
1023
1024         Introduce 'commit_ownerships' which records ownership between commits.
1025         On existing production server, run ```
1026             CREATE TABLE commit_ownerships (
1027                 commit_owner integer NOT NULL REFERENCES commits ON DELETE CASCADE,
1028                 commit_ownee integer NOT NULL REFERENCES commits ON DELETE CASCADE,
1029                 PRIMARY KEY (commit_owner, commit_ownee)
1030             );
1031             ALTER TABLE repositories RENAME repository_parent TO repository_owner;
1032             ALTER TABLE repositories DROP repository_name_must_be_unique;
1033             CREATE UNIQUE INDEX repository_name_owner_unique_index ON repositories (repository_owner, repository_name) WHERE repository_owner IS NOT NULL;
1034             CREATE UNIQUE INDEX repository_name_unique_index ON repositories (repository_name) WHERE repository_owner IS NULL;
1035         ``` to update database.
1036         Add unit-tests to cover this change.
1037
1038         * init-database.sql:
1039         * public/api/report-commits.php:
1040         * public/include/commit-log-fetcher.php:
1041         * public/include/db.php:
1042         * public/include/manifest-generator.php:
1043         * public/include/report-processor.php:
1044         * public/v3/models/repository.js:
1045         (Repository):
1046         (Repository.prototype.owner):
1047         * server-tests/admin-reprocess-report-tests.js:
1048         (addBuilderForReport.simpleReportWithRevisions.0.then):
1049         (then):
1050         * server-tests/api-manifest.js:
1051         (then):
1052         * server-tests/api-report-commits-tests.js:
1053         (addSlaveForReport.sameRepositoryNameInSubCommitAndMajorCommit.then):
1054         (then):
1055         (addSlaveForReport.systemVersionCommitWithSubcommits.then):
1056         (addSlaveForReport.multipleSystemVersionCommitsWithSubcommits.then):
1057         (addSlaveForReport.systemVersionCommitWithEmptySubcommits.then):
1058         (addSlaveForReport.systemVersionCommitAndSubcommitWithTimestamp.then):
1059         * tools/js/database.js:
1060
1061 2017-03-07  Ryosuke Niwa  <rniwa@webkit.org>
1062
1063         Update ReadMe.md to use directory format for backing up & restoring the database
1064         https://bugs.webkit.org/show_bug.cgi?id=169263
1065
1066         Reviewed by Joseph Pecoraro.
1067
1068         Update ReadMe.md's instruction to backup and restore the database to use directory format instead of
1069         piping it to gzip. The new command will backup and restore the database with multiple concurrent processes
1070         with a custom compression level.
1071
1072         * ReadMe.md:
1073
1074 2017-03-02  Ryosuke Niwa  <rniwa@webkit.org>
1075
1076         Make baseline data points selectable
1077         https://bugs.webkit.org/show_bug.cgi?id=169069
1078         <rdar://problem/29209427>
1079
1080         Reviewed by Antti Koivisto.
1081
1082         Add the capability to select data points other than "current" configuration type.
1083
1084         This patch refactors the way the "chart status" is computed. Before this patch, ChartStatusView was
1085         responsible for determining two data points for which to compute the status, and computing the status
1086         between two data points. ChartPaneStatusView which inherits from ChartStatusView and used in the charts
1087         page relied upon ChartStatusView to compute these values, and computed the list of revision ranges for
1088         each relevant repository between the data points. ChartPane then had callbacks on ChartPaneStatusView
1089         to know whenever these values changed. Because of this entangled mess, ChartStatusView had to be aware
1090         of InteractiveTimeSeriesChart even though only ChartPaneStatusView could be used with it.
1091
1092         This patch dramatically simplifies the situation by adding referencePoints() on TimeSeriesChart and
1093         InteractiveTimeSeriesChart which returns the current point, the previous point if there is any, and
1094         their time series view. It also extracts ChartStatusEvaluator which computes the current status values
1095         and ChartRevisionRange which computes a list of revision differences both based on the referencePoints.
1096         As a result, ChartPaneStatusView no longer inherits from ChartStatusView, and ChartStatusView has been
1097         renamed to DashboardChartStatusView to reflect its purpose. Furthermore, ChartPane which used to rely on
1098         ChartPaneStatusView's revisionCallback to update the commit log viewer simply uses another instance of
1099         ChartRevisionRange, eliminating the need for the callback.
1100
1101         To implement these classes easily, this patch also introduces a new class, LazilyEvaluatedFunction to
1102         memoize the return value of a function when called with the same arguments. Delaying the computation of
1103         a value and avoiding the work when the values are the same is a very common pattern in the perf dashboard
1104         so I expect this class would be used in a lot more places in the future.
1105
1106         * browser-tests/chart-revision-range-tests.js: Added. Tests for ChartRevisionRange.
1107         * browser-tests/chart-status-evaluator-tests.js: Added. Tests for ChartStatusEvaluator.
1108
1109         * browser-tests/index.html:
1110         (BrowsingContext):
1111         (BrowsingContext.importScripts): Fixed the bug that calling importScripts twice results in MockRemoteAPI
1112         being loaded twice.
1113         (ChartTest.importChartScripts): Import more model objects.
1114         (ChartTest.sampleCluster): Made this a getter.
1115         (ChartTest.makeModelObjectsForSampleCluster):
1116         (ChartTest.makeSampleCluster): Added. Cutomizes the valus of baseline / target based on options.
1117         (ChartTest.respondWithSampleCluster): Now takes an options argument for makeSampleCluster.
1118
1119         * public/v3/components/chart-pane-base.js:
1120         (ChartPaneBase): Added _openRepository to keep track of the currently open repository instead of relying
1121         on _mainChartStatus or _commitLogViewer to keep track of it.
1122         (ChartPaneBase.prototype.configure):  The callback for when the user clicked on a repository name in
1123         ChartPaneStatusView has been replaced by "openRepository" action.
1124         (ChartPaneBase.prototype.setOpenRepository): Moved from ChartPane.
1125         (ChartPaneBase.prototype._mainSelectionDidChange):
1126         (ChartPaneBase.prototype._indicatorDidChange):
1127         (ChartPaneBase.prototype._didFetchData):
1128         (ChartPaneBase.prototype._updateCommitLogViewer): Renamed from _updateStatus.
1129         (ChartPaneBase.prototype.openNewRepository): Renamed from _requestOpeningCommitViewer. Fixed a bug that
1130         clicking on the repository name inside ChartPaneStatusView would not focus the pane, which resulted in
1131         arrow keys to be ignored instead of moving the main chart's indicator or the currently open repository.
1132         (ChartPaneBase.prototype._keyup):
1133         (ChartPaneBase.prototype._moveOpenRepository): Moved from ChartPaneStatusView's
1134         moveRepositoryWithNotification. Used when changing the open repository by up/down arrow keys.
1135
1136         * public/v3/components/chart-revision-range.js: Added. Extracted from ChartPaneStatusView.
1137         (ChartRevisionRange): Added.
1138         (ChartRevisionRange.prototype.revisionList): Added.
1139         (ChartRevisionRange.prototype.rangeForRepository): Added.
1140         (ChartRevisionRange._revisionForPoint): Added. Extracted from ChartPaneStatusView's
1141         _updateRevisionListForNewCurrentRepository.
1142         (ChartRevisionRange._computeRevisionList): Ditto from computeChartStatusLabels.
1143
1144         * public/v3/components/chart-status-evaluator.js: Added.
1145         (ChartStatusEvaluator): Added.
1146         (ChartStatusEvaluator.prototype.status): Added.
1147         (ChartStatusEvaluator.computeChartStatus): Added. Extracted from ChartStatusView's updateStatusIfNeeded.
1148
1149         * public/v3/components/chart-status-view.js: Removed.
1150         (ChartStatusView): Deleted. Split into ChartStatusEvaluator and DashboardChartStatusView.
1151
1152         * public/v3/components/chart-styles.js:
1153         (ChartStyles.baselineStyle): Make baseline data points interactive. This single line change is what
1154         enables the user to interact with the data points. The rest of changes in this patch mostly deals with
1155         the status text such as "5% worse than baseline" and the list of revisions shown in the commit log viewer
1156         which would have shown the wrong range without these changes.
1157
1158         * public/v3/components/dashboard-chart-status-view.js: Added. Extracted from ChartStatusView.
1159         (DashboardChartStatusView): Added.
1160         (DashboardChartStatusView.prototype.render): Added.
1161         (DashboardChartStatusView.htmlTemplate): Added.
1162         (DashboardChartStatusView.cssTemplate): Added.
1163
1164         * public/v3/components/interactive-time-series-chart.js:
1165         (InteractiveTimeSeriesChart.prototype.referencePoints): Added. Return the first point and the last point
1166         as the reference points when there is a selection. Only report the previous point if they are distinct as
1167         showing a range of revisions from a data point to itself makes no sense. When there is a indicator simply
1168         return it and its previous point as reference points. Otherwise return null unlike TimeSeriesChart's
1169         referencePoints which always returns the latest point as the reference point.
1170
1171         * public/v3/components/time-series-chart.js:
1172         (TimeSeriesChart.prototype.referencePoints): Added. Return the latest point as the reference point. It
1173         never returns the previous point even if there were more data points as there is no way for the user to
1174         specify which data points to compare.
1175
1176         * public/v3/index.html: Include newly added files.
1177
1178         * public/v3/lazily-evaluated-function.js: Added.
1179         (LazilyEvaluatedFunction): Added.
1180         (LazilyEvaluatedFunction.prototype.evaluate): Added.
1181
1182         * public/v3/models/commit-log.js:
1183         (CommitLog.prototype.diff): Fixed a bug that computing the diff of two Subversion-like revisions results
1184         in "from" field to be unexpectedly an integer instead of a string.
1185
1186         * public/v3/models/metric.js:
1187         (Metric): Moved the code to compute the unit from the metric name from v2's RunsData class. This makes
1188         writing tests easier since it eliminates the need to load v2's data.js.
1189         (Metric.prototype.unit):
1190         (Metric.prototype.isSmallerBetter): Ditto for determining whether the unit is smaller-is-better.
1191
1192         * public/v3/pages/analysis-task-page.js:
1193         (AnalysisTaskChartPane.prototype._updateStatus): Deleted the unused code.
1194
1195         * public/v3/pages/chart-pane-status-view.js:
1196         (ChartPaneStatusView): No longer inherits from ChartStatusView. Uses ChartStatusEvaluator and
1197         ChartRevisionRange to to compute the chart status and the list of revision changes.
1198         (ChartPaneStatusView.prototype.pointsRangeForAnalysis): Deleted.
1199         (ChartPaneStatusView.prototype.render): Split it into _renderStatus and _renderBuildRevisionTable using
1200         LazilyEvaluatedFunction.
1201         (ChartPaneStatusView.prototype._renderStatus): Added.
1202         (ChartPaneStatusView.prototype._renderBuildRevisionTable): Added.
1203         (ChartPaneStatusView.prototype.setCurrentRepository): _updateRevisionListForNewCurrentRepository has been
1204         moved into ChartRevisionRange. Just enqueue itself to re-render.
1205         (ChartPaneStatusView.prototype._setRevisionRange): Deleted.
1206         (ChartPaneStatusView.prototype.moveRepositoryWithNotification): Deleted.
1207         (ChartPaneStatusView.prototype.updateRevisionList): Deleted.
1208         (ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Deleted.
1209         (ChartPaneStatusView.prototype.computeChartStatusLabels): Deleted.
1210         (ChartPaneStatusView.htmlTemplate):
1211         (ChartPaneStatusView.cssTemplate):
1212
1213         * public/v3/pages/chart-pane.js:
1214         (ChartPane.prototype.openNewRepository): Overrides the one in ChartPaneBase, which has been renamed from
1215         _requestOpeningCommitViewer.
1216         (ChartPane.prototype._analyzeRange):
1217         (ChartPane.prototype._renderActionToolbar): Use the main chart's selection directly to determine whether
1218         an analysis task can be created for the currenty selected range.
1219
1220         * public/v3/pages/dashboard-page.js:
1221         (DashboardPage.prototype._createChartForCell):
1222
1223         * unit-tests/lazily-evaluated-function-tests.js: Added. Tests for LazilyEvaluatedFunction.
1224
1225 2017-03-01  Ryosuke Niwa  <rniwa@webkit.org>
1226
1227         Build fix after r212853. Make creating an analysis task work again.
1228
1229         * public/v3/pages/analysis-task-page.js:
1230         (AnalysisTaskPage.prototype.render):
1231
1232 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
1233
1234         Fix tests after r213119 and r213120.
1235
1236         * browser-tests/time-series-chart-tests.js:
1237         (return.ChartTest.importChartScripts.context.then):
1238         (string_appeared_here.then): Deleted.
1239
1240 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
1241
1242         Removed the unused code that was supposed to be removed in the previous commit.
1243
1244         * browser-tests/time-series-chart-tests.js:
1245
1246 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
1247
1248         Split tests for InteractiveTimeSeriesChart into a separate test file.
1249         https://bugs.webkit.org/show_bug.cgi?id=168960
1250
1251         Reviewed by Joseph Pecoraro.
1252
1253         Extracted the test cases for InteractiveTimeSeriesChart charts from time-series-chart-tests.js
1254         into interactive-time-series-chart-tests.js now that the former file has gotten really big over time.
1255
1256         Also extracted a bunch of helper functions time-series-chart-tests.js as ChartTest in index.html.
1257         Any test which instantiates a time series chart can use this helper class.
1258
1259         * browser-tests/index.html:
1260         (ChartTest.importChartScripts): Ditto.
1261         (ChartTest.posixTime): Moved from time-series-chart-tests.js.
1262         (ChartTest.sampleCluster): Ditto.
1263         (ChartTest.createChartWithSampleCluster): Ditto.
1264         (ChartTest.createInteractiveChartWithSampleCluster): Ditto.
1265         (ChartTest.respondWithSampleCluster):
1266         * browser-tests/interactive-time-series-chart-tests.js: Extracted from time-series-chart-tests.js.
1267         * browser-tests/time-series-chart-tests.js:
1268         (posixTime): Moved.
1269         (dayInMilliseconds): Moved.
1270         (sampleCluster): Moved.
1271         (createChartWithSampleCluster): Moved.
1272         (createInteractiveChartWithSampleCluster): Moved.
1273         (respondWithSampleCluster): Moved.
1274         * unit-tests/analysis-task-tests.js: Fixed a typo. s/adopter/adapter/.
1275
1276 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
1277
1278         Calling build() on a baseline point results in an exception
1279         https://bugs.webkit.org/show_bug.cgi?id=168959
1280
1281         Reviewed by Joseph Pecoraro.
1282
1283         Some baseline points may lack the build information. e.g. A custom data point made by an user.
1284         Only instantiate Build object in a point object returned by MeasurementAdaptor when the builder id
1285         is available so that we don't hit an assertion inside Build's constructor.
1286
1287         * public/v3/models/measurement-adaptor.js:
1288         (MeasurementAdaptor.prototype.applyTo..build): Only instantiate Build when builderId is set.
1289         * unit-tests/measurement-adaptor-tests.js: Added a test case.
1290
1291 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
1292
1293         Arrow key shouldn't move the indicator beyond the visible points
1294         https://bugs.webkit.org/show_bug.cgi?id=168956
1295
1296         Reviewed by Joseph Pecoraro.
1297
1298         The bug was caused by moveLockedIndicatorWithNotification using the full sampled time series view
1299         instead of the one constrained by the domain. Since the time series chart expands the visible domain
1300         to include at least one point before the start time and one point after the end tiem to draw lines
1301         extending beyond the visible region (otherwise it looks as though the graph ends there), we need to
1302         use a view constrained by the start time and the end time before looking for a next/previous point.
1303
1304         * browser-tests/time-series-chart-tests.js: Added test cases for moveLockedIndicatorWithNotification.
1305         * public/v3/components/interactive-time-series-chart.js:
1306         (InteractiveTimeSeriesChart.prototype.moveLockedIndicatorWithNotification): Fixed the bug. Also
1307         enqueue itself to render instead of relying on a parent component to do it.
1308
1309 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
1310
1311         A Locked indicator should be visually distinct from an unlocked indicator
1312         https://bugs.webkit.org/show_bug.cgi?id=168868
1313         <rdar://problem/29666054>
1314
1315         Reviewed by Antti Koivisto.
1316
1317         Added the support for specifying options.lockedIndicator in addition to options.indicator to style
1318         an locked indicator differently from an unlocked one.
1319
1320         * browser-tests/time-series-chart-tests.js: Added new test cases for indicators.
1321         (createChartWithSampleCluster): Renamed and swapped the order of arguments to better match
1322         TimeSeriesChart's constructor. Now the second argument is an array of source as is in the constructor.
1323         (createInteractiveChartWithSampleCluster): Added.
1324
1325         * public/v3/components/chart-styles.js:
1326         (ChartStyles.overviewChartOptions): Changed the color of a selection to blue.
1327         (ChartStyles.mainChartOptions): Ditto. Also use a different style for a locked indicator.
1328
1329         * public/v3/components/interactive-time-series-chart.js:
1330         (InteractiveTimeSeriesChart.prototype._layout): Removed the unused variable.
1331         (InteractiveTimeSeriesChart.prototype._renderChartContent): Use options.lockedIndicator when rendering
1332         a locked indicator. Also stroke the circle in addition to filling it so that we can use a blue circle
1333         with a white hole for a locked indicator to make it even more visually distinctive from an unlocked one.
1334
1335 2017-02-25  Dewei Zhu  <dewei_zhu@apple.com>
1336
1337         Commit should order by 'commit_order' as secondary key.
1338         https://bugs.webkit.org/show_bug.cgi?id=168866
1339
1340         Reviewed by Ryosuke Niwa.
1341
1342         Currently, commits are sorted by 'commit_time' only.
1343         We should use 'commit_order' as secondary key when 'commit_time' is equal or null.
1344
1345         * public/include/commit-log-fetcher.php:
1346         * public/include/db.php:
1347         * server-tests/api-commits.js:
1348         (return.addSlaveForReport.subversionCommits.then):
1349         (then):
1350
1351 2017-02-24  Ryosuke Niwa  <rniwa@webkit.org>
1352
1353         REGRESSION(r212853): Comparisons to baseline no longer shows up
1354         https://bugs.webkit.org/show_bug.cgi?id=168863
1355
1356         Reviewed by Joseph Pecoraro.
1357
1358         The bug was caused by ChartStatusView's code not being updated to use TimeSeriesView's.
1359         Updated the code to use TimeSeriesView's methods to fix the bug.
1360
1361         Also made InteractiveTimeSeriesChart's currentPoint to return a (TimeSeriesView, point, isLocked) tuple
1362         to consolidate it with lockedIndicator() to work towards making the baseline data points selectable.
1363
1364         * browser-tests/time-series-chart-tests.js: Updated the test cases to use currentIndicator, and added
1365         test cases for newly added lastPointInTimeRange.
1366
1367         * public/v3/components/chart-pane.js:
1368         (ChartPane.prototype.serializeState): Updated to use currentIndicator.
1369         (ChartPane.prototype._renderFilteringPopover): Ditto.
1370
1371         * public/v3/components/chart-status-view.js:
1372         (ChartStatusView.prototype.updateStatusIfNeeded): Use currentIndicator for an interative time series.
1373         Fixed the non-interactive chart's code path for TimeSeriesView.
1374         (ChartStatusView.prototype._computeChartStatus): Modernized the code.
1375         (ChartStatusView.prototype._findLastPointPriorToTime): Deleted. Replaced by TimeSeriesView's
1376         lastPointInTimeRange.
1377
1378         * public/v3/components/interactive-time-series-chart.js:
1379         (InteractiveTimeSeriesChart.prototype.currentIndicator):
1380         (InteractiveTimeSeriesChart.prototype.moveLockedIndicatorWithNotification):
1381         (InteractiveTimeSeriesChart.prototype._renderChartContent):
1382         (InteractiveTimeSeriesChart):
1383
1384         * public/v3/models/time-series.js:
1385         (TimeSeriesView.prototype.lastPointInTimeRange): Added.
1386         (TimeSeriesView.prototype._reverse): Added. Traverses the view in the reverse order.
1387         * unit-tests/time-series-tests.js:
1388
1389 2017-02-23  Dewei Zhu  <dewei_zhu@apple.com>
1390
1391         Rename 'commit_parent' in 'commits' table to 'commit_previous_commit'.
1392         https://bugs.webkit.org/show_bug.cgi?id=168816
1393
1394         Reviewed by Ryosuke Niwa.
1395
1396         Rename 'commit_parent' to avoid ambiguity in the coming feature.
1397         For exisiting database, run
1398             "ALTER TABLE commits RENAME commit_parent TO commit_previous_commit;"
1399         to update the database.
1400
1401         * init-database.sql:
1402         * public/api/report-commits.php:
1403         * public/include/commit-log-fetcher.php:
1404         * server-tests/api-commits.js:
1405         (then):
1406         * server-tests/api-report-commits-tests.js:
1407         (then):
1408         * tools/sync-commits.py:
1409         (main):
1410         (Repository.fetch_commits_and_submit):
1411         (GitRepository._revision_from_tokens):
1412         * unit-tests/analysis-task-tests.js:
1413         (sampleAnalysisTask):
1414
1415 2017-02-23  Ryosuke Niwa  <rniwa@webkit.org>
1416
1417         New sampling algorithm shows very few points when zoomed out
1418         https://bugs.webkit.org/show_bug.cgi?id=168813
1419
1420         Reviewed by Saam Barati.
1421
1422         When a chart is zoomed out to a large time interval, the new sampling algorithm introduced in r212853 can
1423         hide most of the data points because the difference between the preceding point's time and the succeeding
1424         point's time of most points will be below the threshold we computed.
1425
1426         Instead, rank each data point based on the aforementioned time interval difference, and pick the first M data
1427         points when M data points are to be shown.
1428
1429         This makes the new algorithm behave like our old algorithm while keeping it stable still. Note that this
1430         algorithm still biases data points without a close neighboring point but this seems to work out in practice
1431         because such a point tends to be an important sample anyway, and we don't have a lot of space between
1432         data points since we aim to show about one point per pixel.
1433
1434         * browser-tests/index.html:
1435         (CanvasTest.canvasContainsColor): Extracted from one of the test cases and generalized. Returns true when
1436         the specified region of the canvas contains a specified color (alpha is optional).
1437         * browser-tests/time-series-chart-tests.js: Added a test case for sampling. It checks that sampling happens
1438         and that we always show some data point even when zoomed out to a large time interval.
1439         (createChartWithSampleCluster):
1440
1441         * public/v3/components/interactive-time-series-chart.js:
1442         (InteractiveTimeSeriesChart.prototype._sampleTimeSeries):
1443         * public/v3/components/time-series-chart.js:
1444         (TimeSeriesChart.prototype._ensureSampledTimeSeries): M, the number of data points we pick must be computed
1445         based on the width of data points we're about to draw constrained by the canvas size. e.g. when the canvas
1446         is only half filled, we shouldn't be showing two points per pixel in the filled region.
1447         (TimeSeriesChart.prototype._sampleTimeSeries): Refined the algorithm. First, compute the time difference or
1448         the rank for each N data points. Sort those ranks in descending order (in the order we prefer), and include
1449         all data points above the M-th rank in the sample.
1450         (TimeSeriesChart.prototype.computeTimeGrid): Revert the inadvertent change in r212935.
1451
1452         * public/v3/models/time-series.js:
1453         (TimeSeriesView.prototype.filter): Fixed a bug that the indices passed onto the callback were shifted by the
1454         starting index.
1455         * unit-tests/time-series-tests.js: Added a test case to ensure callbacks are called with correct data points
1456         and indices.
1457
1458 2017-02-23  Ryosuke Niwa  <rniwa@webkit.org>
1459
1460         REGRESSION(r212542): Make TimeSeriesChart.computeTimeGrid stops x-axis grid prematurely
1461         https://bugs.webkit.org/show_bug.cgi?id=168812
1462
1463         Reviewed by Joseph Pecoraro.
1464
1465         Add time iterator of two months, three months, and four months with some tests.
1466
1467         Also for one-month time iterator, round the day of month to 1 or 15 whichever is closer.
1468
1469         * browser-tests/time-series-chart-tests.js: Added more tests.
1470         * public/v3/components/time-series-chart.js:
1471         (TimeSeriesChart._timeIterators.next):
1472         (TimeSeriesChart._timeIterators):
1473
1474 2017-02-22  Ryosuke Niwa  <rniwa@webkit.org>
1475
1476         Add tests for InteractiveTimeSeriesChart and adopt actions
1477         https://bugs.webkit.org/show_bug.cgi?id=168750
1478
1479         Reviewed by Chris Dumez.
1480
1481         Added tests for InteractiveTimeSeriesChart.
1482
1483         Also replaced selection.onchange, selection.onzoom, indicator.onchange, annotations.onclick callbacks
1484         by "selectionChange", "zoom", "indicatorChange", and "annotationClick" actions respectively.
1485
1486         Also fixed various bugs and bad code I encountered while writing these tests.
1487
1488         * browser-tests/index.html:
1489         (waitForComponentsToRender): Delay the call to enqueueToRender until the next run loop because there
1490         might be outstanding promises that just got resolved. e.g. for fetching measurement sets JSONs. Let
1491         all those promises get resolved first. Otherwise, some tests become racy.
1492         (canvasImageData): Extracted from time-series-chart-tests.js.
1493         (canvasRefTest): Ditto.
1494         (CanvasTest): Ditto.
1495         (CanvasTest.fillCanvasBeforeRedrawCheck): Ditto.
1496         (CanvasTest.hasCanvasBeenRedrawn): Ditto.
1497         (CanvasTest.canvasImageData): Ditto.
1498         (CanvasTest.expectCanvasesMatch): Ditto.
1499         (CanvasTest.expectCanvasesMismatch): Ditto.
1500
1501         * browser-tests/time-series-chart-tests.js: Fixed some test cases where dpr multipler was not doing
1502         the right thing anymore in Safari under a high DPI screen. Also added a lot of test cases for interactive
1503         time series chart and one for rendering annotations.
1504         (scripts): Moved.
1505         (posixTime): Added. A helper function for sampleCluster.
1506         (dayInMilliseconds): Ditto.
1507         (sampleCluster): Moved here. Made the same cluster more artifical for an easier testing.
1508         (createChartWithSampleCluster): Moved out of one of the tests.
1509         (respondWithSampleCluster): Ditto.
1510
1511         * public/v3/components/chart-pane-base.js:
1512         (ChartPaneBase.prototype.configure): Adopted new actions in InteractiveTimeSeriesChart.
1513
1514         * public/v3/components/chart-status-view.js:
1515         (ChartStatusView.prototype.updateStatusIfNeeded): Removed a superflous console.log.
1516
1517         * public/v3/components/chart-styles.js:
1518         (ChartStyles.mainChartOptions): Set zoomButton to true. InteractiveTimeSeriesChart used to determine
1519         whether to show the zoom button or not based on the precense of the zoom callback. We made it explicit.
1520
1521         * public/v3/components/interactive-time-series-chart.js:
1522         (InteractiveTimeSeriesChart.prototype.setIndicator): Explicitly call _notifySelectionChanged with false
1523         instead of relying on undefined to be treated as falsey.
1524         (InteractiveTimeSeriesChart.prototype._createCanvas): Use id instead of selector to find elements.
1525         (InteractiveTimeSeriesChart.htmlTemplate):
1526         (InteractiveTimeSeriesChart.cssTemplate):
1527         (InteractiveTimeSeriesChart.prototype._mouseMove): Explicitly call _startOrContinueDragging with false
1528         instead of relying on undefined treated as falsey. Also added the missing call to enqueueToRender found
1529         by new tests. This was working fine on the dashboard due to other components invoking enqueueToRender
1530         but won't work in a standalone instance of InteractiveTimeSeriesChart.
1531         (InteractiveTimeSeriesChart.prototype._mouseLeave): Ditto, adding the missing call to enqueueToRender.
1532         (InteractiveTimeSeriesChart.prototype._click): Removed the assignment to _forceRender when calling
1533         _mouseMove in an early exist, which does set this flag and invokes enqueueToRender, and added the missing
1534         call to enqueueToRender in the other code path.
1535         (InteractiveTimeSeriesChart.prototype._startOrContinueDragging): Replaced annotations.onclick callback
1536         by the newly added "annotationClick" action, and added the missing call to enqueueToRender.
1537         (InteractiveTimeSeriesChart.prototype._endDragging): Use arrow function.
1538         (InteractiveTimeSeriesChart.prototype._notifyIndicatorChanged): Replaced indicator.onchange callback by
1539         the newly added "indicatorChange" action.
1540         (InteractiveTimeSeriesChart.prototype._notifySelectionChanged): Replaced selection.onchange callback by
1541         the newly added "selectionChange" action.
1542         (InteractiveTimeSeriesChart.prototype._renderChartContent): Show the zoom button when options.zoomButton
1543         is set instead of relying on the presence of selection.onzoom especially now that the callback has been
1544         replaced by the "zoom" action.
1545
1546         * public/v3/components/time-series-chart.js:
1547         (TimeSeriesChart.prototype.setAnnotations): Added the missing call to enqueueToRender.
1548
1549         * public/v3/main.js:
1550
1551 2017-02-21  Ryosuke Niwa  <rniwa@webkit.org>
1552
1553         Make sampling algorithm more stable and introduce an abstraction for sampled data
1554         https://bugs.webkit.org/show_bug.cgi?id=168693
1555
1556         Reviewed by Chris Dumez.
1557
1558         Before this patch, TimeSeriesChart's resampling resulted in some points poping up and disappearing as
1559         the width of a chart is changed. e.g. when resizing the browser window. The bug was by caused by
1560         the sample for a given width not always including all points for a smaller width so as the width is
1561         expanded, some point may be dropped.
1562
1563         Fixed this by using a much simpler algorithm of always picking a point when the time interval between
1564         the preceding point and the succeeding point is larger than the minimum space we allow for a given width.
1565
1566         Also introduced a new abstraction around the sample data: TimeSeriesView. A TimeSeriesView provides
1567         a similar API to TimeSeries for a subset of the time series filtered by a time range a custom function.
1568         This paves a way to adding the ability to select baseline, etc... on the chart status view.
1569
1570         TimeSeriesView can be in two modes:
1571         Mode 1. The view represents a contiguous subrange of TimeSeries - In this mode, this._data references
1572                 the underlying TimeSeries's _data directly, and we use _startingIndex to adjust index given to
1573                 find the relative index. Finding the next point or the previous point of a given point is done
1574                 via looking up the point's seriesIndex and doing a simple arithmetic. In general, an index is
1575                 converted to the absolute index in the underlying TimeSeries's _data array.
1576
1577         Mode 2. The view represents a filtered non-contiguous subset of TimeSeries -  In this mode, this._data is
1578                 its own array. Finding the next point or the previous point of a given point requires finding
1579                 a sibling point in the underlying TimeSeries which is in this view. Since this may result in O(n)
1580                 traversal and a hash lookup, we lazily build a map of each point to its position in _data instead.
1581
1582         * public/v3/components/chart-status-view.js:
1583         (ChartStatusView.prototype.updateStatusIfNeeded): Call selectedPoints instead of sampledDataBetween for
1584         clarity. This function now returns a TimeSeriesView instead of a raw array.
1585
1586         * public/v3/components/interactive-time-series-chart.js:
1587         (InteractiveTimeSeriesChart.prototype.currentPoint): Updated now that _sampledTimeSeriesData contains
1588         an array of TimeSeriesView's. Note that diff is either 0, -1, or 1.
1589         (InteractiveTimeSeriesChart.prototype.selectedPoints): Ditto. sampledDataBetween no longer exists since
1590         we can simply call viewTimeRange on TimeSeriesView returned by sampledDataBetween.
1591         (InteractiveTimeSeriesChart.prototype.firstSelectedPoint): Ditto.
1592         (InteractiveTimeSeriesChart.prototype._sampleTimeSeries): Use add since excludedPoints is now a Set.
1593
1594         * public/v3/components/time-series-chart.js:
1595         (TimeSeriesChart.prototype.sampledDataBetween): Deleted.
1596         (TimeSeriesChart.prototype.firstSampledPointBetweenTime): Deleted.
1597         (TimeSeriesChart.prototype._ensureSampledTimeSeries): Modernized the code. Use the the time interval of
1598         the chart divided by the number of allowed points as the time interval used in the new sampling algorithm.
1599         (TimeSeriesChart.prototype._sampleTimeSeries): Rewritten. We also create TimeSeriesView here.
1600         (TimeSeriesChart.prototype._sampleTimeSeries.findMedian): Deleted.
1601         (TimeSeriesChart.prototype._updateCanvasSizeIfClientSizeChanged): Fixed a bug that the canvas size wasn't
1602         set to the correct value on Chrome when a high DPI screen is used.
1603
1604         * public/v3/models/time-series.js:
1605         (TimeSeries.prototype.viewBetweenPoints): Renamed from dataBetweenPoints. Now returns a TimeSeriesView.
1606         (TimeSeriesView): Added. This constructor is to be called by viewBetweenPoints, viewTimeRange, and filter.
1607         (TimeSeriesView.prototype._buildPointIndexMap): Added. Used in mode (2).
1608         (TimeSeriesView.prototype.length): Added.
1609         (TimeSeriesView.prototype.firstPoint): Added.
1610         (TimeSeriesView.prototype.lastPoint): Added.
1611         (TimeSeriesView.prototype.nextPoint): Added. Note index is always a position in this._data. In mode (1),
1612         this is the position of the point in the underlying TimeSeries' _data. In mode (2), this is the position
1613         of the point in this._data which is dictinct from the underlying TimeSeries' _data.
1614         (TimeSeriesView.prototype.previousPoint): Ditto.
1615         (TimeSeriesView.prototype.findPointByIndex): Added. Finds the point using the positional index from the
1616         beginning of this view. findPointByIndex(0) on one view may not be same as findPointByIndex(0) of another.
1617         (TimeSeriesView.prototype.findById): Added. This is O(n).
1618         (TimeSeriesView.prototype.values): Added. Returns the value of each point in this view.
1619         (TimeSeriesView.prototype.filter): Added. Creates a new view with a subset of data points the predicate
1620         function returned true.
1621         (TimeSeriesView.prototype.viewTimeRange): Added. Creates a new view with a subset of data points for the
1622         given time ragne. When the resultant view would include all points of this view, it simply returns itself
1623         as an optimization.
1624         (TimeSeriesView.prototype.firstPointInTimeRange): Added. Returns the first point in the view which lies
1625         within the specified time range.
1626         (TimeSeriesView.prototype.Symbol.iterator): Added. Iterates over each point in the view.
1627
1628         * public/v3/pages/analysis-task-page.js:
1629         (AnalysisTaskChartPane.prototype.selectedPoints): Use selectedPoints in lieu of getting selection and then
1630         calling sampledDataBetween with that range.
1631
1632         * public/v3/pages/summary-page.js:
1633         (SummaryPageConfigurationGroup.set _medianForTimeRange): Modernized.
1634
1635         * unit-tests/time-series-tests.js: Added tests for TimeSeries and TimeSeriesView. Already caught bugs!
1636         (addPointsToSeries):
1637
1638 2017-02-17  Ryosuke Niwa  <rniwa@webkit.org>
1639
1640         Add tests for the time series chart and fix bugs I found along the way
1641         https://bugs.webkit.org/show_bug.cgi?id=168499
1642
1643         Reviewed by Antti Koivisto.
1644
1645         Add basic tests for the time series chart.
1646
1647         Replaced the "ondata" callback set in the options by "dataChange" action now that ComponentBase provides
1648         a facility for defining event-like actions.
1649
1650         Also fixed bugs I encountered while writing these tests see below for descriptions.
1651
1652         * browser-tests/editable-text-tests.js:
1653         (waitToRender): Moved to index.html
1654         * browser-tests/index.html:
1655         (waitToRender): Moved from editable-text-tests.js.
1656         (wait): Added.
1657         * browser-tests/time-series-chart-tests.js: Added.
1658         * public/v3/components/chart-pane-base.js:
1659         (ChartPaneBase.prototype.configure):
1660         * public/v3/components/time-series-chart.js:
1661         (TimeSeriesChart): Removed the code to set display and position inline properties. This is now done inside
1662         cssTemplate with :host pseudo class.
1663         (TimeSeriesChart.prototype._ensureCanvas): Don't strech the canvas to 100% of width and height. This was
1664         causing a flush of contents where the canvas is momentarily streched by the browser and the script later
1665         updates with the content with the correct aspect ratio.
1666         (TimeSeriesChart.cssTemplate): Added :host rule to set display: block and position: relative.
1667         (TimeSeriesChart._updateAllCharts): Deleted.
1668         (TimeSeriesChart.prototype.render): Only run the code for axis when options.axis is defined. Also, avoid
1669         setting the fill style because we never fill for axis drawing.
1670         (TimeSeriesChart.prototype._computeHorizontalRenderingMetrics): Ditto. Fallback to sensible values when
1671         options.axis is not defined.
1672         (TimeSeriesChart.prototype._renderYAxis): Now computeValueGrid generates a sequence of {time, label}.
1673         (TimeSeriesChart.prototype._renderTimeSeries): Don't draw the shades for confidence intervals unless its
1674         fill style is defined. Otherwise, we'd end up drawing black shade and mask the actual data points.
1675         (TimeSeriesChart.prototype._ensureSampledTimeSeries): Dispatch newly added "dataChange" action instead of
1676         calling "ondata" callback in options dictionary.
1677         (TimeSeriesChart.computeTimeGrid): Modernized to use const/let. Also fixed the bug that we were emitting
1678         the date even when the entire time range fit within a 24-hour interval.
1679         (TimeSeriesChart.computeValueGrid): Rewritten to make MB/GB use a nice round number instead of 0.98GB.
1680         We were using a power of 10 to round up the stepping value but the value formatter used a power of 1024
1681         to divide byte measurements (e.g. for memory). Use formatter.divisor to find the right scaling factor for
1682         each kind.
1683         * public/v3/models/metric.js:
1684         (Metric.prototype.makeFormatter):
1685         (Metric.makeFormatter): Extracted from the one on the prototype so that tests don't need a metric object
1686         just to test TimeSeriesChart. Added the second argument which specifies the maximum absolute value of the
1687         range we're formatting. This is needed to use the same number of decimal points when the most significant
1688         digit of some value is smaller than that of the biggest one. For example, we were emitting 0.50GB instead
1689         of 0.5G along with 2.0GB. The "adjustment" reduces the number of significant figures in these cases.
1690         * public/v3/pages/dashboard-page.js:
1691         (DashboardPage.prototype._createChartForCell):
1692
1693 2017-02-16  Ryosuke Niwa  <rniwa@webkit.org>
1694
1695         Use expect.js instead of expect in browser tests
1696         https://bugs.webkit.org/show_bug.cgi?id=168492
1697
1698         Reviewed by Joseph Pecoraro.
1699
1700         Use expect.js (https://github.com/Automattic/expect.js) instead of expect (https://github.com/mjackson/expect).
1701
1702         * browser-tests/close-button-tests.js:
1703         * browser-tests/component-base-tests.js:
1704         * browser-tests/editable-text-tests.js:
1705         * browser-tests/index.html:
1706
1707 2017-02-16  Ryosuke Niwa  <rniwa@webkit.org>
1708
1709         Modernize and fix measurement-set tests
1710         https://bugs.webkit.org/show_bug.cgi?id=168484
1711
1712         Reviewed by Joseph Pecoraro.
1713
1714         Modernized and fixed the tests in measurement-set-tests.js.
1715
1716         1. Return a promise instead of manually calling done in then/catch hanlders.
1717         2. Use arrow function everywhere.
1718         3. Explicitly assert the number of calls to callbacks instead of asserting never reached.
1719
1720         The test case labled "should return false when the range ends after the fetched cluster"
1721         was incorrectly asserting that hasFetchedRange returns false when the end time is after
1722         the primary cluster's end time. Test an interval before the primary cluster instead.
1723
1724         Added a test case for hasFetchedRange returning true when the end time appears after
1725         the end of the primary cluster and fixed hasFetchedRange to that end. Since there are
1726         no data points after the primary cluster which is chronologically the last cluster,
1727         there is nothing to fetch beyond its end time.
1728
1729         * public/v3/models/measurement-set.js:
1730         (MeasurementSet.prototype.hasFetchedRange): Fixed the bug that this function returned
1731         false when the end time was after the primary cluster's end by truncating the range by
1732         the end of the primary cluster.
1733         * unit-tests/measurement-set-tests.js:
1734         * unit-tests/resources/mock-remote-api.js:
1735         (assert.notReached.assert.notReached): Deleted. It's no longer used by any tests.
1736
1737 2017-02-15  Ryosuke Niwa  <rniwa@webkit.org>
1738
1739         Update ReadMe.md and merge it with Install.md
1740         https://bugs.webkit.org/show_bug.cgi?id=168405
1741
1742         Reviewed by Michael Catanzaro.
1743
1744         Merged Install.md and ReadMe.md into one file.
1745
1746         * Install.md: Removed.
1747         * ReadMe.md: Merged Install.md at the top and updated the rest of the content.
1748
1749 2017-01-24  Ryosuke Niwa  <rniwa@webkit.org>
1750
1751         Modernize editable-text component and add tests
1752         https://bugs.webkit.org/show_bug.cgi?id=167398
1753
1754         Reviewed by Yusuke Suzuki.
1755
1756         Modernized EditableText component to use the action feature added in r210938.
1757
1758         * browser-tests/editable-text-tests.js: Added. Added tests for EditableText component.
1759         (.waitToRender):
1760         * browser-tests/index.html:
1761         * public/v3/components/base.js:
1762         (ComponentBase.prototype.dispatchAction): Return the result from the callback.
1763         * public/v3/components/editable-text.js:
1764         (EditableText): Removed a bunch of instance variables that are no longer needed.
1765         (EditableText.prototype.didConstructShadowTree): Added. Add event listeners on the Edit/Save button and the host.
1766         (EditableText.prototype.editedText): Return the text field's value directly.
1767         (EditableText.prototype.text): Added.
1768         (EditableText.prototype.setText): Call enqueueToRender automatically instead of relying on the parent component
1769         to do so in _startedEditingCallback, which has been removed.
1770         (EditableText.prototype.render): Modernized the code.
1771         (EditableText.prototype._didClick): No longer prevents the default action manually since that's automatically done
1772         in createEventHandler. Handle the case where the update action is not handled.
1773         (EditableText.prototype._endEditingMode): Renamed from _didUpdate.
1774         (EditableText.htmlTemplate): Added ids on various elements in the shadow tree.
1775         (EditableText.cssTemplate): Updated the CSS selectors per above change.
1776         * public/v3/main.js:
1777         (main): Fixed a typo.
1778         * public/v3/pages/analysis-task-page.js:
1779         (AnalysisTaskPage): Use the action listener instead of manually setting callbacks.
1780         (AnalysisTaskPage.prototype._createTestGroupListItem): Ditto.
1781         (AnalysisTaskPage.prototype._didStartEditingTaskName): Deleted.
1782
1783 2017-01-20  Ryosuke Niwa  <rniwa@webkit.org>
1784
1785         Build fix after r210783. Didn't mean to require custom elements API.
1786
1787         * public/v3/main.js:
1788         (main):
1789
1790 2017-01-20  Ryosuke Niwa  <rniwa@webkit.org>
1791
1792         Make sync-commits.py robust against missing Subversion authors and missing parent Git commits
1793         https://bugs.webkit.org/show_bug.cgi?id=167231
1794
1795         Reviewed by Antti Koivisto.
1796
1797         Fixed a bug that a subversion commit that's missing author name (anonymous commit) results in an out of bound
1798         exception, and a bug that syncing a git repository starts failing once there was a merge commit which pulled
1799         in a commit data earlier than that of the last reported commit.
1800
1801         For the latter fix, added --max-ancestor-fetch-count to specify the number of maximum commits to look back.
1802
1803         * tools/sync-commits.py:
1804         (main): Added --max-ancestor-fetch-count.
1805         (Repository.fetch_commits_and_submit): If submit_commits fails with FailedToFindParentCommit, fetch the parent
1806         commit's information until we've resolved them all.
1807         (Repository.fetch_next_commit): Renamed from fetch_commit.
1808         (SVNRepository.fetch_next_commit): Renamed from fetch_commit. Don't try to get the author name if it's missing
1809         due to an anonymous commit. It's important to never include the "author" field in the JSON submitted to
1810         a dashboard since it rejects when "author" field is not an array (e.g. null). 
1811         (GitRepository.fetch_next_commit): Renamed from fetch_commit.
1812         (GitRepository.fetch_commit): Added. Fetches the commit information for a given git hash. Used to retrieve
1813         missing parent commits.
1814         (GitRepository._revision_from_tokens): Extracted from fetch_commit.
1815
1816         * tools/util.py:
1817         (submit_commits): Optionally takes status_to_accept to avoid throwing in the case of FailedToFindParentCommit
1818         and returns the response JSON.
1819
1820 2017-01-20  Ryosuke Niwa  <rniwa@webkit.org>
1821
1822         REGRESSION(r198234): /api/commits/%revision% always fails
1823         https://bugs.webkit.org/show_bug.cgi?id=167235
1824
1825         Reviewed by Antti Koivisto.
1826
1827         The bug was caused by a typo in CommitLogFetcher::fetch_revision, which was calling commit_for_revision on
1828         $this->db instead of $this. This had been monkey-patched in the internal dashboard so it was working there.
1829
1830         Also fixed a bug that /latest wasn't doing what it claimed to do, and a bug that /oldest /latest,
1831         and /last-reported would return a commit with all values set to null instead of an empty list.
1832
1833         Finally, added server API tests for /api/commits.
1834
1835         * public/api/commits.php:
1836         (main): Add a comment for APIs that only exist for v2 UI.
1837
1838         * public/include/commit-log-fetcher.php:
1839         (CommitLogFetcher::fetch_latest): Fixed the bug that this function was returning the oldest commit, not the
1840         the latest commit as desired.
1841         (CommitLogFetcher::fetch_revision): Fixed the bug that this function would always encounter an exception
1842         because commit_for_revision is defined on $this, not $this->db.
1843         (CommitLogFetcher::format_single_commit): Return an empty list instead of an array with a single commit with
1844         all values set to null.
1845
1846         * server-tests/api-commits.js: Added. Added tests for the JSON API at /api/commits.
1847         (.assertCommitIsSameAsOneSubmitted): Added. A helper function to compare a commit returned by /api/commits
1848         to one sent to /api/report-commits.
1849
1850 2017-01-19  Ryosuke Niwa  <rniwa@webkit.org>
1851
1852         measurement-sets API can incorrectly order points with OS version without commit time
1853         https://bugs.webkit.org/show_bug.cgi?id=167227
1854
1855         Reviewed by Chris Dumez.
1856
1857         Ignore revision_order for the purpose of ordering data points in /api/measurement-sets.
1858
1859         These orderings are used in some UI (e.g A/B testing) to order OS build numbers which do not have a timestamp
1860         associated with each "revision".
1861
1862         The baseline measurements made in our internal dashboard were using these ordering numbers before ordering
1863         results with build time. Because those data points don't have an associated Webkit revisions, all data points
1864         were ordered first by macOS's revision_order, then build time. Because v3 UI completely ignores revision_order
1865         for the purpose of plotting data points, this resulted in some data points being plotted in a wrong order
1866         with some lines going backwards in time.
1867
1868         This patch addresses this discrepancy by stop ordering data points with revision_order in the JSON API.
1869
1870         * public/api/measurement-set.php:
1871         (MeasurementSetFetcher::execute_query): Fixed the bug.
1872         * server-tests/api-measurement-set-tests.js: Added a test.
1873
1874 2017-01-19  Ryosuke Niwa  <rniwa@webkit.org>
1875
1876         Build fix after r210626. We need to clear Triggerable's static map in each iteration.
1877
1878         * tools/sync-buildbot.js:
1879         (syncLoop):
1880
1881 2017-01-18  Ryosuke Niwa  <rniwa@webkit.org>
1882
1883         Add a mechanism to dispatch and listen to an action
1884         https://bugs.webkit.org/show_bug.cgi?id=167191
1885
1886         Reviewed by Antti Koivisto.
1887
1888         Added the notion of an action to components. Like DOM events, it can be dispatched or listen to.
1889
1890         Also added ComponentBase.prototype.part which finds a sub-component inside a component's shadow tree,
1891         and made ComponentBase.prototype.content take an id to find an element that matches it.
1892
1893         * browser-tests/close-button-tests.js: Added. Tests for CloseButton.
1894         * browser-tests/component-base-tests.js: Added tests for ComponentBase's part(~), content(id), dispatchEvent.
1895         * browser-tests/index.html:
1896         * public/v3/components/base.js:
1897         (ComponentBase): Added this._actionCallbacks, which is a map of an action name to a callback to be invoked.
1898         (ComponentBase.prototype.content): Return an element of the given id if one is specified.
1899         (ComponentBase.prototype.part): Find a component whose element has the matching id.
1900         (ComponentBase.prototype.dispatchAction): Added.
1901         (ComponentBase.prototype.listenToAction): Added.
1902         (ComponentBase.prototype._ensureShadowTree): Call didConstructShadowTree.
1903         (ComponentBase.prototype.didConstructShadowTree): Added.
1904         (ComponentBase.prototype._recursivelyReplaceUnknownElementsByComponents): Copy attributes when instantiating
1905         an element for a component when the browser doesn't support custom elements API.
1906         (ComponentBase.createLink):
1907         (ComponentBase.prototype.createEventHandler): Added.
1908         (ComponentBase.createEventHandler): Renamed from createActionHandler.
1909         * public/v3/components/button-base.js:
1910         (ButtonBase.prototype.didConstructShadowTree): Added. Dispatch "activate" action when the button is clicked.
1911         (ButtonBase.prototype.setCallback): Deleted.
1912         (ButtonBase.htmlTemplate): Use id instead of class so that this.content() can find it.
1913         (ButtonBase.cssTemplate): Updated style rules.
1914         * public/v3/pages/chart-pane.js:
1915         (ChartPane):
1916         (ChartPane.prototype.didConstructShadowTree): Added. Listen to "activate" action on the close button.
1917         (ChartPane.prototype.render): Fixed a bug that we were never calling enqueueToRender on the close button.
1918         (ChartPane.htmlTemplate): Add the id on the close button.
1919
1920 2017-01-18  Dewei Zhu  <dewei_zhu@apple.com>
1921
1922         'buildbot-syncer.js' should be able to determine force build argument from a list of possible repositories.
1923         https://bugs.webkit.org/show_bug.cgi?id=167152
1924
1925         Reviewed by Ryosuke Niwa.
1926
1927         Add 'rootOptions' key which maps to a list of possible repositories.
1928         For a build request, only one of the repositories in the list is valid.
1929
1930         * tools/js/buildbot-syncer.js:
1931         (BuildbotSyncer.prototype._propertiesForBuildRequest):
1932         (BuildbotSyncer._validateAndMergeProperties):
1933         (BuildbotSyncer):
1934         * unit-tests/buildbot-syncer-tests.js:
1935         (sampleiOSConfig):
1936         (sampleiOSConfigWithExpansions):
1937         (createSampleBuildRequest):
1938         (Promise.resolve.then):
1939         * unit-tests/resources/mock-v3-models.js:
1940         (MockModels.inject):
1941
1942 2017-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1943
1944         Make calls to render() functions async
1945         https://bugs.webkit.org/show_bug.cgi?id=167151
1946
1947         Reviewed by Andreas Kling.
1948
1949         Make calls to render() async by coalescing calls inside enqueueToRender(), which has been renamed from
1950         updateRendering(). We now queue up all the components and wait until the next animation frame to invoke
1951         render() on all those components.
1952
1953         This reduces render() calls in the summary page of our internal dashboard by 15x from ~9400 to ~600 by
1954         eliminating pathological O(n^2) behavior between render() calls.
1955
1956         Consolidated TimeSeriesChart's enqueueRender into this newly added feature of ComponentBase along with
1957         the support to call render() on a resize event. New implementation makes use of connectedCallback and
1958         disconnectedCallback to avoid the work when the component is not in a document tree.
1959
1960         The rest of the patch concerns with renaming updateRendering to enqueueToRender and fixing a few minor bugs
1961         that I encountered while working on this patch.
1962
1963         * browser-tests/component-base-tests.js: Added tests for ComponentBase.enqueueToRender().
1964         * browser-tests/index.html:
1965         (BrowserContext.prototype.importScripts): Renamed from importScript; Now supports loading multiple scripts.
1966         (BrowserContext.prototype.importScript): Added.
1967         (BrowserContext): Removed the unused createWithScripts.
1968
1969         * public/v3/components/analysis-results-viewer.js:
1970         (AnalysisResultsViewer.prototype._expandBetween):
1971         * public/v3/components/bar-graph-group.js:
1972         (BarGraphGroup.prototype.updateGroupRendering):
1973
1974         * public/v3/components/base.js:
1975         (ComponentBase): When the browser doesn't support custom elements and 
1976         (ComponentBase.prototype.enqueueToRender): Renamed from updateRendering. Queues up the component to call
1977         render() instead of immediately invoking it.
1978         (ComponentBase.renderingTimerDidFire): Call render(). Since render() function often calls enqueueToRender
1979         on child components, go ahead and invoke render() on any components enqueued during render() calls.
1980         (ComponentBase._connectedComponentToRenderOnResize): Added.
1981         (ComponentBase._disconnectedComponentToRenderOnResize): Added.
1982         (ComponentBase.defineElement.elementClass.prototype.connectedCallback): Added. This is an optimization to
1983         avoid the work when the component is not in the document; e.g. because the entire page component has been
1984         detached from the document. The old implementation in TimeSeriesChart was not doing this.
1985         (ComponentBase.defineElement.elementClass.prototype.disconnectedCallback): Added.
1986         (ComponentBase): Replaced unused static variables with _componentsToRender and _componentsToRenderOnResize.
1987
1988         * public/v3/components/chart-pane-base.js:
1989         (ChartPaneBase.prototype.fetchAnalysisTasks):
1990         (ChartPaneBase.prototype.didUpdateAnnotations): Added. Addresses the bug that the annotation bars in the
1991         charts shown an an analysis task doesn't update its color when the state is updated in the UI. 
1992         (ChartPaneBase.prototype._mainSelectionDidZoom):
1993         (ChartPaneBase.prototype._updateStatus):
1994         (ChartPaneBase.prototype._requestOpeningCommitViewer):
1995         (ChartPaneBase.prototype._keyup):
1996         (ChartPaneBase.prototype.render):
1997         * public/v3/components/commit-log-viewer.js:
1998         * public/v3/components/customizable-test-group-form.js:
1999         (CustomizableTestGroupForm):
2000         (CustomizableTestGroupForm.prototype._customize):
2001         * public/v3/components/editable-text.js:
2002         (EditableText.prototype._didUpdate):
2003         * public/v3/components/interactive-time-series-chart.js:
2004         * public/v3/components/pane-selector.js:
2005         (PaneSelector.prototype._selectedItem):
2006         * public/v3/components/time-series-chart.js:
2007         (TimeSeriesChart): Removed the logic to update upon resize. See _connectedComponentToRenderOnResize above.
2008         (TimeSeriesChart.prototype.get enqueueToRenderOnResize): Added. Returns true.
2009         (TimeSeriesChart.prototype.enqueueToRender): Deleted.
2010         (TimeSeriesChart._renderEnqueuedCharts): Deleted.
2011         (TimeSeriesChart): Call ComponentBase.defineElement to make this a proper component so that the logic in
2012         connectedCallback to update upon resize event would work.
2013         * public/v3/instrumentation.js:
2014         (Instrumentation.dumpStatistics): Sort results by the key names.
2015         * public/v3/models/time-series.js:
2016         (TimeSeries.prototype.values): Added. This method was never ported to v3 in r198462, and broke the feature
2017         to show moving averages, etc... on the charts page.
2018         * public/v3/pages/analysis-category-page.js:
2019         (AnalysisCategoryPage.prototype.open):
2020         (AnalysisCategoryPage.prototype.updateFromSerializedState):
2021         (AnalysisCategoryPage.prototype.filterDidChange):
2022         (AnalysisCategoryPage.prototype.render):
2023         * public/v3/pages/analysis-task-page.js:
2024         (AnalysisTaskChartPane.prototype._updateStatus):
2025         (AnalysisTaskPage.prototype.updateFromSerializedState):
2026         (AnalysisTaskPage.prototype._didFetchTask):
2027         (AnalysisTaskPage.prototype._didFetchRelatedAnalysisTasks):
2028         (AnalysisTaskPage.prototype._didFetchMeasurement):
2029         (AnalysisTaskPage.prototype._didFetchTestGroups):
2030         (AnalysisTaskPage.prototype._showAllTestGroups):
2031         (AnalysisTaskPage.prototype._didFetchAnalysisResults):
2032         (AnalysisTaskPage.prototype.render):
2033         (AnalysisTaskPage.prototype._renderTestGroupList.):
2034         (AnalysisTaskPage.prototype._renderTestGroupList):
2035         (AnalysisTaskPage.prototype._createTestGroupListItem):
2036         (AnalysisTaskPage.prototype._showTestGroup):
2037         (AnalysisTaskPage.prototype._didStartEditingTaskName):
2038         (AnalysisTaskPage.prototype._updateTaskName):
2039         (AnalysisTaskPage.prototype._updateTestGroupName):
2040         (AnalysisTaskPage.prototype._hideCurrentTestGroup):
2041         (AnalysisTaskPage.prototype._updateChangeType): Fixed the bug that we were never updating annotation bars
2042         in the main chart by calling didUpdateAnnotations.
2043         (AnalysisTaskPage.prototype._associateBug):
2044         (AnalysisTaskPage.prototype._dissociateBug):
2045         (AnalysisTaskPage.prototype._associateCommit):
2046         (AnalysisTaskPage.prototype._dissociateCommit):
2047         (AnalysisTaskPage.prototype._chartSelectionDidChange):
2048         (AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer):
2049         * public/v3/pages/build-request-queue-page.js:
2050         (BuildRequestQueuePage.prototype.open.):
2051         (BuildRequestQueuePage.prototype.open):
2052         * public/v3/pages/chart-pane.js:
2053         (ChartPane.prototype.setOpenRepository):
2054         (ChartPane.prototype._renderTrendLinePopover): Fixed a race condition. Insert a select element as needed
2055         before trying to assign the current value on it.
2056         (ChartPane.prototype._trendLineTypeDidChange):
2057         (ChartPane.prototype._updateTrendLine):
2058         * public/v3/pages/charts-page.js:
2059         (ChartsPage.prototype.updateFromSerializedState):
2060         (ChartsPage.prototype._updateDomainsFromSerializedState):
2061         (ChartsPage.prototype.setNumberOfDaysFromToolbar):
2062         (ChartsPage.prototype._didMutatePaneList):
2063         (ChartsPage.prototype.render):
2064         * public/v3/pages/charts-toolbar.js:
2065         (ChartsToolbar.prototype.render):
2066         * public/v3/pages/create-analysis-task-page.js:
2067         (CreateAnalysisTaskPage.prototype.updateFromSerializedState):
2068         * public/v3/pages/dashboard-page.js:
2069         (DashboardPage.prototype.updateFromSerializedState):
2070         (DashboardPage.prototype._fetchedData):
2071         * public/v3/pages/heading.js:
2072         (Heading.prototype.render):
2073         * public/v3/pages/page-with-heading.js:
2074         (PageWithHeading.prototype.render):
2075         * public/v3/pages/page.js:
2076         (Page.prototype.open):
2077         * public/v3/pages/summary-page.js:
2078         (SummaryPage.prototype.open):
2079         (SummaryPage.prototype.this._renderQueue.push):
2080         (SummaryPage):
2081         (SummaryPage.prototype._renderCell):
2082
2083 2017-01-15  Ryosuke Niwa  <rniwa@webkit.org>
2084
2085         Add the build fix for browsers that don't yet support custom elements SPI.
2086         It was supposedly to be a part of the previous commit.
2087
2088         * public/v3/components/base.js:
2089         (ComponentBase.defineElement):
2090
2091 2017-01-12  Ryosuke Niwa  <rniwa@webkit.org>
2092
2093         Adopt custom elements API in perf dashboard
2094         https://bugs.webkit.org/show_bug.cgi?id=167045
2095
2096         Reviewed by Darin Adler.
2097
2098         Adopt custom elements API in ComponentBase, and create the shadow tree lazily in content() and render()
2099         instead of eagerly creating it inside the constructor.
2100
2101         For now, create a separate element class for each component in ComponentBase.defineElement instead of
2102         making ComponentBase inherit from HTMLElement to preserve the semantics we have as well as to test
2103         the boundaries of what custom elements API allows for framework authors.
2104
2105         In order to ensure one-to-one correspondence between elements and their components, we use a static map,
2106         ComponentBase._currentlyConstructedByInterface, to remember which element or component is being created
2107         and use that in custom element's constructor to update element.component() and this._element.
2108
2109         Also dropped the support for not having attachShadow as we've shipped this feature in Safari 10.
2110
2111         Finally, added tests to be ran inside a browser to test the front end code in browser-tests.
2112
2113         * browser-tests/component-base-tests.js: Added. Basic tests for ComponentBase.
2114         * browser-tests/index.html: Added.
2115
2116         * public/v3/components/base.js:
2117         (ComponentBase): Don't create the shadow tree. Use the currently constructed element as this._element if
2118         there is one (the custom element's constructor is getting called). Otherwise create a new element but
2119         store this component in the map to avoid creating a new component in the custom element's constructor.
2120         (ComponentBase.prototype.content): Lazily create the shadow tree now.
2121         (ComponentBase.prototype.render): Ditto.
2122         (ComponentBase.prototype._ensureShadowTree): Renamed from _constructShadowTree. Dropped the support for
2123         not having shadow DOM API. This is now required. Also use importNode instead of cloneNode in cloning
2124         the template content since the latter would not get upgraded.
2125         (ComponentBase.prototype._recursivelyReplaceUnknownElementsByComponents): Modernized the code. Don't
2126         re-create a component if its element had already been upgraded by its custom element constructor.
2127         (ComponentBase.defineElement): Add this component to the static maps. _componentByName is used by
2128         _recursivelyReplaceUnknownElementsByComponents to instantiate new components in the browsers that don't
2129         support custom elements API and _componentByClass is used by ComponentBase's constructor to lookup the
2130         element name. The latter should go away once all components fully adopt ComponentBase.defineElement.
2131         (ComponentBase.defineElement.elementClass): A class to define a custom element for the component.
2132         We need to reconfigure the property since class's name is not writable but configurable.
2133
2134         * public/v3/components/button-base.js:
2135         (ButtonBase.htmlTemplate): Added. Extracted the common code from CloseButton and WarningIcon.
2136         (ButtonBase.buttonContent): Added. An abstract method overridden by CloseButton and WarningIcon.
2137         (ButtonBase.sizeFactor): Added. Overridden by WarningIcon.
2138         (ButtonBase.cssTemplate): Updated to use :host.
2139         * public/v3/components/close-button.js:
2140         (CloseButton.buttonContent): Renamed from htmlTemplate.
2141         * public/v3/components/spinner-icon.js:
2142         (SpinnerIcon.cssTemplate): Removed webkit prefixed properties, and updated it to animate stroke instead
2143         of opacity to reduce the power usage.
2144         (SpinnerIcon.htmlTemplate): Factored stroke, stroke-width, and stroke-linecap into cssTemplate.
2145         * public/v3/components/warning-icon.js:
2146         (WarningIcon.cssTemplate): Deleted.
2147         (WarningIcon.sizeFactor): Added.
2148         (WarningIcon.buttonContent): Renamed from htmlTemplate.
2149         * public/v3/pages/summary-page.js:
2150         (SummaryPage._constructRatioGraph): Fixed a bug that we were not never calling spinner.updateRendering().
2151         (SummaryPage.prototype._renderCell):
2152
2153 2017-01-13  Ryosuke Niwa  <rniwa@webkit.org>
2154
2155         Instrument calls to render()
2156         https://bugs.webkit.org/show_bug.cgi?id=167037
2157
2158         Reviewed by Sam Weinig.
2159
2160         Wrap every call to render() by newly added ComponentBase.updateRendering() to instrument it.
2161         Also, use arrow functions instead of this.render.bind or regular closures for simplicity.
2162
2163         Currently, we're making 5100 calls to render() while opening the summary page, and that's way too high.
2164
2165         * public/v3/components/analysis-results-viewer.js:
2166         (AnalysisResultsViewer.prototype._expandBetween):
2167         * public/v3/components/bar-graph-group.js:
2168         (BarGraphGroup.prototype.updateGroupRendering): Renamed form render() as BarGraphGroup is not a component.
2169         * public/v3/components/base.js:
2170         (ComponentBase.prototype.updateRendering): Added. Instruments render() call.
2171         * public/v3/components/chart-pane-base.js:
2172         (ChartPaneBase.prototype.fetchAnalysisTasks):
2173         (ChartPaneBase.prototype._mainSelectionDidZoom):
2174         (ChartPaneBase.prototype._updateStatus):
2175         (ChartPaneBase.prototype._requestOpeningCommitViewer):
2176         (ChartPaneBase.prototype._keyup):
2177         (ChartPaneBase.prototype.render):
2178         * public/v3/components/commit-log-viewer.js:
2179         * public/v3/components/customizable-test-group-form.js:
2180         (CustomizableTestGroupForm):
2181         (CustomizableTestGroupForm.prototype._customize):
2182         * public/v3/components/editable-text.js:
2183         (EditableText.prototype._didUpdate):
2184         * public/v3/components/pane-selector.js:
2185         (PaneSelector.prototype._selectedItem):
2186         * public/v3/components/results-table.js:
2187         (ResultsTable.prototype.render):
2188         * public/v3/components/time-series-chart.js:
2189         (TimeSeriesChart._renderEnqueuedCharts):
2190         * public/v3/pages/analysis-category-page.js:
2191         (AnalysisCategoryPage.prototype.open):
2192         (AnalysisCategoryPage.prototype.updateFromSerializedState):
2193         (AnalysisCategoryPage.prototype.filterDidChange):
2194         (AnalysisCategoryPage.prototype.render):
2195         * public/v3/pages/analysis-task-page.js:
2196         (AnalysisTaskChartPane.prototype._updateStatus):
2197         (AnalysisTaskPage.prototype.updateFromSerializedState):
2198         (AnalysisTaskPage.prototype._didFetchTask):
2199         (AnalysisTaskPage.prototype._didFetchRelatedAnalysisTasks):
2200         (AnalysisTaskPage.prototype._didFetchMeasurement):
2201         (AnalysisTaskPage.prototype._didFetchTestGroups):
2202         (AnalysisTaskPage.prototype._showAllTestGroups):
2203         (AnalysisTaskPage.prototype._didFetchAnalysisResults):
2204         (AnalysisTaskPage.prototype.render):
2205         (AnalysisTaskPage.prototype._renderTestGroupList.):
2206         (AnalysisTaskPage.prototype._renderTestGroupList):
2207         (AnalysisTaskPage.prototype._createTestGroupListItem):
2208         (AnalysisTaskPage.prototype._showTestGroup):
2209         (AnalysisTaskPage.prototype._didStartEditingTaskName):
2210         (AnalysisTaskPage.prototype._updateTaskName):
2211         (AnalysisTaskPage.prototype._updateTestGroupName):
2212         (AnalysisTaskPage.prototype._hideCurrentTestGroup):
2213         (AnalysisTaskPage.prototype._updateChangeType):
2214         (AnalysisTaskPage.prototype._associateBug):
2215         (AnalysisTaskPage.prototype._dissociateBug):
2216         (AnalysisTaskPage.prototype._associateCommit):
2217         (AnalysisTaskPage.prototype._dissociateCommit):
2218         (AnalysisTaskPage.prototype._chartSelectionDidChange):
2219         (AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer):
2220         * public/v3/pages/build-request-queue-page.js:
2221         (BuildRequestQueuePage.prototype.open.):
2222         (BuildRequestQueuePage.prototype.open):
2223         * public/v3/pages/chart-pane.js:
2224         (ChartPane.prototype.setOpenRepository):
2225         (ChartPane.prototype._trendLineTypeDidChange):
2226         (ChartPane.prototype._updateTrendLine):
2227         * public/v3/pages/charts-page.js:
2228         (ChartsPage.prototype.updateFromSerializedState):
2229         (ChartsPage.prototype._updateDomainsFromSerializedState):
2230         (ChartsPage.prototype.setNumberOfDaysFromToolbar):
2231         (ChartsPage.prototype._didMutatePaneList):
2232         (ChartsPage.prototype.render):
2233         * public/v3/pages/charts-toolbar.js:
2234         (ChartsToolbar.prototype.render):
2235         * public/v3/pages/create-analysis-task-page.js:
2236         (CreateAnalysisTaskPage.prototype.updateFromSerializedState):
2237         * public/v3/pages/dashboard-page.js:
2238         (DashboardPage.prototype.updateFromSerializedState):
2239         (DashboardPage.prototype._fetchedData):
2240         * public/v3/pages/heading.js:
2241         (Heading.prototype.render):
2242         * public/v3/pages/page-with-heading.js:
2243         (PageWithHeading.prototype.render):
2244         * public/v3/pages/page.js:
2245         (Page.prototype.open):
2246         * public/v3/pages/summary-page.js:
2247         (SummaryPage.prototype.open):
2248         (SummaryPage.prototype.this._renderQueue.push):
2249         (SummaryPage):
2250         (SummaryPage.prototype._renderCell):
2251
2252 2017-01-12  Ryosuke Niwa  <rniwa@webkit.org>
2253
2254         Outliers are not hidden in v3 UI
2255         https://bugs.webkit.org/show_bug.cgi?id=166966
2256
2257         Reviewed by Andreas Kling.
2258
2259         Fixed the typo in addToSeries. An outlier has markedOutlier set to true, not isOutlier.
2260
2261         Also fixed a bug unveiled by new tests in MeasurementRootSet.ensureSingleton. It was was creating
2262         a new MeasurementRootSet each time it was called instead of finding an existing instance. Fixed the bug
2263         by merging the static maps of MeasurementRootSet and RootSet.
2264
2265         * public/v3/models/measurement-cluster.js:
2266         (MeasurementCluster.prototype.addToSeries): Fixed the bug.
2267         * public/v3/models/root-set.js:
2268         (MeasurementRootSet.prototype.namedStaticMap): Added.
2269         (MeasurementRootSet.prototype.ensureNamedStaticMap): Added.
2270         (MeasurementRootSet.namedStaticMap): Added.
2271         (MeasurementRootSet.ensureNamedStaticMap): Added.
2272         * unit-tests/measurement-set-tests.js: Added tests for adopting time series data from a cluster.
2273
2274 2017-01-12  Ryosuke Niwa  <rniwa@webkit.org>
2275
2276         Hide the UI to trigger an A/B testing when there are no triggerables
2277         https://bugs.webkit.org/show_bug.cgi?id=166964
2278
2279         Reviewed by Yusuke Suzuki.
2280
2281         Hide the "Start A/B Testing" button on analysis task pages instead of showing it and failing later
2282         when the user tries to create one it with a TriggerableNotFound error.
2283
2284         Added the list of triggerables to the manifest JSON so that we can determine this condition without
2285         having to fetch /api/triggerable for each analysis task as done in v2 UI.
2286
2287         * public/admin/reprocess-report.php:
2288         * public/api/manifest.php:
2289         * public/api/report.php:
2290         * public/include/admin-header.php:
2291         * public/include/manifest-generator.php: Moved from public/include/manifest.php.
2292         (ManifestGenerator::generate):
2293         (ManifestGenerator::triggerables): Added. Include the list of repositories this triggerable accepts
2294         as well as the list of (test, platform) pairs on which this triggerable is available.
2295         Use [testId, platformId] instead of a dictionary to reduce the file size.
2296         * public/v3/components/customizable-test-group-form.js:
2297         (CustomizableTestGroupForm): Removed this._disabled. This variable was used in TestGroupFrom to
2298         disable the "Start A/B Testing" button when no range is selected but this ended up racy. Compute
2299         the visibility of the button in render() function instead.
2300         (CustomizableTestGroupForm.prototype.setRootSetMap):
2301         (CustomizableTestGroupForm.prototype._submitted):
2302         (CustomizableTestGroupForm.prototype.render): Hide the customize link and the button as needed.
2303         The "Start A/B Testing" button must be hidden when either no range is selected or no title is typed.
2304         "Customize" button must be hidden when no range is selected.
2305         * public/v3/components/test-group-form.js:
2306         (TestGroupForm): Removed _disabled since it's no longer used.
2307         (TestGroupForm.prototype.setDisabled): Ditto.
2308         (TestGroupForm.prototype.render): Ditto.
2309         * public/v3/index.html: Include triggerable.js.
2310         * public/v3/models/manifest.js:
2311         (Manifest._didFetchManifest): Modernized. Create Triggerable objects from the manifest JSON.
2312         * public/v3/models/triggerable.js: Added.
2313         (Triggerable): Add this triggerable object to the static map of (test id, platform id) pair.
2314         (Triggerable.prototype.acceptedRepositories): Added.
2315         (Triggerable.findByTestConfiguration): Added. Finds a triggerable in the aforementioned static map.
2316         * public/v3/pages/analysis-task-page.js:
2317         (AnalysisTaskChartPane.prototype._updateStatus): Added. Re-render the page since time series data
2318         points that were previously not available may have become available. The lack of this update was
2319         causing a race condition in which the "Start A/B Testing" button for the charts is disabled even
2320         after a group name had been specified because setRootSetMap was never called with a valid set.
2321         (AnalysisTaskPage): Added this._triggerable.
2322         (AnalysisTaskPage.prototype._didFetchTask): Find the triggerable now that we've fetched the task.
2323         (AnalysisTaskPage.prototype.render): Hide the group view (the table of A/B testing results) entirely
2324         when there are no groups to show. Also hide the forms to start A/B testing when there are no matching
2325         triggerable, which is the main feature of this patch.
2326         * server-tests/api-manifest.js: Added a test for including a list of triggerables in the manifest JSON.
2327         * server-tests/resources/mock-data.js:
2328         (MockData.resetV3Models): Reset Triggerable's static map.
2329         * server-tests/tools-buildbot-triggerable-tests.js: Assert that Triggerable objects are  constructed
2330         with appropriate list of repositories and (test, platform) associations.
2331         * tools/js/database.js:
2332         (tableToPrefixMap): Added triggerable_repositories's prefix.
2333         * tools/js/remote.js:
2334         (RemoteAPI.prototype.getJSON): Log the entire response to stderr when JSON.parse fails to aid debugging.
2335         * tools/js/v3-models.js: Import triggerable.js.
2336
2337 2017-01-11  Ryosuke Niwa  <rniwa@webkit.org>
2338
2339         fetch-from-remote doesn’t work with some websites
2340         https://bugs.webkit.org/show_bug.cgi?id=166963
2341
2342         Reviewed by Yusuke Suzuki.
2343
2344         Apparently file_get_contents is not compatible with some SSL/TLS connections.
2345         Use curl_* functions to access remote servers instead.
2346
2347         * public/admin/fetch-from-remote.php:
2348         (fetch_remote):
2349
2350 2017-01-10  Ryosuke Niwa  <rniwa@webkit.org>
2351
2352         Another build fix. Always use UTC when expressing commit times in UNIX-epoch timestamps.
2353
2354         * public/api/measurement-set.php:
2355
2356 2017-01-10  Ryosuke Niwa  <rniwa@webkit.org>
2357
2358         Fix a typo in the previous commit.
2359
2360         * public/api/measurement-set.php:
2361
2362 2017-01-10  Ryosuke Niwa  <rniwa@webkit.org>
2363
2364         Build fixes for older versions of Postgres.
2365
2366         Also redirect / and /# to /v3/ as intended in r200820.
2367
2368         * public/api/measurement-set.php:
2369         * public/api/runs.php:
2370         * public/index.html:
2371
2372 2016-10-18  Dewei Zhu  <dewei_zhu@apple.com>
2373
2374         Update test cases for change r206465.
2375         https://bugs.webkit.org/show_bug.cgi?id=163618
2376
2377         Reviewed by Ryosuke Niwa.
2378
2379         Update test case for change r206465 which added support for multiple summary pages.
2380         Use deepStrictEqual instead of deepEqual as deepEqual will not complain in the case like 'deepEqual([],{})'.
2381         Fix a test failure in tools-buildbot-triggerable-tests.js.
2382         Fix a bug in generating manifest.
2383
2384         * config.json:
2385         * public/include/manifest.php:
2386         * server-tests/api-manifest.js:
2387         (TestServer.remoteAPI.getJSON.string_appeared_here.then):
2388         * server-tests/tools-buildbot-triggerable-tests.js:
2389         (then):
2390
2391 2016-09-27  Dewei Zhu  <dewei_zhu@apple.com>
2392
2393         Extend perf dashboard to support multiple summary pages.
2394         https://bugs.webkit.org/show_bug.cgi?id=162594
2395
2396         Reviewed by Ryosuke Niwa.
2397
2398         Start support multiple summary pages instead of one.
2399         Specify 'summaryPages' as key that map to a list of summaries which follows
2400         current 'summary' format in 'config.json' but with 2 more properties:
2401            'name': specifying the name shows on perf dashboard,
2402            'route': specifying the path to this page.
2403
2404         * public/include/manifest.php:
2405         * public/v3/main.js:
2406         (main):
2407         (main.): Deleted.
2408         * public/v3/models/manifest.js:
2409         (Manifest._didFetchManifest):
2410         (Manifest):
2411         * public/v3/pages/summary-page.js:
2412         (SummaryPage):
2413         (SummaryPage.prototype.routeName):
2414
2415 2016-08-09  Ryosuke Niwa  <rniwa@webkit.org>
2416
2417         Don't filter out the latest data point in chart data sampling
2418         https://bugs.webkit.org/show_bug.cgi?id=160714
2419
2420         Reviewed by Chris Dumez.
2421
2422         Exclude the last data point from sampling so that it's always included in the "sampled" charts data.
2423         Without this, the last data point can change as we zoom out the time domain.
2424
2425         Luckily, we already had a mechanism to exclude the user selected point from sampling. Extend this
2426         feature by supporting an array of point IDs instead of a single ID to exclude from filering.
2427
2428         * public/v3/components/interactive-time-series-chart.js:
2429         (InteractiveTimeSeriesChart.prototype._sampleTimeSeries): Replaced exclusionPointID by excludedPoints. 
2430
2431         * public/v3/components/time-series-chart.js:
2432         (TimeSeriesChart.prototype._ensureSampledTimeSeries): Put the last data point in excludedPoints.
2433         (TimeSeriesChart.prototype._sampleTimeSeries): Check point's id against the list of IDs.
2434
2435 2016-08-09  Ryosuke Niwa  <rniwa@webkit.org>
2436
2437         Build fix after r204187. interval has to be a getter, not a method.
2438
2439         * public/v3/components/time-series-chart.js:
2440         (TimeSeriesChart.prototype._renderTimeSeries):
2441         * public/v3/models/measurement-adaptor.js:
2442         (MeasurementAdaptor.prototype.applyTo):
2443
2444 2016-08-09  Ryosuke Niwa  <rniwa@webkit.org>
2445
2446         Fix a typo that was supposed to be fixed in r204296 before landing.
2447
2448         * public/v3/pages/chart-pane.js:
2449         (ChartPane):
2450         (ChartPane.prototype.updateFromSerializedState):
2451         (ChartPane.prototype._analyzeRange):
2452         (ChartPane.prototype._renderTrendLinePopover):
2453         (ChartPane.prototype._trendLineTypeDidChange):
2454
2455 2016-08-08  Ryosuke Niwa  <rniwa@webkit.org>
2456
2457         Always show segmentation on v3 charts page
2458         https://bugs.webkit.org/show_bug.cgi?id=160576
2459
2460         Rubber-stamped by Chris Dumez.
2461
2462         Added "Trend Lines" popover to select and customize a moving average or a segmentation to show on charts page
2463         and made Schwarz criterion segmentation the default trend line for all charts.
2464
2465         Because computing the segmentation is expensive, we use WebWorker to parallelize the computation via AsyncTask.
2466         We also compute and cache the segmentation for each cluster separately to avoid processing the entire measurement
2467         set as that could take 10-20s total, which was a huge problem in v2 UI. v3 UI's approach is more incremental and
2468         even opens up an opportunity to cache the results in the server side.
2469
2470         Also brought back "shading" for the confidence interval drawing as done in v1 and v2 UI.
2471
2472         * public/shared/statistics.js:
2473         (Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion): Added segmentCountWeight and gridSize as arguments
2474         to customize the algorithm.
2475         (Statistics.splitIntoSegmentsUntilGoodEnough): Takes segmentCountWeight as BirgeAndMassartC.
2476
2477         * public/v3/async-task.js: Added.
2478         (AsyncTask): Added. This class represents a task such as computing segmentation to be executed in a worker.
2479         (AsyncTask.prototype.execute): Added. Returns a promise that gets resolved when the specified task completes.
2480         (AsyncTaskWorker.waitForAvailableWorker): Added. Calls the given callback with the first available worker. When
2481         all workers are processing some tasks, it waits until one becomes available by putting the callback into a queue.
2482         _didRecieveMessage pops an item out of this queue when a worker completes a task. We don't use a promise here
2483         because calling this function multiple times synchronously could result in all the returned promises getting
2484         resolved with the same worker as none of the callers get to lock away the first available worker until the end
2485         of the current micro-task.
2486         (AsyncTaskWorker._makeWorkerEventuallyAvailable): Added. A helper function for waitForAvailableWorker. Start
2487         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
2488         8 cores on the machine). Avoid starting a new worker if we've started a new worker within the last 50 ms since
2489         starting a new worker takes some time.
2490         (AsyncTaskWorker._findAvailableWorker): Added. Finds a worker that's available right now if there is any.
2491         (AsyncTaskWorker): Added. An instance of AsyncTaskWorker represents a Web worker.
2492         (AsyncTaskWorker.prototype.id): Added.
2493         (AsyncTaskWorker.prototype.sendTask): Added. Sends a task represented by AsyncTask to the worker.
2494         (AsyncTaskWorker.prototype._didRecieveMessage): Added. This function gets called when the current task completes
2495         in the worker. Pop the next callback if some caller of waitForAvailableWorker is still waiting. Otherwise stop
2496         the worker after one second of waiting to avoid worker churning.
2497         (AsyncTaskWorker.workerDidRecieveMessage): Added. Called by onmessage on the worker. Executes the specified task
2498         and sends back a message upon completion with the appropriate timing data.
2499
2500         * public/v3/components/chart-pane-base.js:
2501         (ChartPaneBase.prototype.configure): Uses _createSourceList.
2502         (ChartPaneBase.prototype._createSourceList): Added. Extracted from configure to customize the source list for
2503         the main chart and the overview chart.
2504         (ChartPaneBase.prototype._updateSourceList): Uses _createSourceList.
2505
2506         * public/v3/components/chart-styles.js:
2507         (ChartStyles.createSourceList): Added a boolean showPoint as an extra argument. This specifies whether circles
2508         are drawn for each data point.
2509         (ChartStyles.baselineStyle): Added styles for foreground lines and background lines. They're used for trend lines
2510         and underlying raw data respectively when trend lines are shown.
2511         (ChartStyles.targetStyle): Ditto.
2512         (ChartStyles.currentStyle): Ditto.
2513
2514         * public/v3/components/time-series-chart.js:
2515         (TimeSeriesChart): Added _trendLines, _renderedTrendLines, and _fetchedTimeSeries as instance variables.
2516         (TimeSeriesChart.prototype.setSourceList): Clear _fetchedTimeSeries before calling setSourceList for consistency.
2517         (TimeSeriesChart.prototype.sourceList): Added.
2518         (TimeSeriesChart.prototype.clearTrendLines): Added.
2519         (TimeSeriesChart.prototype.setTrendLine): Added. Preserves the existing trend lines for other sources. This is
2520         necessary because segmentation for "current" and "baseline" lines may become available at different times, and we
2521         don't want to clear one or the other when setting one.
2522         (TimeSeriesChart.prototype._layout): Added a call to _ensureTrendLines.
2523         (TimeSeriesChart.prototype._renderChartContent): Call _renderTimeSeries for trend lines. Trend lines are always
2524         foreground lines and "regular" raw data points are drawn as background if there are trend lines.
2525         (TimeSeriesChart.prototype._renderTimeSeries): Added layerName as an argument. It could be an empty string,
2526         "foreground", or "background". Draw a "shade" just like v1 and v2 UI instead of vertical lines for the confidence
2527         intervals. Pick "foreground", "background", or "regular" chart style based on layerName. Also avoid drawing data
2528         points when *PointRadius is set to zero to reduce the runtime of this function.
2529         (TimeSeriesChart.prototype._sourceOptionWithFallback): Added.
2530         (TimeSeriesChart.prototype._ensureSampledTimeSeries): When *PointRadius is 0, show as many points as there are x
2531         coordinates as a fallback instead of showing every point.
2532         (TimeSeriesChart.prototype._ensureTrendLines): Added. Returns true if the chart contents haven't been re-rendered
2533         since the last update to trend lines. This flag is unset by setTrendLine.
2534
2535         * public/v3/index.html:
2536
2537         * public/v3/models/measurement-cluster.js:
2538         (MeasurementCluster.prototype.addToSeries): Store the data points' index to idMap to help aid MeasurementSet's
2539         _cachedClusterSegmentation efficiently re-create the segmentation from the cache.
2540
2541         * public/v3/models/measurement-set.js:
2542         (MeasurementSet): Added _segmentationCache as an instance variable.
2543         (MeasurementSet.prototype.fetchSegmentation): Added. Calls _cachedClusterSegmentation on each cluster, and
2544         constructs the time series representation of the segmentation from the results.
2545         (MeasurementSet.prototype._cachedClusterSegmentation): Computes and caches the segmentation for each cluster.
2546         The cache of segmentation stores ID of each measurement set at which segment changes instead of its index since
2547         the latter could change in any moment when a new test result is reported, or an existing test result is removed
2548         from the time series; e.g. when it's marked as an outlier.
2549         (MeasurementSet.prototype._validateSegmentationCache): Added. Checks whether the cached segmentation's name and
2550         its parameters match that of the requested one.
2551         (MeasurementSet.prototype._invokeSegmentationAlgorithm): Added. Invokes the segmentation algorithm either in the
2552         main thread or in a Web worker via AsyncTask API based on the size of the time series. While parallelizing the
2553         work is beneficial when the data set is large, the overhead can add up if we keep processing a very small data
2554         set in a worker.
2555
2556         * public/v3/models/time-series.js: Made the file compatible with Node.
2557         (TimeSeries.prototype.length): Added.
2558         (TimeSeries.prototype.valuesBetweenRange): Added.
2559
2560         * public/v3/pages/chart-pane.js:
2561         (createTrendLineExecutableFromAveragingFunction): Added.
2562         (ChartTrendLineTypes): Added. Similar to StatisticsStrategies (statistics-strategies.js) in v2 UI.
2563         (ChartPane): Added _trendLineType, _trendLineParameters, _trendLineVersion, and _renderedTrendLineOptions as
2564         instance variables.
2565         (ChartPane.prototype.serializeState): Serialize the trend line option. This format is compatible with v2 UI.
2566         (ChartPane.prototype.updateFromSerializedState): Ditto. Parsing is compatible with v2 UI except that we now have
2567         the default trend line set when the specified ID doesn't match an existing type ID.
2568         (ChartPane.prototype._renderActionToolbar): Added a call to _renderTrendLinePopover. This is the popover that
2569         specifies the type of a trend line to show as well as its parameters.
2570         (ChartPane.prototype._renderTrendLinePopover): Added. A popover for specifying and customizing a trend line.
2571         (ChartPane.prototype._trendLineTypeDidChange): Added. Called when a new trend line is selected.
2572         (ChartPane.prototype._defaultParametersForTrendLine): Added.
2573         (ChartPane.prototype._trendLineParameterDidChange): Added. Called when the trend lines' parameters are changed.
2574         (ChartPane.prototype._didFetchData): Added. Overrides the one in ChartPaneBase to trigger a trend line update.
2575         (ChartPane.prototype._updateTrendLine): Added. Update the trend line. Since segmentation can take an arbitrary
2576         long time, avoid updating trend lines if this function had been called again (possibly for a different trend line
2577         type or with different parameters) before the results become available; hence the versioning.
2578         (ChartPane.paneHeaderTemplate): Added the trend line popover.
2579         (ChartPane.cssTemplate): Added styles for the trend line popover. Also use a more opaque background color behind
2580         popovers when the -webkit-backdrop-filter property is not supported.
2581
2582         * public/v3/pages/dashboard-page.js:
2583         (DashboardPage.prototype._createChartForCell): Call createSourceList with showPoints set to true to preserve the
2584         existing behavior.
2585
2586         * tools/js/v3-models.js: Include TimeSeries object.
2587
2588         * unit-tests/measurement-set-tests.js: Added two test cases for MeasurementSet's fetchSegmentation.
2589
2590         * unit-tests/resources/almost-equal.js: Added.
2591         (almostEqual): Extracted out of statistics-tests.js.
2592
2593         * unit-tests/statistics-tests.js:
2594
2595 2016-08-05  Ryosuke Niwa  <rniwa@webkit.org>
2596
2597         segmentTimeSeriesByMaximizingSchwarzCriterion returns a bogus result on empty charts
2598         https://bugs.webkit.org/show_bug.cgi?id=160575
2599
2600         Rubber-stamped by Chris Dumez.
2601
2602         The bug was caused by an early return in segmentTimeSeriesByMaximizingSchwarzCriterion.
2603         Removed this early return as the one in splitIntoSegmentsUntilGoodEnough was sufficient.
2604
2605         Also factored out a few functions in findOptimalSegmentation so that they can be better
2606         optimized in JSC's DFG and FTL tiers, and removed unused debuggingTestingRangeNomination.
2607
2608         * public/shared/statistics.js:
2609         (Statistics.segmentTimeSeriesByMaximizingSchwarzCriterion): Removed an early return.
2610         (Statistics.splitIntoSegmentsUntilGoodEnough):
2611         (.allocateCostUpperTriangularForSegmentation): Extracted from findOptimalSegmentation.
2612         (.allocatePreviousNodeForSegmentation): Ditto.
2613         (.findOptimalSegmentationInternal): Ditto.
2614         (.findOptimalSegmentation):
2615
2616         * unit-tests/statistics-tests.js: Added a test case.
2617
2618 2016-08-05  Ryosuke Niwa  <rniwa@webkit.org>
2619
2620         Perf dashboard sometimes tries to fetch a non-existent measurement-set JSON
2621         https://bugs.webkit.org/show_bug.cgi?id=160577
2622
2623         Rubber-stamped by Chris Dumez.
2624
2625         The bug was caused by findClusters computing the first cluster's endTime incorrectly. Namely, we were
2626         multiplying the number of clusters by clusterStart instead of clusterSize with an off-by-one error.
2627
2628         * public/v3/models/measurement-set.js:
2629         (MeasurementSet.prototype.findClusters): Folded computeClusterStart into where clusterEnd is computed
2630         for clarity. Also fixed a bug that we were not computing the first cluster to fetch correctly when
2631         the fetched time range started before clusterStart (i.e. when startTime - clusterStart is negative).
2632         Finally, fixed the main bug by multiplying the number of clusters by clusterSize instead of
2633         clusterStart to compute the end time of the very first cluster in this measurement set. Because what
2634         we're computing here is the end time of the first cluster, not the start time, we also need to subtract
2635         one from the number of clusters. e.g. if there was exactly one cluster, then firstClusterEndTime is
2636         identically equal to lastClusterEndTime.
2637         (MeasurementSet.prototype.fetchedTimeSeries): Removed the unused argument to TimeSeries's constructor.
2638
2639         * unit-tests/analysis-task-tests.js: Fixed the tests for the latest version of Mocha which complains if
2640         we returned a promise in unit tests when "done" function is used.
2641         * unit-tests/checkconfig.js: Ditto.
2642         * unit-tests/measurement-set-tests.js: Added a test case for findClusters and a test to make sure
2643         fetchBetween doesn't try to fetch a cluster before the first cluster in the set. Also fixed other test
2644         cases which were relying on the bug this patch fixed.
2645
2646 2016-08-04  Ryosuke Niwa  <rniwa@webkit.org>
2647
2648         MeasurementCluster's addToSeries is slow
2649         https://bugs.webkit.org/show_bug.cgi?id=160581
2650
2651         Rubber-stamped by Chris Dumez.
2652
2653         The bulk of time was spent in MeasurementAdaptor.prototype.applyTo where we computed the interval.
2654
2655         Since some of data points are filtered out by TimeSeriesChart component before intervals are used,
2656         we can significantly reduce the CPU time by lazily compute them. This patch reduces the runtime of
2657         applyTo from ~60ms to ~30ms on my machine.
2658
2659         * public/v3/models/measurement-adaptor.js:
2660         (MeasurementAdaptor.prototype.applyTo): Lazily compute and cache the interval. Also cache the build
2661         object instead of always creating a new object.
2662         * public/v3/models/measurement-cluster.js:
2663         (MeasurementCluster.prototype.addToSeries): Call applyTo first before checking whether the point is
2664         an outlier or its id to avoid extracting those values twice since they show up in the profiler. Also
2665         use "of" instead "forEach" since "of" seems to be faster here.
2666
2667 2016-08-04  Ryosuke Niwa  <rniwa@webkit.org>
2668
2669         Syncing script's configuration duplicates a lot of boilerplate
2670         https://bugs.webkit.org/show_bug.cgi?id=160574
2671
2672         Rubber-stamped by Chris Dumez.
2673
2674         This patch makes each configuration accept an array of platforms and types so that we can write:
2675
2676         {"type": "speedometer", "builder": "mba", "platform": "Trunk El Capitan MacBookAir"},
2677         {"type": "speedometer", "builder": "mbp", "platform": "Trunk El Capitan MacBookPro"},
2678         {"type": "speedometer", "builder": "mba", "platform": "Trunk Sierra MacBookAir"},
2679         {"type": "speedometer", "builder": "mbp", "platform": "Trunk Sierra MacBookPro"},
2680         {"type": "jetstream", "builder": "mba", "platform": "Trunk El Capitan MacBookAir"},
2681         {"type": "jetstream", "builder": "mbp", "platform": "Trunk El Capitan MacBookPro"},
2682         {"type": "jetstream", "builder": "mba", "platform": "Trunk Sierra MacBookAir"},
2683         {"type": "jetstream", "builder": "mbp", "platform": "Trunk Sierra MacBookPro"},
2684
2685         more concisely as:
2686
2687         {"builder": "mba", "types": ["speedometer", "jetstream"],
2688             "platforms": ["Trunk El Capitan MacBookAir", "Trunk Sierra MacBookAir"]},
2689         {"builder": "mbp", "types": ["speedometer", "jetstream"],
2690             "platforms": ["Trunk El Capitan MacBookPro", "Trunk Sierra MacBookPro"]},
2691
2692         * tools/js/buildbot-syncer.js:
2693         (BuildbotSyncer._loadConfig):
2694         (BuildbotSyncer._expandTypesAndPlatforms): Added. Clones a new configuration entry for each type
2695         and platform.
2696         (BuildbotSyncer._createTestConfiguration): Extracted from _loadConfig.
2697         (BuildbotSyncer._validateAndMergeConfig): Added a new argument that specifies a property that
2698         shouldn't be merged into the configuration. Also added the support for 'types' and 'platforms',
2699         and merged the code for verify an array of strings. Finally, allow the appearance of 'properties'
2700         since this function can now be called on a cloned configuration in which 'arguments' had already
2701         been renamed to 'properties'.
2702
2703         * unit-tests/buildbot-syncer-tests.js: Added a test case to parse a consolidated configuration.
2704         (sampleiOSConfigWithExpansions): Added.
2705
2706         * unit-tests/resources/mock-v3-models.js:
2707         (MockModels.inject): Added a few more mock models for the newly added test.
2708
2709 2016-07-26  Ryosuke Niwa  <rniwa@webkit.org>
2710
2711         REGRESSION: Tooltip for analysis tasks doesn't show up on charts
2712         https://bugs.webkit.org/show_bug.cgi?id=160221
2713
2714         Rubber-stamped by Chris Dumez.
2715
2716         The bug was caused by ChartPaneBase resetting annotation bars every time the current point has moved.
2717         Avoid doing this in ChartPaneBase's _renderAnnotations().
2718
2719         * public/v3/components/chart-pane-base.js:
2720         (ChartPaneBase):
2721         (ChartPaneBase.prototype.fetchAnalysisTasks):
2722         (ChartPaneBase.prototype._renderAnnotations):
2723
2724 2016-07-26  Ryosuke Niwa  <rniwa@webkit.org>
2725
2726         REGRESSION: The arrow indicating the current page doesn't get updated
2727         https://bugs.webkit.org/show_bug.cgi?id=160185
2728
2729         Reviewed by Chris Dumez.
2730
2731         The bug was caused by Heading's render() function not updating the DOM more than once. I don't understand
2732         how this has ever worked. Fixed the bug by rendering DOM whenever the current page has changed.
2733
2734         * public/v3/pages/heading.js:
2735         (Heading):
2736         (Heading.prototype.render):
2737
2738 2016-07-25  Ryosuke Niwa  <rniwa@webkit.org>
2739
2740         Build fix for Safari 9.
2741
2742         * public/v3/models/build-request.js:
2743         (BuildRequest.prototype.waitingTime): Don't use "const" in strict mode.
2744
2745 2016-07-23  Ryosuke Niwa  <rniwa@webkit.org>
2746
2747         Perf dashboard should show the list of a pending A/B testing jobs
2748         https://bugs.webkit.org/show_bug.cgi?id=160138
2749
2750         Rubber-stamped by Chris Dumez.
2751
2752         Add a page to show the list of A/B testing build requests per triggerable. Ideally, we would like to
2753         see a queue per builder but that would require changes to database tables and syncing scripts.
2754
2755         Because this page is most useful when the analysis task with which each build request is associated,
2756         JSON API at /api/build-requests/ has been modified to return the analysis task ID for each request.
2757
2758         Also streamlined the page that shows the list of analysis tasks per Chris' feedback by consolidating
2759         "Bisecting" and "Identified" into "Investigated" and moving the toolbar from the upper left corner
2760         inside the heading to right beneath the heading above the table. Also made the category page serialize
2761         the filter an user had typed in so that reloading the page doesn't clear it.
2762
2763         * public/api/analysis-tasks.php:
2764         (fetch_associated_data_for_tasks): Removed 'category' from the list of columns returned as the notion
2765         of 'category' is only relevant in UI, and it's better computed in the front-end.
2766         (format_task): Ditto.
2767         (determine_category): Deleted.
2768
2769         * public/api/test-groups.php:
2770         (main):
2771
2772         * public/include/build-requests-fetcher.php:
2773         (BuildRequestsFetcher::fetch_for_task): Include the analysis task ID in the rows.
2774         (BuildRequestsFetcher::fetch_for_group): Ditto. Ditto.
2775         (BuildRequestsFetcher::fetch_incomplete_requests_for_triggerable): Ditto.
2776         (BuildRequestsFetcher::results_internal): Ditto.
2777
2778         * public/v3/index.html:
2779
2780         * public/v3/main.js:
2781         (main): Create a newly introduced BuildRequestQueuePage as a subpage of AnalysisCategoryPage.
2782
2783         * public/v3/components/ratio-bar-graph.js:
2784         (RatioBarGraph.prototype.update): Fixed a bogus assertion here. ratio can be any number. The coercion
2785         into [-1, 1] is done inside RatioBarGraph's render() function.
2786
2787         * public/v3/models/analysis-task.js:
2788         (AnalysisTask.prototype.category): Moved the code to compute the analysis task's category from
2789         determine_category in analysis-tasks.php. Also merged "bisecting" and "identified" into "investigated".
2790         (AnalysisTask.categories): Merged "bisecting" and "identified" into "investigated".
2791
2792         * public/v3/models/build-request.js:
2793         (BuildRequest): Remember the triggerable and the analysis task associated with this request as well as
2794         the time at when this request was created.        
2795         (BuildRequest.prototype.analysisTaskId): Added.
2796         (BuildRequest.prototype.statusLabel): Use a shorter label: "Waiting" for "pending" status.
2797         (BuildRequest.prototype.createdAt): Added.
2798         (BuildRequest.prototype.waitingTime): Added. Returns a human readable time duration since the creation
2799         of this build request such as "2 hours 21 minutes" against a reference time.
2800         (BuildRequest.fetchTriggerables): Added.
2801         (BuildRequest.cachedRequestsForTriggerableID): Added. Used when navigating back to 
2802
2803         * public/v3/pages/analysis-category-page.js:
2804         (AnalysisCategoryPage): Construct AnalysisCategoryToolbar and store it in this._categoryToolbar since it
2805         no longer inherits from Toolbar class, which PageWithHeading recognizes and stores.
2806         (AnalysisCategoryPage.prototype.title):
2807         (AnalysisCategoryPage.prototype.serializeState): Added.
2808         (AnalysisCategoryPage.prototype.stateForCategory): Added. Include the filter in the serialization.
2809         (AnalysisCategoryPage.prototype.updateFromSerializedState): Restore the filter from the URL state.
2810         (AnalysisCategoryPage.prototype.filterDidChange): Added. Called by AnalysisCategoryToolbar to update
2811         the URL state in addition to calling render() as done previously via setFilterCallback.
2812         (AnalysisCategoryPage.prototype.render): Always call _categoryToolbar.render() since the hyperlinks for
2813         the category pages now include the filter, which can be updated in each call.
2814         (AnalysisCategoryPage.cssTemplate):
2815
2816         * public/v3/pages/analysis-category-toolbar.js:
2817         (AnalysisCategoryToolbar): Inherits from ComponentBase instead of Toolbar since AnalysisCategoryToolbar
2818         no longer works with Heading class unlike other subclasses of Toolbar class.
2819         (AnalysisCategoryToolbar.prototype.setCategoryPage): Added.
2820         (AnalysisCategoryToolbar.prototype.setFilterCallback): Deleted.
2821         (AnalysisCategoryToolbar.prototype.setFilter): Added. Used to restore from a serialized URL state.
2822         (AnalysisCategoryToolbar.prototype.render): Don't recreate the input element as it clears the value as
2823         well as the selection of the element. Also use AnalysisCategoryPage's stateForCategory to serialize the
2824         category name and the current filter for each hyperlink.
2825         (AnalysisCategoryToolbar.prototype._filterMayHaveChanged): Now takes an boolean argument specifying
2826         whether the URL state should be updated or not. We update the URL only when a change event is fired to
2827         avoid constantly updating it while an user is still typing.
2828         (AnalysisCategoryToolbar.cssTemplate): Added.
2829         (AnalysisCategoryToolbar.htmlTemplate): Added a button to open the newly added queue page.
2830
2831         * public/v3/pages/build-request-queue-page.js:
2832         (BuildRequestQueuePage): Added.
2833         (BuildRequestQueuePage.prototype.routeName): Added.
2834         (BuildRequestQueuePage.prototype.pageTitle): Added.
2835         (BuildRequestQueuePage.prototype.open): Added. Fetch open build requests for every triggerables using
2836         the same API as the syncing scripts.
2837         (BuildRequestQueuePage.prototype.render): Added.
2838         (BuildRequestQueuePage.prototype._constructBuildRequestTable): Added. Construct a table for the list of
2839         pending, scheduled or running build requests in the order syncing scripts would see. Note that the list
2840         of build requests returned by /api/build-requests/* can contain completed, canceled, or failed requests
2841         since the JSON returns all build requests associated with each test group if one of the requests of the
2842         group have not finished. This helps syncing scripts picking the right builder for A/B testing when it
2843         had previously been unloaded or crashed in the middle of processing a test group. This characteristics
2844         of the API actually helps us here because we can reliably compute the total number of build requests in
2845         the group. The first half of this function does this counting as well as collapses all but the first
2846         unfinished build requests into a "contraction" row, which just shows the number of build requests that
2847         are remaining in the group.
2848         (BuildRequestQueuePage.cssTemplate): Added.
2849         (BuildRequestQueuePage.htmlTemplate): Added.
2850
2851         * public/v3/pages/summary-page.js:
2852         (SummaryPage.prototype.open): Use one-day median instead of seven-day median to compute the status.
2853         (SummaryPageConfigurationGroup): Initialize _ratio to NaN. This was causing assertion failures in
2854         RatioBarGraph's update() while measurement sets are being fetched.
2855
2856         * server-tests/api-build-requests-tests.js: Updated the tests per change in BuildRequest's statusLabel.
2857         * unit-tests/analysis-task-tests.js: Ditto.
2858         * unit-tests/test-groups-tests.js: Ditto.
2859         * unit-tests/build-request-tests.js: Added tests for BuildRequest's waitingTime.
2860
2861 2016-07-22  Ryosuke Niwa  <rniwa@webkit.org>
2862
2863         REGRESSION(r203035): Marking points as an outlier no longer updates charts
2864         https://bugs.webkit.org/show_bug.cgi?id=160106
2865
2866         Reviewed by Darin Adler.
2867
2868         The bug was caused by MeasurementSet's fetchBetween clearing previously registered callbacks when noCache
2869         option is specified.
2870
2871         * public/v3/components/time-series-chart.js:
2872         (TimeSeriesChart.prototype.setSourceList): Clear this._fetchedTimeSeries when changing chart options.
2873         e.g. need to start including or excluding outliers.
2874         (TimeSeriesChart.prototype.fetchMeasurementSets): Don't skip the fetching when noCache is true.
2875
2876         * public/v3/models/measurement-set.js:
2877         (MeasurementSet): Added this._callbackMap as an instance variable to keep track of all callbacks on every
2878         cluster since we may need to call each callback multiple times per cluster when noCache option is used.
2879         (MeasurementSet.prototype.fetchBetween): Moved the code to add _primaryClusterPromise to _allFetches here
2880         so that now this function and _ensureClusterPromise are only functions that touch _allFetches.
2881         (MeasurementSet.prototype._ensureClusterPromise): Extracted out of fetchBetween. Queue up all callbacks
2882         for each cluster when creating a new promise.
2883         (MeasurementSet.prototype._fetchPrimaryCluster): Removed the code to add _primaryClusterPromise now that
2884         it's done in fetchBetween.
2885
2886         * public/v3/remote.js:
2887         (RemoteAPI.postJSONWithStatus): Removed superfluous call to console.log.
2888
2889         * unit-tests/measurement-set-tests.js: Updated the test case for noCache. The callback registered before
2890         fetchBetween is called with noCache=true is now invoked so callCount must be 3 instead of 2.
2891
2892 2016-07-19  Ryosuke Niwa  <rniwa@webkit.org>
2893
2894         Perf dashboard always re-generate measurement set JSON
2895         https://bugs.webkit.org/show_bug.cgi?id=159951
2896
2897         Reviewed by Chris Dumez.
2898
2899         The bug was caused by manifest.json reporting the last modified date of a measurement set in floating point,
2900         and a measurement set JSON reporting it as an integer. Fixed the bug by always using an integer.
2901
2902         * public/api/measurement-set.php:
2903         (main): Return 404 when the results is empty.
2904         (MeasurementSetFetcher::execute_query): Use "extract(epoch from commit_time)" like ManifestGenerator to improve
2905         the generation speed. This is ~10% runtime improvement.
2906         (MeasurementSetFetcher::format_map): Updated to reflect the above change.
2907         (MeasurementSetFetcher::parse_revisions_array): Ditto.
2908
2909         * public/include/manifest.php:
2910         (ManifestGenerator::platforms): Fixed the bug by coercing lastModified to integer (instead of float).
2911
2912         * server-tests/api-measurement-set-tests.js: Added a test case for returning empty results, and a test case for
2913         making sure lastModified dates in manifest.json and measurement sets match.
2914
2915         * tools/js/remote.js:
2916         (RemoteAPI.prototype.sendHttpRequest): Reject the promise when HTTP status code is not 200.
2917
2918 2016-07-09  Ryosuke Niwa  <rniwa@webkit.org>
2919
2920         Perf dashboard can consume 50-70% of CPU on MacBook even if user is not interacting at all
2921         https://bugs.webkit.org/show_bug.cgi?id=159597
2922
2923         Reviewed by Chris Dumez.
2924
2925         TimeSeriesChart and InteractiveTimeSeriesChart had been relying on continually polling on requestAnimationFrame
2926         to update itself in response to its canvas resizing. Even though there as an early exit in the case there was
2927         nothing to update, this is still causing a significant power drain when the user is not interacting at all.
2928
2929         Let TimeSeriesChart use the regular top-down render path like other components with exceptions of listening to
2930         window's resize eventas well as when new JSONs are fetched from the server. The render() call to the latter case
2931         will be coerced into a single callback on requestAnimationFrame to avoid DOM-mutation-layout churn.
2932
2933         * public/v3/components/base.js:
2934         (ComponentBase.isElementInViewport): Deleted.
2935         * public/v3/components/chart-pane-base.js:
2936         (ChartPaneBase.prototype.render): Enqueue charts to render.
2937         * public/v3/components/chart-styles.js:
2938         (ChartStyles.dashboardOptions): Removed updateOnRequestAnimationFrame which is no longer an available option.
2939         * public/v3/components/time-series-chart.js:
2940         (TimeSeriesChart): Replaced the code to register itself for rAF by the code to listen to resize events on window.
2941         (TimeSeriesChart._updateOnRAF): Deleted.
2942         (TimeSeriesChart._updateAllCharts): Added.
2943         (TimeSeriesChart.prototype._enqueueToRender): Added.
2944         (TimeSeriesChart._renderEnqueuedCharts): Added.
2945         (TimeSeriesChart.prototype.fetchMeasurementSets): Avoid calling fetchBetween when the range had been fetched.
2946         Without this change, we can incur a significant number of redundant calls to render() when adjusting the domain
2947         in charts page by the slider. When no new JSON is fetched, simply enqueue this chart to render on rAF.
2948         (TimeSeriesChart.prototype._didFetchMeasurementSet): Enqueue this chart to render on rAF.
2949         (TimeSeriesChart.prototype.render): Removed the check for isElementInViewport since we no longer get render() call
2950         when this chart moves into the viewport (as we no longer listen to every rAF or scroll event).
2951         * public/v3/models/measurement-set.js:
2952         (MeasurementSet.prototype.hasFetchedRange): Fixed various bugs revealed by the new use in fetchMeasurementSets.
2953         * public/v3/pages/chart-pane-status-view.js:
2954         (ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Removed the dead code. It was probably
2955         copied from when this code was in InteractiveTimeSeries chart. There is no this._forceRender in this component.
2956         * public/v3/pages/dashboard-page.js:
2957         (DashboardPage.prototype.render): Enqueue charts to render. 
2958         * public/v3/pages/heading.js:
2959         (SummaryPage.prototype.open): Removed the call to isElementInViewport. This wasn't really doing anything useful in
2960         this component.
2961         * unit-tests/measurement-set-tests.js: Added tests for hasFetchedRange.
2962         (.waitForMeasurementSet): Moved to be used in a newly added test case.
2963
2964 2016-07-09  Ryosuke Niwa  <rniwa@webkit.org>
2965
2966         REGRESSION: manifest.json generation takes multiple seconds on perf dashboard
2967         https://bugs.webkit.org/show_bug.cgi?id=159596
2968
2969         Reviewed by Chris Dumez.
2970
2971         The most of CPU time was spent looking for a duplicate entry in an array of metrics by array_search.
2972         This patch moves to postgres by using aggregate functions in the query. Also moved the code to convert
2973         datetime to UNIX epoch timestamp from PHP to within postgres query.
2974
2975         These improvements reduce total runtime of Manifest::generate from ~4s to ~350ms on my machine.
2976
2977         * public/include/manifest.php:
2978         (Manifest::generate): No longer fetches test_configurations table as this is done in Manifest::platforms now.
2979         Also moved calls to each method in the class to separate lines for easier instrumentation.
2980         (Manifest::platforms): Group test configurations (current, baseline, target) by platform and metric.
2981         Use the max of the last modified dates in UNIX epoch timestamps (ms to be compatible with JS's representation).
2982         A given platform, metric pair is considered to be in the v1 dashboard if any test configuration is in.
2983
2984 2016-07-08  Ryosuke Niwa  <rniwa@webkit.org>
2985
2986         bundle-v3-scripts.py should compress HTML/CSS templates
2987         https://bugs.webkit.org/show_bug.cgi?id=159582
2988
2989         Reviewed by Joseph Pecoraro.
2990
2991         Strip leading and trailing whitespaces from HTML and CSS templates. This is a 8% progression on the file size.
2992
2993         * Install.md: Updated the list of MIME types to apply deflate for newer versions of Apache.
2994         * tools/bundle-v3-scripts.py:
2995         (main):
2996         (compress_template): Added.
2997
2998 2016-06-13  Ryosuke Niwa  <rniwa@webkit.org>
2999
3000         Build fix. Strip out "use strict" everywhere so that the perf dashboard works on the shipping Safari.
3001
3002         * tools/bundle-v3-scripts.py:
3003         (main):
3004
3005 2016-06-13  Ryosuke Niwa  <rniwa@webkit.org>
3006
3007         Invalid token error when trying to create an A/B analysis for a range
3008         https://bugs.webkit.org/show_bug.cgi?id=158679
3009
3010         Reviewed by Chris Dumez.
3011
3012         The problem in this particular case was due to another website overriding cookies for our subdomain.
3013         Make PrivilegedAPI robust against its token becoming invalid in general to fix the bug since the cookie
3014         is only available under /privileged-api/ and the v3 UI can't access it for security reasons.
3015
3016         This patch factors out PrivilegedAPI out of remote.js so that it can be tested separately in server tests
3017         as well as unit tests even though RemoteAPI itself is implemented differently in each case.
3018
3019         * init-database.sql: Added a forgotten default value "false" to run_marked_outlier.
3020         * public/v3/index.html:
3021         * public/v3/privileged-api.js: Added. Extracted out of public/v3/remote.js.
3022         (PrivilegedAPI.sendRequest): Fixed the bug. When the initial request fails with "InvalidToken" error,
3023         re-generate the token and re-issue the request.
3024         (PrivilegedAPI.requestCSRFToken):
3025         * public/v3/remote.js:
3026         (RemoteAPI.postJSON): Added to match tools/js/remote.js.
3027         (RemoteAPI.postJSONWithStatus): Ditto.
3028         (PrivilegedAPI): Moved to privileged-api.js.
3029         * server-tests/api-measurement-set-tests.js: Removed the unused require for crypto.
3030         * server-tests/privileged-api-upate-run-status.js: Added tests for /privileged-api/update-run-status.
3031         * server-tests/resources/test-server.js:
3032         (TestServer.prototype.inject): Clear the cookies as well as tokens in PrivilegedAPI.
3033         * tools/js/remote.js:
3034         (RemoteAPI): Added the support for PrivilegedAPI by making cookie set by the server persist.
3035         (RemoteAPI.prototype.clearCookies): Added for tests.
3036         (RemoteAPI.prototype.postJSON): Make sure sendHttpRequest always sends a valid JSON.
3037         (RemoteAPI.prototype.postJSONWithStatus): Added since this API is used PrivilegedAPI.
3038         (RemoteAPI.prototype.sendHttpRequest): Retain the cookie set by the server and send it back in each request.
3039         * tools/js/v3-models.js:
3040         * unit-tests/privileged-api-tests.js: Added unit tests for PrivilegedAPI.
3041         * unit-tests/resources/mock-remote-api.js:
3042         (MockRemoteAPI.postJSON): Added for unit testing.
3043         (MockRemoteAPI.postJSONWithStatus): Ditto.
3044
3045 2016-06-13  Ryosuke Niwa  <rniwa@webkit.org>
3046
3047         /admin/tests is very slow
3048         https://bugs.webkit.org/show_bug.cgi?id=158682
3049
3050         Reviewed by Chris Dumez.
3051
3052         The slowness came from TestNameResolver::__construct, which was fetching the entire table of test_configurations,
3053         which at this point contains more than 32,000 rows. Don't fetch the entire table in the constructor. Instead,
3054         fetch a subset of rows as needed in configurations_for_metric_and_platform. Even though this results in many SQL
3055         queries being issued, that's a lot more efficient in practice because we only fetch a few dozen rows in practice.
3056
3057         Also removed a whole bunch of features from /admin/tests to simplify the page. In particular, the ability to update
3058         the list of triggerables has been removed now that sync-buildbot.js automatically updates that for us. This removed
3059         the last use of test_exists_on_platform, which was also dependent on fetching test_configurations upfront.
3060
3061         * public/admin/tests.php:
3062         * public/include/test-name-resolver.php:
3063         (TestNameResolver::__construct): Don't fetch the entire table of test_configurations.
3064         (TestNameResolver::configurations_for_metric_and_platform): Just issue a SQL query for the specified platform and metric.
3065         (TestNameResolver::test_exists_on_platform): Removed.
3066
3067 2016-06-08  Ryosuke Niwa  <rniwa@webkit.org>
3068
3069         sync-buildbot.js should update the list of tests and platforms associated with a triggerable
3070         https://bugs.webkit.org/show_bug.cgi?id=158406
3071
3072         Reviewed by Chris Dumez.
3073
3074         Add /api/update-triggerable and a test for it, which were supposed to be added in r201718
3075         but for which I forgot to run svn add.
3076
3077         * public/api/update-triggerable.php: Added.
3078         (main):
3079         * server-tests/api-update-triggerable.js: Added.
3080
3081 2016-06-07  Ryosuke Niwa  <rniwa@webkit.org>
3082
3083         Build fix after r201739. attachShadow was throwing an exception on this component.
3084
3085         * public/v3/pages/analysis-category-toolbar.js:
3086         (AnalysisCategoryToolbar):
3087
3088 2016-06-06  Ryosuke Niwa  <rniwa@webkit.org>
3089
3090         sync-buildbot.js should update the list of tests and platforms associated with a triggerable
3091         https://bugs.webkit.org/show_bug.cgi?id=158406
3092         <rdar://problem/26185737>
3093
3094         Reviewed by Darin Adler.
3095
3096         Added /api/update-triggerable to update the list of configurations (platform and test pairs)
3097         associated with a given triggerable, and make sync-buildbot.js use this JSON API before each
3098         syncing cycle so that the association gets updated automatically by simply updating the JSON.
3099
3100         * server-tests/api-manifest.js: Use const for imported modules.
3101         * server-tests/api-report-commits-tests.js: Removed unnecessary importing of crypto.
3102         * server-tests/resources/mock-data.js:
3103         (MockData.someTestId): Added.
3104         (MockData.somePlatformId): Added.
3105         (MockData.addMockData):
3106         * server-tests/tools-buildbot-triggerable-tests.js: Use const for imported modules. Also added
3107         a test for BuildbotTriggerable's updateTriggerable.
3108         * tools/js/buildbot-triggerable.js:
3109         (BuildbotTriggerable.prototype.updateTriggerable): Added. Find the list of all configurations
3110         associated with this triggeerable and post it to /api/update-triggerable.
3111         * tools/js/database.js: Added triggerable_configurations to the list of tables.
3112         * tools/js/remote.js:
3113         (RemoteAPI.prototype.postJSON): Print the whole response when JSON parsing fails for debugging.
3114         * tools/sync-buildbot.js:
3115         (syncLoop): Call BuildbotTriggerable's updateTriggerable before syncing.
3116
3117 2016-06-02  Ryosuke Niwa  <rniwa@webkit.org>
3118
3119         Build fix after r201564.
3120
3121         * public/v3/pages/analysis-category-page.js:
3122         (AnalysisCategoryPage.prototype.updateFromSerializedState):
3123         * public/v3/pages/create-analysis-task-page.js:
3124         (CreateAnalysisTaskPage.prototype.updateFromSerializedState):
3125         (CreateAnalysisTaskPage.prototype.render):
3126
3127 2016-05-31  Ryosuke Niwa  <rniwa@webkit.org>
3128
3129         v3 UI should support marking and unmarking outliers as well as hiding them
3130         https://bugs.webkit.org/show_bug.cgi?id=158248
3131
3132         Rubber-stamped by Chris Dumez.
3133
3134         Added the support for marking and unmarking a sequence of points as outliers. Unlike v2, we now support marking
3135         multiple points as outliers in a single click. Also fixed a bug that outliers are never explicitly hidden in v3 UI.
3136
3137         This patch splits ChartStyles.createChartSourceList into two functions: resolveConfiguration and createSourceList
3138         to separate the work of resolving platform and metric IDs to their respective model objects, and creating a source
3139         list used by TimeSeriesChart to fetch measurement sets. createSourceList is called again when filtering options are
3140         changed.
3141
3142         It also adds noCache option to TimeSeriesChart's fetchMeasurementSets, MeasurementSet's fetchBetween and
3143         _fetchPrimaryCluster to update the measurement sets after marking or unmarking points as outliers. In addition, it
3144         fixes a bug that the annotation bars for analysis tasks are not updated in charts page after creating an analysis
3145         task by adding noCache option to ChartPaneBase's fetchAnalysisTasks, AnalysisTask's fetchByPlatformAndMetric and
3146         _fetchSubset.
3147
3148         Finally, this patch splits ChartPane._makeAnchorToOpenPane into _makePopoverActionItem, _makePopoverOpenOnHover and
3149         _setPopoverVisibility for clarity.
3150
3151         * public/v3/components/chart-pane-base.js:
3152         (ChartPaneBase): Added _disableSampling and _showOutliers as instance variables.
3153         (ChartPaneBase.prototype.configure):
3154         (ChartPaneBase.prototype.isSamplingEnabled): Added.
3155         (ChartPaneBase.prototype.setSamplingEnabled): Added. When a filtering option is updated, recreate the source list
3156         so that TimeSeriesChart.setSourceList can re-fetch the measurement set JSONs.
3157         (ChartPaneBase.prototype.isShowingOutliers): Added.
3158         (ChartPaneBase.prototype.setShowOutliers): Added. Ditto for calling _updateSourceList.
3159         (ChartPaneBase.prototype._updateSourceList): Added.
3160         (ChartPaneBase.prototype.fetchAnalysisTasks): Renamed from _fetchAnalysisTasks. Now takes noCache as an argument
3161         instead of platform and metric IDs since they're on instance variables.
3162
3163         * public/v3/components/chart-styles.js:
3164         (ChartStyles.resolveConfiguration): Renamed from createChartSourceList. Just resolves platform and metric IDs.
3165         (ChartStyles.createSourceList): Extracted from createChartSourceList since it needs to be called when a filtering
3166         option is changed as well as when ChartPaneBase.prototype.configure is called.
3167         (ChartStyles.baselineStyle): Now takes filtering options.
3168         (ChartStyles.targetStyle): Ditto.
3169         (ChartStyles.currentStyle): Ditto.
3170
3171         * public/v3/components/interactive-time-series-chart.js: