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