ef6028a4260cea93ba22552fda4ef42c2e8744c0
[WebKit.git] / Websites / perf.webkit.org / ChangeLog
1 2017-09-19  Dewei Zhu  <dewei_zhu@apple.com>
2
3         Use 'owned commit' instead of 'sub commit' whenever refers to a commit owned by another commit.
4         https://bugs.webkit.org/show_bug.cgi?id=177178
5
6         Reviewed by Ryosuke Niwa.
7
8         We use both 'owned commit' and 'sub commit' to refer to a commit owned by an another commit. We should use one term instead of two.
9         Renaming 'subCommit' to 'ownedCommit', 'ownsSubCommit' to 'ownsCommit' and 'sub-commit' to 'owned-commit'.
10
11         * browser-tests/commit-log-viewer-tests.js:
12         * public/api/commits.php:
13         * public/api/report-commits.php:
14         * public/include/commit-log-fetcher.php:
15         * public/v3/components/commit-log-viewer.js:
16         (CommitLogViewer.prototype._renderCommitList):
17         * public/v3/components/owned-commit-viewer.js: Renamed from Websites/perf.webkit.org/public/v3/components/sub-commit-viewer.js.
18         (OwnedCommitViewer):
19         (OwnedCommitViewer.prototype.didConstructShadowTree):
20         (OwnedCommitViewer.prototype._toggleVisibility):
21         (OwnedCommitViewer.prototype.render):
22         (OwnedCommitViewer.prototype._renderOwnedCommitTable):
23         (OwnedCommitViewer.htmlTemplate):
24         (OwnedCommitViewer.cssTemplate):
25         * public/v3/index.html:
26         * public/v3/models/commit-log.js:
27         (CommitLog):
28         (CommitLog.prototype.updateSingleton):
29         (CommitLog.prototype.ownsCommits):
30         (CommitLog.prototype.fetchOwnedCommits):
31         (CommitLog.prototype._buildOwnedCommitMap):
32         (CommitLog.diffOwnedCommits):
33         (CommitLog.prototype.ownsSubCommits): Deleted.
34         (CommitLog.prototype.fetchSubCommits): Deleted.
35         (CommitLog.prototype._buildSubCommitMap): Deleted.
36         (CommitLog.diffSubCommits): Deleted.
37         * server-tests/api-commits-tests.js:
38         * server-tests/api-report-commits-tests.js:
39         * server-tests/tools-os-build-fetcher-tests.js:
40         (return.waitForInvocationPromise.then):
41         (string_appeared_here.return.waitForInvocationPromise.then):
42         * tools/js/os-build-fetcher.js:
43         (prototype._fetchAvailableBuilds):
44         (prototype._addOwnedCommitsForBuild):
45         (prototype._addSubCommitsForBuild): Deleted.
46         * unit-tests/commit-log-tests.js:
47         (return.commit.fetchOwnedCommits.then):
48         (return.fetchingPromise.then):
49         (return.commit.fetchSubCommits.then): Deleted.
50
51 2017-09-12  Dewei Zhu  <dewei_zhu@apple.com>
52
53         Performance Dashboard backend should support A/B testing for owned components.
54         https://bugs.webkit.org/show_bug.cgi?id=175978
55
56         Reviewed by Ryosuke Niwa.
57
58         Add backend change for Performance Dashboard to support A/B testing for owned components.
59         Added 'commitset_commit_owner' and 'commitset_requires_build' columns to 'commit_set_items' table.
60         'commitset_commit_owner' referrs to determine a commit with owner.
61         'commitset_requires_build' indicates whether a root build is required.
62         This will be set true whenever commit_set_item specifies a patch file,
63         or commit_set_item is commit with owner commit,
64         or any other commit from same repository and in same build-request group requires build.
65         SQL for updating existing database:
66             'BEGIN;
67                 ALTER TABLE commit_set_items ADD COLUMN commitset_commit_owner integer REFERENCES commits DEFAULT NULL, ADD COLUMN commitset_requires_build boolean DEFAULT FALSE;
68                 UPDATE commit_set_items SET commitset_requires_build = TRUE WHERE commitset_patch_file IS NOT NULL;
69                 UPDATE commit_set_items SET commitset_requires_build = TRUE WHERE commitset_set IN (SELECT requests1.request_commit_set FROM build_requests as requests1 JOIN build_requests as requests2 ON requests1.request_group = requests2.request_group JOIN commit_set_items as item ON item.commitset_set = requests2.request_commit_set  WHERE item.commitset_patch_file IS NOT NULL);
70                 ALTER TABLE commit_set_items ADD CONSTRAINT commitset_item_with_patch_must_requires_build CHECK (commitset_patch_file IS NULL OR commitset_requires_build = TRUE),
71                     ADD CONSTRAINT commitset_item_with_owned_commit_must_requires_build CHECK (commitset_commit_owner IS NULL OR commitset_requires_build = TRUE);
72             END;'
73
74         * init-database.sql: Updated 'commit_set_items' table.
75         * public/admin/triggerables.php: Only top level repository should show on triggerables page.
76         * public/include/build-requests-fetcher.php: Added 'commitOwner' and 'requireBuild' to 'revision_items'. Added 'commitOwner' field to a commit.
77         * public/include/db.php: Should be able to insert boolean value to database without explicted convert to 't' or 'f'.
78         * public/privileged-api/create-test-group.php:
79             Added logic to process 'commitOwner' and 'requireBuild' in 'commit_set_items'.
80             Removed a 'FIXME' that has been addressed before this commit.
81         * public/v3/models/build-request.js:
82         (BuildRequest.constructBuildRequestsFromData): Set 'commitOwner' field for a commit set item.
83         * public/v3/models/commit-set.js:
84         (CommitSet): Added maps for repository to commit owner and whether a repository requires builds.
85         (CommitSet.prototype.updateSingleton):
86         (CommitSet.prototype._updateFromObject):
87         (CommitSet.prototype.ownerRevisionForRepository): Returns owner revision for a given repository in current commit set.
88         (CommitSet.prototype.requiresBuildForRepository): Returns whether a repository need to build.
89         (CommitSet.prototype.equals): Equality check should include 2 new maps.
90         (CustomCommitSet): CustomCommitSet should be able to store commit with an owner commit.
91         (CustomCommitSet.prototype.setRevisionForRepository): Added each revision list entry should have 'ownerRevision'(null by default).
92         (CustomCommitSet.prototype.equals): Equality check should also check the equality of 'ownerRevision'.
93         (CustomCommitSet.prototype.ownerRevisionForRepository): Returns a owner revision for a given repository.
94         * public/v3/models/repository.js:
95         (Repository.prototype.findOwnedRepositoryByName): Return an repository owned by current repository with a given name.
96         * public/v3/models/test-group.js: Added 'ownerRevision' field in each entry of revisionSet.
97         * server-tests/api-build-requests-tests.js: Added tests.
98         * server-tests/privileged-api-create-test-group-tests.js: Added tests.
99         * server-tests/privileged-api-upload-file-tests.js: Fix unit tests by setting'requires_build' field to be true when updating commit_set_item which has a patch..
100         * server-tests/resources/mock-data.js: Added mock build requests with commit sets contain owned commits.
101         (MockData.jscRepositoryId): Returns id for JavaScriptsCore repository.
102         (MockData.addMockConfiguration): Added mock JavaScriptCore and owned JavaScriptCore repositories and commits associated with them.
103         (MockData.ownedJSCRepositoryId): Added a JavaScriptCore repository with WebKit as owner.
104         (MockData.addMockConfiguration): Added mock data for test cases those require a commit with a owner commit.
105         (MockData.addTestGroupWithOwnedCommits): Added mock data for analysis tasks, the build requires of which contains owned commits.
106         (MockData.set addAnotherTriggerable): Added another triggerable which has mac, webkit and javascript core repositories as triggerable repository group.
107         (MockData.set addAnotherMockTestGroup): Added another mock test group.
108         * tools/js/v3-models.js: Import CustomCommitSet.
109         * unit-tests/resources/mock-v3-models.js: Added an owned webkit repository.
110         * unit-tests/commit-set-tests.js: Added unit tests CustomCommitSet.
111
112 2017-09-15  Dewei Zhu  <dewei_zhu@apple.com>
113
114         Should not mark a platform as missing in summary page if all expecting metrics are exlucded.
115         https://bugs.webkit.org/show_bug.cgi?id=176970
116
117         Reviewed by Ryosuke Niwa.
118
119         In summary page, if all metrics for a test are excluded in excludedConfigurations for a platform, this platform should not be marked as missing.
120
121         * public/v3/pages/summary-page.js:
122         (SummaryPageConfigurationGroup):
123
124 2017-09-11  Ryosuke Niwa  <rniwa@webkit.org>
125
126         Analysis task page shows an empty results for an irrelevant top-level test
127         https://bugs.webkit.org/show_bug.cgi?id=175252
128
129         Reviewed by Antti Koivisto.
130
131         The bug was caused by TestGroupResultsViewer always listing every top-level test which has a result for the
132         entire analysis task. Since a custom analysis task (perf try bots) allows multiple tests to be tested in each
133         group, we have to only list the tests which contains results in a particular test group.
134
135         * public/v3/components/test-group-results-viewer.js:
136         (TestGroupResultsViewer.prototype.render): Find the tests that have results for the current test group instead
137         of for any test group in this analysis task.
138         any test 
139         * public/v3/models/analysis-results.js:
140         (AnalysisResults):
141         (AnalysisResults.prototype.topLevelTestsForTestGroup): Renamed from highestTests. Now takes a test group
142         as an argument.
143         (AnalysisResults.prototype._computedTopLevelTests): Renamed from _computeHighestTests. Filters the results
144         with the specified test group.
145
146 2017-09-06  Aakash Jain  <aakash_jain@apple.com>
147
148         Add initSyncers method in BuildbotTriggerable
149         https://bugs.webkit.org/show_bug.cgi?id=176125
150
151         Reviewed by Ryosuke Niwa.
152
153         * tools/sync-buildbot.js:
154         (syncLoop): Use initSyncers() which returns a promise. Modified to handle the promise.
155         * tools/js/buildbot-triggerable.js:
156         (BuildbotTriggerable): Invokes initSyncers() appropriately.
157         (BuildbotTriggerable.prototype.initSyncers): Returns a promise which initialize all the syncers.
158         * server-tests/tools-buildbot-triggerable-tests.js: Updated tests to handle initSyncers().
159         * server-tests/tools-sync-buildbot-integration-tests.js: Ditto.
160
161 2017-09-05  Ryosuke Niwa  <rniwa@webkit.org>
162
163         Add a button to show two weeks of data to perf dashboard
164         https://bugs.webkit.org/show_bug.cgi?id=176438
165
166         Reviewed by Saam Barati.
167
168         Add "2W" button to show 14 days of data on dashboard pages.
169
170         * public/v3/pages/dashboard-toolbar.js:
171         (DashboardToolbar):
172
173 2017-08-29  Ryosuke Niwa  <rniwa@webkit.org>
174
175         Build fix. OS X "revision" can have a space.
176
177         * public/include/commit-log-fetcher.php:
178
179 2017-08-29  Ryosuke Niwa  <rniwa@webkit.org>
180
181         Make it possible to specify A/B testing revision with a partial hash
182         https://bugs.webkit.org/show_bug.cgi?id=176047
183
184         Rubber-stamped by Chris Dumez.
185
186         Added the support for specifying a partial hash in A/B testing instead of the full hash.
187
188         * public/include/commit-log-fetcher.php:
189         (CommitLogFetcher::find_commit_id_by_revision): Extracted from associate-commit.php.
190         * public/privileged-api/associate-commit.php:
191         (main): 
192         * public/privileged-api/create-test-group.php:
193         (main): Use find_commit_id_by_revision here to support scheduling an A/B testing with a partial hash.
194         * server-tests/privileged-api-create-test-group-tests.js:
195         (createAnalysisTask): Make it possible to customize revision string in some test cases.
196         * server-tests/resources/test-server.js:
197         (TestServer.prototype._stopApache): Fixed the bug that cleanup step always fails whenever the test file
198         runs more than 8s.
199
200 2017-08-26  Ryosuke Niwa  <rniwa@webkit.org>
201
202         Build fix. Creating trying a test group no longer updates the page.
203
204         * public/v3/models/test-group.js:
205         (TestGroup.createWithCustomConfiguration): Added the missing ignoreCache=true.
206
207 2017-08-21  Dewei Zhu  <dewei_zhu@apple.com>
208
209         Performance Dashboard should be compatible with PHP 7.
210         https://bugs.webkit.org/show_bug.cgi?id=175813
211
212         Reviewed by Ryosuke Niwa.
213
214         Use `file_get_contents('php://input')` instead of '$HTTP_RAW_POST_DATA'.
215         Update test harness script to load right php module in httpd.
216
217         * ReadMe.md: JSON example format fix.
218         * public/api/report-commits.php: Stop using '$HTTP_RAW_POST_DATA'.
219         * public/api/report.php: Stop using '$HTTP_RAW_POST_DATA'.
220         * public/api/update-triggerable.php: Stop using '$HTTP_RAW_POST_DATA'.
221         * public/include/json-header.php: Stop using '$HTTP_RAW_POST_DATA'.
222         * public/include/report-processor.php: Stop using '$HTTP_RAW_POST_DATA'.
223         * server-tests/resources/test-server.conf: Load php5 or php7 module conditionally.
224         * server-tests/resources/test-server.js: Pass PHP version info while launching httpd.
225         (TestServer.prototype._startApache):
226         * tools/remote-cache-server.py: Pass PHP version info while launching httpd.
227         (start_httpd):
228         * tools/remote-server-relay.conf: Load php5 or php7 module conditionally.
229         * tools/sync-buildbot.js:
230         (syncLoop.const.makeTriggerable):
231         (syncLoop):
232
233 2017-08-17  Ryosuke Niwa  <rniwa@webkit.org>
234
235         Number each section in ReadMe.md and add more clarifications
236         https://bugs.webkit.org/show_bug.cgi?id=175687
237
238         Rubber-stamped by Joseph Pecoraro.
239
240         Numbered each section and added more clarifications per issues Aakash encountered.
241
242         * ReadMe.md:
243
244 2017-08-17  Ryosuke Niwa  <rniwa@webkit.org>
245
246         Build fix. Make the test work with the latest versions of node modules.
247
248         * server-tests/privileged-api-upload-file-tests.js:
249
250 2017-07-27  Ryosuke Niwa  <rniwa@webkit.org>
251
252         Build fix. Fixed a typo. task.id() isn't a thing in this function.
253
254         * public/v3/models/test-group.js:
255         (TestGroup.createWithCustomConfiguration):
256
257 2017-07-11  Ryosuke Niwa  <rniwa@webkit.org>
258
259         Another build fix.
260
261         * public/v3/components/chart-pane-base.js:
262         (ChartPaneBase.prototype._updateCommitLogViewer):
263
264 2017-07-11  Ryosuke Niwa  <rniwa@webkit.org>
265
266         Build fix. It looks like the code here is racy.
267
268         * public/v3/components/chart-pane-base.js:
269         (ChartPaneBase.prototype.configure):
270         (ChartPaneBase.prototype.setOpenRepository):
271
272 2017-07-11  Ryosuke Niwa  <rniwa@webkit.org>
273
274         Show the roots built by perf try bots on results page
275         https://bugs.webkit.org/show_bug.cgi?id=174305
276
277         Reviewed by Joseph Pecoraro.
278
279         Show build products created by a perf try bots so that we can download them for local testing.
280
281         * public/v3/components/test-group-revision-table.js:
282         (TestGroupRevisionTable.prototype._renderTable): Find the set of repositories for which a patch is applied.
283         Show build products for all commit sets for such a repository since when WebKit is built with a patch in
284         one configuration, the other configuration also needs to be built for consistency.
285         (TestGroupRevisionTable.prototype._buildCommitCell): Added the hyperlink for build products.
286         (TestGroupRevisionTable.prototype._buildFileInfo): Takes a string to override the file's label. Since all
287         build products made by bots tend to have the same filename, we show the label of "Build product" instead.
288         (TestGroupRevisionTable.prototype._mergeCellsWithSameCommitsAcrossRows): Fixed a bug that any entry with
289         a patch wasn't getting merged since it was comparing against the result commit set, which does not contain
290         the patch (only requested commit set contains a patch).
291
292 2017-07-10  Ryosuke Niwa  <rniwa@webkit.org>
293
294         Address Antti's review comment.
295
296         * public/v3/models/analysis-results.js:
297         (AnalysisResults.prototype.containsTest):
298
299 2017-07-10  Ryosuke Niwa  <rniwa@webkit.org>
300
301         A/B testing results page show results for the top-level tests instead of the one being analyzed
302         https://bugs.webkit.org/show_bug.cgi?id=174304
303
304         Reviewed by Antti Koivisto.
305
306         When a specific subtest is analyzed (e.g. Images subtest of MotionMark), then TestGroupResultsViewer
307         should expand and highlight that specific subtest instead of simply showing the top-level test's score.
308         This is especially misleading since AnalysisResultsViewer (stacking bars for each test group) uses
309         the score of the specific subtest being analyzed.
310
311         Fixed the bug by passing in the metric associated with the analysis task from AnalysisTaskPage to
312         TestGroupResultsViewer via AnalysisTaskTestGroupPane. Also made TestGroupResultsViewer.setAnalysisResults
313         auto-expand the tests that are ancestors of the specified metric. Without that, the test won't be shown
314         to the user until the ancestor tests are expanded by the user.
315
316         Also fixed the bug that we were always listing sub-tests regardless of whether they have results or not.
317         Since tests tend to change over time, we shouldn't show a test if it doesn't have any results associated.
318
319         * public/v3/components/test-group-results-viewer.js:
320         (TestGroupResultsViewer.prototype.setAnalysisResults): Expand the ancestor tests of the metric.
321         (TestGroupResultsViewer.prototype._buildRowsForTest): Exit early if this test doesn't have any results.
322         * public/v3/models/analysis-results.js:
323         (AnalysisResults.prototype.containsTest): Added.
324         * public/v3/pages/analysis-task-page.js:
325         (AnalysisTaskTestGroupPane.prototype.setAnalysisResults): Takes a metric to pass it to the results viewer.
326         (AnalysisTaskPage.prototype._assignTestResultsIfPossible):
327
328 2017-07-06  Ryosuke Niwa  <rniwa@webkit.org>
329
330         Safari 10.1 fails to upload a patch on perf try bots page
331         https://bugs.webkit.org/show_bug.cgi?id=174214
332
333         Reviewed by Chris Dumez.
334
335         Added the workaround to make the analysis task page work on Safari 10.1
336
337         * public/v3/components/instant-file-uploader.js:
338         (InstantFileUploader.prototype._uploadFiles): Convert files to an array since for-of doesn't work otherwise on Safari 10.1.
339         * public/v3/models/uploaded-file.js:
340         (UploadedFile._computeSHA256Hash): Fallback to crypto.webkitSubtle since crypto.subtle isn't available on Safari 10.1 or 11.
341
342 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
343
344         Fix a typo pointed out by Andreas Kling.
345
346         * public/v3/components/instant-file-uploader.js:
347         (InstantFileUploader.prototype._uploadFiles):
348         * public/v3/models/uploaded-file.js:
349         (UploadedFile.fetchUploadedFileWithIdenticalHash): Renamed from fetchUnloadedFileWithIdenticalHash.
350
351 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
352
353         Add an admin page to manage uploaded files
354         https://bugs.webkit.org/show_bug.cgi?id=174089
355
356         Reviewed by Andreas Kling.
357
358         Add an admin page to see the disk usage per user as well as the total, and to prune any zombie files (ones marked
359         as deleted but aren't actually deleted in the filesystem).
360
361         * public/admin/files.php: Added.
362         (format_size): Added.
363         * public/include/admin-header.php:
364
365 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
366
367         Roots uploaded by bots don't get author specified properly
368         https://bugs.webkit.org/show_bug.cgi?id=174087
369
370         Reviewed by Andreas Kling.
371
372         When a root file is uploaded from the bot, we manually specify the remote user to upload_file_in_transaction.
373         However, this was getting ignored by create_uploaded_file_from_form_data since it was always calling
374         remote_user_name to get the user name off of $_SERVER.
375
376         Fixed the bug by passing in the user name from upload_file_in_transaction to create_uploaded_file_from_form_data.
377
378         * public/include/uploaded-file-helpers.php:
379         (create_uploaded_file_from_form_data): Take the remote user as an argument instead of calling remote_user_name.
380         (upload_file_in_transaction):
381         * server-tests/api-upload-root-tests.js: Updated an existing test cases to make sure root files' author is set.
382         (createTestGroupWihPatch): Manually override the author of a test group for testing.
383
384 2017-07-03  Ryosuke Niwa  <rniwa@webkit.org>
385
386         Prune unused uploaded files when the file quota is reached
387         https://bugs.webkit.org/show_bug.cgi?id=174086
388
389         Reviewed by Andreas Kling.
390
391         Made /privileged-api/uploaded-file and /api/upload-root automatically delete old uploaded files when
392         uploading a new file results in the file quota to be exceeded. Also added the notion of the total quota
393         to avoid running out of a disk when there are hundreds of users each uploading near their quota.
394
395         * config.json: Added a sample total disk quota of 100GB.
396         * public/include/uploaded-file-helpers.php:
397         (query_file_usage_for_user): Renamed from query_total_file_size.
398         (query_total_file_usage): Added.
399         (upload_file_in_transaction):
400         (delete_file): Added.
401         (prune_old_files): Added.
402         * server-tests/privileged-api-upload-file-tests.js: Added tests for deleting old uploaded files as well as
403         tests for the total quota.
404         * server-tests/resources/test-server.js:
405         (TestServer.prototype.testConfig): Added uploadTotalQuotaInMB to the test configuration.
406
407 2017-06-29  Ryosuke Niwa  <rniwa@webkit.org>
408
409         UploadedFile should include the file extension in its url
410         https://bugs.webkit.org/show_bug.cgi?id=174009
411
412         Reviewed by Chris Dumez.
413
414         Some command line tools such as darwinup use the file extension to determine the file type.
415         Include the file extension in the URL of an uploaded file to make it work with these tools.
416
417         * public/include/uploaded-file-helpers.php:
418         (format_uploaded_file): Include the file extension.
419         * public/v3/models/uploaded-file.js:
420         (UploadedFile):
421         (UploadedFile.prototype.url): Return the URL with hthe file extension specified. /api/uploaded-file
422         already supports having the file extension specified.
423         * server-tests/tools-sync-buildbot-integration-tests.js: Updated test cases.
424         * unit-tests/buildbot-syncer-tests.js: Ditto.
425
426 2017-05-31  Ryosuke Niwa  <rniwa@webkit.org>
427
428         Don't shouldn't create a request to build a patch if there is no patch to build
429         https://bugs.webkit.org/show_bug.cgi?id=172791
430
431         Reviewed by Chris Dumez.
432
433         When a commit set doesn't have a patch specified, don't create a request to build. For example, when we're comparing
434         WebKit in the system to WebKit with a patch, there is nothing to build for the first commit set.
435
436         However, when conducting an A/B testing, it's advisible to compare WebKit built with and without a patch on a single
437         machine with the same version of Xcode, etc... For this reason, we still create a request to build for a commit set
438         if there is another commit set with a patch which uses the same repository group.
439
440         * public/privileged-api/create-test-group.php:
441         (main): Fixed the bug. Only create a build request to build if there is a matching repository group with a patch.
442         * server-tests/privileged-api-create-test-group-tests.js: Added a test case.
443
444 2017-05-31  Ryosuke Niwa  <rniwa@webkit.org>
445
446         Allow sync-buildbot.js to set a buildbot property only when patches are built
447         https://bugs.webkit.org/show_bug.cgi?id=172743
448
449         Rubber-stamped by Chris Dumez.
450
451         Added the ability to specify a buildbot property only when there are build requests to build a patch.
452
453         * tools/js/buildbot-syncer.js:
454         (BuildbotSyncer.prototype.scheduleRequest): Pass in the list of build requests that belong to the same test group.
455         (BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Ditto.
456         (BuildbotSyncer.prototype._propertiesForBuildRequest): Added the support for specifying a conditional property.
457         For the condition type of "built", we check if there was any other 
458         (BuildbotSyncer._parseRepositoryGroup): Added the support for "ifBuilt" conditional.
459
460         * tools/js/buildbot-triggerable.js:
461         (BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Pass in the list of build requests that
462         belong to the same test group.
463         (BuildbotTriggerable.prototype._scheduleRequestWithLog): Ditto.
464
465         * unit-tests/buildbot-syncer-tests.js:  Added test case for newly added "ifBuilt" as well as specifying a patch.
466         Updated the various test cases per the addition of new argument to scheduleRequest, _propertiesForBuildRequest,
467         and scheduleRequestInGroupIfAvailable.
468         (createSampleBuildRequestWithPatch): Added.
469
470         * unit-tests/resources/mock-v3-models.js:
471         (MockModels.inject): Made "ios-svn-webkit" accept a WebKit patch and roots to allow new testing.
472
473 2017-05-30  Ryosuke Niwa  <rniwa@webkit.org>
474
475         sync-builedbot.js fails to schedule the second request to test with a patch
476         https://bugs.webkit.org/show_bug.cgi?id=172701
477
478         Reviewed by Antti Koivisto.
479
480         The bug was caused by an assertion failure in BuildbotTriggerable's _pullBuildbotOnAllSyncers failing to
481         take into account that for a test group with a patch could be associated with two syncers, one to build
482         a patch and another to run tests. Fixed the bug by differentiating the two types of syncers by buildSyncer
483         and testSyncer per test group.
484
485         * server-tests/tools-sync-buildbot-integration-tests.js: Extended a test case so that it would hit the
486         assertion without the fix.
487
488         * tools/js/buildbot-triggerable.js:
489         (BuildbotTriggerable.prototype.syncOnce): Use the right kind of the syncer to schedule a build or a test.
490         (BuildbotTriggerable.prototype._pullBuildbotOnAllSyncers): Associate a given syncer based on the kind of
491         the build request it processed, and assert accordingly.
492
493 2017-05-29  Ryosuke Niwa  <rniwa@webkit.org>
494
495         Fix UI glitches with a custom analysis test group with a patch
496         https://bugs.webkit.org/show_bug.cgi?id=172694
497
498         Reviewed by Sam Weinig.
499
500         Fix the following UI glitches with perf try bots:
501          - Retrying an A/B testing with a patch fails.
502          - A patch specified in an test group does not get specified in the configurator.
503          - Drag & dropping a patch doesn't work.
504          - Results for custom analysis tasks don't get shown.
505
506         * public/api/test-groups.php:
507         (main): Fix a bug that test group's platform does not match that of the request'ed platform. Since each test
508         group is associated with platform, just use that instead of querying test_configurations. This resulted in
509         the configurator not being able to find a triggerable in some cases.
510
511         * public/v3/components/custom-analysis-task-configurator.js:
512         (CustomAnalysisTaskConfigurator):
513         (CustomAnalysisTaskConfigurator.prototype.setCommitSets): Add patches in the commit set.
514         (CustomAnalysisTaskConfigurator.prototype._setUploadedFilesToUploader): Now clears the exiting uploaded files
515         Also renamed from _setUploadedFilesIfEmpty.
516         (CustomAnalysisTaskConfigurator.prototype._setPatchFiles): Added.
517         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): We no longer update the list of roots
518         for the comparsion when a new root is added to the baseline.
519         (CustomAnalysisTaskConfigurator.prototype._configureComparison): Copy over the list of patches and roots when
520         starting to configure the comparsion.
521
522         * public/v3/components/instant-file-uploader.js:
523         (InstantFileUploader.prototype.clear): Added.
524         (InstantFileUploader.prototype.didConstructShadowTree): Added event handlers for dragover & drop events to
525         allow specifying a patch and root using drag & drop. Unfortunately, this still doesn't work in WebKit due to
526         a bug in our shadow DOM implementation.
527         (InstantFileUploader.prototype._didFileInputChange):
528         (InstantFileUploader.prototype._uploadFiles): Extracted from _didFileInputChange.
529
530         * public/v3/pages/analysis-task-page.js:
531         (AnalysisTaskTestGroupPane.prototype.setAnalysisResults): No longer takes metric.
532         (AnalysisTaskTestGroupPane.cssTemplate): Removed unused rules. Also disallow flexing on the list of test groups
533         to avoid the name of a test froup from overflowing on top of the results pane.
534         (AnalysisTaskPage.prototype._assignTestResultsIfPossible): Set setAnalysisResults even when metric is not set
535         as is the case for a custom analysis task.
536         (AnalysisTaskPage.prototype._retryCurrentTestGroup): Use createWithCustomConfiguration to allow retrying of
537         an A/B testing with a patch in a custom analysis task.
538         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
539
540 2017-05-26  Ryosuke Niwa  <rniwa@webkit.org>
541
542         Show patches applied in each A/B testing build requests
543         https://bugs.webkit.org/show_bug.cgi?id=172636
544
545         Reviewed by Antti Koivisto.
546
547         List patches applied along side revisions inn the list of revisions for an A/B tesing build requests if there
548         are any patches applied.
549
550         * public/v3/components/test-group-revision-table.js:
551         (TestGroupRevisionTable.prototype._renderTable): Indicate which request is to build a patch and which one is
552         to run tests.
553         (TestGroupRevisionTable.prototype._buildCommitCell): Include the patch file's information when there is one.
554         We need to use the requested commit set instead of the one reported by testers or builders since they don't
555         include patch or root information.
556         (TestGroupRevisionTable.prototype._buildCustomRootsCell):
557         (TestGroupRevisionTable.prototype._buildFileInfo): Extracted from _buildCustomRootsCell.
558
559 2017-05-26  Ryosuke Niwa  <rniwa@webkit.org>
560
561         The queue page is broke when there is a custom analysis task
562         https://bugs.webkit.org/show_bug.cgi?id=172631
563
564         Reviewed by Antti Koivisto.
565
566         Fix the bug that we were always assuming each build request to have a test associated.
567
568         * public/v3/models/test-group.js:
569         (TestGroup.createAndRefetchTestGroups): Fixed the bug that we were referring to a non-existent variable task.
570         * public/v3/pages/build-request-queue-page.js:
571         (BuildRequestQueuePage.prototype._constructBuildRequestTable): Fixed the bug. Collect every request in the group
572         and then find the first test request's test name. Make it clear that we're waiting for a build as needed.
573
574 2017-05-25  Ryosuke Niwa  <rniwa@webkit.org>
575
576         Syncing script shouldn't schedule a build request when there is a build from another test group in progress
577         https://bugs.webkit.org/show_bug.cgi?id=172577
578         <rdar://problem/32395049>
579
580         Reviewed by Chris Dumez.
581
582         When a buildbot master gets restarted while there is an in-progress build and a pending build, the master will
583         re-schedule the currently running build, and this can result in multiple build requests from different test
584         groups being scheduled simultaneously.
585
586         sync-buildbot.js was supposed to recover from this state by only processing build requests from one test group
587         at a time and eventually come back to a state where only a single test group is running per buildbot slave.
588
589         We had a test for this particular case but it wasn't testing what it claimed to test. Rewriten the test case
590         and fixed the bug by explicitly checking this condition and treating it as if there is a pending build already
591         scheduled in the builder in this case.
592
593         * public/api/test-groups.php:
594         (main): Fixed a regression from r217397. Return the platform ID of the first request when none of the requets
595         have been processed yet or all of them had failed.
596         * server-tests/tools-buildbot-triggerable-tests.js: Rewritten a test case intended to cover this bug.
597         (.assertRequestAndResolve): Added.
598         * tools/js/buildbot-syncer.js:
599         (BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Fixed the bug. Avoid scheduling a new request on
600         this syncer if there is a build in progress for a test group different from that of the new request. Reuse the
601         code we had to deal with a pending build for this purpose.
602
603 2017-05-24  Ryosuke Niwa  <rniwa@webkit.org>
604
605         Opening an analysis task from the queue page is broken
606         https://bugs.webkit.org/show_bug.cgi?id=172559
607         <rdar://problem/32389708>
608
609         Rubber-stamped by Chris Dumez.
610
611         Fix the bug that opening the analysis task page from the queue page results in multiple assertion failures
612         as well as the list of test groups in the analysis task page not getting updated.
613
614         * public/v3/models/build-request.js:
615         (BuildRequest.prototype.updateSingleton): Because /api/build-requests/ do not include test groups, it's
616         possible for testGroup to be dynamically updated upon loading an analysis task page. Update _testGroup in
617         such instances instead of asserting that it doesn't happen.
618
619         * public/v3/models/data-model.js:
620         (DataModelObject.cachedFetch): Because various code to create model objects from the result of a JSON API
621         modify the fetched content in irreversible manner, e.g. `object.platform = Platform.findById(object.platform)`
622         we must return a fresh new content each time even if the result had been cached.
623
624         * public/v3/models/test-group.js:
625         (TestGroup.prototype.platform): Return this._platform as that's not available.
626
627         * public/v3/pages/analysis-task-page.js:
628         (AnalysisTaskPage):
629         (AnalysisTaskPage.prototype._resetVariables): Extracted from the constructor.
630         (AnalysisTaskPage.prototype.updateFromSerializedState): Reset all instance variables when opening a new
631         analysis task page. This would avoid showing the stale result even when fetching new test groups had failed.
632
633         * unit-tests/test-groups-tests.js: Added a test case for fetching the same test group twice. This used to hit
634         a problem in BuildRequest.constructBuildRequestsFromData which overrode platform property of each raw content
635         with a Platform model object because in the case of a cached fetch, we end up trying to look up the platform
636         again using the result of stringifying the Platform object instead of the platform ID included in the original
637         fetched content.
638         (sampleTestGroup): Added "platform" as included in the JSON API's response now.
639
640 2017-05-24  Ryosuke Niwa  <rniwa@webkit.org>
641
642         The commit log viewer can overlap the analysis results viewer
643         https://bugs.webkit.org/show_bug.cgi?id=172534
644
645         Rubber-stamped by Chris Dumez.
646
647         Allocate the padding on the right for the commit log viewer, and add a horizontal scrollbar
648         to the analysis results viewer instead of letting it expand beneath the commit log viewer.
649
650         * public/v3/pages/analysis-task-page.js:
651         (AnalysisTaskResultsPane.htmlTemplate):
652         (AnalysisTaskResultsPane.cssTemplate):
653
654 2017-05-24  Ryosuke Niwa  <rniwa@webkit.org>
655
656         Sycning script build fix after r217378.
657
658         * tools/sync-buildbot.js:
659         (syncLoop):
660
661 2017-05-23  Ryosuke Niwa  <rniwa@webkit.org>
662
663         Add the support for perf try bots to sync-buildbot.js
664         https://bugs.webkit.org/show_bug.cgi?id=172529
665
666         Rubber-stamped by Chris Dumez.
667
668         Make sync-buildbot.js schedule an A/B testing job with a patch or roots to buildbot.
669
670         Change the buildbot property format in the syncing script's configuration again to use a dictionary
671         with a single key of "revision", "patch", or "roots" to specify a revision, a patch, or a set of roots,
672         and simplified the structure of the configuration by always having "types" and "builders", and
673         make each entry in "configurations" refer to a list of types, platforms, and builders.
674
675         Since now there are build requests to build patches and run tests, "configurations" has been renamed to
676         "testConfigurations" and "buildConfigurations" have been added. Each entry in "buildConfigurations"
677         specifies a list of platforms and builders. Similarly in repository group configurations, the buildbot
678         properties for testing is now specified as "testProperties" and ones for building a patch is specified
679         in newly introduced "buildProperties".
680
681         * public/api/build-requests.php:
682         (update_builds): When a build request to build a patch fails, mark all subsequent requests as failed
683         since there is no way to run tests without a successful build.
684
685         * public/api/update-triggerable.php:
686         (main): Re-generate manifest.json after updating the triggerable. The lack of this re-generation was
687         the reason we had to manually GET /api/manifest in api-update-triggerable-tests.js.
688
689         * public/v3/models/build-request.js:
690         (BuildRequest.prototype.hasCompleted): Added.
691
692         * public/v3/models/manifest.js:
693         (Manifest.reset): Added. Extracted from MockData.resetV3Models in unit-tests/mock-data.js and
694         syncLoop in tools/sync-buildbot.js
695         (Manifest.fetch): Reset V3 models before fetching the manifest. This eliminates the need to manually
696         reset V3 models in syncLoop.
697
698         * public/v3/models/uploaded-file.js:
699         (UploadedFile.prototype.url): Use RemoteAPI.url to get the full URL instead of just a path.
700
701         * public/v3/remote.js:
702         (BrowserRemoteAPI.prototype.url): Added. Constructs the full URL.
703
704         * server-tests/api-update-triggerable-tests.js:
705         (.refetchManifest): Deleted. Now that /api/manifest re-generates manifest.json, we can simply call
706         Manifest.fetch instead.
707
708         * server-tests/resources/mock-data.js:
709         (MockData.resetV3Models): Calls Manifest.reset().
710         (MockData.addMockConfiguration): Extracted from addMockData.
711         (MockData.addMockData): Updated per the format change.
712         (MockData.mockTestSyncConfigWithSingleBuilder): Ditto.
713         (MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
714         (MockData.runningBuild): Make buildNumber specifiable.
715         (MockData.finishedBuild): Ditto.
716
717         * server-tests/tools-buildbot-triggerable-tests.js: Updated configurations per the format change.
718         Now that now acceptsCustomRoots() for "system-and-webkit" must be true since we can't have a
719         repository group that which accepts a patch and not take roots.
720
721         * server-tests/tools-sync-buildbot-integration-tests.js: Added.
722         (createTriggerable): Added.
723         (createTestGroupWihPatch): Added.
724         (uploadRoot): Added.
725         (.assertAndResolveRequest): Added.
726         (.assertTestBuildHasFailed): Added.
727
728         * tools/js/buildbot-syncer.js:
729         (BuildbotSyncer): Added. _type as an instance variable to identify whether this buildbot builder
730         is a "builder" which builds a patch, builder, or a "tester" which runs a test. Also renamed
731         _testConfigurations to _configurations.
732         (BuildbotSyncer.prototype.addTestConfiguration): Assert that either the type of this syncer hasn't
733         been set or it's a tester.
734         (BuildbotSyncer.prototype.testConfigurations): Return [] when it's a builder.
735         (BuildbotSyncer.prototype.addBuildConfiguration): Added. Adds a platform to a builder.
736         (BuildbotSyncer.prototype.buildConfigurations): Added. Returns the list of configurations if this
737         syncer is a builder. Otherwise returns [].
738         (BuildbotSyncer.prototype.isTester): Added.
739         (BuildbotSyncer.prototype.matchesConfiguration):
740         (BuildbotSyncer.prototype._propertiesForBuildRequest): Updated to support the new format.
741         (BuildbotSyncer._loadConfig): Ditto. Optionally parse buildConfigurations.
742         (BuildbotSyncer._resolveBuildersWithPlatforms): Added. For each test or build configuration entry,
743         creates the list of configurations per builder and platform.
744         (BuildbotSyncer._parseRepositoryGroup): Added the support for parsing the new format with revision,
745         roots, and patch option types with a lot of validations as we're seeing a bit of combinatorial
746         explosion in the number of things that can go wrong. Also parse buildProperties optionally.
747         (BuildbotSyncer._parseRepositoryGroupPropertyTemplate): Added. A helper function to parse a set of
748         buildbot properties, validates its content, and invokes a callback if it's an dynamically resolved
749         type such as "revision" and "patch".
750         (BuildbotSyncer._validateAndMergeConfig): Updated per the format change. No longer allows "types",
751         "type", "platforms", and "platform" as they're explicity resolved in _resolveBuildersWithPlatforms.
752
753         * tools/js/buildbot-triggerable.js:
754         (BuildbotTriggerable.prototype.syncOnce):
755         (BuildbotTriggerable.prototype._validateRequests): Handle the case when a build request is not
756         associated with any test.
757         (BuildbotTriggerable.prototype._nextRequestInGroup): Return null when there is a build request to
758         build a patch which has not been completed (pending, scheduled, running, or failed). Since all
759         requests to build a patch has a negative order, those requests should all show up at the beginning.
760         (BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Pick a new buildbot syncer when
761         scheduling the first request to build a patch or the first request to run a test. The first request
762         to run a test will always have order of 0, so it's a sufficient condition to find such a request.
763         On the other hand, the first request to build a patch can have a negative order number so we must
764         explicitly check if it's the first item in the ordered list of requests in the test group.
765
766         * tools/remote-server-relay.log: Added.
767
768         * tools/sync-buildbot.js:
769         (syncLoop): Fixed a bug we were not re-fetching the triggerable after updating the triggerable so
770         that Triggerable and related objects we have in the memory may not reflect what we just synced to
771         the perf dashboard. Also, we don't reset V3 models manually any more since Manifest.fetch does that.
772
773         * unit-tests/buildbot-syncer-tests.js: Added more test cases and updated existing test cases to test
774         exception messages explicitly since allowing any exception was resulting in some tests passing a
775         result of unrelated parsing error being thrown, etc...
776         (sampleiOSConfig): Updated per the format change.
777         (sampleiOSConfigWithExpansions): Ditto.
778         (smallConfiguration): Ditto.
779
780 2017-05-22  Dewei Zhu  <dewei_zhu@apple.com>
781
782         Fix the bug that sometimes analysis task results pane is missing.
783         https://bugs.webkit.org/show_bug.cgi?id=172404
784
785         Reviewed by Ryosuke Niwa.
786
787         AnalysisTaskPage._didFetchTask and AnalaysisTaskPage._fetchRelatedInfoForTaskId should be called in order.
788         The race between those two functions causes the analysis task results pane sometimes missing.
789
790         * public/v3/components/analysis-results-viewer.js:
791         (AnalysisResultsViewer.prototype.render): Fix the bug in r217173 that commitSet can be undefined.
792         * public/v3/pages/analysis-task-page.js:
793         (AnalysisTaskPage.prototype.updateFromSerializedState): Use arrow function to get rid of self variable.
794         Use `const` instead of var for constant variable. And call _didFetchTask before calling _fetchRelatedInfoForTaskId.
795         (AnalysisTaskPage.prototype._renderTaskNameAndStatus):
796         (AnalysisTaskPage.cssTemplate):
797
798 2017-05-19  Ryosuke Niwa  <rniwa@webkit.org>
799
800         Add a commit log viewer next to the analysis results viewer
801         https://bugs.webkit.org/show_bug.cgi?id=172399
802
803         Reviewed by Chris Dumez.
804
805         Add a commit log viewer next to the analysis results viewer, which visualizes the A/B testing results.
806
807         Also linkify the revisions in the table that shows the status of each A/B testing job,
808         and allow the prefix of "r" when associating a Subversion revision.
809
810         Finally, Fixed a bug that the list of commits associated with the analysis task were not re-rendered
811         when the list was updated by the user.
812
813         * public/v3/components/analysis-results-viewer.js:
814         (AnalysisResultsViewer): Added _selectorRadioButtonList as an instance variable. It's a list of radio
815         buttons to select a configuration (A/B) with a commit set. It's added to update the checked status of
816         radio buttons upon changing the currently selected test group.
817         (AnalysisResultsViewer.prototype.setTestGroups): Update the selected range to that of the currently
818         selected group.
819         (AnalysisResultsViewer.prototype.render): Fill _selectorRadioButtonList with radio buttons.
820
821         * public/v3/components/commit-log-viewer.js:
822         (CommitLogViewer): Added _showRepositoryName as an instance variable.
823         (CommitLogViewer.prototype.setShowRepositoryName): Added.
824         (CommitLogViewer.prototype.render): Hide the repository name when _showRepositoryName is false. This
825         is used in the newly added commit log viewer for the analysis results since we're showing a select
826         element with all the names of repositories above this component.
827
828         * public/v3/components/test-group-revision-table.js:
829         (TestGroupRevisionTable.prototype._buildCommitCell): Linkify the revisions if possible.
830
831         * public/v3/models/analysis-task.js:
832         (AnalysisTask.prototype.associateCommit): Strip "r" at the beginning for a Subversion like r12345
833         since that's the format we use to show to the user. This makes copy & paste easier.
834
835         * public/v3/pages/analysis-task-page.js:
836         (AnalysisTaskResultsPane): Added a bunch of new instance variables to show and update the commit log
837         viewer next to the analysis results viewer.
838         (AnalysisTaskResultsPane.prototype.setPoints): Create the list of repositories to show details.
839         (AnalysisTaskResultsPane.prototype.didConstructShadowTree): Re-render when the current selected test
840         group changes since that may have updated the selected range for A/B testing. Also re-render when
841         a new repository is selected to show details.
842         (AnalysisTaskResultsPane.prototype.render): Update the list of repositories and the commit log viewer.
843         (AnalysisTaskResultsPane.prototype._renderRepositoryList): Renders the list of repositories.
844         (AnalysisTaskResultsPane.prototype._updateCommitViewer): Updates the commit log viewer given the range
845         selected in the analysis results viewer.
846         (AnalysisTaskResultsPane.htmlTemplate): Updated the template.
847         (AnalysisTaskResultsPane.cssTemplate): Ditto.
848         (AnalysisTaskTestGroupPane.cssTemplate): Add a little space between the list of results and the table
849         of A/B testing jobs with revisions.
850         (AnalysisTaskPage.prototype.render): Fixed the bug that the list of commits associated with the task
851         is not updated when the list changes the task or the start point never changed when the list of commits
852         associated with the task changed. Make the lazily evaluated function compare the actual list of commits
853         so that it will invoke _renderCauseAndFixes when the list changes.
854         (AnalysisTaskPage.prototype._renderCauseAndFixes): Now renders a specific list.
855
856 2017-05-16  Ryosuke Niwa  <rniwa@webkit.org>
857
858         Another build fix. Added a missing null check.
859
860         * public/v3/components/custom-analysis-task-configurator.js:
861         (CustomAnalysisTaskConfigurator.prototype._setUploadedFilesIfEmpty):
862
863 2017-05-14  Ryosuke Niwa  <rniwa@webkit.org>
864
865         Build fix. Added a missing null check.
866
867         * public/v3/pages/analysis-task-page.js:
868         (AnalysisTaskConfiguratorPane.prototype.setTestGroups):
869
870 2017-05-11  Ryosuke Niwa  <rniwa@webkit.org>
871
872         Remove the code for old syncing script configuration in BuildbotSyncer
873         https://bugs.webkit.org/show_bug.cgi?id=171963
874
875         Reviewed by Chris Dumez.
876
877         Removed the code for specifying {"root": ~}, {"rootOptions": [~]}, and {"rootsExcluding": [~]} in buildbot
878         properties in the syncing script's configurations since they are no longer used after r215061.
879
880         Also removed the support for using "arguments" as an alias to "properties", and updated the tests accordingly.
881
882         * tools/js/buildbot-syncer.js:
883         (BuildbotSyncer._parseRepositoryGroup): Removed the unused code.
884         (BuildbotSyncer._validateAndMergeConfig): Just allow string values in properties.
885         (BuildbotSyncer._validateAndMergeProperties): Deleted.
886
887         * unit-tests/buildbot-syncer-tests.js:
888         (sampleiOSConfig): Use "properties" instead of "arguments" to specify the buildbot properties.
889         (sampleiOSConfigWithExpansions): Ditto.
890
891 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
892
893         Another build fix after r215633 to make the bar graphs render even when the confidence intervals aren't available.
894
895         * public/v3/components/bar-graph-group.js:
896         (BarGraphGroup.prototype._computeRange):
897
898 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
899
900         Build fix after r215633.
901
902         * public/v3/models/test-group.js:
903         (TestGroup.prototype._computeRequestedCommitSets):
904         (TestGroup.prototype.requestsForCommitSet):
905
906 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
907
908         Add API to upload a patched build for a custom A/B testing
909         https://bugs.webkit.org/show_bug.cgi?id=171956
910
911         Reviewed by Chris Dumez.
912
913         Added /api/upload-root to upload a root file, the build product of a patch associated with a commit set.
914
915         Extracted more functions out of privileged-api/upload-file.php to uploaded-file-helpers.php to share code
916         with /api/upload-root.php.
917
918         * public/api/upload-root.php: Added.
919         (main):
920         (compute_commit_set_items_to_update): Find the list of commit set items to associate this root with.
921         A root can be associated with multiple repositories and there fore commit set items; e.g. if a software
922         is built from multiple repositories and there is a patch associated with one of them, the built product
923         must be associated with all those repositories.
924
925         * public/include/build-requests-fetcher.php:
926         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Include the root file is there is one.
927
928         * public/include/json-header.php:
929         (validate_arguments): Added the support for validating json string.
930         (verify_slave): Return the slave ID found.
931
932         * public/include/uploaded-file-helpers.php:
933         (validate_uploaded_file): Extracted from /privileged-api/upload-file to be shared with /api/upload-root.
934         (query_total_file_size): Ditto.
935         (create_uploaded_file_from_form_data): Ditto.
936         (upload_file_in_transaction): Ditto. Takes a lambda to do the extra work inside the transaction.
937
938         * public/privileged-api/upload-file.php:
939         (main):
940
941         * public/v3/models/build-request.js:
942         (BuildRequest.constructBuildRequestsFromData): Resolve the rootFIle of each commit set item.
943
944         * public/v3/models/commit-set.js:
945         (CommitSet): Added _repositoryToRootMap and _allRootFiles as instance variables.
946         (CommitSet.prototype.updateSingleton): Added. Previously, each commit set's states never changed after
947         its creation. After this patch, each item can be newly associated with a root so we must update its
948         _repositoryToRootMap and _allRootFiles. For simplicity, we update all states.
949         (CommitSet.prototype._updateFromObject): Extracted from the constructor.
950         (CommitSet.prototype.allRootFiles): Added. Includes custom roots and roots created for patches.
951         (CommitSet.prototype.rootForRepository): Added.
952         (CommitSet.prototype.equals): Fixed the bug that we were comparing _repositoryToPatchMap to
953         _repositoryToCommitMap, and added a check for _repositoryToRootMap.
954
955         * public/v3/models/test-group.js:
956         (TestGroup.prototype.task): Added.
957         (TestGroup.createWithTask):
958         (TestGroup.createWithCustomConfiguration):
959         (TestGroup.createAndRefetchTestGroups):
960         (TestGroup._fetchTestGroupsForTask): Deleted. Now fetchForTask takes a boolean argument: ignoreCache.
961         (TestGroup.findAllByTask): Added.
962         (TestGroup.fetchForTask): Renamed from fetchByTask.
963
964         * public/v3/pages/analysis-task-page.js:
965         (AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId):
966
967         * server-tests/api-build-requests-tests.js:
968
969         * server-tests/api-upload-root-tests.js: Added. Added tests for /api/upload-root.
970         (makeReport): Added.
971         (addSlaveAndCreateRootFile): Added.
972         (createTestGroupWihPatch): Added.
973
974         * server-tests/privileged-api-create-test-group-tests.js:
975
976         * server-tests/resources/mock-data.js:
977         (MockData.sharedRepositoryId): Added.
978         (MockData.addMockData): Added "Shared" repository along with commits.
979
980 2017-05-10  Ryosuke Niwa  <rniwa@webkit.org>
981
982         Rename server-tests/api-update-triggerable.js to server-tests/api-update-triggerable-tests.js
983         https://bugs.webkit.org/show_bug.cgi?id=171905
984
985         Reviewed by Chris Dumez.
986
987         * server-tests/api-update-triggerable-tests.js: Renamed from server-tests/api-update-triggerable.js.
988
989 2017-04-30  Ryosuke Niwa  <rniwa@webkit.org>
990
991         Add the support for scheduling a A/B testing with a patch.
992         https://bugs.webkit.org/show_bug.cgi?id=171209
993
994         Reviewed by Chris Dumez.
995
996         Added the support for creating a custom test group with a patch applied.
997
998         First, each repository in a repository group has a boolean indicating whether a given repository can have
999         a patch applied or not. When any configuration in a test group contains a patch, we create build requests
1000         without a test specified in order to "build" those patches. These build requests have negative order numbers
1001         to differentiate them from regular build requests. We can't simply build ones with patches since there could
1002         be differences in SDK, build options, etc... when patches are applied.
1003
1004         The JSON format for commit sets returned by /api/build-requests have been changed from using an array of
1005         commit IDs to an array of dictionaries indicate commit and acceptsPatch boolean. /api/update-triggerable now
1006         uses a dictionary with two keys: repository and acceptsPatch to specify a set of repositories associated with
1007         a repository group, and /privileged-api-create-test-group uses a dictionary with two keys: revision and patch
1008         instead of a revision string to specify commit sets.
1009
1010         Furthermore, the syncing script's configuration have been updated to use a dictionary of repository names to
1011         an options dictionary instead of an array of repositories names. For now, the only supported option is
1012         acceptsPatch but will be extended when we add the support for rolling back system components.
1013         e.g. {"WebKit": {acceptsPatch: true}, "macOS": {}} instead of ["WebKit", "macOS"]
1014
1015         On the UI side, InstantFileUploader has been changed to accept only one file by default, and added a new method
1016         allowMultipleFiles() to allow multiple files to be selected for custom roots. Also replaced the input element
1017         with type=file by a button with a custom label to show labels such as "Apply a patch" or "Add a new root"
1018         instead of the generic label like "choose a file".
1019
1020
1021         * init-database.sql: Added trigrepo_accepts_patch to triggerable_repositories to indicate whether a given
1022         repository can have a patch applied or not. Made request_test optional in build_requests for when a build
1023         request is created to build patches. Such a build request have a negative request_order. Updated the related
1024         constraints accordingly.
1025
1026         * public/admin/triggerables.php: Added the support for updating whether a given repository can have a patch
1027         applied in each repository group. Only show the repositories in the repository group for this purpose since
1028         there is no way to accept a patch on a repository without it being a part of the group.
1029         (generate_repository_form): Now takes the markup for checkboxes instead of generating one itself.
1030         (generate_repository_checkboxes): Now takes an array of repositories to generate checkboxes. The checkbox is
1031         shown when the repository ID exists as a key in this array, and is checked when its value is true. The new
1032         capability to skip repositories not in the array is used to hide repositories not associated with the group
1033         in the list of checkboxes to indicate a repository accepts a patch.
1034
1035         * public/api/update-triggerable.php:
1036         (main): Now updates the description and acceptsRoots states of each repository group, and sets acceptsPatch
1037         boolean for each repository in the group if set in the update.
1038         (validate_repository_groups): Use a reference to $repository_groups in order to set repository_id_list, which
1039         contains an array of repository IDs to find the existing repository group that matches the set via
1040         RepositoryGroupFinder's find_by_repositories. Also added a various validations for acceptsRoots, a dictionary
1041         specifying repository and acceptsPatch.
1042
1043         * public/include/build-requests-fetcher.php:
1044         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Instead of returning an array of commit IDs as
1045         "commits", it now returns an array of dictionaries with "commit" and "patch" keys specifying the commit ID
1046         and the patch file's ID respectively as "revisionItems". 
1047         (BuildRequestsFetcher::add_uploaded_file): Added. Extracted from fetch_commits_for_set_if_needed. Used to
1048         add either a patch file or a custom root file in the list of uploaded files in the result.
1049
1050         * public/include/manifest-generator.php:
1051         (fetch_triggerables): Each element in repository group's "repositories" field is now an array of dictionaries
1052         with "repository" and "acceptsPatch" as keys.
1053
1054         * public/include/repository-group-finder.php:
1055         (RepositoryGroupFinder::__construct): Added a map for boolean indicating whether a given repository group
1056         allows a patch on a repository. Used in /privileged-api/create-test-group.
1057         (RepositoryGroupFinder::accepts_patch): Added.
1058         (RepositoryGroupFinder::populate_map): Build up the map for acceptsPatch boolean per repository per group.
1059
1060         * public/privileged-api/create-test-group.php:
1061         (main): Fixed a bug that we were not explicitly checking for a duplicate test group name (with a test). Create
1062         build requests to "build" patches if there is any patch file specified.
1063         (commit_sets_from_revision_sets): Updated to take a dictionary with "revision" and "patch" as keys to specify
1064         a revision and a patch if any instead of just a revision string for each repository. Also validate that each
1065         repository is allowed to have a patch once the repository group has been found for the set of repositories.
1066         (ensure_commit_sets):
1067
1068         * public/v3/components/custom-analysis-task-configurator.js:
1069         (CustomAnalysisTaskConfigurator): Added _patchUploaders as an instance variable, which is a dictionary of
1070         configuration names to a map of InstantFileUploader's used to upload a patch. Also renamed _fileUploaders to
1071         _customRootUploaders for clarity.
1072         (CustomAnalysisTaskConfigurator.prototype.setCommitSets):
1073         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree.createRootUploader): Added.
1074         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree):
1075         (CustomAnalysisTaskConfigurator.prototype._ensurePatchUploader): Added. Creates an instant file uploader for
1076         patches. We only allow a single patch per repository.
1077         (CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Include a patch in the commit set as needed.
1078         (CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Show the patch file uploader for repositories
1079         which can have patches in the current repository group.
1080         (CustomAnalysisTaskConfigurator.cssTemplate): Show borders between every rows instead of just between tbody's
1081         now that each row can have a patch file uploader.
1082
1083         * public/v3/components/instant-file-uploader.js:
1084         (InstantFileUploader): Added _fileInput and _allowMultipleFiles as instance variables. We now show a button
1085         in the UI instead of an input with type=file. _fileInput is a hidden input with type=file used inside a click
1086         event of the button to let the user pick a file.
1087         (InstantFileUploader.prototype.allowMultipleFiles): Added. Allows this instance to accept multiple files.
1088         (InstantFileUploader.prototype.didConstructShadowTree): Synthetically click on the hidden input element when
1089         the newly added button element is clicked to open the browser's file picker.
1090         (InstantFileUploader.prototype.render): Hide the button to add a file if this instance can only select one file
1091         and there is already some file being uploaded in this instance.
1092         (InstantFileUploader.htmlTemplate): Replaced the input element with type=file with a button. Its label comes
1093         from the default slot content.
1094
1095         * public/v3/models/build-request.js:
1096         (BuildRequest): Made the test optional.
1097         (BuildRequest.prototype.isBuild): Returns true if this is a build request for building a patch.
1098         (BuildRequest.prototype.isTest): Returns true if this is a build request for running tests.
1099         (BuildRequest.constructBuildRequestsFromData): Create each commit log here instead of relying on CommitSet's
1100         constructor to construct its commit logs. Also updated per the replacement of an array of commit IDs by
1101         an array of dictionaries with commit and patch properties.
1102
1103         * public/v3/models/commit-set.js:
1104         (CommitSet): Made _repositoryToCommitMap a real Map object. Also added _repositoryToPatchMap. Also got rid of
1105         the code to instantiate commit logs since that's now done in BuildRequest.constructBuildRequestsFromData.
1106         (CommitSet.prototype.commitForRepository):
1107         (CommitSet.prototype.revisionForRepository):
1108         (CommitSet.prototype.patchForRepository): Added.
1109         (CommitSet.prototype.latestCommitTime): Modernized the code.
1110         (CommitSet.prototype.equals): Modernized the code. Also added the check for patches.
1111         (MeasurementCommitSet): Updated per the change to make _repositoryToCommitMap a real Map.
1112         (CustomCommitSet.prototype.setRevisionForRepository):
1113         (CustomCommitSet.prototype.equals): Added the check for patches.
1114         (CustomCommitSet.prototype.revisionForRepository):
1115         (CustomCommitSet.prototype.patchForRepository): Added.
1116
1117         * public/v3/models/manifest.js:
1118         (Manifest._didFetchManifest): Updated per the replacement of an array of commit IDs by an array of dictionaries
1119         with commit and patch properties.
1120
1121         * public/v3/models/repository.js:
1122         (Repository.prototype.ownerId): Renamed from owner for clarity.
1123
1124         * public/v3/models/test-group.js:
1125         (TestGroup): Modernized the code by using LazilyEvaluatedFunction. Removed _requestsAreInOrder since it's not
1126         necessary anymore with LazilyEvaluatedFunction.
1127         (TestGroup.prototype.addBuildRequest):
1128         (TestGroup.prototype.test): Use the last build request's test since the first few requests could be requests to
1129         build patches.
1130         (TestGroup.prototype.platform): Ditto.
1131         (TestGroup.prototype._lastRequest): Added.
1132         (TestGroup.prototype._orderedBuildRequests): Added.
1133         (TestGroup.prototype.repetitionCount): Only count the build requests for testing (skipping any requests to
1134         build patches).
1135         (TestGroup.prototype.requestedCommitSets): Simply call _computeRequestedCommitSetsLazily.
1136         (TestGroup.prototype._computeRequestedCommitSets): Extracted from requestedCommitSets.
1137         (TestGroup.prototype.requestsForCommitSet):
1138         (TestGroup.prototype.labelForCommitSet): Rewritten. Just compute the label here instead of relying on
1139         _commitSetToLabel since requestedSets is always of the length two at the moment.
1140         (TestGroup._revisionSetsFromCommitSets): Specify both the revision and the patch in the revision set.        
1141
1142         * public/v3/models/triggerable.js:
1143         (TriggerableRepositoryGroup): Added _patchAcceptingSet as an instance variable. Use
1144         sortByNamePreferringOnesWithURL to sort repositories instead of simple sortByName.
1145         (TriggerableRepositoryGroup.prototype.accepts): Added checks for the custom roots and patches.
1146         (TriggerableRepositoryGroup.prototype.acceptsPatchForRepository): Added.
1147
1148         * server-tests/api-build-requests-tests.js: Updated the test cases per the replacement of an array of commit
1149         IDs by an array of dictionaries with commit and patch properties.
1150
1151         * server-tests/api-manifest-tests.js: Updated the test case per the name of Repository's owner to ownerId.
1152
1153         * server-tests/api-update-triggerable.js: Updated the test case per the name of Repository's owner to ownerId,
1154         and added a test case for updating whether a given repository group allows custom roots as well as patches
1155         on repositories via /api/update-triggerable. 
1156         (.updateWithOSXRepositoryGroup): Updated the sample syncing script configuration per the format change.
1157         (.refetchManifest): Added.
1158
1159         * server-tests/privileged-api-create-test-group-tests.js: Updated per the syncing script configuration format
1160         change. Also added a test for creating a test group with a duplicate name, which is expected to fail with 
1161         DuplicateTestGroupName, and creating a test group with a patch both when it's allowed and when it's not allowed
1162         in the matching repository group.
1163         (.addTriggerableAndCreateTask): Updated per the format change.
1164
1165         * server-tests/resources/mock-data.js:
1166         (MockData.addEmptyTriggerable): Added a metric and its configuration to make it appear in the manifest file.
1167         The new test case in api-update-triggerable.js requires this.
1168         (MockData.mockTestSyncConfigWithSingleBuilder): Updated per the syncing script configuration format change.
1169         (MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
1170
1171         * server-tests/tools-buildbot-triggerable-tests.js: Removed the useless assertions about test configurations,
1172         and added assertions about custom roots and patches in the test case for updateTriggerables.
1173
1174         * tools/js/buildbot-syncer.js:
1175         (BuildbotSyncer._parseRepositoryGroup): Made each assertion explicitly refer to the specific repository group
1176         to make it more user friendly. Now each repository group uses a dictionary of repository names to its options
1177         in the syncing script configurations. When parsed, we insert it as an array of dictionaries with repository ID
1178         and acceptsPatch boolean specified separately since this is the format /api/update-triggerable expects.
1179
1180         * tools/js/buildbot-triggerable.js:
1181         (BuildbotTriggerable.prototype.updateTriggerable):
1182
1183         * unit-tests/build-request-tests.js:
1184         (sampleBuildRequestData): Updated per the commit sets format change in /api/build-requests.
1185
1186         * unit-tests/buildbot-syncer-tests.js: Updated the existing tests per various format changes and added a couple
1187         of new test cases for the syncing script's configuration validation.
1188         (sampleiOSConfig):
1189         (smallConfiguration):
1190         (createSampleBuildRequest):
1191
1192         * unit-tests/resources/mock-v3-models.js:
1193         (MockModels.inject): Updated per the repository group format change.
1194
1195         * unit-tests/test-groups-tests.js:
1196         (sampleTestGroup): Updated per the commit sets format change in /api/build-requests. 
1197
1198 2017-04-21  Ryosuke Niwa  <rniwa@webkit.org>
1199
1200         Rename commit_set_relationships to commit_set_items
1201         https://bugs.webkit.org/show_bug.cgi?id=171143
1202
1203         Reviewed by Joseph Pecoraro.
1204
1205         Renamed commit_set_relationships to commit_set_items. Also added commitset_patch_file in the preparation to add
1206         the support for applying patches in custom test groups. To migrate an existing database, run:
1207
1208         ```sql
1209         BEGIN;
1210         ALTER TABLE commit_set_relationships RENAME TO commit_set_items;
1211         ALTER TABLE commit_set_items ADD COLUMN commitset_patch_file integer REFERENCES uploaded_files;
1212         ALTER TABLE commit_set_items ADD CONSTRAINT commitset_with_patch_must_have_commit
1213             CHECK (commitset_patch_file IS NULL OR commitset_commit IS NOT NULL);
1214         END;
1215         ```
1216
1217         * init-database.sql:
1218         * public/include/build-requests-fetcher.php:
1219         * public/privileged-api/create-test-group.php:
1220         * server-tests/resources/mock-data.js:
1221         (MockData.addMockData):
1222         (MockData.addMockTestGroupWithGitWebKit):
1223         * tools/js/database.js:
1224
1225 2017-04-21  Ryosuke Niwa  <rniwa@webkit.org>
1226
1227         Add the support for creating a custom test group in the analysis task page
1228
1229         Make it possible to create more custom test groups in the analysis task page
1230         https://bugs.webkit.org/show_bug.cgi?id=171138
1231
1232         Rubber-stamped by Chris Dumez.
1233
1234         Extracted CustomConfigurationTestGroupForm out of CreateAnalysisTaskPage and added it to AnalysisTaskPage inside
1235         AnalysisTaskConfiguratorPane. This allows configuration of a new test group within a custom analysis task.
1236
1237         * public/privileged-api/create-test-group.php:
1238         (main): Fixed the bug that the triggerable wasn't resolved when creating a test group in a custom analysis task.
1239
1240         * public/v3/components/custom-analysis-task-configurator.js:
1241         (CustomAnalysisTaskConfigurator.prototype.selectTests): Added. Used by CustomConfigurationTestGroupForm's
1242         setConfigurations.
1243         (CustomAnalysisTaskConfigurator.prototype.selectPlatform): Ditto.
1244         (CustomAnalysisTaskConfigurator.prototype.setCommitSets): Ditto. 
1245         (CustomAnalysisTaskConfigurator.prototype._setUploadedFilesIfEmpty): Added.
1246         (CustomAnalysisTaskConfigurator.prototype._revisionMapFromCommitSet): Added.
1247         (CustomAnalysisTaskConfigurator.prototype.render): Update the currently selected platforms and tests now that
1248         they can be set externally via selectTests and selectPlatform.
1249         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Return the result of _renderRadioButtonList
1250         so that the caller can update the currently selected tests without having to reconstruct the list.
1251         (CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Ditto.
1252         (CustomAnalysisTaskConfigurator.prototype._renderRadioButtonList): Renamed from _buildCheckboxList. Now returns
1253         a function which updates the currently selected items. We still pretend that multiple items can be selected to
1254         make it future-proof.
1255
1256         * public/v3/components/custom-configuration-test-group-form.js: Added.
1257         (CustomConfigurationTestGroupForm): Added. Inherits from TestGroupForm. Extracted from CreateAnalysisTaskPage.
1258         (CustomConfigurationTestGroupForm.prototype.setHasTask): Added.
1259         (CustomConfigurationTestGroupForm.prototype.hasCommitSets): Added.
1260         (CustomConfigurationTestGroupForm.prototype.setConfigurations): Added. Used by AnalysisTaskConfiguratorPane to
1261         set the default configuration to what the latest test group used.
1262         (CustomConfigurationTestGroupForm.prototype.startTesting): Added. Dispatches "startTesting" action with
1263         platform, test, taskName in addition to what CustomizedTestGroupForm emits.
1264         (CustomConfigurationTestGroupForm.prototype.didConstructShadowTree): Added.
1265         (CustomConfigurationTestGroupForm.prototype.render): Added.
1266         (CustomConfigurationTestGroupForm.prototype._updateTestGroupName): Added.
1267         (CustomConfigurationTestGroupForm.cssTemplate): Added.
1268         (CustomConfigurationTestGroupForm.htmlTemplate): Added.
1269
1270         * public/v3/components/test-group-form.js:
1271         (TestGroupForm.cssTemplate): Make the form display: block.
1272
1273         * public/v3/index.html:
1274
1275         * public/v3/models/test-group.js:
1276         (TestGroup.prototype.test): Added.
1277         (TestGroup.prototype.platform): Added.
1278         (TestGroup.createWithCustomConfiguration): Added. Creates a custom test group with an existing analysis task.
1279
1280         * public/v3/models/uploaded-file.js:
1281         (UploadedFile): Fixed a bug that _deletedAt was set to a Date object even when object.deletedAt is null.
1282
1283         * public/v3/pages/analysis-task-page.js:
1284         (AnalysisTaskConfiguratorPane): Added.
1285         (AnalysisTaskConfiguratorPane.prototype.didConstructShadowTree): Added. Dispatch createCustomTestGroup action
1286         in turn when receiving startTesting from CustomConfigurationTestGroupForm.
1287         (AnalysisTaskConfiguratorPane.prototype.setTestGroups): Added.
1288         (AnalysisTaskConfiguratorPane.prototype.render): Added.
1289         (AnalysisTaskConfiguratorPane.htmlTemplate): Added. We override this instead of formContent to display the
1290         "Start" button at the end instead of at the beginnning.
1291         (AnalysisTaskConfiguratorPane.cssTemplate): Added.
1292         (AnalysisTaskPage.prototype.didConstructShadowTree): Listen to createCustomTestGroup.
1293         (AnalysisTaskPage.prototype.render): Hide AnalysisTaskConfiguratorPane when the analysis task is not custom.
1294         (AnalysisTaskPage.prototype._showTestGroup): Let AnalysisTaskConfiguratorPane know of the current test group
1295         so that it can update the default configuration if the user hasn't modified yet.
1296         (AnalysisTaskPage.prototype._createCustomTestGroup): Added. 
1297
1298         * public/v3/pages/create-analysis-task-page.js:
1299         (CreateAnalysisTaskPage.prototype.didConstructShadowTree):
1300         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup):
1301         (CreateAnalysisTaskPage.prototype.render):
1302         (CreateAnalysisTaskPage.prototype._renderMessage):
1303         (CreateAnalysisTaskPage.htmlTemplate):
1304         (CreateAnalysisTaskPage.cssTemplate):
1305
1306         * server-tests/privileged-api-create-test-group-tests.js: Added a test case for creating a custom test group for
1307         an existing analysis task.
1308
1309         * server-tests/resources/mock-data.js:
1310         (MockData.otherPlatformId): Added.
1311         (MockData.addMockData): Added a test configuration for otherPlatformId.
1312
1313 2017-04-21  Ryosuke Niwa  <rniwa@webkit.org>
1314
1315         Make it possible to view results for sub tests and metrics in A/B testing
1316         https://bugs.webkit.org/show_bug.cgi?id=170975
1317
1318         Reviewed by Chris Dumez.
1319
1320         Replaced TestGroupResultsTable, which was a single table that presented the test results with a set of revisions
1321         each build request used, with TestGroupResultsViewer and TestGroupRevisionTable. TestGroupResultsViewer provides
1322         an UI to look the results of sub-tests and sub-metrics and TestGroupRevisionTable provides an UI to display
1323         the set of revisions each build request used. TestGroupRevisionTable can also show the list of custom roots now
1324         that we've added UI to schedule an analysis task with a custom test group.
1325
1326         This patch extends BarGraphGroup to show multiple bars per SingleBarGraph using a canvas with bars indicating
1327         their mean and confidence interval.
1328
1329         * browser-tests/index.html:
1330         (ChartTest.importChartScripts): Include lazily-evaluated-function.js now that Test model object uses
1331         LazilyEvaluatedFunction.
1332
1333         * public/v3/components/analysis-results-viewer.js:
1334         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet):
1335         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
1336
1337         * public/v3/components/bar-graph-group.js:
1338         (BarGraphGroup): No longer takes formatter. Added _computeRangeLazily and _showLabels as instance variables.
1339         (BarGraphGroup.prototype.addBar): Now takes a list of values, their labels, mean, confidence interval, and
1340         the colors of bar graphs shown for each value and the mean indicator.
1341         (BarGraphGroup.prototype.showLabels): Added.
1342         (BarGraphGroup.prototype.setShowLabels): Added.
1343         (BarGraphGroup.prototype.range): Added.
1344         (BarGraphGroup.prototype._computeRange): Renamed from updateGroupRendering. Now returns the range instead off
1345         setting it to each bar, and each SingleBarGraph's render function uses the value via BarGraphGroup's range.
1346         (BarGraph): Renamed from SingleBarGraph. Added various arguments introduced in addBar, and now stores various
1347         lazily evaluated functions used for rendering.
1348         (BarGraph.prototype.render): Rewritten to use canvas to draw bar graphs and show a label when group's
1349         showLabels() returns true.
1350         (BarGraph.prototype._resizeCanvas): Added.
1351         (BarGraph.prototype._renderCanvas): Added.
1352         (BarGraph.prototype._renderLabels): Added. We align the top of each label to the middle of each bar and shift it
1353         back up by half the height of the label (0.4rem) using margin-top in css.
1354         (BarGraph.htmlTemplate): Uses a canvas now.
1355         (BarGraph.cssTemplate):
1356
1357         * public/v3/components/results-table.js:
1358         (ResultsTable.prototype.renderTable): Updated per code changes to BarGraphGroup.
1359         (ResultsTableRow.prototype.resultContent): Ditto.
1360
1361         * public/v3/components/test-group-results-table.js: Removed.
1362         * public/v3/components/test-group-results-viewer.js: Added.
1363         (TestGroupResultsViewer): Added. Shows a list of test results with bar graphs with mean and confidence interval
1364         indicators. The results of sub tests and metrics can be expanded via "(Breakdown)" link shown below each test. 
1365         (TestGroupResultsViewer.prototype.setTestGroup): Added.
1366         (TestGroupResultsViewer.prototype.setAnalysisResults): Added.
1367         (TestGroupResultsViewer.prototype.render): Added.
1368         (TestGroupResultsViewer.prototype._renderResultsTable): Compute the depth of the test tree we show, and construct
1369         the header rows. Each sub test is "indented" by a new column.
1370         (TestGroupResultsViewer.prototype._buildRowForTest): Added. Build rows for metrics of the given test. Expand the
1371         list of its child tests if it's in expandedTests. Otherwise add a link to "Breakdown" if it has any child tests.
1372         (TestGroupResultsViewer.prototype._buildRowForMetric): Added. Builds rows of table cells to show the results for
1373         the given metric for each configuration.
1374         (TestGroupResultsViewer.prototype._buildRowForMetric.createConfigurationRow): Added. A helper to build cells for
1375         a given configuration represented by a requested commit set.
1376         (TestGroupResultsViewer.prototype._buildValueMap): Added. Creates a mappting between a requested commit set, and
1377         the list of values, mean, etc... associated with the results for the commit set.
1378         (TestGroupResultsViewer.prototype._buildEmptyCells): Added. A helper to create empty cells to indent sub tests.
1379         (TestGroupResultsViewer.prototype._expandCurrentMetrics): Added. Highlights the current metrics and renders the
1380         label for each bar in the results.
1381         (TestGroupResultsViewer.htmlTemplate): Added.
1382         (TestGroupResultsViewer.cssTemplate): Added.
1383
1384         * public/v3/components/test-group-revision-table.js: Added.
1385         (TestGroupRevisionTable): Added. Renders the list of revisions requested for each test configuration as well as
1386         ones used in actual testing, and additional repositories being reported (e.g. repositories for helper scripts).
1387         (TestGroupRevisionTable.prototype.setTestGroup): Added.
1388         (TestGroupRevisionTable.prototype.setAnalysisResults): Added.
1389         (TestGroupRevisionTable.prototype.render): Added.
1390         (TestGroupRevisionTable.prototype._renderTable): Added. The basic algorithm here is to first create a row entry
1391         object for each build request, merge cells that use the same revision of the same repository, and then render
1392         the entire table.
1393         (TestGroupRevisionTable.prototype._buildCommitCell): Added.
1394         (TestGroupRevisionTable.prototype._buildCustomRootsCell): Added.
1395         (TestGroupRevisionTable.prototype._mergeCellsWithSameCommitsAcrossRows): Added. Compute rowspan for each cell
1396         by traversing the rows that use the same revision per repository, and store it in rowCountByRepository while
1397         adding the repository to each succeeding row's repositoriesToSkip.
1398         (TestGroupRevisionTable.htmlTemplate): Added.
1399         (TestGroupRevisionTable.cssTemplate): Added.
1400
1401         * public/v3/index.html:
1402         * public/v3/models/analysis-results.js:
1403         (AnalysisResults): Added _metricIds and _lazilyComputedHighestTests as instance variables.
1404         (AnalysisResults.prototype.findResult): Renamed from find.
1405         (AnalysisResults.prototype.highestTests): Added.
1406         (AnalysisResults.prototype._computeHighestTests): Added. Finds the root tests for this analysis result.
1407         (AnalysisResults.prototype.add): Update _metricIds.
1408         (AnalysisResults.prototype.commitSetForRequest): Added. Returns the reported commit set for the build request.
1409         This commit set contains the set of revisions reported to /api/report by A/B testers.
1410         (AnalysisResultsView.prototype.resultForRequest): Renamed from resultForBuildId.
1411
1412         * public/v3/models/metric.js:
1413         (Metric.prototype.relativeName): Added. Computes the relative name given the test/metric path. This function is
1414         used to determine the label for each test/metric in TestGroupResultsViewer.
1415         (Metric.prototype.aggregatorLabel): Extracted from label.
1416         (Metric.prototype.label):
1417         (Metric.makeFormatter): Added the default value of false to alwaysShowSign.
1418
1419         * public/v3/models/test-group.js:
1420         (TestGroup.prototype.compareTestResults): Now takes a metric instead of retrieving it from the analysis task
1421         since a custom analysis task may not have a metric associated with it.
1422
1423         * public/v3/models/test.js:
1424         (Test): Added _computePathLazily as an instance variable.
1425         (Test.prototype.path): Lazily computes the path now that this function can be called on the same test for many
1426         times in TestGroupResultsViewer while computing relative names of tests and metrics.
1427         (Test.prototype._computePath): Extracted path.
1428         (Test.prototype.fullName): Modernized the code.
1429         (Test.prototype.relativeName): Added.
1430
1431         * public/v3/models/uploaded-file.js:
1432         (UploadedFile):
1433         (UploadedFile.prototype.deletedAt): Added.
1434         (UploadedFile.prototype.label): Added.
1435         (UploadedFile.prototype.url): Added.
1436
1437         * public/v3/pages/analysis-task-page.js:
1438         (AnalysisTaskTestGroupPane.prototype.setTestGroups):
1439         (AnalysisTaskTestGroupPane.prototype.setAnalysisResults): Replaced setAnalysisResultsView. Now takes an
1440         analysisResults instead of its view.
1441         (AnalysisTaskTestGroupPane.prototype.render): No longer enqueues the results table and the retry form to render
1442         since the results table no longer exists, and the retry form re-renders itself as needed.
1443         (AnalysisTaskTestGroupPane.htmlTemplate): Now uses test-group-results-viewer and test-group-revision-table
1444         instead of test-group-results-table, which has been removed.
1445         (AnalysisTaskTestGroupPane.cssTemplate):
1446         (AnalysisTaskPage.prototype._assignTestResultsIfPossible):
1447
1448         * public/v3/pages/create-analysis-task-page.js:
1449         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Removed superflous console.log's.
1450
1451         * tools/js/v3-models.js: Import LazilyEvaluatedFunction now that it's used in the Test model.
1452
1453         * unit-tests/test-model-tests.js: Added.
1454
1455 2017-04-19  Ryosuke Niwa  <rniwa@webkit.org>
1456
1457         Another build fix after r215061. Clear TriggerableRepositoryGroup's static map in each iteration.
1458
1459         * tools/sync-buildbot.js:
1460         (syncLoop):
1461
1462 2017-04-18  Ryosuke Niwa  <rniwa@webkit.org>
1463
1464         Build fix after r215061.
1465
1466         There was a mismatch between the format updateTriggerable and /api/update-triggerable were using.
1467         Namely, each repository group was assumed to contain a name field in /api/update-triggerable
1468         but updateTriggerable was not including that at all.
1469
1470         We didn't catch this because the test for updateTriggerable also used the wrong format :(
1471
1472         * server-tests/tools-buildbot-triggerable-tests.js:
1473         * tools/js/buildbot-triggerable.js:
1474         (BuildbotTriggerable.prototype.updateTriggerable):
1475
1476 2017-04-14  Dewei Zhu  <dewei_zhu@apple.com>
1477
1478         Add sub-commit UI in commit log viewer.
1479         https://bugs.webkit.org/show_bug.cgi?id=170379
1480
1481         Reviewed by Ryosuke Niwa.
1482
1483         Add an API to return sub-commits for a given commit.
1484         Add sub-commit difference viewer into commit log viewer to show changed sub-commits between two commits.
1485         Add 'ownsSubCommits' info in 'api/commits' return values.
1486         Extend 'api/manifest' to include whether a repositories owns other repositories.
1487         Only show this sub-commit difference viewer when a repository owns other repositories and both commits owns sub-commits.
1488         Add unit tests for those new features.
1489
1490         * browser-tests/commit-log-viewer-tests.js: Updated test cases.
1491         * public/api/commits.php: Added 'sub-commits' to provide sub-commit for a given commit.
1492         * public/include/commit-log-fetcher.php: Added function to query sub-commit from database. Added 'repository' and 'ownsSubCommits' fields in returning commits.
1493         * public/v3/components/expand-collapse-button.js: Added.
1494         (ExpandCollapseButton):
1495         (ExpandCollapseButton.prototype.didConstructShadowTree): Changes state on click and dispatches 'toggle' event.
1496         (ExpandCollapseButton.sizeFactor):
1497         (ExpandCollapseButton.buttonContent):
1498         (ExpandCollapseButton.cssTemplate):
1499         * public/v3/components/commit-log-viewer.js:
1500         (CommitLogViewer.prototype._renderCommitList): Added sub-commit viewer if two adjacent commits both have sub-commits.
1501         (CommitLogViewer.cssTemplate):
1502         * public/v3/components/sub-commit-viewer.js: Added.
1503         (SubCommitViewer): Added 'SubCommitViewer' class to represent the sub-commit differences between two given commits.`
1504         (SubCommitViewer.prototype.didConstructShadowTree): Makes 'expand-collapse' button listen to 'toggle' event.
1505         (SubCommitViewer.prototype._toggleVisibility): Updates UI once 'expand-collapse' button is clicked.
1506         (SubCommitViewer.prototype.render): Render sub-commit view based on the state.
1507         (SubCommitViewer.prototype._renderSubcommitTable): Generates sub-commits difference table entries.
1508         (SubCommitViewer.htmlTemplate):
1509         (SubCommitViewer.cssTemplate):
1510         * public/v3/index.html: Added 'sub-commit-viewer.js' and 'expand-collapse-button.js'.
1511         * public/v3/models/commit-log.js:
1512         (CommitLog): Added '_subCommits'.
1513         (CommitLog.prototype.updateSingleton): Updates 'rawData.ownsSubCommits' as well.
1514         (CommitLog.prototype.ownsSubCommits):
1515         (CommitLog.prototype.subCommits): Added. Returns sub-commits.
1516         (CommitLog.prototype.fetchSubCommits): Added. Fetches sub-commits if haven't fetched them before.
1517         (CommitLog.prototype._buildSubCommitMap): Added. Creates a map which maps repositories to commits.
1518         (CommitLog.diffSubCommits): Added. Finds difference between two given commits.
1519         (CommitLog.fetchBetweenRevisions): Updated due to '_constructFromRawData' change.
1520         (CommitLog.fetchForSingleRevision): Updated due to '_constructFromRawData' change.
1521         (CommitLog._constructFromRawData): Removed first argument 'repository' as it can be determined by calling 'Repository.findById'.
1522         * public/v3/models/repository.js:
1523         (Repository):
1524         (Repository.prototype.owner): Returns the owner id.
1525         (Repository.prototype.ownedRepositories): Returns a list of repositories owned by this repository.
1526         * server-tests/api-commits-tests.js: Added tests for 'sub-commits' filter.
1527         * server-tests/api-manifest-tests.js: Added a test.
1528         * unit-tests/commit-log-tests.js: Added tests for 'fetchSubCommits' and 'diffSubCommits'.
1529         * unit-tests/resources/mock-v3-models.js: Added 'ownerRepository' and 'ownedRepository'.
1530
1531 2017-04-11  Ryosuke Niwa  <rniwa@webkit.org>
1532
1533         Retrying an A/B testing does not set the repetition count in some cases
1534         https://bugs.webkit.org/show_bug.cgi?id=170695
1535
1536         Reviewed by Joseph Pecoraro.
1537
1538         When selecting an existing A/B test group, the analysis task page automatically sets the repetition count
1539         of its retry to be that of the original test group. However, this information wasn't being passed correctly
1540         to the code that actually created a test group. As a result, the retried test group's repetition count does
1541         not match that of the original group or the number shown to the user on UI.
1542
1543         Fixed the bug by updating this._repetitionCount in setRepetitionCount.
1544
1545         * browser-tests/index.html:
1546         * browser-tests/test-group-form-tests.js: Added. Added tests.
1547         (.createTestGroupFormWithContext): Added.
1548         * public/v3/components/test-group-form.js:
1549         (TestGroupForm.prototype.setRepetitionCount):
1550         (TestGroupForm.formContent):
1551         (TestGroupForm):
1552
1553 2017-04-10  Ryosuke Niwa  <rniwa@webkit.org>
1554
1555         Add the UI for scheduling a A/B testing with a custom root
1556         https://bugs.webkit.org/show_bug.cgi?id=170622
1557
1558         Reviewed by Anders Carlsson.
1559
1560         This patch adds the support for creating a new analysis task with a custom darwinup roots. A follow up patch
1561         would update the syncing script to schedule such an A/B testing job to a buildbot instance.
1562
1563
1564         * ReadMe.md: Updated instructions for backing up and restoring the database so that it's easier to replace
1565         the file path for the backup.
1566
1567         * init-database.sql: Make task_platform and task_metric optional in each analysis task. Also added a column
1568         to store the root file in commit_set_relationships.
1569
1570         * public/api/build-requests.php:
1571         (main): Include the uploaded files.
1572
1573         * public/api/commits.php:
1574         (main): Added the support for querying the latest commits for a given platform. This is used in a new page
1575         to create a custom analysis task to autofill the latest revisions for a given platform.
1576
1577         * public/api/test-groups.php:
1578         (main): Include the uploaded files.
1579
1580         * public/include/build-requests-fetcher.php:
1581         (BuildRequestsFetcher::__construct): Added a list of uploaded_files and a map from its id.
1582         (BuildRequestsFetcher::uploaded_files): Added.
1583         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Added the support for including custom roots' id in
1584         each commit set, and inserting its meta data in the list of uplaoded files.
1585
1586         * public/include/commit-log-fetcher.php:
1587         (CommitLogFetcher::fetch_latest_for_platform): Added. Finds the latest commit for a given platform. Ideally,
1588         we should be finding the latest commit for a given platform, but this is very slow so instead find the commit
1589         of the latest build for a given platform.
1590
1591         * public/privileged-api/create-test-group.php:
1592         (main): Added the support for creating an analysis task along with a group.
1593         (commit_sets_from_revision_sets): Added the support for custom roots. Verify the specified uploaded file exists
1594         and include it in commit_set_relationships. Because commits and upload files are stored in a different column
1595         in commit_set_relationships, this function now stores the information for each row of commit_set_relationships
1596         except the commit set ID, which is unknown until the set is created, instead of a commit ID.
1597         (ensure_commit_sets): Made the each entry in a commit set a row instead of a commit ID as done. As this format
1598         is only by v2 UI and detect-changes.js, we don't add the support for specifying custom roots here.
1599
1600         * public/privileged-api/upload-file.php:
1601         (main): Fixed a typo. Also added one more error check.
1602
1603         * public/v3/components/custom-analysis-task-configurator.js: Added. The UI for selecting a test, a platform,
1604         and a set of revisions, as well as custom roots for a custom A/B testing job. The first set of revision with
1605         custom roots is referred as "baseline", and the second configuration is referred as "comparison" in this class.
1606         (CustomAnalysisTaskConfigurator):
1607         (CustomAnalysisTaskConfigurator.prototype.tests): Added.
1608         (CustomAnalysisTaskConfigurator.prototype.platform): Added.
1609         (CustomAnalysisTaskConfigurator.prototype.commitSets): Added. Returns a pair of baseline and comparsion if both
1610         have been configured by the user.
1611         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): Added.
1612         (CustomAnalysisTaskConfigurator.prototype._configureComparison): Added. Called when the user is to configu the
1613         "comparison" configuration.
1614         (CustomAnalysisTaskConfigurator.prototype.render): Added.
1615         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Added. Renders the list of top-level tests
1616         that can be scheduled by a triggerable.
1617         (CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Added. Renders the list of platforms
1618         that can be schedule with the currently selected list of tests by a triggerable. Note that the current UI only
1619         lets the user select a single test but the intent is to allow multiple tests to be selected in the near future.
1620         (CustomAnalysisTaskConfigurator.prototype._buildCheckboxList): Added. Creates a list of radio boxes to select
1621         an item with a callback for each. It automatically sets "selected" class on the selected item. It's used to
1622         render both the list of tests and platforms.
1623         (CustomAnalysisTaskConfigurator.prototype._updateTriggerable): Added. Finds the triggerable for a given list of
1624         tests and platforms. Returns an error when some tests belong to another triggearalbe.
1625         (CustomAnalysisTaskConfigurator.prototype._updateRepositoryGroups): Added. Finds a repository group to use when
1626         the current triggerable has changed. We try to use the repository group of the same name if there is any, and
1627         defaults to the first repository group if there is none. This allows the set of repositories to be specified to
1628         more or less persist across different triggerables. For example, if iOS platforms and Mac platforms use two
1629         distinct triggerables , and both triggerables have two repository groups: one that only specify the OS and the
1630         other that specifies both teh OS and WebKit revision, then this code allows the choice the user had made to
1631         specify either just the OS or the OS and WebKit will be preserved when the user switches from an iOS platform
1632         to a Mac platform.
1633         (CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Added. Create a commit set map, the format that
1634         TestGroup.createWithTask accepts given "baseline" and "comparison" commit sets. Pretend "comparison" is not set
1635         if two sets are identical since it makes no sense to schedule an A/B testing job when A and B are identical.
1636         (CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Added. Creates a commit set using the revisions
1637         and the csutom roots the user had specified.
1638         (CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Added. Renders the pane to specify revisions
1639         and custom roots for "baseline" and "comparison".
1640         (CustomAnalysisTaskConfigurator.prototype._renderBaselineRevisionTable): Added.
1641         (CustomAnalysisTaskConfigurator.prototype._renderComparisonRevisionTable): Added.
1642         (CustomAnalysisTaskConfigurator.prototype._optionalRepositoryList): Added.
1643         (CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Added. Creates a table for specifying revisions
1644         and custom roots along with a list of repository groups to pick. The set of repositories and custom roots are
1645         shown at the all if all repository groups require them. Otherwise, they are grouped at the bottom as optional.
1646         (CustomAnalysisTaskConfigurator.prototype._buildRepositoryGroupList): Added.
1647         (CustomAnalysisTaskConfigurator.prototype._selectRepositoryGroup): Added.
1648         (CustomAnalysisTaskConfigurator.prototype._buildRevisionInput): Added. Creates an input element to specify
1649         a revision for a given repository. Autofills it with the latest commit for the currently selected platform if
1650         the user had not modified the field by the time the revisions are fetched.
1651         (CustomAnalysisTaskConfigurator.htmlTemplate): Added.
1652         (CustomAnalysisTaskConfigurator.cssTemplate): Added.
1653
1654         * public/v3/components/instant-file-uploader.js: Added. A form to upload a custom darwinup root in "baseline"
1655         or "comparison" configurations of CustomAnalysisTaskConfigurator. It's "instant" because it auto-detects when a
1656         file to be uploaded had already been uploaded elsewhere by checking its SHA-256 hash.
1657         (InstantFileUploader):
1658         (InstantFileUploader.prototype.hasFileToUpload): Added.
1659         (InstantFileUploader.prototype.uploadedFiles): Added.
1660         (InstantFileUploader.prototype.addUploadedFile): Added. It's called on the uploader for "comparison"
1661         configuration when the uploader for "baseline" configuration dipsatches "uploadedFile" action to automatically
1662         mirror the newly uploaded custom root to "comparision" configuration.
1663         (InstantFileUploader.prototype.didConstructShadowTree): Added.
1664         (InstantFileUploader.prototype.render): Added.
1665         (InstantFileUploader.prototype._renderUploadedFiles): Added. Renders the list of the uploaded files.
1666         (InstantFileUploader.prototype._renderPreuploadFiles): Added. Renders the list of the files to be uploaded with
1667         a progress bar.
1668         (InstantFileUploader.prototype._updateUploadStatus): Added. Updates the progress bar for uploading the file.
1669         (InstantFileUploader.prototype._formatUploadError): Added.
1670         (InstantFileUploader.prototype._didFileInputChange): Added. Called when the user picks a file to uploaded on
1671         the input element. Fetch the meta data for the uploaded file with the same SHA-256 hash if there is any, and
1672         start uploading the file if there isn't one.
1673         (InstantFileUploader.prototype._removeUploadedFile): Added.
1674         (InstantFileUploader.prototype._didUploadFile): Added. Move a file from the list of files to be uploaded to
1675         the list of uploaded files.
1676         (InstantFileUploader.htmlTemplate): Added.
1677         (InstantFileUploader.cssTemplate): Added.
1678
1679         * public/v3/index.html:
1680
1681         * public/v3/models/analysis-task.js:
1682         (AnalysisTask): Made platform and metric optional as it is now.
1683         (AnalysisTask.findByPlatformAndMetric): Skip analysis tasks without a platform or a metric.
1684         (AnalysisTask.prototype.isCustom): Added. Returns true for a custom analysis task.
1685         (AnalysisTask.fetchRelatedTasks): Skip custom analysis tasks.
1686         (AnalysisTask._constructAnalysisTasksFromRawData): Construct analysis tasks even if they were missing a metric
1687         or a platform instead of silently skipping them.
1688
1689         * public/v3/models/build-request.js:
1690         (BuildRequest.constructBuildRequestsFromData): Construct uploaded file objects returned by /api/build-requests.
1691
1692         * public/v3/models/commit-log.js:
1693         (CommitLog.fetchLatestCommitForPlatform): Added.
1694
1695         * public/v3/models/commit-set.js:
1696         (CommitSet): Added this._customRoots.
1697         (CommitSet.prototype.customRoots): Returns this._customRoots.
1698         (CommitSet.prototype.equals): Returns false when the set of custom roots are not equal.
1699         (CommitSet.areCustomRootsEqual): Added.
1700         (CustomCommitSet):
1701         (CustomCommitSet.prototype.equals): Added.
1702         (CustomCommitSet.prototype.customRoots): Added.
1703         (CustomCommitSet.prototype.addCustomRoot): Added.
1704
1705         * public/v3/models/manifest.js:
1706         (Manifest._didFetchManifest): Store fileUploadSizeLimit in the manifest as UploadedFile.fileUploadSizeLimit.
1707         This allows a file size check in the client size instead of uploading it to the server and receiving an error.
1708
1709         * public/v3/models/metric.js:
1710         (Metric.formatTime): Moved from ChartPaneStatusView to be also used by InstantFileUploader._renderUploadedFiles.
1711
1712         * public/v3/models/test-group.js:
1713         (TestGroup.prototype.createWithTask): Added.
1714         (TestGroup.prototype.createAndRefetchTestGroups):
1715         (TestGroup.prototype._revisionSetsFromCommitSets): Added. Extracted from createAndRefetchTestGroups.
1716         (TestGroup.prototype._fetchTestGroupsForTask): Added. Extracted from createAndRefetchTestGroups.
1717
1718         * public/v3/models/triggerable.js:
1719         (Triggerable.triggerablePlatformsForTests): Added.
1720         (Triggerable.sortByNamePreferringSmallerRepositories): Added.
1721
1722         * public/v3/models/uploaded-file.js:
1723         (UploadedFile.prototype.createdAt): Added.
1724         (UploadedFile.prototype.filename): Added.
1725         (UploadedFile.prototype.author): Added.
1726         (UploadedFile.prototype.size): Added.
1727         (UploadedFile.uploadFile): Added a client-side check for the file size using UploadedFile.fileUploadSizeLimit.
1728         (UploadedFile.fetchUnloadedFileWithIdenticalHash): Ditto. Also fixed a bug that 404 was resulting in a rejected
1729         promise instead of a resolved promise with null.
1730
1731         * public/v3/pages/analysis-category-page.js:
1732         (AnalysisCategoryPage.prototype._reconstructTaskList): Modernized the code. Added the support for platform and
1733         metric being null for some analysis tasks.
1734
1735         * public/v3/pages/analysis-task-page.js:
1736         (AnalysisTaskPage.prototype._didFetchTask): Don't fetch the measurement set or create a chart for custom tasks.
1737         (AnalysisTaskPage.prototype.render): Don't display the charts or the stacking table for custom tasks.
1738         (AnalysisTaskPage.prototype._renderTaskNameAndStatus): Don't try to show the full test name for custom tasks
1739         since it's not associated with exactly one pair.
1740
1741         * public/v3/pages/chart-pane-status-view.js:
1742         (ChartPaneStatusView.prototype._renderBuildRevisionTable):
1743         (ChartPaneStatusView.prototype._formatTime): Moved to Metric.formatTime.
1744
1745         * public/v3/pages/chart-pane.js:
1746         (ChartPane.prototype._analyzeRange): Set inProgress to true to hide CustomAnalysisTaskConfigurator in
1747         CreateAnalysisTaskPage when creating a non-custom analysis task for a specific range.
1748
1749         * public/v3/pages/create-analysis-task-page.js:
1750         (CreateAnalysisTaskPage): This page now shows CustomAnalysisTaskConfigurator by default, and lets a user create
1751         a custom analysis task by picking a test, a platform, and a set of revisions and custom darwinup roots.
1752         (CreateAnalysisTaskPage.prototype.updateFromSerializedState): Show a message when inProgress is set. This is
1753         the old behavior of this page.
1754         (CreateAnalysisTaskPage.prototype.didConstructShadowTree): Added.
1755         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Added.
1756         (CreateAnalysisTaskPage.prototype.render):
1757         (CreateAnalysisTaskPage.prototype._renderMessage): Added. Hides CustomAnalysisTaskConfigurator and the select
1758         element to specify the numebr of iterations when a message is set.
1759         (CreateAnalysisTaskPage.htmlTemplate):
1760         (CreateAnalysisTaskPage.cssTemplate):
1761
1762         * public/v3/pages/page-router.js:
1763         (PageRouter.prototype.route): Always enqueue the page to re-render when the route has changed.
1764
1765         * server-tests/api-build-requests-tests.js: Updated test cases now that the response contains a list of
1766         uploaded files associated with build requests.
1767
1768         * server-tests/privileged-api-create-test-group-tests.js: Added test cases for creating a custom analysis task
1769         and a test group with custom roots. 
1770
1771         * server-tests/resources/mock-data.js:
1772         (MockData.addMockData): Updated the mock data to satisfy new constraint on analysis-tasks table.
1773
1774         * tools/js/remote.js: Include global.FormData from form-data.js.
1775
1776         * unit-tests/build-request-tests.js:
1777         (sampleBuildRequestData): Updated the mock response.
1778         * unit-tests/buildbot-syncer-tests.js:
1779         (createSampleBuildRequest): Ditto.
1780         * unit-tests/test-groups-tests.js:
1781         (sampleTestGroup): Ditto.
1782
1783 2017-04-10  Commit Queue  <commit-queue@webkit.org>
1784
1785         Unreviewed, rolling out r215202.
1786         https://bugs.webkit.org/show_bug.cgi?id=170694
1787
1788         Committed incorrectly (Requested by rniwa on #webkit).
1789
1790         Reverted changeset:
1791
1792         "Add the UI for scheduling a A/B testing with a custom root"
1793         https://bugs.webkit.org/show_bug.cgi?id=170622
1794         http://trac.webkit.org/changeset/215202
1795
1796 2017-04-10  Ryosuke Niwa  <rniwa@webkit.org>
1797
1798         Add the UI for scheduling a A/B testing with a custom root
1799         https://bugs.webkit.org/show_bug.cgi?id=170622
1800
1801         Reviewed by Anders Carlsson.
1802
1803         This patch adds the support for creating a new analysis task with a custom darwinup roots. A follow up patch
1804         would update the syncing script to schedule such an A/B testing job to a buildbot instance.
1805
1806
1807         * ReadMe.md: Updated instructions for backing up and restoring the database so that it's easier to replace
1808         the file path for the backup.
1809
1810         * init-database.sql: Make task_platform and task_metric optional in each analysis task. Also added a column
1811         to store the root file in commit_set_relationships.
1812
1813         * public/api/build-requests.php:
1814         (main): Include the uploaded files.
1815
1816         * public/api/commits.php:
1817         (main): Added the support for querying the latest commits for a given platform. This is used in a new page
1818         to create a custom analysis task to autofill the latest revisions for a given platform.
1819
1820         * public/api/test-groups.php:
1821         (main): Include the uploaded files.
1822
1823         * public/include/build-requests-fetcher.php:
1824         (BuildRequestsFetcher::__construct): Added a list of uploaded_files and a map from its id.
1825         (BuildRequestsFetcher::uploaded_files): Added.
1826         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Added the support for including custom roots' id in
1827         each commit set, and inserting its meta data in the list of uplaoded files.
1828
1829         * public/include/commit-log-fetcher.php:
1830         (CommitLogFetcher::fetch_latest_for_platform): Added. Finds the latest commit for a given platform. Ideally,
1831         we should be finding the latest commit for a given platform, but this is very slow so instead find the commit
1832         of the latest build for a given platform.
1833
1834         * public/privileged-api/create-test-group.php:
1835         (main): Added the support for creating an analysis task along with a group.
1836         (commit_sets_from_revision_sets): Added the support for custom roots. Verify the specified uploaded file exists
1837         and include it in commit_set_relationships. Because commits and upload files are stored in a different column
1838         in commit_set_relationships, this function now stores the information for each row of commit_set_relationships
1839         except the commit set ID, which is unknown until the set is created, instead of a commit ID.
1840         (ensure_commit_sets): Made the each entry in a commit set a row instead of a commit ID as done. As this format
1841         is only by v2 UI and detect-changes.js, we don't add the support for specifying custom roots here.
1842
1843         * public/privileged-api/upload-file.php:
1844         (main): Fixed a typo. Also added one more error check.
1845
1846         * public/v3/components/custom-analysis-task-configurator.js: Added. The UI for selecting a test, a platform,
1847         and a set of revisions, as well as custom roots for a custom A/B testing job. The first set of revision with
1848         custom roots is referred as "baseline", and the second configuration is referred as "comparison" in this class.
1849         (CustomAnalysisTaskConfigurator):
1850         (CustomAnalysisTaskConfigurator.prototype.tests): Added.
1851         (CustomAnalysisTaskConfigurator.prototype.platform): Added.
1852         (CustomAnalysisTaskConfigurator.prototype.commitSets): Added. Returns a pair of baseline and comparsion if both
1853         have been configured by the user.
1854         (CustomAnalysisTaskConfigurator.prototype.didConstructShadowTree): Added.
1855         (CustomAnalysisTaskConfigurator.prototype._configureComparison): Added. Called when the user is to configu the
1856         "comparison" configuration.
1857         (CustomAnalysisTaskConfigurator.prototype.render): Added.
1858         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Added. Renders the list of top-level tests
1859         that can be scheduled by a triggerable.
1860         (CustomAnalysisTaskConfigurator.prototype._renderTriggerablePlatforms): Added. Renders the list of platforms
1861         that can be schedule with the currently selected list of tests by a triggerable. Note that the current UI only
1862         lets the user select a single test but the intent is to allow multiple tests to be selected in the near future.
1863         (CustomAnalysisTaskConfigurator.prototype._buildCheckboxList): Added. Creates a list of radio boxes to select
1864         an item with a callback for each. It automatically sets "selected" class on the selected item. It's used to
1865         render both the list of tests and platforms.
1866         (CustomAnalysisTaskConfigurator.prototype._updateTriggerable): Added. Finds the triggerable for a given list of
1867         tests and platforms. Returns an error when some tests belong to another triggearalbe.
1868         (CustomAnalysisTaskConfigurator.prototype._updateRepositoryGroups): Added. Finds a repository group to use when
1869         the current triggerable has changed. We try to use the repository group of the same name if there is any, and
1870         defaults to the first repository group if there is none. This allows the set of repositories to be specified to
1871         more or less persist across different triggerables. For example, if iOS platforms and Mac platforms use two
1872         distinct triggerables , and both triggerables have two repository groups: one that only specify the OS and the
1873         other that specifies both teh OS and WebKit revision, then this code allows the choice the user had made to
1874         specify either just the OS or the OS and WebKit will be preserved when the user switches from an iOS platform
1875         to a Mac platform.
1876         (CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Added. Create a commit set map, the format that
1877         TestGroup.createWithTask accepts given "baseline" and "comparison" commit sets. Pretend "comparison" is not set
1878         if two sets are identical since it makes no sense to schedule an A/B testing job when A and B are identical.
1879         (CustomAnalysisTaskConfigurator.prototype._computeCommitSet): Added. Creates a commit set using the revisions
1880         and the csutom roots the user had specified.
1881         (CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Added. Renders the pane to specify revisions
1882         and custom roots for "baseline" and "comparison".
1883         (CustomAnalysisTaskConfigurator.prototype._renderBaselineRevisionTable): Added.
1884         (CustomAnalysisTaskConfigurator.prototype._renderComparisonRevisionTable): Added.
1885         (CustomAnalysisTaskConfigurator.prototype._optionalRepositoryList): Added.
1886         (CustomAnalysisTaskConfigurator.prototype._buildRevisionTable): Added. Creates a table for specifying revisions
1887         and custom roots along with a list of repository groups to pick. The set of repositories and custom roots are
1888         shown at the all if all repository groups require them. Otherwise, they are grouped at the bottom as optional.
1889         (CustomAnalysisTaskConfigurator.prototype._buildRepositoryGroupList): Added.
1890         (CustomAnalysisTaskConfigurator.prototype._selectRepositoryGroup): Added.
1891         (CustomAnalysisTaskConfigurator.prototype._buildRevisionInput): Added. Creates an input element to specify
1892         a revision for a given repository. Autofills it with the latest commit for the currently selected platform if
1893         the user had not modified the field by the time the revisions are fetched.
1894         (CustomAnalysisTaskConfigurator.htmlTemplate): Added.
1895         (CustomAnalysisTaskConfigurator.cssTemplate): Added.
1896
1897         * public/v3/components/instant-file-uploader.js: Added. A form to upload a custom darwinup root in "baseline"
1898         or "comparison" configurations of CustomAnalysisTaskConfigurator. It's "instant" because it auto-detects when a
1899         file to be uploaded had already been uploaded elsewhere by checking its SHA-256 hash.
1900         (InstantFileUploader):
1901         (InstantFileUploader.prototype.hasFileToUpload): Added.
1902         (InstantFileUploader.prototype.uploadedFiles): Added.
1903         (InstantFileUploader.prototype.addUploadedFile): Added. It's called on the uploader for "comparison"
1904         configuration when the uploader for "baseline" configuration dipsatches "uploadedFile" action to automatically
1905         mirror the newly uploaded custom root to "comparision" configuration.
1906         (InstantFileUploader.prototype.didConstructShadowTree): Added.
1907         (InstantFileUploader.prototype.render): Added.
1908         (InstantFileUploader.prototype._renderUploadedFiles): Added. Renders the list of the uploaded files.
1909         (InstantFileUploader.prototype._renderPreuploadFiles): Added. Renders the list of the files to be uploaded with
1910         a progress bar.
1911         (InstantFileUploader.prototype._updateUploadStatus): Added. Updates the progress bar for uploading the file.
1912         (InstantFileUploader.prototype._formatUploadError): Added.
1913         (InstantFileUploader.prototype._didFileInputChange): Added. Called when the user picks a file to uploaded on
1914         the input element. Fetch the meta data for the uploaded file with the same SHA-256 hash if there is any, and
1915         start uploading the file if there isn't one.
1916         (InstantFileUploader.prototype._removeUploadedFile): Added.
1917         (InstantFileUploader.prototype._didUploadFile): Added. Move a file from the list of files to be uploaded to
1918         the list of uploaded files.
1919         (InstantFileUploader.htmlTemplate): Added.
1920         (InstantFileUploader.cssTemplate): Added.
1921
1922         * public/v3/index.html:
1923
1924         * public/v3/models/analysis-task.js:
1925         (AnalysisTask): Made platform and metric optional as it is now.
1926         (AnalysisTask.findByPlatformAndMetric): Skip analysis tasks without a platform or a metric.
1927         (AnalysisTask.prototype.isCustom): Added. Returns true for a custom analysis task.
1928         (AnalysisTask.fetchRelatedTasks): Skip custom analysis tasks.
1929         (AnalysisTask._constructAnalysisTasksFromRawData): Construct analysis tasks even if they were missing a metric
1930         or a platform instead of silently skipping them.
1931
1932         * public/v3/models/build-request.js:
1933         (BuildRequest.constructBuildRequestsFromData): Construct uploaded file objects returned by /api/build-requests.
1934
1935         * public/v3/models/commit-log.js:
1936         (CommitLog.fetchLatestCommitForPlatform): Added.
1937
1938         * public/v3/models/commit-set.js:
1939         (CommitSet): Added this._customRoots.
1940         (CommitSet.prototype.customRoots): Returns this._customRoots.
1941         (CommitSet.prototype.equals): Returns false when the set of custom roots are not equal.
1942         (CommitSet.areCustomRootsEqual): Added.
1943         (CustomCommitSet):
1944         (CustomCommitSet.prototype.equals): Added.
1945         (CustomCommitSet.prototype.customRoots): Added.
1946         (CustomCommitSet.prototype.addCustomRoot): Added.
1947
1948         * public/v3/models/manifest.js:
1949         (Manifest._didFetchManifest): Store fileUploadSizeLimit in the manifest as UploadedFile.fileUploadSizeLimit.
1950         This allows a file size check in the client size instead of uploading it to the server and receiving an error.
1951
1952         * public/v3/models/metric.js:
1953         (Metric.formatTime): Moved from ChartPaneStatusView to be also used by InstantFileUploader._renderUploadedFiles.
1954
1955         * public/v3/models/test-group.js:
1956         (TestGroup.prototype.createWithTask): Added.
1957         (TestGroup.prototype.createAndRefetchTestGroups):
1958         (TestGroup.prototype._revisionSetsFromCommitSets): Added. Extracted from createAndRefetchTestGroups.
1959         (TestGroup.prototype._fetchTestGroupsForTask): Added. Extracted from createAndRefetchTestGroups.
1960
1961         * public/v3/models/triggerable.js:
1962         (Triggerable.triggerablePlatformsForTests): Added.
1963         (Triggerable.sortByNamePreferringSmallerRepositories): Added.
1964
1965         * public/v3/models/uploaded-file.js:
1966         (UploadedFile.prototype.createdAt): Added.
1967         (UploadedFile.prototype.filename): Added.
1968         (UploadedFile.prototype.author): Added.
1969         (UploadedFile.prototype.size): Added.
1970         (UploadedFile.uploadFile): Added a client-side check for the file size using UploadedFile.fileUploadSizeLimit.
1971         (UploadedFile.fetchUnloadedFileWithIdenticalHash): Ditto. Also fixed a bug that 404 was resulting in a rejected
1972         promise instead of a resolved promise with null.
1973
1974         * public/v3/pages/analysis-category-page.js:
1975         (AnalysisCategoryPage.prototype._reconstructTaskList): Modernized the code. Added the support for platform and
1976         metric being null for some analysis tasks.
1977
1978         * public/v3/pages/analysis-task-page.js:
1979         (AnalysisTaskPage.prototype._didFetchTask): Don't fetch the measurement set or create a chart for custom tasks.
1980         (AnalysisTaskPage.prototype.render): Don't display the charts or the stacking table for custom tasks.
1981         (AnalysisTaskPage.prototype._renderTaskNameAndStatus): Don't try to show the full test name for custom tasks
1982         since it's not associated with exactly one pair.
1983
1984         * public/v3/pages/chart-pane-status-view.js:
1985         (ChartPaneStatusView.prototype._renderBuildRevisionTable):
1986         (ChartPaneStatusView.prototype._formatTime): Moved to Metric.formatTime.
1987
1988         * public/v3/pages/chart-pane.js:
1989         (ChartPane.prototype._analyzeRange): Set inProgress to true to hide CustomAnalysisTaskConfigurator in
1990         CreateAnalysisTaskPage when creating a non-custom analysis task for a specific range.
1991
1992         * public/v3/pages/create-analysis-task-page.js:
1993         (CreateAnalysisTaskPage): This page now shows CustomAnalysisTaskConfigurator by default, and lets a user create
1994         a custom analysis task by picking a test, a platform, and a set of revisions and custom darwinup roots.
1995         (CreateAnalysisTaskPage.prototype.updateFromSerializedState): Show a message when inProgress is set. This is
1996         the old behavior of this page.
1997         (CreateAnalysisTaskPage.prototype.didConstructShadowTree): Added.
1998         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup): Added.
1999         (CreateAnalysisTaskPage.prototype.render):
2000         (CreateAnalysisTaskPage.prototype._renderMessage): Added. Hides CustomAnalysisTaskConfigurator and the select
2001         element to specify the numebr of iterations when a message is set.
2002         (CreateAnalysisTaskPage.htmlTemplate):
2003         (CreateAnalysisTaskPage.cssTemplate):
2004
2005         * public/v3/pages/page-router.js:
2006         (PageRouter.prototype.route): Always enqueue the page to re-render when the route has changed.
2007
2008         * server-tests/api-build-requests-tests.js: Updated test cases now that the response contains a list of
2009         uploaded files associated with build requests.
2010         *server-tests/api-commits-tests.js: Added a test case for /api/commits/<repository-name>/latest?platform=X.
2011         * server-tests/privileged-api-create-test-group-tests.js: Added test cases for creating a custom analysis task
2012         and a test group with custom roots. 
2013         * server-tests/resources/mock-data.js:
2014         (MockData.addMockData): Updated the mock data to satisfy new constraint on analysis-tasks table. Also inserted
2015         more commits, builds, and build_commits rows for testing /api/commits/<repository-name>/latest?platform=X.
2016
2017         * tools/js/remote.js: Include global.FormData from form-data.js.
2018
2019         * unit-tests/analysis-task-tests.js: Added a test for calling findByPlatformAndMetric when there is a custom
2020         analysis task.
2021         (sampleAnalysisTask): Removed the category since /api/analysis-tasks/ no longer generate this property.
2022         (sampleCustomAnalysisTask): Added.
2023         * unit-tests/build-request-tests.js:
2024         (sampleBuildRequestData): Updated the mock response. Added a test case for fetcing custom roots.
2025         * unit-tests/buildbot-syncer-tests.js:
2026         (createSampleBuildRequest): Ditto.
2027         * unit-tests/test-groups-tests.js:
2028         (sampleTestGroup): Ditto.
2029
2030 2017-04-07  Ryosuke Niwa  <rniwa@webkit.org>
2031
2032         Make cycler page scroll down when a dashboard is too tall for the current viewport size
2033         https://bugs.webkit.org/show_bug.cgi?id=170588
2034
2035         Rubber-stamped by Chris Dumez.
2036
2037         Updated the cycler page to scroll down smoothly over 500ms and scroll up again before moving to the next page
2038         when a dashboard page is too tall to be shown at once. For now, we assume that each dashboard's height is no
2039         more than 2x the height of the viewport.
2040
2041         * public/cycler.html:
2042
2043 2017-04-06  Ryosuke Niwa  <rniwa@webkit.org>
2044
2045         Each build request should be associated with a repository group
2046         https://bugs.webkit.org/show_bug.cgi?id=170528
2047
2048         Rubber-stamped by Chris Dumez.
2049
2050         Make the buildbot syncing script use the concept of repository groups so that each repository group can post
2051         a different set of properties to buildbot. In order to do this, we associate each build request with
2052         a repository group to use. Each triggerable's repository groups is now updated by the syncing scripts via
2053         /api/update-triggerable just the same way the set of the supported platform, test pairs are updated.
2054
2055         Each repository group specifies the list of repositories, a dictionary that maps the buildbot property name
2056         to either a string value or a repository name enclosed in < and >:
2057
2058         ```js
2059         "repositoryGroups": {
2060             "webkit-svn": {
2061                 "repositories": ["WebKit", "macOS"],
2062                 "properties": {"os": "<macOS>", "wk": "<WebKit>"}
2063             }
2064         }
2065         ```
2066
2067         With this, removed the support for specifying a repository to use in generic dictionary of properties via
2068         a dictionary with a single key of "root", "rootOptions", and "rootsExcluding". We now validate that the list of
2069         repositories in each repository group matches exactly the ones used in buildbot properties as well as ones in
2070         build requests.
2071
2072         After this patch, sync-with-buildbot.js will no longer schedule a build request without a repository group.
2073         Run the appropriate database queries to set the repository group on each build request. Because of this change,
2074         this patch also makes BuildbotTriggerable.prototype.syncOnce more robust against invalid build requests.
2075         Instead of throwing an exception and exiting early, it simply skips all build requests that belong to the same
2076         test group if the next build request to be scheduled does not specify a repository group.
2077
2078         * init-database.sql: Add request_repository_group column to build_requests table, and a unique constraint for
2079         repository and group pair in triggerable_repositories table.
2080
2081         * public/api/update-triggerable.php:
2082         (main): Validate and insert repository groups.
2083         (validate_configurations): Extracted from main.
2084         (validate_repository_groups): Added.
2085
2086         * public/v3/models/repository.js:
2087         (Repository.findTopLevelByName): Added.
2088
2089         * public/include/build-requests-fetcher.php:
2090         (BuildRequestsFetcher::results_internal): Include the repository group of each request in the JSON response.
2091
2092         * public/include/repository-group-finder.php: Added. A helper class to find the repository group for a given
2093         triggerable for a list of repositories.
2094         (RepositoryGroupFinder): Added. 
2095         (RepositoryGroupFinder::__construct): Added.
2096         (RepositoryGroupFinder::find_by_repositories): Added.
2097         (RepositoryGroupFinder::populate_map): Added.
2098
2099         * public/privileged-api/create-test-group.php:
2100         (main): Each element in an array returned by ensure_commit_sets and commit_sets_from_revision_sets now contains
2101         "set", the list of commit IDs, and "repository_group", the repository group identified for each commit set.
2102         Use that to set the repository group in each new build request. 
2103         (commit_sets_from_revision_sets): Use RepositoryGroupFinder to find the right repository group.
2104         (ensure_commit_sets): Ditto. There is no need to find a repository group for each commit set here since its
2105         argument is keyed by the repository name. e.g. {"WebKit": [123, 456], "macOS": ["16A323", "16A323"]}
2106
2107         * public/v3/models/build-request.js:
2108         (BuildRequest):
2109         (BuildRequest.prototype.triggerable): Added.
2110         (BuildRequest.prototype.repositoryGroup): Added.
2111         (BuildRequest.constructBuildRequestsFromData): Resolve the triggerable and the repository group.
2112
2113         * public/v3/models/triggerable.js:
2114         (Triggerable.prototype.name): Added.
2115         (Triggerable.prototype.acceptedRepositories): Deleted.
2116         (TriggerableRepositoryGroup):
2117         (TriggerableRepositoryGroup.prototype.accepts): Added. Retruns true if the repository group
2118
2119         * server-tests/api-build-requests-tests.js: Added a test for getting the repository group of a build request.
2120         * server-tests/api-manifest-tests.js: Added assertions for the repository groups.
2121         * server-tests/api-report-tests.js:
2122         (.emptyReport):
2123         (.reportWithTwoLevelsOfAggregations):
2124         * server-tests/api-update-triggerable.js: Added test cases for updating the repository groups associated with
2125         a triggerable.
2126         (.updateWithOSXRepositoryGroup):
2127         (.mapRepositoriesByGroup):
2128         * server-tests/privileged-api-create-test-group-tests.js:
2129         (addTriggerableAndCreateTask): Add two repository groups for testing. Added assertions for repository groups
2130         in existing test cases, and added a test case for creating a test group with two different repository groups.
2131
2132         * server-tests/resources/mock-data.js:
2133         (MockData.resetV3Models): Reset TriggerableRepositoryGroup's static maps.
2134         (MockData.emptyTriggeragbleId): Added.
2135         (MockData.macosRepositoryId): Added.
2136         (MockData.webkitRepositoryId): Added.
2137         (MockData.gitWebkitRepositoryId): Added.
2138         (MockData.addMockData): Create repository groups as needed. Renamed the "OS X" repository to "macOS" since some
2139         tests were using the latter, and now we need mock data to be consistent across tests due to stricter checks.
2140         (MockData.addEmptyTriggerable): Added. Used in api-update-triggerable.js.
2141         (MockData.addMockTestGroupWithGitWebKit): Added. Used in api-build-requests-tests.js.
2142         (MockData.addAnotherMockTestGroup): Cleanup.
2143         (MockData.mockTestSyncConfigWithSingleBuilder): Updated the mock configuration per code changes.
2144         (MockData.mockTestSyncConfigWithTwoBuilders): Ditto.
2145
2146         * server-tests/tools-buildbot-triggerable-tests.js: Updated a test case testing /api/update-triggerable to test
2147         updating the set of repository groups in addition to the set of test, platform pairs.
2148         (.refetchManifest): Added.
2149
2150         * tools/js/buildbot-syncer.js:
2151         (BuildbotSyncer): Now takes a set of configurations shared across syncers: repositoryGroups, slaveArgument,
2152         and buildRequestArgument as the third argument.
2153         (BuildbotSyncer.prototype.repositoryGroups): Added.
2154         (BuildbotSyncer.prototype._testGroupMapForBuildRequests): Cleaned up the code to use Array.prototype.find.
2155         Also added an assertion that the build request is associated with a repository group.
2156         (BuildbotSyncer.prototype._propertiesForBuildRequest): Removed the support for using an arbitary property to
2157         specify a revision in favor of explicity listing each property and repository name in a repository group.
2158         (BuildbotSyncer._loadConfig): Removed the support for "shared", which specified the set of buildbot properties
2159         shared across syncers, the name of properties which specifies the build slave name and build request ID. These
2160         values are not stored as top-level properties and superseded by the concept of repository groups.
2161         (BuildbotSyncer._parseRepositoryGroup): Parses and validates repository groups.
2162         (BuildbotSyncer._createTestConfiguration): We no longer expect each configuration to specify a dictionary of
2163         properties or buildRequestArgument (often inherited from shared).
2164         (BuildbotSyncer._validateAndMergeConfig): Removed "slaveArgument" and "buildRequestArgument" from the list of
2165         allowed proeprties in each configuration now that they're specified as top-level properties.
2166
2167         * tools/js/buildbot-triggerable.js:
2168         (BuildbotTriggerable.prototype.updateTriggerable): Update the associated repository groups.
2169         (BuildbotTriggerable.prototype.syncOnce): Skip test groups for which the next build request to be scheduled is
2170         not included in the list of valid build requests.
2171         (BuildbotTriggerable.prototype._validateRequests): Now returns the list of valid build requests, which excludes
2172         those that lack a repository group set.
2173         (BuildbotTriggerable.prototype._nextRequestInGroup): Extracted from _scheduleRequestIfSlaveIsAvailable. Finds
2174         the next build request to be scheduled for the test group.
2175         (BuildbotTriggerable.prototype._scheduleRequestIfSlaveIsAvailable): Renamed from
2176         _scheduleNextRequestInGroupIfSlaveIsAvailable. Now takes the syncer and the slave name as arguments instead of
2177         a test group information since syncOnce now calls _nextRequestInGroup to find the next build request.
2178
2179         * tools/js/v3-models.js:
2180
2181         * unit-tests/build-request-tests.js: Fixed the test name.
2182
2183         * unit-tests/buildbot-syncer-tests.js: Removed tests for "rootOptions" and "rootsExcluding", and added tests
2184         for parsing repository groups.
2185         (sampleiOSConfig): Updated the mock configuration per code changes.
2186         (sampleiOSConfigWithExpansions): Ditto.
2187         (smallConfiguration): Ditto. Now returns the entire configuration instead of a single builder configuration.
2188         Various test cases have been updated to reflect this.
2189         (createSampleBuildRequest): Removed the git hash of WebKit to match the repository groups listed in the mock
2190         configurations. The git hash was there to test "rootOptions", which this patch removed.
2191         (samplePendingBuild): Removed "root_dict" from the list of properties. This was used to test "rootsExcluding"
2192         which, again, this patch removed.
2193         (sampleInProgressBuild): Ditto.
2194         (sampleFinishedBuild): Ditto.
2195
2196         * unit-tests/resources/mock-v3-models.js:
2197         (MockModels.inject): Added ock repository groups so that existing tests will continue to function.
2198
2199 2017-04-05  Ryosuke Niwa  <rniwa@webkit.org>
2200
2201         Introduce the notion of repository groups to triggerables
2202         https://bugs.webkit.org/show_bug.cgi?id=170228
2203
2204         Reviewed by Chris Dumez.
2205
2206         On some triggerable, it's desirable to specify multiple sets of repositories that are accepted.
2207
2208         For example, if a repository X transitioned from Subversion to Git, and if a triggerable accepted X and
2209         some other repository Y, then it's desirable to two sets: (X-Subversion, Y) and (X-Git, Y) since neither
2210         (X-Subversion, X-Git) nor (X-Subversion, X-Git, Y) makes sense as a set.
2211
2212         This patch introduces triggerable_repository_groups table to represent a set of repositories accepted by
2213         a triggerable. It has many to one relationship to build_triggerables and triggerable_repositories in turn
2214         now has many to one relationship to triggerable_repository_groups instead of build_triggerables.
2215
2216         Also make it possible to disable a triggerable e.g. a set of tests and platforms are no longer supported.
2217         We don't want to delete the triggerable completely from the database since it would result in the associated
2218         A/B testing results being purged, which is not desirale.
2219
2220         To migrate an existing database, run the following transaction:
2221         ```sql
2222         BEGIN;
2223         ALTER TABLE build_triggerables ADD COLUMN triggerable_disabled boolean NOT NULL DEFAULT FALSE;
2224
2225         CREATE TABLE triggerable_repository_groups (
2226             repositorygroup_id serial PRIMARY KEY,
2227             repositorygroup_triggerable integer REFERENCES build_triggerables NOT NULL,
2228             repositorygroup_name varchar(256) NOT NULL,
2229             repositorygroup_description varchar(256),
2230             repositorygroup_accepts_roots boolean NOT NULL DEFAULT FALSE,
2231             CONSTRAINT repository_group_name_must_be_unique_for_triggerable
2232                 UNIQUE(repositorygroup_triggerable, repositorygroup_name));
2233         INSERT INTO triggerable_repository_groups (repositorygroup_triggerable, repositorygroup_name)
2234             SELECT triggerable_id, 'default' FROM build_triggerables;
2235
2236         ALTER TABLE triggerable_repositories ADD COLUMN trigrepo_group integer REFERENCES triggerable_repository_groups;
2237         UPDATE triggerable_repositories SET trigrepo_group = repositorygroup_id FROM triggerable_repository_groups
2238             WHERE trigrepo_triggerable = repositorygroup_triggerable;
2239         ALTER TABLE triggerable_repositories ALTER COLUMN trigrepo_group SET NOT NULL;
2240
2241         ALTER TABLE triggerable_repositories DROP COLUMN trigrepo_triggerable;
2242         ALTER TABLE triggerable_repositories DROP COLUMN trigrepo_sub_roots;
2243         END;
2244         ```
2245
2246         * init-database.sql:
2247         * public/admin/triggerables.php: Use a custom column to make forms to add and configure repository groups.
2248         (insert_triggerable_repositories): Added.
2249         (generate_repository_list): Added.
2250         (generate_repository_form): Added.
2251         (generate_repository_checkboxes): Now generates checkboxes for a repository group instead of a triggerable.
2252
2253         * public/include/manifest-generator.php:
2254         (fetch_triggerables): Fixed the bug that we were not filtering results with query in /api/triggerable.
2255         Rewrote it to include an array of repository groups, which in turn contains an array of repositories along
2256         with its name and a description, and a boolean indicating whether it accepts a custom root file or not.
2257         The boolean will be used when we're adding the support for perf try bots. We will keep acceptedRepositories
2258         since it's still used by detect-changes.js.
2259
2260         * public/v3/models/manifest.js:
2261         (Manifest._didFetchManifest): Resolve repositoriy, test, and platform IDs to their respective objects.
2262
2263         * public/v3/models/triggerable.js:
2264         (Triggerable):
2265         (Triggerable.prototype.isDisabled): Added.
2266         (Triggerable.prototype.repositoryGroups): Added.
2267         (Triggerable.prototype.acceptsTest): Added.
2268         (TriggerableRepositoryGroup): Added.
2269         (TriggerableRepositoryGroup.prototype.description): Added.
2270         (TriggerableRepositoryGroup.prototype.acceptsCustomRoots): Added.
2271         (TriggerableRepositoryGroup.prototype.repositories): Added.
2272
2273         * public/v3/pages/analysis-task-page.js:
2274         (AnalysisTaskPage.prototype._didFetchTask): Don't use a disabled triggerable.
2275
2276         * server-tests/api-manifest-tests.js: Updated a test case to test repository groups.
2277
2278         * tools/js/database.js:
2279         (tableToPrefixMap): Added triggerable_repository_groups.
2280
2281         * tools/js/v3-models.js: Imported TriggerableRepositoryGroup from triggerable.js.
2282
2283 2017-03-31  Ryosuke Niwa  <rniwa@webkit.org>
2284
2285         Build fix. For OS versions, we can end up with non-alphanumeric revision.
2286         Delete the code path only used by the v2 UI since nobody uses that now.
2287
2288         * public/api/commits.php:
2289         (main):
2290
2291 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2292
2293         sync-buildbot.js can schedule more than one build per builder
2294         https://bugs.webkit.org/show_bug.cgi?id=170318
2295
2296         Reviewed by Saam Barati.
2297
2298         The bug was caused by _scheduleNextRequestInGroupIfSlaveIsAvailable not returning a promise when
2299         scheduling the first build request of a test group. This resulted in _pullBuildbotOnAllSyncers
2300         to prematurely resolve before POST'ing new build had finished. That in turn could result in the
2301         next cycle of syncing to occur before POST'ing has actually taken place.
2302
2303         More precisely, when the nextRequest was the first request or its associated syncer object could
2304         not be identified, we were supposed to find the first available syncer, schedule the request,
2305         and then return the promise returned by scheduleRequestInGroupIfAvailable. However, the for loop
2306         which called scheduleRequestInGroupIfAvailable on every syncer was declaring its own variable
2307         named "promise" thereby shadowing the outer variable, which is returned to the caller.
2308
2309         Fixed the bug by not declaring a shadowing variable, and refactored the code. Namely, the only
2310         reason we had such a complicated logic with two local variables, promise and syncer, was so that
2311         we could log that we're scheduling a build. Extracted this code as _scheduleRequestWithLog.
2312
2313         _scheduleNextRequestInGroupIfSlaveIsAvailable can now simply exit early with a call to
2314         _scheduleRequestWithLog when the syncer is readily identified. When looping over syncers, it can
2315         simply return the first non-null result of _scheduleNextRequestInGroupIfSlaveIsAvailable.
2316
2317         * server-tests/tools-buildbot-triggerable-tests.js: Added a test case where we wait 10ms after
2318         receiving the request to POST a build. There should be no new network request until we resolve
2319         this request.
2320
2321         * tools/js/buildbot-triggerable.js:
2322         (BuildbotTriggerable.prototype._scheduleNextRequestInGroupIfSlaveIsAvailable): Fixed the bug.
2323         (BuildbotTriggerable.prototype._scheduleRequestWithLog): Extracted.
2324
2325 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2326
2327         Modernize BuildbotSyncer and BuildbotTriggerable
2328         https://bugs.webkit.org/show_bug.cgi?id=170310
2329
2330         Reviewed by Chris Dumez.
2331
2332         Modernized the code to use arrow functions and other modern idoms in ES2016.
2333
2334         * ReadMe.md: Added instructions on how to run tests, and moved the steps to configure postgres
2335         above the steps to configure Apache since only the former is needed to run tests.
2336         * tools/js/buildbot-syncer.js:
2337         * tools/js/buildbot-triggerable.js:
2338
2339 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2340
2341         Yet another build fix after r214502. Workaround webkit.org/b/169907 for now.
2342
2343         * public/v3/pages/analysis-task-page.js:
2344         (AnalysisTaskPage.cssTemplate):
2345
2346 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2347
2348         Revert an erronously change in the previous commit.
2349
2350         * public/v3/components/base.js:
2351
2352 2017-03-30  Ryosuke Niwa  <rniwa@webkit.org>
2353
2354         Build fix after r214280. Don't render components until its element is inserted into a document.
2355
2356         * public/v3/components/base.js:
2357         (ComponentBase):
2358
2359 2017-03-29  Ryosuke Niwa  <rniwa@webkit.org>
2360
2361         Another build fix after r214502.
2362
2363         * public/v3/components/analysis-results-viewer.js:
2364         (AnalysisResultsViewer.prototype.render): this._groupToCellMap.get may not contain the cell when startPoint
2365         or metric had not been fetched yet even if currentTestGroup is set.
2366
2367 2017-03-29  Ryosuke Niwa  <rniwa@webkit.org>
2368
2369         Build fix after r214502. Analysis tasks without any test groups are throwing exceptions.
2370
2371         * public/v3/components/results-table.js:
2372         (ResultsTable.prototype.renderTable): Don't show the header row when there are no content to show. 
2373         (ResultsTable.prototype._computeRepositoryList): Return a pair of arrays. The caller expects the repository
2374         list to be an array, not undefined.
2375
2376 2017-03-28  Ryosuke Niwa  <rniwa@webkit.org>
2377
2378         Modernize AnalysisTaskPage
2379         https://bugs.webkit.org/show_bug.cgi?id=170165
2380
2381         Reviewed by Antti Koivisto.
2382
2383         Modernized AnalysisTaskPage and related components. The main refactoring happened in AnalysisTaskPage
2384         from which AnalysisTaskResultsPane and AnalysisTaskTestGroupPane have been extracted.
2385
2386         Decoupled BuildRequest from its results. AnalysisResultsViewer and TestGroupResultsTable now stores
2387         a reference to AnalysisResultsView and Metric to find the results for each build request.
2388         This refactoring is necessary in order to view results of an arbitrary metric in the future.
2389
2390         Also refactored ResultsTable and its subclasses extensively. Instead of making its render() to invoke
2391         subclass' methods such as buildRowGroups, heading, and additionalHeading, rely on each subclass call
2392         to invoke renderTable(), renamed from render(), with callbacks to add extra headers and columns.
2393
2394         This patch also fixes a number of usability issues found by the user such as changing the test name
2395         resets the customized revisions by the virtue of the modern code being naturally more correct.
2396
2397         * public/v3/components/analysis-results-viewer.js:
2398         (AnalysisResultsViewer):
2399         (AnalysisResultsViewer.prototype.setTestGroupCallback): Deleted. Replaced by "testGroupClick" action.
2400         (AnalysisResultsViewer.prototype.setRangeSelectorLabels): Moved here from ResultsTable since it's
2401         never used in ResultsTable or TestGroupResultsTable.
2402         (AnalysisResultsViewer.prototype.selectedRange): Ditto.
2403         (AnalysisResultsViewer.prototype.setPoints): Now takes metric as the third argument.
2404         (AnalysisResultsViewer.prototype.setTestGroups): Now takes the current test group.
2405         (AnalysisResultsViewer.prototype.didUpdateResults): Deleted.
2406         (AnalysisResultsViewer.prototype.setAnalysisResultsView): Added.
2407         (AnalysisResultsViewer.prototype.render): Invoke _renderTestGroups lazily. Also simplified the logic
2408         to find the selected list item. Since we always use a shadow DOM now, we can simply look for an element
2409         with ".seleted" instead of crafting a unique class name.
2410         (AnalysisResultsViewer.prototype.renderTestGroups): Renamed from buildRowGroups. Specify callbacks to
2411         insert headers for A/B radio buttons, which has been moved from ResultsTable.prototype.render, and the
2412         stacked blocks of testing results.
2413         (AnalysisResultsViewer.prototype._classForTestGroup): Deleted.
2414         (AnalysisResultsViewer.prototype._openStackingBlock): Deleted.
2415         (AnalysisResultsViewer.prototype._expandBetween): Create a new set for expandedPoints to make
2416         _renderTestGroupsLazily.evaluate do the work.
2417         (AnalysisResultsViewer._layoutBlocks): Moved from TestGroupStackingGrid.layout.
2418         (AnalysisResultsViewer._sortBlocksByRow): Moved from AnalysisResultsViewer.TestGroupStackingGrid.
2419         (AnalysisResultsViewer._insertAfterBlockWithSameRange): Ditto.
2420         (AnalysisResultsViewer._insertBlockInFirstAvailableColumn): Ditto.
2421         (AnalysisResultsViewer._createCellsForRow): Ditto.
2422
2423         (AnalysisResultsViewer.TestGroupStackingBlock):
2424         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
2425         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.createStackingCell): No longer creates a unique
2426         class name here. See the inline comment for AnalysisResultsViewer.prototype.render.
2427         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.isThin): Deleted. We used to collapse "failed"
2428         test groups as a thin vertical line, and we wanted to show them next to each other in _layoutBlock but
2429         we don't do that anymore.
2430         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet): Added. Uses
2431         this._analysisResultsView to extract the results for the current metrics.
2432         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
2433
2434         * public/v3/components/analysis-task-bug-list.js: Added.
2435         (AnalysisTaskBugList): Added. Extracted from AnalysisTaskChartPane.
2436         (AnalysisTaskBugList.prototype.setTask): Added.
2437         (AnalysisTaskBugList.prototype.didConstructShadowTree): Added.
2438         (AnalysisTaskBugList.prototype.render): Added.
2439         (AnalysisTaskBugList.prototype._associateBug): Added.
2440         (AnalysisTaskBugList.prototype._dissociateBug): Added.
2441         (AnalysisTaskBugList.htmlTemplate): Added.
2442
2443         * public/v3/components/chart-pane-base.js:
2444         (ChartPaneBase.htmlTemplate): Added a hook to insert more content at the end in AnalysisTaskChartPane.
2445         (ChartPaneBase.paneFooterTemplate): Added.
2446
2447         * public/v3/components/customizable-test-group-form.js:
2448         (CustomizableTestGroupForm):
2449         (CustomizableTestGroupForm.prototype.setCommitSetMap):
2450         (CustomizableTestGroupForm.prototype.startTesting): Renamed from _submitted. Now dispatches an action
2451         by the name of "startTesting" instead of calling this._startCallback.
2452         (CustomizableTestGroupForm.prototype.didConstructShadowTree): Added. Moved the logic to attach event
2453         handlers here to avoid eagerly creating the shadow tree in the constructor.
2454         (CustomizableTestGroupForm.prototype._computeCommitSetMap): Use the newly added this._revisionEditorMap
2455         to find the relevant input element instead of running a querySelector.
2456         (CustomizableTestGroupForm.prototype.render): Lazily invoke _renderCustomRevisionTable. This avoids
2457         overriding the customized revisions when the user finally types in the test group name.
2458         (CustomizableTestGroupForm.prototype._renderCustomRevisionTable): Extracted from render.
2459         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons): Made this a non-static method
2460         since it needs to update this._revisionEditorMap now. Merged _constructRevisionRadioButtons.
2461         (CustomizableTestGroupForm.prototype._createRadioButton): Deleted. See above.
2462         (CustomizableTestGroupForm.cssTemplate):
2463         (CustomizableTestGroupForm.formContent): Use IDs instead of classes to make this.content(ID) work.
2464
2465         * public/v3/components/mutable-list-view.js:
2466         (MutableListView.prototype.setList):
2467         (MutableListView.prototype.setKindList):
2468         (MutableListView.prototype.setAddCallback): Deleted. Replaced by "addItem" action.
2469         (MutableListView.prototype.render):
2470         (MutableListItem.prototype.content):
2471
2472         * public/v3/components/results-table.js:
2473         (ResultsTable): Removed this._rangeSelectorLabels, this._rangeSelectorCallback, and this._selectedRange
2474         as they are only used by AnalysisResultsViewer. Also replaced this._valueFormatter by
2475         this._analysisResultsView which knows a metric.
2476         (ResultsTable.prototype.setValueFormatter): Deleted.
2477         (ResultsTable.prototype.setRangeSelectorLabels): Deleted.
2478         (ResultsTable.prototype.setRangeSelectorCallback): Deleted.
2479         (ResultsTable.prototype.selectedRange): Deleted.
2480         (ResultsTable.prototype._rangeSelectorClicked): Deleted.
2481         (ResultsTable.prototype.setAnalysisResultsView): Added.
2482         (ResultsTable.prototype.renderTable): Added. Removed the logic to add _rangeSelectorLabels since it has
2483         been moved to AnalysisResultsViewer.prototype.render inside buildColumns, which also inserts additional
2484         columns which used to be stored on each ResultsTableRow. Use the same technique to insert additional
2485         headers. Also take the name (thead tr th) of row header (tbody tr td) as an argument and automatically
2486         create a table cell of an appropriate colspan.
2487         (ResultsTable.prototype._createRevisionListCells):
2488         (ResultsTable.prototype.heading): Deleted. Superseded by buildHeaders callback.
2489         (ResultsTable.prototype.additionalHeading): Ditto.
2490         (ResultsTable.prototype.buildRowGroups): Deleted. It is now the responsibility of each subclass to call
2491         ResultsTable's renderTable() in the subclass' render() function.
2492         (ResultsTable.prototype._computeRepositoryList): No longer takes extraRepositories as an argument.
2493         Instead, this function now returns a pair of the repository list and the list of constant commits.
2494         (ResultsTable.htmlTemplate):
2495         (ResultsTable.cssTemplate):
2496
2497         * public/v3/components/test-group-form.js:
2498         (TestGroupForm): Avoid eagerly creating the shadow tree. Also removed the removed the dead code.
2499         (TestGroupForm.prototype.setRepetitionCount): Simply override the value of the select element.
2500         (TestGroupForm.prototype.didConstructShadowTree): Added. Attach event handlers here to avoid eagerly
2501         creating the shadow tree in the constructor.
2502         (TestGroupForm.prototype.startTesting): Renamed from _submitted. Dispatch "startTesting" action instead
2503         of invoking _startCallback which has been removed.
2504         (TestGroupForm.htmlTemplate):
2505         (TestGroupForm.formContent):
2506
2507         * public/v3/components/test-group-results-table.js:
2508         (TestGroupResultsTable):
2509         (TestGroupResultsTable.prototype.didUpdateResults): Deleted. No longer neeed per setAnalysisResultsView
2510         in ResultsTable.
2511         (TestGroupResultsTable.prototype.setTestGroup):
2512         (TestGroupResultsTable.prototype.heading): Deleted.
2513         (TestGroupResultsTable.prototype.render):
2514         (TestGroupResultsTable.prototype._renderTestGroup): Extracted from render.
2515         (TestGroupResultsTable.prototype._buildRowGroups): Renamed from buildRowGroups.
2516         (TestGroupResultsTable.prototype._buildRowGroupForCommitSet): Extracted from buildRowGroups.
2517         (TestGroupResultsTable.prototype._buildComparisonRow): Extracted from buildRowGroups.buildRowGroups
2518
2519         * public/v3/index.html: Include analysis-task-bug-list.js.
2520
2521         * public/v3/models/analysis-results.js:
2522         (AnalysisResults): Inverted the map so that we can easily create a view based on metric.
2523         (AnalysisResults.prototype.find): Ditto.
2524         (AnalysisResults.prototype.add): Ditto.
2525         (AnalysisResults.prototype.viewForMetric): Added.
2526         (AnalysisResults.fetch):
2527         (AnalysisResultsView): Added.
2528         (AnalysisResultsView.prototype.metric): Added.
2529         (AnalysisResultsView.prototype.resultForBuildId): Added.
2530
2531         * public/v3/models/build-request.js:
2532         (BuildRequest.result): Deleted.
2533         (BuildRequest.setResult): Deleted.
2534
2535         * public/v3/models/test-group.js:
2536         (TestGroup): Removed this._allCommitSets since it was never used.
2537         (TestGroup.prototype.didSetResult): Deleted since it was never used.
2538         (TestGroup.prototype.compareTestResults): Now takes an array of measurement set values.
2539         (TestGroup.prototype._valuesForCommitSet): Deleted.
2540
2541         * public/v3/pages/analysis-task-page.js:
2542         (AnalysisTaskChartPane): This class now includes the form to cutomize the revisions.
2543         (AnalysisTaskChartPane.prototype.setShowForm): Added.
2544         (AnalysisTaskChartPane.prototype._mainSelectionDidChange):
2545         (AnalysisTaskChartPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action when
2546         the user presses the button to start a new A/B testing from the chart.
2547         (AnalysisTaskChartPane.prototype.render): Added.
2548         (AnalysisTaskChartPane.prototype.paneFooterTemplate): Added.
2549         (AnalysisTaskChartPane.cssTemplate):
2550
2551         (AnalysisTaskResultsPane): Added. Encapsulates AnalysisResultsViewer and CustomizableTestGroupForm.
2552         (AnalysisTaskResultsPane.prototype.setPoints): Added.
2553         (AnalysisTaskResultsPane.prototype.setTestGroups): Added.
2554         (AnalysisTaskResultsPane.prototype.setAnalysisResultsView): Added.
2555         (AnalysisTaskResultsPane.prototype.setShowForm): Added.
2556         (AnalysisTaskResultsPane.prototype.didConstructShadowTree): Added. Dispatches "newTestGroup" action
2557         when the user presses the button to start a new A/B testing from the chart.
2558         (AnalysisTaskResultsPane.prototype.render): Added.
2559         (AnalysisTaskResultsPane.htmlTemplate): Added.
2560         (AnalysisTaskResultsPane.cssTemplate): Added.
2561
2562         (AnalysisTaskTestGroupPane): Added. Encapsulates TestGroupResultsTable and CustomizableTestGroupForm.
2563         (AnalysisTaskTestGroupPane.prototype.didConstructShadowTree): Added.
2564         (AnalysisTaskTestGroupPane.prototype.setTestGroups): Added.
2565         (AnalysisTaskTestGroupPane.prototype.setAnalysisResultsView): Added.
2566         (AnalysisTaskTestGroupPane.prototype.render): Added.
2567         (AnalysisTaskTestGroupPane.prototype._renderTestGroups): Added. Updates the list of test groups. Hide
2568         the hidden groups unless showHiddenGroups is set. Updates this._testGroupMap so that the visibility of
2569         groups and their names can be updated without having to re-render the entire list.
2570         (AnalysisTaskTestGroupPane.prototype._renderTestGroupVisibility): Added.
2571         (AnalysisTaskTestGroupPane.prototype._renderTestGroupNames): Added.
2572         (AnalysisTaskTestGroupPane.prototype._renderCurrentTestGroup): Added. Update TestGroupResultsTable with
2573         the selected test group. Also highlight the list view, and update the hide-unhide toggle button's label
2574         as needed.
2575         (AnalysisTaskTestGroupPane.htmlTemplate): Added.
2576         (AnalysisTaskTestGroupPane.cssTemplate): Added.
2577
2578         (AnalysisTaskPage): Deleted a massive number of instance variables. They are now manged by newly added
2579         AnalysisTaskChartPane, AnalysisTaskResultsPane, and AnalysisTaskTestGroupPane
2580         (AnalysisTaskPage.prototype.didConstructShadowTree): Added. Attach various event handlers here to avoid
2581         eagerly creating the shadow tree in the constructor.
2582         (AnalysisTaskPage.prototype._fetchRelatedInfoForTaskId):
2583         (AnalysisTaskPage.prototype._didFetchTask): No longer sets the value formatter to the results viewer
2584         and the results table as they now recieve AnalysisResultsView later in _assignTestResultsIfPossible.
2585         (AnalysisTaskPage.prototype._didFetchMeasurement): Set the metric to the results viewer.
2586         (AnalysisTaskPage.prototype._didUpdateTestGroupHiddenState):
2587         (AnalysisTaskPage.prototype._assignTestResultsIfPossible): Create AnalysisResultsView from the newly
2588         retrieved AnalysisResults and pass it to AnalysisTaskResultsPane and AnalysisTaskTestGroupPane.
2589         (AnalysisTaskPage.prototype.render): Dramatically simplified.
2590         (AnalysisTaskPage.prototype._renderTaskNameAndStatus): Extracted from render.
2591         (AnalysisTaskPage.prototype._renderRelatedTasks): Ditto.
2592         (AnalysisTaskPage.prototype._renderCauseAndFixes): Ditto.
2593         (AnalysisTaskPage.prototype._showTestGroup):
2594         (AnalysisTaskPage.prototype._updateTaskName): Now takes the new name as an argument.
2595         (AnalysisTaskPage.prototype._updateTestGroupName): Now takes the new name as the second argument.
2596         (AnalysisTaskPage.prototype._hideCurrentTestGroup): Now takes the test group to hide.
2597         (AnalysisTaskPage.prototype._associateCommit): Moved to AnalysisTaskBugList.
2598         (AnalysisTaskPage.prototype._dissociateCommit): Ditto.
2599         (AnalysisTaskPage.prototype._retryCurrentTestGroup): Now takes the test group as the first argument.
2600         (AnalysisTaskPage.prototype._chartSelectionDidChange): Deleted.
2601         (AnalysisTaskPage.prototype._createNewTestGroupFromChart): Deleted.
2602         (AnalysisTaskPage.prototype._selectedRowInAnalysisResultsViewer): Deleted.
2603         (AnalysisTaskPage.prototype._createNewTestGroupFromViewer): Deleted.
2604         (AnalysisTaskPage.htmlTemplate):
2605         (AnalysisTaskPage.cssTemplate):
2606
2607         * unit-tests/test-groups-tests.js: Updated a test case which was expecting BuildReqeust's result, which
2608         has been removed, to exist.
2609
2610 2017-03-23  Ryosuke Niwa  <rniwa@webkit.org>
2611
2612         Share more code between ManifestGenerator and /api/triggerables
2613         https://bugs.webkit.org/show_bug.cgi?id=169993
2614
2615         Reviewed by Chris Dumez.
2616
2617         Shared the code to fetch the list of triggerables from the database between ManifestGenerator
2618         and /api/triggerables.
2619
2620         * public/api/triggerables.php:
2621         (main):
2622         * public/include/manifest-generator.php:
2623         (ManifestGenerator::fetch_triggerables): Extracted as a static function. Also include the ID
2624         in the triggerable data.
2625
2626 2017-03-23  Ryosuke Niwa  <rniwa@webkit.org>
2627
2628         create-test-group should allow a different set of repositories to be used in each configuration
2629         https://bugs.webkit.org/show_bug.cgi?id=169992
2630
2631         Rubber-stamped by Antti Koivisto.
2632
2633         Added the support for new POST parameter, revisionSets, to /privileged-api/create-test-group.
2634         This new parameter now specifies an array of repository id to revision dictionaries, and allows
2635         different set of repositories' revisions to be specified in each dictionary.
2636
2637         We keep the old API for v2 UI and detect-changes.js compatibility for now.
2638
2639         * public/privileged-api/create-test-group.php:
2640         (main):
2641         (commit_sets_from_revision_sets): Added.
2642         (ensure_commit_sets): Only fetch the top-level repository per r213788 and r213976.
2643
2644         * public/v3/models/test-group.js:
2645         (TestGroup.createAndRefetchTestGroups): Use the newly added revisionSets parameter instead of
2646         the now depreacted commitSets parameter.
2647
2648         * public/v3/pages/analysis-task-page.js:
2649         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList): Simplified this code
2650         by simply verifying the consistency of commit sets now that createAndRefetchTestGroups takes
2651         an array of commit sets instead of a dictionary of repository name to a list of revisions.
2652
2653         * server-tests/privileged-api-create-test-group-tests.js: Added test cases for new parameter.
2654
2655 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
2656
2657         /api/uploaded-file should return createdAt as a POSIX timestamp
2658         https://bugs.webkit.org/show_bug.cgi?id=169980
2659
2660         Rubber-stamped by Antti Koivisto.
2661
2662         Call Database::to_js_time on createdAt to return it as a POSIX timestamp.
2663
2664         * public/include/uploaded-file-helpers.php:
2665         (format_uploaded_file): Fixed the bug.
2666         * server-tests/api-manifest-tests.js: Renamed from api-manifest.js.
2667         * server-tests/api-uploaded-file-tests.js: Renamed from api-uploaded-file.js. Added a test case.
2668
2669 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
2670
2671         UploadedFile should support a callback for upload progress
2672         https://bugs.webkit.org/show_bug.cgi?id=169977
2673
2674         Reviewed by Andreas Kling.
2675
2676         Added a new option dictionary to CommonRemoteAPI.sendHttpRequest with uploadProgressCallback
2677
2678         Moved request headers and responseHandler callback in NodeRemoteAPI to this dictionary,
2679         and updated the tests which relied on this code.
2680
2681         * public/shared/common-remote.js:
2682         (CommonRemoteAPI.prototype.postJSON):
2683         (CommonRemoteAPI.prototype.postJSONWithStatus):
2684         (CommonRemoteAPI.prototype.postFormData):
2685         (CommonRemoteAPI.prototype.postFormDataWithStatus):
2686         * public/v3/privileged-api.js:
2687         (PrivilegedAPI.prototype.sendRequest):
2688         * public/v3/remote.js:
2689         (BrowserRemoteAPI.prototype.sendHttpRequest):
2690         (BrowserRemoteAPI.prototype.sendHttpRequestWithFormData):
2691         (BrowserRemoteAPI):
2692         * server-tests/api-uploaded-file.js:
2693         * tools/js/remote.js:
2694         (NodeRemoteAPI.prototype.sendHttpRequest):
2695         (NodeRemoteAPI.prototype.sendHttpRequestWithFormData):
2696         (NodeRemoteAPI):
2697
2698 2017-03-22  Ryosuke Niwa  <rniwa@webkit.org>
2699
2700         ComponentBase should enqueue itself to render when it becomes connected
2701         https://bugs.webkit.org/show_bug.cgi?id=169905
2702
2703         Reviewed by Antti Koivisto.
2704
2705         When a component becomes connected to a document, enqueue itself to render automatically.
2706         Also added the support for boolean attribute to ComponentBase.createElement.
2707
2708         * ReadMe.md: Added an instruction to raise the upload limit per r214065.
2709         * browser-tests/component-base-tests.js: Added tests for the new behavior and createElement. Also moved
2710         the tests related to enqueueToRenderOnResize out of defineElement tests.
2711
2712         * browser-tests/index.html:
2713         (BrowsingContext.prototype.constructor): Override requestAnimationFrame so that the callback would be
2714         involved immediately durign testing.
2715
2716         * public/v3/components/base.js:
2717         (ComponentBase): Enqueue itself to render during construction if custom elements is not available.
2718         (ComponentBase.defineElement):
2719         (ComponentBase.defineElement.elementClass.prototype.connectedCallback): Enqueue itself to render when
2720         the component's element became connected.
2721         (ComponentBase.createElement): Use Array.isArray instead of instanceof to make it work with arrays made
2722         in other realms (global objects) during testing. Added the support for boolean attributes. Setting an
2723         attribute value to true would set the attribute, and setting it to false would not set the attribute.
2724         (ComponentBase.useNativeCustomElements): Added. True iff window.customElements is defined.
2725
2726         * public/v3/components/chart-pane-base.js:
2727         (ChartPaneBase.prototype.render): No longer need to call enqueueToRender on the commit log viewer.
2728
2729         * public/v3/components/commit-log-viewer.js:
2730         (CommitLogViewer.prototype.render): No longer need to call enqueueToRender on the spinner icon.
2731
2732         * public/v3/models/time-series.js:
2733         (TimeSeries): Made this a proper class declaration now that we don't include data.js after r213300.
2734
2735         * public/v3/pages/chart-pane.js:
2736         (ChartPane.prototype._renderActionToolbar): No longer need to call enqueueToRender on the close icon.
2737
2738         * public/v3/pages/summary-page.js:
2739         (SummaryPage.prototype._renderCell): No longer need to call enqueueToRender on the spinner icon.
2740
2741 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
2742
2743         Delete another function that was supposed to be removed in the previous commit.
2744
2745         * public/v3/models/build-request.js:
2746         (BuildRequest.cachedRequestsForTriggerableID): Deleted.
2747
2748 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
2749
2750         Modernize BuildRequestQueuePage
2751         https://bugs.webkit.org/show_bug.cgi?id=169903
2752
2753         Reviewed by Antti Koivisto.
2754
2755         Modernized the code for /v3/#/analysis/queue.
2756
2757         * public/v3/models/build-request.js:
2758         (BuildRequest.fetchTriggerables): Deleted since the manifest JSON now contains all the triggerables.
2759
2760         * public/v3/pages/build-request-queue-page.js:
2761         (BuildRequestQueuePage): Deleted this._triggerables. Added this._buildRequestsByTriggerable.
2762         (BuildRequestQueuePage.prototype.open): Modernized the code.
2763         (BuildRequestQueuePage.prototype.render): Ditto.
2764         (BuildRequestQueuePage.prototype._constructBuildRequestTable): Ditto.
2765
2766 2017-03-19  Ryosuke Niwa  <rniwa@webkit.org>
2767
2768         Charts page show an inconsistent list of revisions for Git and Subversion
2769         https://bugs.webkit.org/show_bug.cgi?id=169888
2770
2771         Reviewed by Andreas Kling.
2772
2773         With Git, CommitLogViewer was showing the list of revisions including the starting hash,
2774         which was the last data point's revision instead of all revisions after the last data point.
2775
2776         Fixed the bug by always specifying the revision at the last data point in both Subversion
2777         and Git and then making /api/commits/<repository>/?from=X&to=Y exclude the first revision.
2778         For clarity, "from" and "to" query parameters have been renamed to "precedingRevision" and
2779         "lastRevision" respectively.
2780
2781         We also no longer adds 1 to the starting revision of Subversion-like starting revisions. e.g.
2782         when the last data point was at r1234, new data point is at r1250, the label is now "r1234-r1250"
2783         instead of "r1235-r1250".
2784
2785         * browser-tests/chart-revision-range-tests.js: Fixed the tests since revisionList no longer
2786         specifies from/to revisions.
2787         * browser-tests/commit-log-viewer-tests.js: Added. Added tests for CommitLogViewer.
2788         * browser-tests/index.html: Include the new test. Also use a local copy of mocha.js/css.
2789
2790         * public/api/commits.php:
2791         (main): Renamed "from" and "to" query parameters.
2792
2793         * public/include/commit-log-fetcher.php:
2794         (CommitLogFetcher::fetch_between): Added a check that commit time should either be specified
2795         in both rows or not specified in either. Also reject when before_first_revision is identical
2796         or after last_revision instead of re-ordering them since it no longer makes sense to do so with
2797         new query parameter names.
2798
2799         * public/v3/components/base.js:
2800         (ComponentBase._addContentToElement): Use Array.isArray instead of instanceof. It's resilient
2801         againt realm (global object) differences.
2802
2803         * public/v3/components/chart-pane-base.js:
2804         (ChartPaneBase.prototype._updateCommitLogViewer): No longer calls enqueueToRender on this since
2805         CommitLogViewer does that on its own now.
2806         (ChartPaneBase.prototype.render): Juse use this._openRepository instead of relying on CommitLogViewer
2807         to remember which repository is current. This was the only use of currentRepository.
2808
2809         * public/v3/components/commit-log-viewer.js:
2810         (CommitLogViewer):
2811         (CommitLogViewer.prototype.currentRepository): Deleted.
2812         (CommitLogViewer.prototype.view):
2813         (CommitLogViewer.prototype._fetchCommitLogs): Modernized and extracted from view to make it lazy.
2814         Call fetchForSingleRevision when precedingRevision is not specified or it's identical to lastRevision
2815         since the generic JSON API no longer supports being called with the identical revisions.
2816         (CommitLogViewer.prototype.render): Modernized & simplified the code.
2817         (CommitLogViewer.prototype._renderCommitList): Extracted from render to make it lazy.
2818         (CommitLogViewer.htmlTemplate): Add ID on caption & tbody so that they're more easily addressable.
2819         (CommitLogViewer.cssTemplate):
2820
2821         * public/v3/models/commit-log.js:
2822         (CommitLog.prototype.diff): No longer includes from/to revisions in the result. Also avoid adding
2823         1 to a Subversion-like starting revision for creating the label. See above. But we still do this
2824         for forming URLs due to the way tools like Trac work with Subversion revisions.
2825         (CommitLog.fetchBetweenRevisions): Rewritten using DataModel.prototype.cachedFetch with FIXME for
2826         what this function is supposed to be doing.
2827         (CommitLog._cachedCommitLogs): Deleted.
2828         (CommitLog.fetchForSingleRevision): Added.
2829         (CommitLog._constructFromRawData): Added.
2830
2831         * public/v3/models/data-model.js:
2832         (DataModelObject.cachedFetch): Don't parse query values as an integer. Just URL-escape them.
2833
2834         * public/v3/remote.js:
2835         (BrowserRemoteAPI.prototype.sendHttpRequest): Fixed a typo.
2836
2837         * server-tests/api-commits-tests.js: Renamed from api-commits.js. Updated the existing tests to
2838         use new query parameters and added more test cases.
2839
2840         * unit-tests/commit-log-tests.js: Updated the test cases now that CommitLog.prototype.diff no longer
2841         includes from/to values. They're computed in ChartRevisionRange instead.
2842
2843 2017-03-20  Ryosuke Niwa  <rniwa@webkit.org>
2844
2845         Fix os-build-fetcher.js and subprocess.js to make them work
2846         https://bugs.webkit.org/show_bug.cgi?id=169844
2847
2848         Reviewed by Antti Koivisto.
2849
2850         The script added in r213976 has a bug that it can execute commands to fetch subcommits in parallel.
2851         Some commands to poll the lsit of system components is not desirable to be ran in parallel.
2852
2853         * server-tests/resources/mock-subprocess.js:
2854         (MockSubprocess): Use const declaration.
2855         (MockSubprocess.resetAndWaitForInvocation): Added.
2856         (MockSubprocess.waitForInvocation): Renamed from waitingForInvocation. A function name must be a verb.
2857         See https://webkit.org/code-style-guidelines/#names-verb
2858         (MockSubprocess.reset): Set invocations.length to 0 so that tests can store a reference to the array
2859         regardless of whether reset is called or when it's called.
2860
2861         * server-tests/tools-os-build-fetcher-tests.js: Updated tests per the code change. Most of codes now
2862         expect each command to be ran seprately. e.g. if there were two commands to run, instead of expecting
2863         them to be both ran, and resolving invocation promises, we'd wait for one command to run, resolve,
2864         its subcommand to run, and then move onto the second top-level command. Also use a local reference
2865         to MockSubprocess.invocations instead of using the fully qualified name.
2866
2867         * tools/js/os-build-fetcher.js:
2868         (mapInSerialPromiseChain): Added. Calling a closure that returns a promise on each item in an array
2869         in serial (not asynchronous) is a very common pattern in this class.
2870         (OSBuildFetcher.fetchAndReportAllInOrder): Added.
2871         (OSBuildFetcher.prototype.fetchAndReportNewBuilds): Log what the number of builds being submitted.
2872         (OSBuildFetcher.prototype._fetchAvailableBuilds): Fixed the main bug. Using Promise.all would result
2873         in each top-level command to be execued in parallel. Since each subcommand is executed as soon as
2874         its parent command is executed, this results in commands to be executed in parallel.
2875         Added a whole bunch of logging so that we can at least detect a bug like this in the future.
2876         (OSBuildFetcher.prototype._commitsForAvailableBuilds): Cleanup the coding style.
2877         (OSBuildFetcher.prototype._addSubCommitsForBuild): Use mapInSerialPromiseChain. Tightened the assertion
2878         about the content returned by a subcommand.
2879
2880         * tools/js/subprocess.js: Fixed the bug that we were importing require('child_process').ChildProcess.
2881         execFile is defined on require('child_process') itself.
2882         (Subprocess.prototype.execute): Fixed a typo. this._childProcess doesn't exist.
2883         (Subprocess):
2884
2885         * tools/sync-os-versions.js: Renamed from tools/pull-os-versions.js.
2886         (syncLoop): Cleaned up the coding style a little. Also added logging about how long we're about to sleep.
2887
2888 2017-03-16  Ryosuke Niwa  <rniwa@webkit.org>
2889
2890         Add the file uploading capability to the perf dashboard.
2891         https://bugs.webkit.org/show_bug.cgi?id=169737
2892
2893         Reviewed by Chris Dumez.
2894
2895         Added /privileged-api/upload-file to upload a file, and /api/uploaded-file/ to download the file
2896         and retrieve its meta data based on its SHA256. We treat two files with the identical SHA256 as
2897         identical since anyone who can upload a file using this mechanism can execute arbitrary code in
2898         our bots anyway. This is important for avoiding uploading a large darwinup roots multiple times
2899         to the server, saving both user's time/bandwidth and server's disk space.
2900
2901         * config.json: Added uploadDirectory, uploadFileLimitInMB, and uploadUserQuotaInMB as options.
2902         * init-database.sql: Added uploaded_files table.
2903
2904         * public/api/uploaded-file.php: Added.
2905         (main): /api/uploaded-file/N would download uploaded_file with id=N. /api/uploaded-file/?sha256=X
2906         would return the meta data for uploaded_file with sha256=X.
2907         (stream_file_content): Streams the file content in 64KB chunks. We support Range & If-Range HTTP
2908         request headers so that browsers can pause and resume downloading of a large root file.
2909         (parse_range_header): Parses Range HTTP request header.
2910
2911         * public/include/json-header.php:
2912         (remote_user_name): Use the default argument of NULL.
2913
2914         * public/include/manifest-generator.php:
2915         (ManifestGenerator::generate): Include the maximum upload size in the manifest file to let the
2916         frontend code preemptively check the file size before attempting to submit a file.
2917
2918         * public/include/uploaded-file-helpers.php: Added.
2919         (format_uploaded_file):
2920         (uploaded_file_path_for_row):
2921
2922         * public/privileged-api/upload-file-form.html: Added. For debugging purposes.
2923         (fetchCSRFfToken):
2924         (upload):
2925
2926         * public/privileged-api/upload-file.php: Added.
2927         (main):
2928         (query_total_file_size):
2929         (create_uploaded_file_from_form_data):
2930
2931         * public/shared/common-remote.js:
2932         (CommonRemoteAPI.prototype.postFormData): Added.
2933         (CommonRemoteAPI.prototype.postFormDataWithStatus): Added.
2934         (CommonRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
2935         (CommonRemoteAPI.prototype._asJSON): Throw an exception instead of calling a non-existent reject.
2936
2937         * public/v3/models/uploaded-file.js: Added.
2938         (UploadedFile): Added.
2939         (UploadedFile.uploadFile): Added.
2940         (UploadedFile.fetchUnloadedFileWithIdenticalHash): Added. Finds the file with the same SHA256 in
2941         the server to avoid uploading a large custom root multiple times.
2942         (UploadedFile._computeSHA256Hash): Added.
2943
2944         * public/v3/privileged-api.js:
2945         (PrivilegedAPI.prototype.sendRequest): Added the options dictionary as a third argument. For now,
2946         only support useFormData boolean.
2947
2948         * public/v3/remote.js:
2949         (BrowserRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
2950
2951         * server-tests/api-manifest.js: Updated per the inclusion of fileUploadSizeLimit in the manifest.
2952         * server-tests/api-uploaded-file.js: Added.
2953         * server-tests/privileged-api-upload-file-tests.js: Added.
2954
2955         * server-tests/resources/temporary-file.js: Added.
2956         (TemporaryFile): Added. A helper class for creating a temporary file to upload.
2957         (TemporaryFile.makeTemporaryFileOfSizeInMB):
2958         (TemporaryFile.makeTemporaryFile):
2959         (TemporaryFile.inject):
2960
2961         * server-tests/resources/test-server.conf: Set upload_max_filesize and post_max_size for testing.
2962         * server-tests/resources/test-server.js:
2963         (TestServer.prototype.testConfig): Use uploadFileLimitInMB and uploadUserQuotaInMB of 2MB and 5MB.
2964         (TestServer.prototype._ensureDataDirectory): Create a directory to store uploaded files inside
2965         the data directory. In a production server, we can place it outside ServerRoot / DocumentRoot.
2966         (TestServer.prototype.cleanDataDirectory): Delete the aforementioned directory as needed.
2967
2968         * tools/js/database.js:
2969         (tableToPrefixMap): Added uploaded_files.
2970
2971         * tools/js/remote.js:
2972         (NodeRemoteAPI.prototype.sendHttpRequest): Added a dictionary to specify request headers and
2973         a callback to process the response as arguments. Fixed the bug that any 2xx code other than 200
2974         was resulting in a rejected promise. Also include the response headers in the result for tests.
2975         Finally, when content is a function, call that instead of writing the content since FormData
2976         requires a custom logic.
2977         (NodeRemoteAPI.prototype.sendHttpRequestWithFormData): Added.
2978
2979         * tools/js/v3-models.js: Include uploaded-file.js.
2980
2981         * tools/run-tests.py:
2982         (main): Add form-data as a new dependency.
2983
2984 2017-03-15  Dewei Zhu  <dewei_zhu@apple.com>
2985
2986         Fix unit test and bug fix for 'pull-os-versions.js' script.
2987         https://bugs.webkit.org/show_bug.cgi?id=169701
2988
2989         Reviewed by Ryosuke Niwa.
2990
2991         Fix unit tests warnings on node-6.10.0.
2992         Fix 'pull-os-versions.js' does not fetch new builds and report.
2993
2994         * server-tests/tools-os-build-fetcher-tests.js:
2995         (then):
2996         (beforeEach):
2997         (afterEach):
2998         * tools/pull-os-versions.js:
2999         (syncLoop):
3000
3001 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3002
3003         In-browser and node.js implementations of RemoteAPI should share some code
3004         https://bugs.webkit.org/show_bug.cgi?id=169695
3005
3006         Rubber-stamped by Antti Koivisto.
3007
3008         Extracted CommonRemoteAPI out of RemoteAPI implementations for node.js and browser. 
3009
3010         * public/shared/common-remote.js: Added.
3011         (CommonRemoteAPI): Added.
3012         (CommonRemoteAPI.prototype.postJSON): Extracted from RemoteAPI.
3013         (CommonRemoteAPI.prototype.postJSONWithStatus): Ditto.
3014         (CommonRemoteAPI.prototype.getJSON): Ditto.
3015         (CommonRemoteAPI.prototype.getJSONWithStatus): Ditto.
3016         (CommonRemoteAPI.prototype.sendHttpRequest): Added. Needs to implemented by a subclass.
3017         (CommonRemoteAPI.prototype._asJSON): Added.
3018         (CommonRemoteAPI.prototype._checkStatus): Added.
3019
3020         * public/v3/index.html: Include common-remote.js.
3021
3022         * public/v3/privileged-api.js:
3023         (PrivilegedAPI): Use class now that we don't include data.js.
3024         (PrivilegedAPI.sendRequest): Modernized the code.
3025         (PrivilegedAPI.requestCSRFToken): Ditto.
3026
3027         * public/v3/remote.js:
3028         (BrowserRemoteAPI): Renamed from RemoteAPI. window.RemoteAPI is now an instance of this class.
3029         (BrowserRemoteAPI.prototype.sendHttpRequest): Moved from RemoteAPI.sendHttpRequest.
3030         (BrowserRemoteAPI.prototype.sendHttpRequest):
3031
3032         * server-tests/privileged-api-create-analysis-task-tests.js: Updated tests since NodeJSRemoteAPI
3033         now throws the JSON status as an error to be consistent with BrowserRemoteAPI.
3034         * server-tests/privileged-api-create-test-group-tests.js: Ditto.
3035         * server-tests/privileged-api-upate-run-status.js: Ditto.
3036
3037         * tools/js/buildbot-triggerable.js:
3038         (BuildbotTriggerable.prototype.syncOnce): Just use postJSONWithStatus instead of manually
3039         checking the status.
3040
3041         * tools/js/remote.js:
3042         (NodeRemoteAPI): Renamed from RemoteAPI. Still exported as RemoteAPI.
3043         (NodeRemoteAPI.prototype.constructor):
3044         (NodeRemoteAPI.prototype.sendHttpRequest): Modernized the code.
3045
3046 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3047
3048         Fix server tests after r213998 and r213969
3049         https://bugs.webkit.org/show_bug.cgi?id=169690
3050
3051         Reviewed by Antti Koivisto.
3052
3053         Fixed the existing server tests.
3054
3055         * public/v3/models/analysis-task.js:
3056         (AnalysisTask.prototype._updateRemoteState): Use the relative path from the root so that it works inside tests.
3057         (AnalysisTask.prototype.associateBug): Ditto.
3058         (AnalysisTask.prototype.dissociateBug): Ditto.
3059         (AnalysisTask.prototype.associateCommit): Ditto.
3060         (AnalysisTask.prototype.dissociateCommit): Ditto.
3061         (AnalysisTask._fetchSubset): Ditto.
3062         (AnalysisTask.fetchAll): Ditto.
3063         * public/v3/models/test-group.js:
3064         (TestGroup.prototype.updateName): Ditto.
3065         (TestGroup.prototype.updateHiddenFlag): Ditto.
3066         (TestGroup.createAndRefetchTestGroups): Ditto.
3067         (TestGroup.cachedFetch): Ditto.
3068         * server-tests/api-manifest.js: Reverted an inadvertant change in r213969.
3069         * tools/js/database.js:
3070         (tableToPrefixMap): Added analysis_strategies.
3071         * unit-tests/analysis-task-tests.js: Updated expectations per changes to AnalysisTask.
3072
3073 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3074
3075         Add tests for privileged-api/create-analysis-task and privileged-api/create-test-group
3076         https://bugs.webkit.org/show_bug.cgi?id=169688
3077
3078         Rubber-stamped by Antti Koivisto.
3079
3080         Added tests for privileged-api/create-analysis-task and privileged-api/create-test-group, and fixed newly found bugs.
3081
3082         * public/privileged-api/create-analysis-task.php:
3083         (main): Fixed the bug that we were not explicitly checking whether start_run and end_run were integers or not.
3084         Also return InvalidTimeRange when start and end times are identical as that makes no sense for an analysis task.
3085
3086         * public/privileged-api/create-test-group.php:
3087         (main): Fixed a bug that we were not explicitly checking task and repetitionCount to be an integer.
3088         (ensure_commit_sets): Fixed the bug that the number of commit sets weren't checked. 
3089
3090         * server-tests/privileged-api-create-analysis-task-tests.js: Added.
3091         * server-tests/privileged-api-create-test-group-tests.js: Added.
3092
3093         * server-tests/resources/common-operations.js:
3094         (prepareServerTest): Increase the timeout from 1s to 5s.
3095
3096         * server-tests/resources/mock-data.js:
3097         (MockData.addMockData): Use a higher database ID of 20 for a mock build_slave to avoid a conflict with auto-generated IDs.
3098
3099 2017-03-15  Ryosuke Niwa  <rniwa@webkit.org>
3100
3101         Make unit tests return a promise instead of manually calling done
3102         https://bugs.webkit.org/show_bug.cgi?id=169663
3103
3104         Reviewed by Antti Koivisto.
3105
3106         Make the existing unit tests always reutrn a promise instead of manually calling "done" callback as done
3107         in r213969. The promise tests are a lot more stable and less error prone.
3108
3109         Also use MockRemoteAPI.waitForRequest() instead of chaining two resolved promises where appropriate.
3110
3111         * unit-tests/analysis-task-tests.js:
3112         * unit-tests/buildbot-syncer-tests.js:
3113         * unit-tests/checkconfig.js:
3114         * unit-tests/privileged-api-tests.js:
3115
3116 2017-03-15  Dewei Zhu  <dewei_zhu@apple.com>
3117
3118         Rewrite 'pull-os-versions' script in Javascript to add support for reporting os revisions with sub commits.
3119         https://bugs.webkit.org/show_bug.cgi?id=169542
3120
3121         Reviewed by Ryosuke Niwa.
3122
3123         Extend '/api/commits/<repository>/last-reported' to accept a range and return last reported commits in given range.
3124         Rewrite 'pull-os-versions' in JavaScript and add unit tests for it.
3125         Instead of writing query manually while searching criteria contains null columns, use the methods provided in 'db.php'.
3126         Add '.gitignore' file to ommit files generated by while running tests/instances locally.
3127
3128         * .gitignore: Added.
3129         * public/api/commits.php:
3130         * public/api/report-commits.php:
3131         * public/include/commit-log-fetcher.php:
3132         * public/include/db.php: 'null_columns' of prepare_params should be a reference.
3133         * public/include/report-processor.php:
3134         * server-tests/api-commits.js:
3135         (then):
3136         * server-tests/api-report-commits-tests.js:
3137         * server-tests/resources/mock-logger.js: Added.
3138         (MockLogger):
3139         (MockLogger.prototype.log):
3140         (MockLogger.prototype.error):
3141         * server-tests/resources/mock-subprocess.js: Added.
3142         (MockSubprocess.call):
3143         (MockSubprocess.waitingForInvocation):
3144         (MockSubprocess.inject):
3145         (MockSubprocess.reset):
3146         * server-tests/tools-buildbot-triggerable-tests.js:
3147         (MockLogger): Deleted.
3148         (MockLogger.prototype.log): Deleted.
3149         (MockLogger.prototype.error): Deleted.
3150         * server-tests/tools-os-build-fetcher-tests.js: Added.
3151         (beforeEach):
3152         (return.waitingForInvocationPromise.then):
3153         (then):
3154         (string_appeared_here.return.waitingForInvocationPromise.then):
3155         (return.addSlaveForReport.emptyReport.then):
3156         * tools/js/os-build-fetcher.js: Added.
3157         (OSBuildFetcher):
3158         (OSBuildFetcher.prototype._fetchAvailableBuilds):
3159         (OSBuildFetcher.prototype._computeOrder):
3160         (OSBuildFetcher.prototype._commitsForAvailableBuilds.return.this._subprocess.call.then.):
3161         (OSBuildFetcher.prototype._commitsForAvailableBuilds):
3162         (OSBuildFetcher.prototype._addSubCommitsForBuild):
3163         (OSBuildFetcher.prototype._submitCommits):
3164         (OSBuildFetcher.prototype.fetchAndReportNewBuilds):
3165         * tools/js/subprocess.js: Added.
3166         (const.childProcess.require.string_appeared_here.Subprocess.prototype.call):
3167         (const.childProcess.require.string_appeared_here.Subprocess):
3168         * tools/pull-os-versions.js: Added.
3169         (main):
3170         (syncLoop):
3171         * tools/sync-commits.py:
3172         (Repository.fetch_commits_and_submit):
3173
3174 2017-03-14  Ryosuke Niwa  <rniwa@webkit.org>
3175
3176         Make server tests return a promise instead of manually calling done
3177         https://bugs.webkit.org/show_bug.cgi?id=169648
3178
3179         Rubber-stamped by Chris Dumez.
3180
3181         Make the existing server tests always reutrn a promise instead of manually calling "done" callback.
3182         The promise tests are a lot more stable and less error prone.
3183
3184         Also use arrow functions everywhere and use prepareServerTest, renamed from connectToDatabaseInEveryTest,
3185         in more tests instead of manually connecting to database in every test, and reset v3 models.
3186
3187         * server-tests/admin-platforms-tests.js:
3188         * server-tests/admin-reprocess-report-tests.js:
3189         * server-tests/api-build-requests-tests.js:
3190         * server-tests/api-manifest.js:
3191         * server-tests/api-measurement-set-tests.js:
3192         (.postReports): Deleted. Not used in any test.
3193         * server-tests/api-report-commits-tests.js:
3194         * server-tests/api-report-tests.js:
3195         * server-tests/api-update-triggerable.js:
3196         * server-tests/privileged-api-upate-run-status.js:
3197         * server-tests/resources/common-operations.js:
3198         (prepareServerTest): Renamed from connectToDatabaseInEveryTest. Increase the timeout and reset v3 models.
3199         * server-tests/tools-buildbot-triggerable-tests.js:
3200
3201 2017-03-12  Ryosuke Niwa  <rniwa@webkit.org>
3202
3203         Rename RootSet to CommitSet
3204         https://bugs.webkit.org/show_bug.cgi?id=169580
3205
3206         Rubber-stamped by Chris Dumez.
3207
3208         Renamed root_sets to commit_sets and roots to commit_set_relationships in the database schema, and renamed
3209         related classes in public/v3/ and tools accordingly.
3210
3211         RootSet, MeasurementRootSet, and CustomRootSet are respectively renamed to CommitSet, MeasurementCommitSet,
3212         and CustomCommitSet.
3213
3214         In order to migrate the database, run:
3215         ```
3216         BEGIN;
3217         ALTER TABLE root_sets RENAME TO commit_sets;
3218         ALTER TABLE commit_sets RENAME COLUMN rootset_id TO commitset_id;
3219         ALTER TABLE roots RENAME TO commit_set_relationships;
3220         ALTER TABLE commit_set_relationships RENAME COLUMN root_set TO commitset_set;
3221         ALTER TABLE commit_set_relationships RENAME COLUMN root_commit TO commitset_commit;
3222         ALTER TABLE build_requests RENAME COLUMN request_root_set TO request_commit_set;
3223         END;
3224         ```
3225
3226         * browser-tests/index.html:
3227         * init-database.sql:
3228         * public/api/build-requests.php:
3229         (main):
3230         * public/api/test-groups.php:
3231         (main):
3232         (format_test_group):
3233         * public/include/build-requests-fetcher.php:
3234         (BuildRequestsFetcher::__construct):
3235         (BuildRequestsFetcher::results_internal):
3236         (BuildRequestsFetcher::commit_sets): Renamed from root_sets.
3237         (BuildRequestsFetcher::commits): Renamed from roots.
3238         (BuildRequestsFetcher::fetch_commits_for_set_if_needed): Renamed from fetch_roots_for_set_if_needed.
3239         * public/privileged-api/create-test-group.php:
3240         (main):
3241         (ensure_commit_sets): Renamed from commit_sets_from_root_sets.
3242         * public/v3/components/analysis-results-viewer.js:
3243         (AnalysisResultsViewer.prototype.buildRowGroups):
3244         (AnalysisResultsViewer.prototype._collectCommitSetsInTestGroups): Renamed from _collectRootSetsInTestGroups.
3245         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
3246         (AnalysisResultsViewer.prototype._buildRowsForPointsAndTestGroups):
3247         (AnalysisResultsViewer.CommitSetInTestGroup): Renamed from RootSetInTestGroup.
3248         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.constructor):
3249         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.commitSet): Renamed from rootSet.
3250         (AnalysisResultsViewer.CommitSetInTestGroup.prototype.succeedingCommitSet): Renamed from succeedingRootSet.
3251         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.constructor):
3252         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.addRowIndex):
3253         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.isComplete):
3254         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.startRowIndex):
3255         (AnalysisResultsViewer.TestGroupStackingBlock.prototype.endRowIndex):
3256         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
3257         * public/v3/components/chart-revision-range.js:
3258         (ChartRevisionRange.prototype._revisionForPoint):
3259         (ChartRevisionRange.prototype._computeRevisionList):
3260         * public/v3/components/customizable-test-group-form.js:
3261         (CustomizableTestGroupForm.prototype.constructor):
3262         (CustomizableTestGroupForm.prototype.setCommitSetMap): Renamed from setRootSetMap.
3263         (CustomizableTestGroupForm.prototype._submitted):
3264         (CustomizableTestGroupForm.prototype._computeCommitSetMap): Renamed from _computeRootSetMap.
3265         (CustomizableTestGroupForm.prototype.render): Renamed from render.
3266         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
3267         * public/v3/components/results-table.js:
3268         (ResultsTable.prototype.render):
3269         (ResultsTable.prototype._createRevisionListCells):
3270         (ResultsTable.prototype._computeRepositoryList):
3271         (ResultsTableRow.prototype.constructor):
3272         (ResultsTableRow.prototype.commitSet): Renamed from rootSet.
3273         * public/v3/components/test-group-results-table.js:
3274         (TestGroupResultsTable.prototype.buildRowGroups):
3275         * public/v3/index.html:
3276         * public/v3/models/build-request.js:
3277         (BuildRequest.prototype.constructor):
3278         (BuildRequest.prototype.updateSingleton):
3279         (BuildRequest.prototype.commitSet): Renamed from rootSet.
3280         (BuildRequest.constructBuildRequestsFromData):
3281         * public/v3/models/commit-set.js: Renamed from public/v3/models/root-set.js.
3282         (CommitSet): Renamed from RootSet.
3283         (CommitSet.containsMultipleCommitsForRepository):
3284         (MeasurementCommitSet): Renamed from MeasurementRootSet.
3285         (MeasurementCommitSet.prototype.namedStaticMap):
3286         (MeasurementCommitSet.prototype.ensureNamedStaticMap):
3287         (MeasurementCommitSet.namedStaticMap):
3288         (MeasurementCommitSet.ensureNamedStaticMap):
3289         (MeasurementCommitSet.ensureSingleton):
3290         (CustomCommitSet): Renamed from CustomRootSet.
3291         * public/v3/models/measurement-adaptor.js:
3292         (MeasurementAdaptor.prototype.applyTo):
3293         * public/v3/models/test-group.js:
3294         (TestGroup.prototype.constructor):
3295         (TestGroup.prototype.addBuildRequest):
3296         (TestGroup.prototype.repetitionCount):
3297         (TestGroup.prototype.requestedCommitSets): Renamed from requestedRootSets.
3298         (TestGroup.prototype.requestsForCommitSet): Renamed from requestsForRootSet.
3299         (TestGroup.prototype.labelForCommitSet): Renamed from labelForRootSet.
3300         (TestGroup.prototype.didSetResult):
3301         (TestGroup.prototype.compareTestResults):
3302         (TestGroup.prototype._valuesForCommitSet): Renamed from _valuesForRootSet.
3303         (TestGroup.prototype.createAndRefetchTestGroups):
3304         * public/v3/pages/analysis-task-page.js:
3305         (AnalysisTaskPage.prototype.render):
3306         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
3307         (AnalysisTaskPage.prototype._createNewTestGroupFromChart):
3308         (AnalysisTaskPage.prototype._createNewTestGroupFromViewer):
3309         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
3310         * server-tests/api-build-requests-tests.js:
3311         * server-tests/resources/mock-data.js:
3312         (MockData.resetV3Models):
3313         (MockData.addMockData):
3314         (MockData.addAnotherMockTestGroup):
3315         * tools/detect-changes.js:
3316         (createAnalysisTaskAndNotify):
3317         * tools/js/buildbot-syncer.js:
3318         (BuildbotSyncer.prototype._propertiesForBuildRequest):
3319         (BuildbotSyncer.prototype._revisionSetFromCommitSetWithExclusionList):
3320         * tools/js/database.js:
3321         (tableToPrefixMap):
3322         * tools/js/v3-models.js:
3323         * tools/sync-buildbot.js:
3324         (syncLoop):
3325         * tools/sync-with-buildbot.py: Deleted. No longer used.
3326         * unit-tests/analysis-task-tests.js:
3327         * unit-tests/build-request-tests.js:
3328         (sampleBuildRequestData):
3329         * unit-tests/buildbot-syncer-tests.js:
3330         (sampleCommitSetData):
3331         * unit-tests/measurement-adaptor-tests.js:
3332         * unit-tests/measurement-set-tests.js:
3333         * unit-tests/resources/mock-v3-models.js:
3334         (MockModels.inject):
3335         * unit-tests/test-groups-tests.js:
3336         (sampleTestGroup):
3337
3338 2017-03-13  Ryosuke Niwa  <rniwa@webkit.org>
3339
3340         Database's query functions should support querying for a row with NULL value
3341         https://bugs.webkit.org/show_bug.cgi?id=169504
3342
3343         Reviewed by Antti Koivisto.
3344
3345         Add the support for calling select_* with one of column values set to NULL.
3346         This feature is useful in webkit.org/b/146374 and webkit.org/b/168962.
3347
3348         * public/include/db.php:
3349         (Database::prepare_params): Added $null_columns as an optional argument.
3350         (Database::select_conditions_with_null_columns): Added. Builds up a query string by appending AND x is NULL
3351         to match columns whose value must be NULL.
3352         (Database::_select_update_or_insert_row):
3353         (Database::select_rows):
3354
3355 2017-03-13  Dewei Zhu  <dewei_zhu@apple.com>
3356
3357         Add the ability to report a commit with sub-commits.
3358         https://bugs.webkit.org/show_bug.cgi?id=168962
3359
3360         Reviewed by Ryosuke Niwa.
3361
3362         Introduce 'commit_ownerships' which records ownership between commits.
3363         On existing production server, run ```
3364             CREATE TABLE commit_ownerships (
3365                 commit_owner integer NOT NULL REFERENCES commits ON DELETE CASCADE,
3366                 commit_ownee integer NOT NULL REFERENCES commits ON DELETE CASCADE,
3367                 PRIMARY KEY (commit_owner, commit_ownee)
3368             );
3369             ALTER TABLE repositories RENAME repository_parent TO repository_owner;
3370             ALTER TABLE repositories DROP repository_name_must_be_unique;
3371             CREATE UNIQUE INDEX repository_name_owner_unique_index ON repositories (repository_owner, repository_name) WHERE repository_owner IS NOT NULL;
3372             CREATE UNIQUE INDEX repository_name_unique_index ON repositories (repository_name) WHERE repository_owner IS NULL;
3373         ``` to update database.
3374         Add unit-tests to cover this change.
3375
3376         * init-database.sql:
3377         * public/api/report-commits.php:
3378         * public/include/commit-log-fetcher.php:
3379         * public/include/db.php:
3380         * public/include/manifest-generator.php:
3381         * public/include/report-processor.php:
3382         * public/v3/models/repository.js:
3383         (Repository):
3384         (Repository.prototype.owner):
3385         * server-tests/admin-reprocess-report-tests.js:
3386         (addBuilderForReport.simpleReportWithRevisions.0.then):
3387         (then):
3388         * server-tests/api-manifest.js:
3389         (then):
3390         * server-tests/api-report-commits-tests.js:
3391         (addSlaveForReport.sameRepositoryNameInSubCommitAndMajorCommit.then):
3392         (then):
3393         (addSlaveForReport.systemVersionCommitWithSubcommits.then):
3394         (addSlaveForReport.multipleSystemVersionCommitsWithSubcommits.then):
3395         (addSlaveForReport.systemVersionCommitWithEmptySubcommits.then):
3396         (addSlaveForReport.systemVersionCommitAndSubcommitWithTimestamp.then):
3397         * tools/js/database.js:
3398
3399 2017-03-07  Ryosuke Niwa  <rniwa@webkit.org>
3400
3401         Update ReadMe.md to use directory format for backing up & restoring the database
3402         https://bugs.webkit.org/show_bug.cgi?id=169263
3403
3404         Reviewed by Joseph Pecoraro.
3405
3406         Update ReadMe.md's instruction to backup and restore the database to use directory format instead of
3407         piping it to gzip. The new command will backup and restore the database with multiple concurrent processes
3408         with a custom compression level.
3409
3410         * ReadMe.md:
3411
3412 2017-03-02  Ryosuke Niwa  <rniwa@webkit.org>
3413
3414         Make baseline data points selectable
3415         https://bugs.webkit.org/show_bug.cgi?id=169069
3416         <rdar://problem/29209427>
3417
3418         Reviewed by Antti Koivisto.
3419
3420         Add the capability to select data points other than "current" configuration type.
3421
3422         This patch refactors the way the "chart status" is computed. Before this patch, ChartStatusView was
3423         responsible for determining two data points for which to compute the status, and computing the status
3424         between two data points. ChartPaneStatusView which inherits from ChartStatusView and used in the charts
3425         page relied upon ChartStatusView to compute these values, and computed the list of revision ranges for
3426         each relevant repository between the data points. ChartPane then had callbacks on ChartPaneStatusView
3427         to know whenever these values changed. Because of this entangled mess, ChartStatusView had to be aware
3428         of InteractiveTimeSeriesChart even though only ChartPaneStatusView could be used with it.
3429
3430         This patch dramatically simplifies the situation by adding referencePoints() on TimeSeriesChart and
3431         InteractiveTimeSeriesChart which returns the current point, the previous point if there is any, and
3432         their time series view. It also extracts ChartStatusEvaluator which computes the current status values
3433         and ChartRevisionRange which computes a list of revision differences both based on the referencePoints.
3434         As a result, ChartPaneStatusView no longer inherits from ChartStatusView, and ChartStatusView has been
3435         renamed to DashboardChartStatusView to reflect its purpose. Furthermore, ChartPane which used to rely on
3436         ChartPaneStatusView's revisionCallback to update the commit log viewer simply uses another instance of
3437         ChartRevisionRange, eliminating the need for the callback.
3438
3439         To implement these classes easily, this patch also introduces a new class, LazilyEvaluatedFunction to
3440         memoize the return value of a function when called with the same arguments. Delaying the computation of
3441         a value and avoiding the work when the values are the same is a very common pattern in the perf dashboard
3442         so I expect this class would be used in a lot more places in the future.
3443
3444         * browser-tests/chart-revision-range-tests.js: Added. Tests for ChartRevisionRange.
3445         * browser-tests/chart-status-evaluator-tests.js: Added. Tests for ChartStatusEvaluator.
3446
3447         * browser-tests/index.html:
3448         (BrowsingContext):
3449         (BrowsingContext.importScripts): Fixed the bug that calling importScripts twice results in MockRemoteAPI
3450         being loaded twice.
3451         (ChartTest.importChartScripts): Import more model objects.
3452         (ChartTest.sampleCluster): Made this a getter.
3453         (ChartTest.makeModelObjectsForSampleCluster):
3454         (ChartTest.makeSampleCluster): Added. Cutomizes the valus of baseline / target based on options.
3455         (ChartTest.respondWithSampleCluster): Now takes an options argument for makeSampleCluster.
3456
3457         * public/v3/components/chart-pane-base.js:
3458         (ChartPaneBase): Added _openRepository to keep track of the currently open repository instead of relying
3459         on _mainChartStatus or _commitLogViewer to keep track of it.
3460         (ChartPaneBase.prototype.configure):  The callback for when the user clicked on a repository name in
3461         ChartPaneStatusView has been replaced by "openRepository" action.
3462         (ChartPaneBase.prototype.setOpenRepository): Moved from ChartPane.
3463         (ChartPaneBase.prototype._mainSelectionDidChange):
3464         (ChartPaneBase.prototype._indicatorDidChange):
3465         (ChartPaneBase.prototype._didFetchData):
3466         (ChartPaneBase.prototype._updateCommitLogViewer): Renamed from _updateStatus.
3467         (ChartPaneBase.prototype.openNewRepository): Renamed from _requestOpeningCommitViewer. Fixed a bug that
3468         clicking on the repository name inside ChartPaneStatusView would not focus the pane, which resulted in
3469         arrow keys to be ignored instead of moving the main chart's indicator or the currently open repository.
3470         (ChartPaneBase.prototype._keyup):
3471         (ChartPaneBase.prototype._moveOpenRepository): Moved from ChartPaneStatusView's
3472         moveRepositoryWithNotification. Used when changing the open repository by up/down arrow keys.
3473
3474         * public/v3/components/chart-revision-range.js: Added. Extracted from ChartPaneStatusView.
3475         (ChartRevisionRange): Added.
3476         (ChartRevisionRange.prototype.revisionList): Added.
3477         (ChartRevisionRange.prototype.rangeForRepository): Added.
3478         (ChartRevisionRange._revisionForPoint): Added. Extracted from ChartPaneStatusView's
3479         _updateRevisionListForNewCurrentRepository.
3480         (ChartRevisionRange._computeRevisionList): Ditto from computeChartStatusLabels.
3481
3482         * public/v3/components/chart-status-evaluator.js: Added.
3483         (ChartStatusEvaluator): Added.
3484         (ChartStatusEvaluator.prototype.status): Added.
3485         (ChartStatusEvaluator.computeChartStatus): Added. Extracted from ChartStatusView's updateStatusIfNeeded.
3486
3487         * public/v3/components/chart-status-view.js: Removed.
3488         (ChartStatusView): Deleted. Split into ChartStatusEvaluator and DashboardChartStatusView.
3489
3490         * public/v3/components/chart-styles.js:
3491         (ChartStyles.baselineStyle): Make baseline data points interactive. This single line change is what
3492         enables the user to interact with the data points. The rest of changes in this patch mostly deals with
3493         the status text such as "5% worse than baseline" and the list of revisions shown in the commit log viewer
3494         which would have shown the wrong range without these changes.
3495
3496         * public/v3/components/dashboard-chart-status-view.js: Added. Extracted from ChartStatusView.
3497         (DashboardChartStatusView): Added.
3498         (DashboardChartStatusView.prototype.render): Added.
3499         (DashboardChartStatusView.htmlTemplate): Added.
3500         (DashboardChartStatusView.cssTemplate): Added.
3501
3502         * public/v3/components/interactive-time-series-chart.js:
3503         (InteractiveTimeSeriesChart.prototype.referencePoints): Added. Return the first point and the last point
3504         as the reference points when there is a selection. Only report the previous point if they are distinct as
3505         showing a range of revisions from a data point to itself makes no sense. When there is a indicator simply
3506         return it and its previous point as reference points. Otherwise return null unlike TimeSeriesChart's
3507         referencePoints which always returns the latest point as the reference point.
3508
3509         * public/v3/components/time-series-chart.js:
3510         (TimeSeriesChart.prototype.referencePoints): Added. Return the latest point as the reference point. It
3511         never returns the previous point even if there were more data points as there is no way for the user to
3512         specify which data points to compare.
3513
3514         * public/v3/index.html: Include newly added files.
3515
3516         * public/v3/lazily-evaluated-function.js: Added.
3517         (LazilyEvaluatedFunction): Added.
3518         (LazilyEvaluatedFunction.prototype.evaluate): Added.
3519
3520         * public/v3/models/commit-log.js:
3521         (CommitLog.prototype.diff): Fixed a bug that computing the diff of two Subversion-like revisions results
3522         in "from" field to be unexpectedly an integer instead of a string.
3523
3524         * public/v3/models/metric.js:
3525         (Metric): Moved the code to compute the unit from the metric name from v2's RunsData class. This makes
3526         writing tests easier since it eliminates the need to load v2's data.js.
3527         (Metric.prototype.unit):
3528         (Metric.prototype.isSmallerBetter): Ditto for determining whether the unit is smaller-is-better.
3529
3530         * public/v3/pages/analysis-task-page.js:
3531         (AnalysisTaskChartPane.prototype._updateStatus): Deleted the unused code.
3532
3533         * public/v3/pages/chart-pane-status-view.js:
3534         (ChartPaneStatusView): No longer inherits from ChartStatusView. Uses ChartStatusEvaluator and
3535         ChartRevisionRange to to compute the chart status and the list of revision changes.
3536         (ChartPaneStatusView.prototype.pointsRangeForAnalysis): Deleted.
3537         (ChartPaneStatusView.prototype.render): Split it into _renderStatus and _renderBuildRevisionTable using
3538         LazilyEvaluatedFunction.
3539         (ChartPaneStatusView.prototype._renderStatus): Added.
3540         (ChartPaneStatusView.prototype._renderBuildRevisionTable): Added.
3541         (ChartPaneStatusView.prototype.setCurrentRepository): _updateRevisionListForNewCurrentRepository has been
3542         moved into ChartRevisionRange. Just enqueue itself to re-render.
3543         (ChartPaneStatusView.prototype._setRevisionRange): Deleted.
3544         (ChartPaneStatusView.prototype.moveRepositoryWithNotification): Deleted.
3545         (ChartPaneStatusView.prototype.updateRevisionList): Deleted.
3546         (ChartPaneStatusView.prototype._updateRevisionListForNewCurrentRepository): Deleted.
3547         (ChartPaneStatusView.prototype.computeChartStatusLabels): Deleted.
3548         (ChartPaneStatusView.htmlTemplate):
3549         (ChartPaneStatusView.cssTemplate):
3550
3551         * public/v3/pages/chart-pane.js:
3552         (ChartPane.prototype.openNewRepository): Overrides the one in ChartPaneBase, which has been renamed from
3553         _requestOpeningCommitViewer.
3554         (ChartPane.prototype._analyzeRange):
3555         (ChartPane.prototype._renderActionToolbar): Use the main chart's selection directly to determine whether
3556         an analysis task can be created for the currenty selected range.
3557
3558         * public/v3/pages/dashboard-page.js:
3559         (DashboardPage.prototype._createChartForCell):
3560
3561         * unit-tests/lazily-evaluated-function-tests.js: Added. Tests for LazilyEvaluatedFunction.
3562
3563 2017-03-01  Ryosuke Niwa  <rniwa@webkit.org>
3564
3565         Build fix after r212853. Make creating an analysis task work again.
3566
3567         * public/v3/pages/analysis-task-page.js:
3568         (AnalysisTaskPage.prototype.render):
3569
3570 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
3571
3572         Fix tests after r213119 and r213120.
3573
3574         * browser-tests/time-series-chart-tests.js:
3575         (return.ChartTest.importChartScripts.context.then):
3576         (string_appeared_here.then): Deleted.
3577
3578 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
3579
3580         Removed the unused code that was supposed to be removed in the previous commit.
3581
3582         * browser-tests/time-series-chart-tests.js:
3583
3584 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
3585
3586         Split tests for InteractiveTimeSeriesChart into a separate test file.
3587         https://bugs.webkit.org/show_bug.cgi?id=168960
3588
3589         Reviewed by Joseph Pecoraro.
3590
3591         Extracted the test cases for InteractiveTimeSeriesChart charts from time-series-chart-tests.js
3592         into interactive-time-series-chart-tests.js now that the former file has gotten really big over time.
3593
3594         Also extracted a bunch of helper functions time-series-chart-tests.js as ChartTest in index.html.
3595         Any test which instantiates a time series chart can use this helper class.
3596
3597         * browser-tests/index.html:
3598         (ChartTest.importChartScripts): Ditto.
3599         (ChartTest.posixTime): Moved from time-series-chart-tests.js.
3600         (ChartTest.sampleCluster): Ditto.
3601         (ChartTest.createChartWithSampleCluster): Ditto.
3602         (ChartTest.createInteractiveChartWithSampleCluster): Ditto.
3603         (ChartTest.respondWithSampleCluster):
3604         * browser-tests/interactive-time-series-chart-tests.js: Extracted from time-series-chart-tests.js.
3605         * browser-tests/time-series-chart-tests.js:
3606         (posixTime): Moved.
3607         (dayInMilliseconds): Moved.
3608         (sampleCluster): Moved.
3609         (createChartWithSampleCluster): Moved.
3610         (createInteractiveChartWithSampleCluster): Moved.
3611         (respondWithSampleCluster): Moved.
3612         * unit-tests/analysis-task-tests.js: Fixed a typo. s/adopter/adapter/.
3613
3614 2017-02-27  Ryosuke Niwa  <rniwa@webkit.org>
3615
3616         Calling build() on a baseline point results in an exception
3617         https://bugs.webkit.org/show_bug.cgi?id=168959
3618
3619         Reviewed by Joseph Pecoraro.
3620
3621         Some baseline points may lack the build information. e.g. A custom data point made by an user.
3622         Only instantiate Build object in a point object returned by