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