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