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