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