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