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