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