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