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