'custom-configuration-test-group-form' should update test name when selected test...
[WebKit.git] / Websites / perf.webkit.org / ChangeLog
1 2019-03-21  Dewei Zhu  <dewei_zhu@apple.com>
2
3         'custom-configuration-test-group-form' should update test name when selected test or platform changes.
4         https://bugs.webkit.org/show_bug.cgi?id=196114
5
6         Reviewed by Ryosuke Niwa.
7
8         r240104 fixes commit sets unnecessarily get updated even there is no change.
9         However, this made changing test or platform no longer triggers 'commitSetChange' action.
10         Test name should change not only when 'commitSet' gets change, but also platform or test changes.
11         Renaming the action name from 'commitSetChange' to a more accurate description 'testConfigChange'.
12         Dispatch 'testConfigChange' when platform or test changes.
13
14         * browser-tests/custom-analysis-task-configurator-tests.js: Changed action name to 'commitSetChange'.
15         * public/v3/components/custom-analysis-task-configurator.js:
16         (CustomAnalysisTaskConfigurator.prototype._didUpdateSelectedPlatforms): Should dispatch 'commitSetChange' action.
17         (CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Changed action name to 'commitSetChange'.
18         * public/v3/components/custom-configuration-test-group-form.js: Added a unit test for this change.
19         (CustomConfigurationTestGroupForm.prototype.didConstructShadowTree):
20
21 2019-03-18  Dewei Zhu  <dewei_zhu@apple.com>
22
23         Fix a bug from r226303 that latest build time is not correctly calculated.
24         https://bugs.webkit.org/show_bug.cgi?id=195912
25
26         Reviewed by Ryosuke Niwa.
27
28         Time series is ordered by revision time which does not grantee the build time is
29         monotonically increasing.
30
31         * public/v3/pages/test-freshness-page.js: Use the latest build time instead of the build time of
32         last point on the chart.
33
34 2019-03-13  Dewei Zhu  <dewei_zhu@apple.com>
35
36         Test freshness page should improve the ability to correlating issues from same builder.
37         https://bugs.webkit.org/show_bug.cgi?id=195242
38
39         Reviewed by Ryosuke Niwa.
40
41         Added the ability to highlight indicators with same builder when mouse is hovering over one indicator.
42         This is a very useful visualization for correlating issues specific to a builder.
43         Added tooltip with latest build link when hovering over an indicator.
44
45         * public/v3/components/freshness-indicator.js:
46         (FreshnessIndicator): Removed 'summary' field as it's no longer needed.
47         Added 'highlighted' field.
48         (FreshnessIndicator.prototype.update): Added 'highlighted' argument.
49         (FreshnessIndicator.prototype.didConstructShadowTree): Make indicator to dispatch mouse enter and leave
50         messages so that UI can highlight corresponding cells.
51         (FreshnessIndicator.prototype.render):
52         (FreshnessIndicator.cssTemplate):
53         * public/v3/pages/test-freshness-page.js: Added tooltip to show latest build time and build link.
54         Added logic to manually compute table body height.
55         (TestFreshnessPage):
56         (TestFreshnessPage.prototype.didConstructShadowTree):
57         (TestFreshnessPage.prototype._fetchTestResults):
58         (TestFreshnessPage.prototype.render):
59         (TestFreshnessPage.prototype._renderTooltip):
60         (TestFreshnessPage.prototype._constructTableCell):
61         (TestFreshnessPage.cssTemplate):
62
63 2019-02-26  Dewei Zhu  <dewei_zhu@apple.com>
64
65         The table head of test freshness page should not scroll with the page.
66         https://bugs.webkit.org/show_bug.cgi?id=195092
67
68         Reviewed by Ryosuke Niwa.
69
70         Fix the location of the freshness table head to make it easier to corelate cell with test.
71
72         * public/v3/pages/test-freshness-page.js: Changed some style rules to make the table head fixed.
73         (TestFreshnessPage.prototype._renderTable):
74         (TestFreshnessPage.cssTemplate):
75
76 2019-01-17  Dewei Zhu  <dewei_zhu@apple.com>
77
78         Analyzing a chart that does not exist should not halt whole run-analysis script.
79         https://bugs.webkit.org/show_bug.cgi?id=193563
80
81         Reviewed by Ryosuke Niwa.
82
83         Halting whole run-analysis script while there is any invalid chart specified in Manifest makes the script fragile.
84         Run-analysis is also responsible for adding retry and sending notification which should not be block by this error.
85         Skipping analyzing the corresponding configuration seems reasonable.
86
87         * public/v3/models/measurement-set.js:
88         (MeasurementSet.prototype._ensureClusterPromise): Only add callback when callback is specified.
89         This will help to fix 'UnhandledPromiseRejectionWarning' while running the test.
90         * tools/js/measurement-set-analyzer.js:
91         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet): Catch the exception while failing to fetch a measurement set and skip the analysis for this config.
92         * unit-tests/measurement-set-analyzer-tests.js: Added unit tests for this.
93
94 2019-01-17  Dewei Zhu  <dewei_zhu@apple.com>
95
96         Updating commit in OSBuildFetcher should respect revision range in config.
97         https://bugs.webkit.org/show_bug.cgi?id=193558
98
99         Reviewed by Ryosuke Niwa.
100
101         OSBuildFetcher._fetchAvailableBuilds should filter out commits those are not in
102         revision range specified by cofnig.
103
104         * server-tests/tools-os-build-fetcher-tests.js: Added a unit test for this change.
105         * tools/js/os-build-fetcher.js:
106         (prototype.async._fetchAvailableBuilds): Filter out commits from update list if commit
107         revision is out of range.
108
109 2018-12-31  Dewei Zhu  <dewei_zhu@apple.com>
110
111         Test group results notification should not say a build request to build had failed even when it had successfully completed.
112         https://bugs.webkit.org/show_bug.cgi?id=193064
113
114         Reviewed by Ryosuke Niwa.
115
116         Should show 'Build completed' or 'Build failed' for build type build requests.
117
118         * browser-tests/test-group-result-page-tests.js: Added a unit test to guard this bug.
119         * tools/js/test-group-result-page.js: Show 'Build completed' or 'Build failed' for build type build requests.
120
121 2018-12-21  Dewei Zhu  <dewei_zhu@apple.com>
122
123         Add UI in analysis task page to show commit testability information.
124         https://bugs.webkit.org/show_bug.cgi?id=192972
125
126         Reviewed by Ryosuke Niwa.
127
128         Add UI in custom analysis task configuration and customizable test group form to show testability information.
129         Fix a bug in 'CustomAnalysisTaskConfigurator._updateCommitSetMap' that 'currentComparison' is incorrectly set.
130         SQL to update existing database:
131             ALTER TABLE commits ADD COLUMN IF NOT EXISTS commit_testability varchar(128) DEFAULT NULL;
132
133         * browser-tests/custom-analysis-task-configurator-tests.js: Added a unit test for the bug in
134         'CustomAnalysisTaskConfigurator._updateCommitSetMap'.
135         Added a unit test to make sure 'CustomAnalysisTaskConfigurator' still works when commit fetching never returns.
136         * browser-tests/index.html: Imported ''custom-analysis-task-configurator-tests.js'.
137         * init-database.sql: Increase 'commit_testability' field length from 64 characters to 128.
138         * public/v3/components/custom-analysis-task-configurator.js: Added UI to show testability information.
139         (CustomAnalysisTaskConfigurator):
140         (CustomAnalysisTaskConfigurator.prototype._didUpdateSelectedPlatforms): Should reset related field for corresponding
141         repositories that user does not specify revision.
142         (CustomAnalysisTaskConfigurator.prototype._updateMapFromSpecifiedRevisionsForConfiguration): A helper function
143         to update '_specifiedCommits' and '_invalidRevisionsByConfiguration' per '_specifiedRevisions'.
144         (CustomAnalysisTaskConfigurator.prototype.render):
145         (CustomAnalysisTaskConfigurator.prototype._updateCommitSetMap): Fixed a bug that 'currentComparison' is incorrectly set.
146         (CustomAnalysisTaskConfigurator.prototype._computeCommitSet):
147         (CustomAnalysisTaskConfigurator.prototype.async._fetchCommitsForConfiguration):
148         (CustomAnalysisTaskConfigurator.prototype.async._resolveRevision):
149         (CustomAnalysisTaskConfigurator.prototype._buildRevisionTable):
150         (CustomAnalysisTaskConfigurator.prototype._buildTestabilityList):
151         (CustomAnalysisTaskConfigurator.prototype._selectRepositoryGroup):
152         (CustomAnalysisTaskConfigurator.prototype._buildRevisionInput):
153         (CustomAnalysisTaskConfigurator.cssTemplate):
154         * public/v3/components/customizable-test-group-form.js: Added UI to show testability information.
155         (CustomizableTestGroupForm.prototype._renderCustomRevisionTable):
156         (CustomizableTestGroupForm.prototype._constructTestabilityRows.):
157         (CustomizableTestGroupForm.prototype._constructTestabilityRows):
158         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
159         Changing either revision editor or radio button should trigger a re-render as testability
160         information for updated revision may change.
161         (CustomizableTestGroupForm.cssTemplate):
162         * public/v3/models/commit-set.js:
163         (IntermediateCommitSet.prototype.commitsWithTestability): Renamed from 'commitsWithTestabilityWarnings'.
164         (IntermediateCommitSet.prototype.commitsWithTestabilityWarnings): Deleted.
165
166 2018-12-14  Dewei Zhu  <dewei_zhu@apple.com>
167
168         Extend commits table to contain testability information.
169         https://bugs.webkit.org/show_bug.cgi?id=191557
170
171         Reviewed by Ryosuke Niwa.
172
173         Added the ability to store testability message in commits table.
174         Refactored '/api/report-commits' to support updating commit only.
175         Updated os version syncing script to be able to update testability information.
176
177         * init-database.sql: Added 'commit_testability' field to 'commits' table.
178         * public/api/report-commits.php: Refactor this api to allow only update existing commits.
179         * public/include/commit-log-fetcher.php: Expose testability warning information in this API.
180         * public/include/commit-updater.php: Added 'CommitUpdater' to manage commit insert and update.
181         * public/v3/models/commit-log.js: CommitLog object should expose testability warning information.
182         (CommitLog.prototype.updateSingleton):
183         (CommitLog.prototype.testability):
184         * public/v3/models/commit-set.js: Added 'commitsWithTestability' and 'commits' to CommitSet and
185         IntermediateCommitSet instances.
186         (CommitSet.prototype.commitsWithTestability):
187         (CommitSet.prototype.commits):
188         (IntermediateCommitSet.prototype.commitsWithTestability):
189         (IntermediateCommitSet.prototype.commits):
190         * server-tests/api-report-commits-tests.js: Added unit tests for '/api/report-commits' when `insert=false`.
191         * server-tests/tools-os-build-fetcher-tests.js: Added and updated unit tests.
192         * tools/js/os-build-fetcher.js: Added the ability to update commit testability warnings.
193         (async.fetchReportAndUpdateCommits):
194         (prototype.async.fetchReportAndUpdateBuilds):
195         (prototype.async._fetchAvailableBuilds):
196         (prototype.async._commitsForAvailableBuilds):
197         (prototype._commitsWithinRange):
198         (prototype.async._reportCommits):
199         (fetchAndReportAllInOrder): Deleted.
200         (prototype.fetchAndReportNewBuilds): Deleted.
201         (prototype._fetchAvailableBuilds): Deleted.
202         (prototype._commitsForAvailableBuilds): Deleted.
203         (prototype._submitCommits): Deleted.
204         * tools/sync-os-versions.js:
205         * unit-tests/commit-log-tests.js: Added a unit test for 'testability'.
206         * unit-tests/commit-set-tests.js: Added unit tests for 'commitsWithTestability'.
207
208 2018-11-16  Ryosuke Niwa  <rniwa@webkit.org>
209
210         Manifest file can contain a test metric which references a non-existent test
211         https://bugs.webkit.org/show_bug.cgi?id=191796
212
213         Reviewed by Dewei Zhu.
214
215         The bug was caused by a race condition between the manifest file fetching the list of tests and test metrics
216         and new tests and test metrics being added. Because we would fetch tests before test metrics, it was possible
217         for new test metrics which references a test not included in the fetched tests to be present in the test metrics.
218
219         Fixed the bug by changing the order of the queries so that test metrics are fetched before tests. This guarantees
220         that any test referenced by a test metric always exists and thefore included in the manifest file.
221
222         Unfortunately no new tests beucase this involes a race condition.
223
224         * public/include/manifest-generator.php:
225
226 2018-11-13  Dewei Zhu  <dewei_zhu@apple.com>
227
228         Add cache for CommitLog objects to avoid refetching same commit.
229         https://bugs.webkit.org/show_bug.cgi?id=191621
230
231         Reviewed by Ryosuke Niwa.
232
233         Added a cache for fully fetched commit log objects to avoid refetching.
234
235         * public/v3/models/commit-log.js:
236         (CommitLog): Added assertion for id.
237         Removed unused 'remoteId' as it has been removed since r198479.
238         (CommitLog.async.fetchBetweenRevisions): Turned it into async function.
239         (CommitLog.async.fetchForSingleRevision): Added the logic to check cache before fetching.
240         (CommitLog._constructFromRawData): Added logic to add entries to cache.
241         * public/v3/models/repository.js: Added the ability to track fetched commit for certain repository.
242         (Repository.commitForRevision): Fixed measurement set not passing commit id while constructing a
243         commit log object.
244         (Repository.setCommitForRevision): Sets commit for a given revision.
245         * public/v3/models/commit-set.js: Fixed unit tests.
246         * unit-tests/commit-log-tests.js: Added unit tests for this change.
247         Fixed existing tests.
248         * unit-tests/commit-set-range-bisector-tests.js: Fixed unit tests.
249         * unit-tests/commit-set-tests.js: Fixed unit tests.
250
251 2018-11-08  Dewei Zhu  <dewei_zhu@apple.com>
252
253         commit time returned by '/api/measurement-set' should match the one returned by '/api/commits'.
254         https://bugs.webkit.org/show_bug.cgi?id=191457
255
256         Reviewed by Dean Jackson and Ryosuke Niwa.
257
258         Commit time returned by '/api/measurement-set' sometimes is calculated by 'epoch from ..'.
259         This function may return a floating number with 5 or 6 decimal digits due to double precision limitations.
260         However, some commits may be reported with 6 decimal decimal.
261         So the commit time for those commits will sometime be rounded to 5 decimal digits.
262         In order to avoid front end assertion failure in CommitLog, Database::to_js_time need to round to 5 digits.
263
264         * public/include/db.php: Change the behavior to match that of postgres.
265         Added logic to avoid losing precision in php.
266         * server-tests/api-measurement-set-tests.js: Added unit tests for this bug.
267         (queryPlatformAndMetric): Fix a bug that arguments are not used at all.
268
269 2018-11-07  Dewei Zhu  <dewei_zhu@apple.com>
270
271         "/api/report" does not check commit time correctly.
272         https://bugs.webkit.org/show_bug.cgi?id=191351
273
274         Reviewed by Ryosuke Niwa.
275
276         Test result report API does not convert formated time string to timestamp correctly
277         which result in not checking commit time correctly.
278
279         * public/include/report-processor.php: Use 'strtotime' instead of 'floatval'.
280         Accepts the time delta within 1 seconds.
281         * server-tests/api-report-tests.js: Added unit tests.
282         (reportWitMismatchingCommitTime):
283         (reportWithOneSecondCommitTimeDifference):
284
285 2018-11-06  Dewei Zhu  <dewei_zhu@apple.com>
286
287         Custom test group form should use commit set map before customization as the behavior of radio buttons.
288         https://bugs.webkit.org/show_bug.cgi?id=191347
289
290         Reviewed by Ryosuke Niwa.
291
292         The radio button behavior should always set the same revision while editing the revision input.
293         That means we should not use the intermediate commit set map but use the commit set map before
294         "Customize" link is clicked.
295
296         * browser-tests/customizable-test-group-form-tests.js: Added a unit test for this bug.
297         * public/v3/components/customizable-test-group-form.js: Pass uncustomized commit set so that the radio button
298         behavoir preserves.
299         (CustomizableTestGroupForm):
300         (CustomizableTestGroupForm.prototype.setCommitSetMap):
301         (CustomizableTestGroupForm.prototype.didConstructShadowTree):
302         (CustomizableTestGroupForm.prototype.render):
303         (CustomizableTestGroupForm.prototype._renderCustomRevisionTable):
304         (CustomizableTestGroupForm.prototype._constructTableBodyList):
305         (CustomizableTestGroupForm.prototype._constructTableRowForCommitsWithoutOwner):
306         (CustomizableTestGroupForm.prototype._constructTableRowForCommitsWithOwner):
307         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
308
309 2018-11-06  Dewei Zhu  <dewei_zhu@apple.com>
310
311         Customizable test group form should not reset manually edited commit value sometimes.
312         https://bugs.webkit.org/show_bug.cgi?id=190863
313
314         Reviewed by Ryosuke Niwa.
315
316         After changing the radio button and manually editing the commit value, commit value should not be reset
317         while changing the name of the test group.
318         Add the logic to prompt warning when manually typed commit does not exist.
319
320         * browser-tests/customizable-test-group-form-tests.js: Added a unit test for this bug.
321         * browser-tests/index.html:
322         * public/v3/components/customizable-test-group-form.js: Should always update commit set as long as
323         the repository of that row does not have a owner repository.
324         (CustomizableTestGroupForm.prototype._constructTableRowForCommitsWithoutOwner):
325         (CustomizableTestGroupForm.prototype._constructTableRowForCommitsWithOwner):
326         (CustomizableTestGroupForm.prototype._constructRevisionRadioButtons):
327
328 2018-10-16  Dewei Zhu  <dewei_zhu@apple.com>
329
330         Unreviewed, rolling out r236996.
331
332         Temporarily rollout to fix a manifest generation bug.
333         "lastModified" field for certain platform & metric configurations may be missing.
334
335         Reverted changeset:
336
337         "ManifestGenerator shouldn't need more than 1GB of memory or
338         run for 30 seconds"
339         https://bugs.webkit.org/show_bug.cgi?id=190393
340         https://trac.webkit.org/changeset/236996
341
342 2018-10-12  Ryosuke Niwa  <rniwa@webkit.org>
343
344         Perf dashboard: add a test for aggregating subtests without a matching metric in /api/report
345         https://bugs.webkit.org/show_bug.cgi?id=190544
346
347         Rubber-stamped by Keith Miller and unofficially reviewed by Dewei Zhu.
348
349         Added tests for reporting results to /api/report where a test with aggregated metrics has a subtest
350         without a matching metric type. The aggregation should simply skip such a subtest instead of returning
351         an error or aggregating with a mismatching metric type.
352
353         * server-tests/api-report-tests.js:
354         (.makeReport): Extracted out of a test case.
355
356 2018-10-11  Ryosuke Niwa  <rniwa@webkit.org>
357
358         Build fix after r236956. Use array_get to avoid warnings.
359
360         * public/include/report-processor.php:
361
362 2018-10-09  Dewei Zhu  <dewei_zhu@apple.com>
363
364         Performance dashboard should show added iterations due failed build requests.
365         https://bugs.webkit.org/show_bug.cgi?id=190419
366
367         Reviewed by Ryosuke Niwa.
368
369         Added UI to show added build requests due to previous failed build requests.
370         Updated the retry/bisect button to default to initial repetition count when test group is created.
371
372         * public/v3/pages/analysis-task-page.js: Added a div to show added build requests.
373         Retry and bisect button should default to initial repetion count.
374         (AnalysisTaskTestGroupPane.prototype._renderCurrentTestGroup):
375         (AnalysisTaskTestGroupPane.cssTemplate):
376
377 2018-10-09  Ryosuke Niwa  <rniwa@webkit.org>
378
379         ManifestGenerator shouldn't need more than 1GB of memory or run for 30 seconds
380         https://bugs.webkit.org/show_bug.cgi?id=190393
381
382         Reviewed by Antti Koivisto and unofficially reviewed by Dewei Zhu.
383
384         This patch reduces the runtime of /api/manifest from 13s to 7s and reduces the memory requirement from
385         1GB to 400MB for the internal dashboard in my local testing.
386
387         The biggest perf win comes from avoid running a complex query over test_configurations to compute
388         the latest modified date across different test configuration types ("current" vs. "baseline").
389         Instead, we now fetch the entire table row by row and compute the latest modified date in memory.
390
391         Also call intval in many more places to avoid generating double quotes, which is a pretty significant
392         proportion of the JSON file size at this point.
393
394         Finally, use references in more places to avoid deep copying of arrays.
395
396         * public/include/manifest-generator.php:
397         (ManifestGenerator::generate): Skip the generation of "dashboard" since it's only used by v1 UI.
398         (ManifestGenerator::tests): Don't copy each row.
399         (ManifestGenerator::metrics): Ditto.
400         (ManifestGenerator::platforms): Implement the aforementioned optimization. Instead of grouping
401         test configurations for a given metric and platform together, fetch them all and do in-memory
402         processing in PHP. Avoid more copying as well.
403         (ManifestGenerator::repositories): Avoid more copying.
404         (ManifestGenerator::bug_trackers): Ditto.
405         (ManifestGenerator::fetch_triggerables): Ditto.
406
407 2018-10-08  Ryosuke Niwa  <rniwa@webkit.org>
408
409         /api/report takes 15+ minutes submitting some test results
410         https://bugs.webkit.org/show_bug.cgi?id=190382
411
412         Rubber-stamped by Alexey Proskuryakov and unofficially reviewed by Dewei Zhu.
413
414         The issue was that recursively_ensure_tests would issue thousands of dependent queries.
415
416         Since most reporting of results would be happening after all the tests and test metrics had been created,
417         simply fetch the list of all tests and test metrics upfront in memory.
418
419         This would slow-down the reporting of other test results but in practice doesn't matter (an extra few seconds
420         of overhead) but for slow reporting, it can significantly reduce the runtime from ~10 minutes to ~10 seconds.
421
422         * public/include/report-processor.php:
423         (ReportProcessor::process): Call fetch_tests before recursively_ensure_tests.
424         (ReportProcessor::fetch_tests): Added. This builds up a mapping of tests based on a parent test ID as well as
425         a mapping of metrics per test based on its name and then its aggregator's name.
426         (ReportProcessor::recursively_ensure_tests): Added. Use the in-memory maps built in fetch_tests when possible.
427         (ReportProcessor::aggregator_list_if_exists): Take a reference instead of passing it by value.
428         (TestRunsGenerator::add_aggregated_metric): Now takes metric ID. The code to add the test metric had been moved
429         to recursively_ensure_tests.
430
431 2018-10-01  Dewei Zhu  <dewei_zhu@apple.com>
432
433         Add retry for test groups with failed build requests.
434         https://bugs.webkit.org/show_bug.cgi?id=190188
435
436         Reviewed by Ryosuke Niwa.
437
438         Added retry logic in run-analysis script.
439         Current retry logic will only be triggered when there is at least one successful build request for each commit set
440         in a test group.
441
442         * init-database.sql: Added 'testgroup_initial_repetition_count' and 'testgroup_may_need_more_requests'.
443         SQL to update existing database:
444         '''
445         BEGIN;
446             ALTER TABLE analysis_test_groups
447                 ADD COLUMN testgroup_initial_repetition_count integer DEFAULT NULL,
448                 ADD COLUMN testgroup_may_need_more_requests boolean DEFAULT FALSE;
449             UPDATE analysis_test_groups SET testgroup_initial_repetition_count = (
450                 SELECT DISTINCT(COUNT(*)) FROM build_requests WHERE request_group = testgroup_id AND request_order >= 0 GROUP BY request_commit_set
451             );
452             ALTER TABLE analysis_test_groups ALTER COLUMN testgroup_initial_repetition_count DROP DEFAULT, ALTER COLUMN testgroup_may_need_more_requests SET NOT NULL;
453         END;
454         '''
455         'testgroup_initial_repetition_count' represents the number of successful build request for each commit set when
456         test group is created.
457         'testgroup_may_need_more_requests' will be set when any build request in test group is set to 'failed'.
458         * public/api/build-requests.php: Added the logic to set 'testgroup_may_need_more_requests'.
459         * public/api/test-groups.php: Updated 'ready-for-notification' to 'ready-for-further-processing' so that it returns finished test
460         groups those either have 'needs_notification' or  'may_need_more_requests' set.
461         * public/include/commit-sets-helpers.php: Set 'initial_repetition_count' to repetition count.
462         * public/privileged-api/update-test-group.php: Added APIs to add build request for a test group and
463         update 'may_need_more_requests' flag.
464         * public/v3/models/test-group.js:
465         (TestGroup): Added '_mayNeedMoreRequests' and '_initialRepetitionCount' field.
466         Refactored code that interacts with '/api/update-test-group'.
467         (TestGroup.prototype.updateSingleton):
468         (TestGroup.prototype.mayNeedMoreRequests):
469         (TestGroup.prototype.initialRepetitionCount):
470         (TestGroup.prototype.async._updateBuildRequest):
471         (TestGroup.prototype.updateName):
472         (TestGroup.prototype.updateHiddenFlag):
473         (TestGroup.prototype.async.didSendNotification):
474         (TestGroup.prototype.async.addMoreBuildRequests):
475         (TestGroup.prototype.async.clearMayNeedMoreBuildRequests): Added API to clear 'may_need_more_requests' flag.
476         (TestGroup.fetchAllReadyForFurtherProcessing): Refactored 'TestGroup.fetchAllWithNotificationReady' to return test groups either
477         have 'needs_notification' or  'may_need_more_requests' set.
478         (TestGroup.fetchAllThatMayNeedMoreRequests): Fetches test groups those may need more build requests.
479         * server-tests/api-test-groups.js: Added unit tests.
480         * server-tests/privileged-api-add-build-requests-tests.js: Added unit tests for 'add-build-requests' API.
481         * server-tests/privileged-api-update-test-group-tests.js: Added unit tests.
482         * server-tests/resources/mock-data.js:
483         (MockData.addMockData):
484         * server-tests/resources/test-server.js:
485         (TestServer.prototype._determinePgsqlDirectory): Fixed a bug that 'childProcess.execFileSync' may return a buffer.
486         * tools/run-analysis.js: Added logic to add extra build request before sennding notification.
487         * tools/js/retry-failed-build-requests.js:
488         (async.createAdditionalBuildRequestsForTestGroupsWithFailedRequests): Module that add extra build requests.
489         * unit-tests/retry-failed-build-requests-tests.js: Added.
490         * unit-tests/test-groups-tests.js: Added unit tests.
491
492 2018-09-21  Dewei Zhu  <dewei_zhu@apple.com>
493
494         Apache can return a corrupt manifest file while ManifestGenerator::store is running
495         https://bugs.webkit.org/show_bug.cgi?id=189822
496
497         Reviewed by Ryosuke Niwa.
498
499         Updating a file on performance dashboard should be transactional between php and apache.
500         Otherwise, partial content may be served.
501
502         * public/api/measurement-set.php: Adapted invocation of 'generate_json_date_with_elapsed_time_if_needed'.
503         * public/api/runs.php: Adapted invocation of 'generate_json_date_with_elapsed_time_if_needed'.
504         * public/include/db.php: Make creating file transactionaly by taking advantage of
505         'move/rename' operation is atomic in OS.
506         Added logic to avoid overwriting file if all content except specified filed are identical.
507         * public/include/json-header.php: Added a helper function that added 'status' but does not
508         convert content to json.
509         * public/include/manifest-generator.php: Adapted invocation of 'generate_json_date_with_elapsed_time_if_needed'.
510         * public/shared/statistics.js: Removed unnecessary logging.
511         (Statistics.new.sampleMeanAndVarianceFromMultipleSamples):
512         * server-tests/api-manifest-tests.js: Updated one unit test.
513
514 2018-08-22  Dewei Zhu  <dewei_zhu@apple.com>
515
516         Show t-test results based on individual measurements to analysis task page.
517         https://bugs.webkit.org/show_bug.cgi?id=188425
518
519         Reviewed by Ryosuke Niwa.
520
521         Added comparison for individual iterations in analysis task page.
522         Added comparison for individual iterations for notification on A/B tests completion.
523         Refactored t-distribution inverse lookup to any degree of freedom with 5 significant figures.
524
525         * public/shared/statistics.js: Refactored t-distribution inverse lookup function and adapted this
526         change to all invocations.
527         (Statistics.new.this.supportedConfidenceIntervalProbabilities):
528         (Statistics.new.this.supportedOneSideTTestProbabilities):
529         (Statistics.new.this.confidenceIntervalDelta):
530         (Statistics.new.sampleMeanAndVarianceForMultipleSamples):
531         (Statistics.new.this.probabilityRangeForWelchsT):
532         (Statistics.new.this.probabilityRangeForWelchsTFromTwoSampleSets):
533         (Statistics.new.this._determinetwoSidedProbabilityBoundaryForWelchsT):
534         (Statistics.new.this.computeWelchsT):
535         (Statistics.new.this._computeWelchsTFromStatistics):
536         (Statistics.new.this.minimumTForOneSidedProbability): Function that does t-distribution inverse lookup.
537         * public/v3/components/analysis-results-viewer.js: Adapted TestGroup.compareTestResults change.
538         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._measurementsForCommitSet):
539         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._computeTestGroupStatus):
540         (AnalysisResultsViewer.TestGroupStackingBlock.prototype._valuesForCommitSet): Deleted.
541         * public/v3/components/test-group-results-viewer.js: Show both comparisions for both individual and mean.
542         (TestGroupResultsViewer.prototype._renderResultsTable):
543         (TestGroupResultsViewer.prototype._buildRowForMetric.):
544         (TestGroupResultsViewer.prototype._buildValueMap):
545         * public/v3/models/test-group.js:
546         (TestGroup.compareTestResults): Added comparison for individual iterations.
547         * tools/js/test-group-result-page.js:
548         (TestGroupResultPage.prototype._constructTableForMetric):
549         (TestGroupResultPage.prototype.get styleTemplate):
550         (TestGroupResultPage):
551         (TestGroupResultPage.prototype._URLForAnalysisTask): Renamed to '_resultsForTestGroup'
552         * unit-tests/statistics-tests.js: Updated and added unit tests.
553
554 2018-07-13  Dewei Zhu  <dewei_zhu@apple.com>
555
556         CustomConfigurationTestGroupForm should dispatch different arguments based on whether analysis task is created.
557         https://bugs.webkit.org/show_bug.cgi?id=187675
558
559         Reviewed by Ryosuke Niwa.
560
561         This change will fix the bug that no notification will be sent for any test groups except the
562         first one in any custom perf-try A/B task.
563
564         * public/v3/components/custom-configuration-test-group-form.js:
565         (CustomConfigurationTestGroupForm.prototype.startTesting): Conditionally includes taskName based on
566         whether or not analysis task is created.
567
568 2018-07-03  Dewei Zhu  <dewei_zhu@apple.com>
569
570         MeasurementSet should merge last four segments into two if values are identical.
571         https://bugs.webkit.org/show_bug.cgi?id=187311
572
573         Reviewed by Ryosuke Niwa.
574
575         If last four segments has the same value, MeasurmentSet should merge them.
576
577         * public/v3/models/measurement-set.js: Added the logic to conditionally merge last segments.
578         (MeasurementSet.prototype.fetchSegmentation):
579         * unit-tests/measurement-set-tests.js: Added a unit test for this change.
580
581 2018-06-29  Dewei Zhu  <dewei_zhu@apple.com>
582
583         Manifest.reset should clear static map for BugTracker and Bug objects.
584         https://bugs.webkit.org/show_bug.cgi?id=187186
585
586         Reviewed by Ryosuke Niwa.
587
588         If static maps of BugTracker and Bug objects are not cleared up, updating singleton
589         of Bug object will fail assertion.
590
591         * public/v3/models/manifest.js: Clear static map for BugTracker and Bug.
592         (Manifest.reset):
593         * server-tests/api-manifest-tests.js: Added a unit test for this change.
594
595 2018-06-29  Dewei Zhu  <dewei_zhu@apple.com>
596
597         Fix a bug in range bisector that start commit may be counted twice.
598         https://bugs.webkit.org/show_bug.cgi?id=187205
599
600         Reviewed by Darin Adler.
601
602         Range bisector counted start commit twice if start commit is the same as end commit.
603
604         * public/v3/commit-set-range-bisector.js:
605         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits):
606         * unit-tests/commit-set-range-bisector-tests.js: Added a unit test for this change.
607
608 2018-06-28  Dewei Zhu  <dewei_zhu@apple.com>
609
610         Fix a bug ComponentBase that wrong content template may be used.
611         https://bugs.webkit.org/show_bug.cgi?id=187159
612
613         Reviewed by Ryosuke Niwa.
614
615         ComponentBase uses '_parsed' to mark whether content and style templates of a class
616         is parsed. However, derived class parsing will be skipped as 'Derive._parsed' is available
617         via prototype chain whenever the base class is parsed.
618
619         * browser-tests/component-base-tests.js: Added unit tests.
620         * public/v3/components/base.js: Added 'hasOwnProperty' to make sure current class is parsed.
621         (ComponentBase.prototype._ensureShadowTree):
622
623 2018-06-25  Dewei Zhu  <dewei_zhu@apple.com>
624
625         MeasurementSetAnalyzer should check triggerable availability before creating confirming A/B tests.
626         https://bugs.webkit.org/show_bug.cgi?id=187028
627
628         Reviewed by Ryosuke Niwa.
629
630         If the triggerable is not available, MeasurmentSetAnalyzer should only create analysis task without
631         confirming A/B tests.
632
633         * tools/js/measurement-set-analyzer.js: Added logic to check triggerable availability.
634         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet):
635         (MeasurementSetAnalyzer):
636         * unit-tests/measurement-set-analyzer-tests.js: Updated unit tests and added a new unit test for this change.
637
638 2018-06-11  Dewei Zhu  <dewei_zhu@apple.com>
639
640         Extend test group rule to support 'userInitiated' field.
641         https://bugs.webkit.org/show_bug.cgi?id=186544
642
643         Reviewed by Ryosuke Niwa.
644
645         Added support for rule specifying whether or not test group is user initiated.
646
647         * tools/js/analysis-results-notifier.js: Rule now support 'userInitiated' field.
648         (AnalysisResultsNotifier.prototype.async.sendNotificationsForTestGroups):
649         (AnalysisResultsNotifier.prototype._applyRules):
650         (AnalysisResultsNotifier._matchesRule):
651         * unit-tests/analysis-results-notifier-tests.js: Added unit tests for this change.
652
653 2018-05-29  Dewei Zhu  <dewei_zhu@apple.com>
654
655         CommitSet range bisector should use commits occur in commit sets which specify the range as valid commits for commits without ordering.
656         https://bugs.webkit.org/show_bug.cgi?id=186062
657
658         Reviewed by Ryosuke Niwa.
659
660         For commits without ordering, we should use the commits occurs in the commit sets which specify the range as valid commits.
661         Commit sets in range should only contain those valid commits for corresponding repositories.
662
663         * public/v3/commit-set-range-bisector.js: Updated logic to add check on commits without ordering.
664         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits):
665         * unit-tests/commit-set-range-bisector-tests.js: Added a unit test for this case.
666
667 2018-06-07  Dewei Zhu  <dewei_zhu@apple.com>
668
669         Related task may not have a metric or platform.
670         https://bugs.webkit.org/show_bug.cgi?id=186426
671
672         Reviewed by Ryosuke Niwa.
673
674         Related task in the related task list can be a custom analysis task which
675         may not have platform or metric.
676
677         * public/v3/pages/analysis-task-page.js: Added null checks for platform and metric.
678         (AnalysisTaskPage.prototype._renderRelatedTasks):
679
680 2018-06-07  Dewei Zhu  <dewei_zhu@apple.com>
681
682         Fix browser test failed assertions and a bug in 'common-component-base'
683         https://bugs.webkit.org/show_bug.cgi?id=186423
684
685         Reviewed by Ryosuke Niwa.
686
687         Fixed serveral assertion failures in browser tests.
688         Fixed a bug in common-component-base that null/undefined as attribute value is not allowed.
689
690         * browser-tests/chart-revision-range-tests.js: Should not import 'lazily-evaluated-function.js' twice.
691         * browser-tests/chart-status-evaluator-tests.js: Should not import 'lazily-evaluated-function.js' twice.
692         * browser-tests/component-base-tests.js: Added a unit test for element attributes being null or undefined.
693         * browser-tests/index.html: Make mocked data from makeSampleCluster also contains commit_order.
694         * public/shared/common-component-base.js: Make it allow to take null as attribute value.
695         (CommonComponentBase.createElement):
696
697 2018-05-24  Dewei Zhu  <dewei_zhu@apple.com>
698
699         Added sending notification feature when test group finishes.
700         https://bugs.webkit.org/show_bug.cgi?id=184340
701
702         Reviewed by Ryosuke Niwa.
703
704         Added 'testgroup_needs_notification' filed to 'analysis_test_group' table to indicate whether a test group
705         has a pending notification.
706         Added 'testgroup_notification_sent_at' to record the last notification sent time.
707         SQL queries to update existing database are:
708             'ALTER TABLE analysis_test_groups ADD COLUMN testgroup_needs_notification boolean NOT NULL DEFAULT FALSE;'
709             'ALTER TABLE analysis_test_groups ADD COLUMN testgroup_notification_sent_at timestamp DEFAULT NULL;'
710         Updated 'run-analysis' script to be able to send notification when test group finishes.
711         Added 'Notify on completion' checkbox while creating/retrying/bisecting a test group.
712
713         * browser-tests/test-group-form-tests.js: Updated existing tests and added a new test.
714         * browser-tests/test-group-result-page-tests.js: Added unit tests for TestGroupResultPage.
715         * init-database.sql: Added 'testgroup_needs_notification' filed to 'analysis_test_group' table.
716         * public/api/test-groups.php: Added '/api/test-groups/ready-for-notification' API to 'test-group' to show all
717         test groups that need to send notification. Only the ones with 'completed', 'failed' or 'cancelled' status and its
718         'testgroup_needs_notification' is true will be returned by this API.
719         * public/include/build-requests-fetcher.php: Added 'fetch_requests_for_groups' to return test groups with given ids.
720         * public/include/commit-sets-helpers.php: Updated the logic to support setting 'testgroup_needs_notification'
721         while create an analysis_test_groups.
722         * public/privileged-api/create-analysis-task.php: Updated the logic to support setting 'testgroup_needs_notification'.
723         * public/privileged-api/create-test-group.php: Updated the logic to support setting 'testgroup_needs_notification'.
724         * public/privileged-api/update-test-group.php: Updated the logic to support updating 'testgroup_needs_notification'.
725         Extended this API to allow authentication both from CSRF token and slave.
726         * public/v3/components/custom-configuration-test-group-form.js:
727         (CustomConfigurationTestGroupForm.prototype.startTesting): Pass 'notifyOnCompletion' information which represents
728         'testgroup_needs_notification' from API perspective.
729         * public/v3/components/customizable-test-group-form.js:
730         (CustomizableTestGroupForm.prototype.startTesting): Pass 'notifyOnCompletion' information which represents
731         'testgroup_needs_notification' from API perspective.
732         (CustomizableTestGroupForm.cssTemplate): Added space between 'Notify on completion' checkbox and test group iteration selection list.
733         * public/v3/components/test-group-form.js:
734         (TestGroupForm): Added '_notifyOnCompletion' instance variable.
735         (TestGroupForm.prototype.didConstructShadowTree): Added 'onchange' event for notify on completion checkbox.
736         (TestGroupForm.prototype.startTesting): Pass 'notifyOnCompletion' information which represents
737         'testgroup_needs_notification' from API perspective.
738         (TestGroupForm.cssTemplate): Added space between 'Notify on completion' checkbox and test group iteration selection list.
739         * public/v3/models/analysis-results.js: Export 'AnalysisResults'.
740         (AnalysisResults.fetch): Update API path to use absolute url.
741         (AnalysisResults):
742         * public/v3/models/analysis-task.js:
743         (AnalysisTask.async.create): Extend this function to take notifyOnCompletion as argument which will be used as
744         'needsNotification' to send to server.
745         (AnalysisTask):
746         * public/v3/models/test-group.js:
747         (TestGroup): Added '_needsNotification' field.
748         (TestGroup.prototype.updateSingleton): Added logic to update '_needsNotification' field.
749         (TestGroup.prototype.needsNotification): Returns '_needsNotification' field.
750         (TestGroup.prototype.author): Returns author information.
751         (TestGroup.prototype.async.didSendNotification): API that updates 'testgroup_needs_notification' to true.
752         (TestGroup.prototype.async.fetchTask): API to fetch the task when it has not been fetched.
753         (TestGroup.createWithTask): Updated this function to accept 'notifyOnCompletion' which will be used as
754         'needsNotification' to send to server.
755         (TestGroup.createWithCustomConfiguration): Updated this function to accept 'notifyOnCompletion' which will be used as
756         'needsNotification' to send to server.
757         (TestGroup.createAndRefetchTestGroups): Updated this function to accept 'notifyOnCompletion' which will be used as
758         'needsNotification' to send to server.
759         (TestGroup.fetchAllWithNotificationReady): New function that invokes '/api/test-groups/ready-for-notification'.
760         * public/v3/pages/analysis-task-page.js: Update logic to 'notifyOnCompletion' around
761         (AnalysisTaskChartPane.prototype.didConstructShadowTree):
762         (AnalysisTaskResultsPane.prototype.didConstructShadowTree):
763         (AnalysisTaskTestGroupPane.prototype.didConstructShadowTree):
764         (AnalysisTaskPage.prototype.didConstructShadowTree):
765         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
766         (AnalysisTaskPage.prototype.async._bisectCurrentTestGroup):
767         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList.set const):
768         (AnalysisTaskPage.prototype._createTestGroupAfterVerifyingCommitSetList):
769         (AnalysisTaskPage.prototype._createCustomTestGroup):
770         * public/v3/pages/chart-pane.js: Added 'Notify on completion' checkbox.
771         (ChartPane.prototype.didConstructShadowTree):
772         (ChartPane.prototype.async._analyzeRange):
773         * public/v3/pages/create-analysis-task-page.js: Adapted API change.
774         (CreateAnalysisTaskPage.prototype._createAnalysisTaskWithGroup):
775         * server-tests/api-test-groups.js: Added tests for '/api/test-groups/ready-for-notification'.
776         * server-tests/privileged-api-create-analysis-task-tests.js: Updated tests to adapt this change.
777         Added new tests.
778         * server-tests/privileged-api-create-test-group-tests.js: Added new tests.
779         * server-tests/privileged-api-update-test-group-tests.js: Added unit test for 'update-test-group' API.
780         * server-tests/resources/mock-data.js: addMockData should set 'testgroup_needs_notification' to be true.
781         * server-tests/tools-sync-buildbot-integration-tests.js: Updated tests to adapt this change.
782         (async.createTestGroupWihPatch):
783         (createTestGroupWihOwnedCommit):
784         * tools/js/analysis-results-notifier.js: Added notifier to send notification for completed test groups.
785         (AnalysisResultsNotifier):
786         (AnalysisResultsNotifier.prototype.async.sendNotificationsForTestGroups):
787         (AnalysisResultsNotifier.prototype._sendNotification): Invoke remote API to send notification.
788         (AnalysisResultsNotifier.prototype._constructMessageByRules):
789         (AnalysisResultsNotifier._matchesRule):
790         (AnalysisResultsNotifier._applyUpdate):
791         (AnalysisResultsNotifier.async._messageForTestGroup): Build html as message body for a test group.
792         (AnalysisResultsNotifier._URLForAnalysisTask): Returns URL for an analysis task.
793         (AnalysisResultsNotifier._instantiateNotificationTemplate):
794         * tools/js/test-group-result-page.js: Added 'TestGroupResultPage' and 'BarGraph' to show test group result.
795         (TestGroupResultPage):
796         (TestGroupResultPage.prototype.async.setTestGroup):
797         (TestGroupResultPage._urlForAnalysisTask):
798         (TestGroupResultPage.prototype._URLForAnalysisTask):
799         (TestGroupResultPage.prototype.constructTables):
800         (TestGroupResultPage.prototype._constructTableForMetric):
801         (TestGroupResultPage.):
802         (TestGroupResultPage.prototype.get pageContent):
803         (TestGroupResultPage.prototype.get styleTemplate):
804         (BarGraph):
805         (BarGraph.prototype.setWidth):
806         (BarGraph.prototype._constructBarGraph):
807         (BarGraph.prototype.get pageContent):
808         (BarGraph.prototype.get styleTemplate):
809         * tools/js/measurement-set-analyzer.js: Adapted 'AnalysisTask.create' change.
810         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet):
811         (MeasurementSetAnalyzer):
812         * tools/js/v3-models.js:
813         * tools/run-analysis.js: Added the logic that sends notification for completed test groups.
814         (main):
815         (async.analysisLoop):
816         * unit-tests/analysis-task-tests.js:
817         * unit-tests/analysis-results-notifier-tests.js: Added a unit test for 'AnalysisResultsNotifier' and 'NotificationService'.
818         * unit-tests/measurement-set-analyzer-tests.js: Updated unit tests per this change.
819         * unit-tests/test-groups-tests.js: Added unit tests for 'TestGroup.needsNotification'.
820         * unit-tests/resources/mock-remote-api.js: Only set 'privilegedAPI' when it exits.
821
822 2018-06-07  Ryosuke Niwa  <rniwa@webkit.org>
823
824         Add the basic support for writing components in node.js
825         https://bugs.webkit.org/show_bug.cgi?id=186299
826
827         Reviewed by Antti Koivisto.
828
829         Add the basic support for writing components in node.js for generating rich email notifications.
830
831         To do this, this patch introduces MarkupComponentBase and MarkupPage which implement similar API
832         to ComponentBase and Page classes of v3 UI code. This enables us to share code between frontend
833         and the backend in the future. Because there is no support for declarative custom elements or
834         shadow root in HTML, MarkupComponentBase uses a similar but distinct concept of "content" tree
835         to represent the "DOM" tree for a component. When generating the HTML, MarkupComponentBase and
836         MarkupPage collectively transforms stylesheets and flattens the tree into a single HTML. In order
837         to keep this flatteneing logic simple, MarkupComponentBase only supports a very small subset of
838         CSS selectors to select elements by their local names and class names.
839
840         Specifically, each class name and element name based selectors are replaced by a globally unique
841         class name based selector, and each element which matches the selector is applied of the same
842         globally unique class name. The transformation is applied when constructing the "content" tree
843         as well as calls to renderReplace.
844
845         Because much of v3 frontend code relies on DOM API, this patch also implements the simplest form
846         of a fake DOM API as MarkupNode, MarkupParentNode, MarkupElement, and MarkupText. In order to avoid
847         reimplementing HTML & CSS parsers, this patch introduces the concept of content and style templates
848         to ComponentBase which are JSON alternatives to HTML & CSS template strings which can be used in
849         both frontend & backend.
850
851         * browser-tests/close-button-tests.js: Include CommonComponentBase.
852         * browser-tests/commit-log-viewer-tests.js: Ditto.
853         * browser-tests/component-base-tests.js: Ditto. Added a test cases for content & style templates.
854         (async.importComponentBase): Added.
855         * browser-tests/editable-text-tests.js: Include CommonComponentBase.
856         * browser-tests/index.html:
857         * browser-tests/markup-page-tests.js: Added.
858         * browser-tests/page-router-tests.js: Include CommonComponentBase.
859         * browser-tests/page-tests.js: Ditto.
860         * browser-tests/test-group-form-tests.js: Ditto.
861         * public/shared/common-component-base.js: Added.
862         (CommonComponentBase): Extracted out of ComponentBase.
863         (CommonComponentBase.prototype.renderReplace): Added.
864         (CommonComponentBase.renderReplace): Moved from ComponentBase.
865         (CommonComponentBase.prototype._recursivelyUpgradeUnknownElements): Moved and renamed from
866         ComponentBase's _recursivelyReplaceUnknownElementsByComponents.
867         (CommonComponentBase.prototype._upgradeUnknownElement): Extracted out of the same function.
868         (CommonComponentBase._constructStylesheetFromTemplate): Added.
869         (CommonComponentBase._constructNodeTreeFromTemplate): Added.
870         (CommonComponentBase.prototype.createElement): Added.
871         (CommonComponentBase.createElement): Moved from ComponentBase.
872         (CommonComponentBase._addContentToElement): Moved from ComponentBase.
873         (CommonComponentBase.prototype.createLink): Added.
874         (CommonComponentBase.createLink): Moved from ComponentBase.
875         (CommonComponentBase._context): Added. Set to document in a browser and MarkupDocument in node.js.
876         (CommonComponentBase._isNode): Added. Set to a function which does instanceof Node/MarkupNode check.
877         (CommonComponentBase._baseClass): Added. Set to ComponentBase or MarkupComponentBase.
878         * public/v3/components/base.js:
879         (ComponentBase):
880         (ComponentBase.prototype._ensureShadowTree): Added the support for the content and style templates.
881         Also avoid parsing the html template each time a component is instantiated by caching the result.
882         * public/v3/index.html:
883         * tools/js/markup-component.js: Added.
884         (MarkupDocument): Added. A fake Document.
885         (MarkupDocument.prototype.createContentRoot): A substitude for attachShadow.
886         (MarkupDocument.prototype.createElement):
887         (MarkupDocument.prototype.createTextNode):
888         (MarkupDocument.prototype._idForClone):
889         (MarkupDocument.prototype.reset):
890         (MarkupDocument.prototype.markup):
891         (MarkupDocument.prototype.escapeAttributeValue):
892         (MarkupDocument.prototype.escapeNodeData):
893         (MarkupNode): Added. A fake Node. Each node gets an unique ID.
894         (MarkupNode.prototype._markup):
895         (MarkupNode.prototype.clone): Implemented by the leave class.
896         (MarkupNode.prototype._cloneNodeData):
897         (MarkupNode.prototype.remove):
898         (MarkupParentNode): Added. An equivalent of ContainerNode in WebCore.
899         (MarkupParentNode.prototype.get childNodes):
900         (MarkupParentNode.prototype._cloneNodeData):
901         (MarkupParentNode.prototype.appendChild):
902         (MarkupParentNode.prototype.removeChild):
903         (MarkupParentNode.prototype.removeAllChildren):
904         (MarkupParentNode.prototype.replaceChild):
905         (MarkupContentRoot): Added. Used like a shadow tree.
906         (MarkupContentRoot.prototype._markup): Added.
907         (MarkupElement): Added. A fake Element. It also implements a subset of IDL attributes implemented by
908         subclasses such as HTMLInputElement for simplicity.
909         (MarkupElement.prototype.get id): Added.
910         (MarkupElement.prototype.get localName): Added.
911         (MarkupElement.prototype.clone): Added.
912         (MarkupElement.prototype.appendChild): Added.
913         (MarkupElement.prototype.addEventListener): Added.
914         (MarkupElement.prototype.setAttribute): Added.
915         (MarkupElement.prototype.getAttribute): Added.
916         (MarkupElement.prototype.get attributes): Added.
917         (MarkupElement.prototype.get textContent): Added.
918         (MarkupElement.prototype.set textContent): Added.
919         (MarkupElement.prototype._serializeStyle): Added.
920         (MarkupElement.prototype._markup): Added. Flattens the tree with content tree like copy & paste so
921         this can't be used to implement innerHTML.
922         (MarkupElement.prototype.get value): Added.
923         (MarkupElement.prototype.set value): Added.
924         (MarkupElement.prototype.get style): Added. Returns a fake writeonly CSSStyleDeclaration.
925         (MarkupElement.prototype.set style): Added.
926         (MarkupElement.get selfClosingNames): Added. A small list of self-closing tags for the HTML generation.
927         (MarkupText): Added.
928         (MarkupText.prototype.clone): Added.
929         (MarkupText.prototype._markup): Added.
930         (MarkupText.prototype.get data): Added.
931         (MarkupText.prototype.set data): Added.
932         (MarkupComponentBase): Added.
933         (MarkupComponentBase.prototype.element): Added. Like ComponentBase's element.
934         (MarkupComponentBase.prototype.content): Added. Like ComponentBase's content.
935         (MarkupComponentBase.prototype._findElementRecursivelyById): Added. A fake getElementById.
936         (MarkupComponentBase.prototype.render): Added. Like ComponentBase's render.
937         (MarkupComponentBase.prototype.runRenderLoop): Added. In ComponentBase, we use requestAnimationFrame.
938         In MarkupComponentBase, we keep rendering until the queue drains empty.
939         (MarkupComponentBase.prototype.renderReplace): Added. Like ComponentBase's renderReplace but applies
940         the transformation of classes to workaround the lack of shadow tree support in scriptless HTML.
941         (MarkupComponentBase.prototype._applyStyleOverrides): Added. Recursively applies the transformation.
942         (MarkupComponentBase.prototype._ensureContentTree): Added. Like ComponentBase's _ensureShadowTree.
943         (MarkupComponentBase.reset): Added.
944         (MarkupComponentBase._parseTemplates): Added. Parses the content & style templates, and generates the
945         transformed fake DOM tree and stylesheet text whereby selectors in each component is modified to be
946         unique across all components. The function to apply the necessary changes to an element is saved in
947         the global map of components, and later used in renderReplace via _applyStyleOverrides.
948         (MarkupComponentBase.defineElement): Added. Like ComponentBase's defineElement.
949         (MarkupComponentBase.prototype.createEventHandler): Added.
950         (MarkupComponentBase.createEventHandler): Added.
951         (MarkupPage): Added. The top-level component responsible for generating a DOCTYPE, head, and body.
952         (MarkupPage.prototype.pageTitle): Added.
953         (MarkupPage.prototype.content): Added. Overrides the one in MarkupComponentBase to return what would
954         be the content of the body element as opposed to the html element for the connivance of subclasses,
955         and to match the behavior of the frontend Page class.
956         (MarkupPage.prototype.render): Added.
957         (MarkupPage.prototype._updateComponentsStylesheet): Added. Concatenates the transformed stylesheet of
958         all components used.
959         (MarkupPage.get contentTemplate): Added.
960         (MarkupPage.prototype.generateMarkup): Added. Enqueues the page to render, spin the render loop, and
961         generates the HTML. We enqueue the page twice in order to invoke _updateComponentsStylesheet after
962         all subcomponent had finished rendering.
963         * unit-tests/markup-component-base-tests.js: Added.
964         * unit-tests/markup-element-tests.js: Added.
965         (.createElement): Added.
966         * unit-tests/markup-page-tests.js: Added.
967
968 2018-05-23  Dewei Zhu  <dewei_zhu@apple.com>
969
970         OSBuildFetcher should respect maxRevision while finding OS builds to report.
971         https://bugs.webkit.org/show_bug.cgi?id=185925
972
973         Reviewed by Ryosuke Niwa.
974
975         * server-tests/tools-os-build-fetcher-tests.js: Fix a typo in the unit tests.
976         Added unit tests for this change. Aslo convert an existing test using async.
977         * tools/js/os-build-fetcher.js:
978         (prototype._fetchAvailableBuilds): It should also use 'maxRevision' to filter builds to be reported.
979         It should use 'minRevisionOrder' when no commit has ever been submitted.
980         (prototype._commitsForAvailableBuilds): Takes 'maxOrder' as fifth argument.
981         'minOrder' and 'maxOrder' should be inclusive.
982
983 2018-05-11  Dewei Zhu  <dewei_zhu@apple.com>
984
985         Update ChartPane per change r231087.
986         https://bugs.webkit.org/show_bug.cgi?id=185570
987
988         Reviewed by Ryosuke Niwa.
989
990         On r231087 we change the return type of AnalysisTask.create, ChartPane needs to adapt
991         this change.
992
993         * public/v3/pages/chart-pane.js: Adapted the change that AnalysisTask.create now returns
994         an AnalysisTask object.
995         (ChartPane.prototype.async._analyzeRange):
996
997 2018-05-10  Dewei Zhu  <dewei_zhu@apple.com>
998
999         CommitLogViewer._preceedingCommit should not always be null
1000         https://bugs.webkit.org/show_bug.cgi?id=185540
1001
1002         Reviewed by Ryosuke Niwa.
1003
1004         Fix the bug introduced in r227746 that CommitLogViewer._preceedingCommit is always null.
1005
1006         * browser-tests/index.html: Fix expected measurement-set url.
1007         * public/v3/components/commit-log-viewer.js:
1008         (CommitLogViewer.prototype._fetchCommitLogs): CommitLogViewer._preceedingCommit should be set
1009          when fetching for preceeding revision succeeds.
1010
1011 2018-05-03  Dewei Zhu  <dewei_zhu@apple.com>
1012
1013         Range bisector should check the commits for repositories without change in specified range.
1014         https://bugs.webkit.org/show_bug.cgi?id=185269
1015
1016         Reviewed by Ryosuke Niwa.
1017
1018         For repositories without a change in the specified range, we still need to use them to filter commit
1019         sets. Before this change, code does not apply filtering by those repositories against commit set. As
1020         a result, commit sets with different commits for those repositories may be chosen as bisecting commit set.
1021
1022         * public/v3/commit-set-range-bisector.js: Updated the logic to verify range for repositories without
1023         change in range.
1024         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits):
1025         * unit-tests/commit-set-range-bisector-tests.js: Added a unit test to guard against this change.
1026
1027 2018-05-02  Dewei Zhu  <dewei_zhu@apple.com>
1028
1029         Create analysis task should sync analysis task status after creation.
1030         https://bugs.webkit.org/show_bug.cgi?id=185222
1031
1032         Reviewed by Ryosuke Niwa.
1033
1034         * public/v3/models/analysis-task.js:
1035         (AnalysisTask.async.create): Fetch newly-created analysis task right about its creation.
1036         (AnalysisTask):
1037         * tools/js/measurement-set-analyzer.js:
1038         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet): Adjust as 'AnalysisTask.create' now
1039         returns an anlysis task instance.
1040         (MeasurementSetAnalyzer):
1041         * unit-tests/analysis-task-tests.js: Added a unit test for this change.
1042         (async):
1043         * unit-tests/measurement-set-analyzer-tests.js: Update unit tests accordingly.
1044         Fix a typo in one previous unit test.
1045         (async):
1046
1047 2018-05-01  Dewei Zhu  <dewei_zhu@apple.com>
1048
1049         Write a script that detects chart changes by using v3 API.
1050         https://bugs.webkit.org/show_bug.cgi?id=184419
1051
1052         Reviewed by Ryosuke Niwa.
1053
1054         Added a script that detects chart changes and schedule confirming analysis task.
1055
1056         * browser-tests/async-task-tests.js: Added a unit test for 'AsyncTask'.
1057         * browser-tests/index.html: Added import for 'AsyncTask' for testing.
1058         * public/shared/statistics.js: Make 'findRangesForChangeDetectionsWithWelchsTTest' defaults to 0.99 one sided possibility.
1059         (Statistics.new.this.findRangesForChangeDetectionsWithWelchsTTest):
1060         * public/v3/async-task.js:
1061         (AsyncTask.isAvailable): Helper function to determine whether AsyncTask is available or not as 'Worker' is
1062         not available in nodejs.
1063         (AsyncTask):
1064         * public/v3/models/bug.js: Export as a module.
1065         * public/v3/models/measurement-set.js:
1066         (MeasurementSet.prototype._invokeSegmentationAlgorithm): Added a check to avoid using AsyncTask when running in NodeJs.
1067         (MeasurementSet):
1068         * server-tests/resources/common-operations.js: Added a helper function to assert certain exception is thrown.
1069         (async.assertThrows):
1070         * tools/js/measurement-set-analyzer.js: Added 'MeasurementSetAnalyzer' module for analyzing measurement set.
1071         (MeasurementSetAnalyzer):
1072         (MeasurementSetAnalyzer.prototype.async.analyzeOnce):
1073         (MeasurementSetAnalyzer.measurementSetListForAnalysis):
1074         (MeasurementSetAnalyzer.prototype.async._analyzeMeasurementSet):
1075         * tools/js/v3-models.js: Added import for 'Bug' object.
1076         * tools/run-analysis.js: Added this script to detect measurement set changes.
1077         (main):
1078         (async.analysisLoop):
1079         * unit-tests/measurement-set-analyzer-tests.js: Added unit tests for 'MeasurementSetAnalyzer'.
1080         * unit-tests/resources/mock-v3-models.js: Reset 'MeasurementSet._set' every time.
1081         Update mock platform to include lastModifiedByMetric information.
1082         (MockModels.inject):
1083
1084 2018-04-30  Ryosuke Niwa  <rniwa@webkit.org>
1085
1086         Creating a custom analysis task after fetching all analysis tasks fail
1087         https://bugs.webkit.org/show_bug.cgi?id=184641
1088
1089         Reviewed by Saam Barati.
1090
1091         The bug was caused by AnalysisTask._fetchSubset not fetching the analysis task when all analysis tasks
1092         had previously been fetched (AnlaysisTask._fetchAllPromise is set) even when noCache is set to true.
1093         Fixed it by ignornig _fetchAllPromise when noCache is set to true.
1094
1095         This patch also adds noCache argument to AnalysisTask.fetchById and reverts the inadvertent change in
1096         r226836 to always set noCache to true in this function.
1097
1098         * public/v3/models/analysis-task.js:
1099         (AnalysisTask.fetchById): Added noCache argument instead of always specifying true, and modernized the code.
1100         (AnalysisTask._fetchSubset): Fixed the bug. See above description.
1101         * public/v3/models/test-group.js:
1102         (TestGroup.createWithTask): Set noCache to true when calling AnalysisTask.fetchById here.
1103         * unit-tests/analysis-task-tests.js: Added test cases for AnalysisTask.fetchById, including a test
1104         to make sure it doesn't fetch the specified analysis task when noCache is set to false and all analysis
1105         tasks had previously been fetched for the aforementioned revert of the inadvertent change in r226836.
1106         (sampleAnalysisTasks): Renamed from sampleAnalysisTasks as the result contains multiple analysis tasks.
1107         * unit-tests/test-groups-tests.js: Added a test case for TestGroup.createWithTask
1108
1109 2018-04-30  Ryosuke Niwa  <rniwa@webkit.org>
1110
1111         REGRESSION(r230960): Browser tests under TimeSeriesChart fetchMeasurementSets all fail
1112         https://bugs.webkit.org/show_bug.cgi?id=185125
1113
1114         Reviewed by Saam Barati.
1115
1116         The bug was caused by mock-remote-api.js always loading PrivilegedAPI using require, which doesn't work in a browser.
1117         Fixed the bug by explicitly requiring the right kind of PrivilegedAPI in each unit test instead.
1118
1119         * unit-tests/analysis-task-tests.js:
1120         * unit-tests/buildbot-syncer-tests.js:
1121         * unit-tests/commit-log-tests.js:
1122         * unit-tests/commit-set-range-bisector-tests.js:
1123         * unit-tests/commit-set-tests.js:
1124         * unit-tests/measurement-set-tests.js:
1125         * unit-tests/privileged-api-tests.js:
1126         * unit-tests/resources/mock-remote-api.js:
1127         (MockRemoteAPI.inject): Take PrivilegedAPI instead of the type string. Also fixed a bug that _token wasn't unset
1128         after each unit test, and superfluous initializations of originalRemoteAPI and originalPrivilegedAPI.
1129         * unit-tests/test-groups-tests.js:
1130
1131 2018-04-30  Dewei Zhu  <dewei_zhu@apple.com>
1132
1133         MeasurementSet._constructUrl should construct absolute url.
1134         https://bugs.webkit.org/show_bug.cgi?id=185137
1135
1136         Reviewed by Ryosuke Niwa.
1137
1138         MeasurementSet._constructUrl should not construct an url with relative path.
1139
1140         * public/v3/models/measurement-set.js: Should use '/api/measurement-set...' and '/data/measurement-set-...'
1141         for uncached and cached fetching.
1142         * unit-tests/measurement-set-tests.js: Updated unit tests.
1143         (const.set MeasurementSet):
1144
1145 2018-04-26  Dewei Zhu  <dewei_zhu@apple.com>
1146
1147         Extend create-analysis-test API to be able to create with confirming test group.
1148         https://bugs.webkit.org/show_bug.cgi?id=184958
1149
1150         Reviewed by Ryosuke Niwa.
1151
1152         Extend create-analysis-test API to be able to create an analysis task with confirming test group.
1153         Update create analysis task UI in chart pane to adapt this new API.
1154         Refactored '/privileged-api/create-test-group' API to share some creating test group logic with '/privileged-api/create-analysis-task' API.
1155         Moved the shared logic to commit-sets-helpers.php.
1156
1157         * public/api/analysis-tasks.php: Use 'require_once' instead of 'require'.
1158         * public/include/commit-sets-helpers.php: Added.
1159         (create_test_group_and_build_requests): A helper function that creates test group and build requests for a analysis
1160         task. In long term, this should be a class to avoid passing long argument list around.
1161         (insert_commit_sets_and_construct_configuration_list): Based on commit sets returns build and test configurations.
1162         (insert_build_request_for_configuration): Insert build requests based on configuration.
1163         (commit_sets_from_revision_sets): Returns commit sets from given revision set list.
1164         * public/privileged-api/create-analysis-task.php: Added the ability to create analysis task with confirming test
1165         groups when repetition count is specified.
1166         * public/privileged-api/create-test-group.php: Moved shared function to commit-sets-helpers.php.
1167         * public/v3/models/analysis-task.js:
1168         (AnalysisTask.create): Instead of accepting run ids, it now accepts points and test group name and confirming iterations.
1169         It will conditionally add test group information into parameter when confirming iterations is a positive number.
1170         (AnalysisTask):
1171         * public/v3/models/commit-set.js:
1172         (CommitSet.revisionSetsFromCommitSets): Move 'TestGroup._revisionSetsFromCommitSets' since CommitSet class is more
1173         appropriate place and it will be shared by both TestGroup and AnalysisTask
1174         (CommitSet):
1175         * public/v3/models/test-group.js:
1176         (TestGroup.createWithTask): Adapt 'CommitSet.revisionSetsFromCommitSets'.
1177         (TestGroup.createWithCustomConfiguration): Adapt 'CommitSet.revisionSetsFromCommitSets'.
1178         (TestGroup.createAndRefetchTestGroups): Adapt 'CommitSet.revisionSetsFromCommitSets'.
1179         (TestGroup._revisionSetsFromCommitSets): Deleted and moved to 'CommitSet.revisionSetsFromCommitSets'.
1180         * public/v3/pages/chart-pane.js:
1181         (ChartPane.prototype.didConstructShadowTree): Added the logic to disable options when checkbox for creating confirming
1182         test group is unchecked.
1183         (ChartPane.prototype._analyzeRange): Conditionally create confirming test group from UI.
1184         (ChartPane.cssTemplate):
1185         * server-tests/privileged-api-create-analysis-task-tests.js: Added unit tests. Added a unit test for 'NodePrivilegedAPI'.
1186         * unit-tests/analysis-task-tests.js: Added unit tests.
1187         * unit-tests/commit-set-tests.js: Added unit test for 'CommitSet.revisionSetsFromCommitSets'.
1188         * unit-tests/resources/mock-remote-api.js: Reset csrf token when BrowserPrivilegedAPI is used.
1189         (MockRemoteAPI.inject):
1190
1191 2018-04-23  Dewei Zhu  <dewei_zhu@apple.com>
1192
1193         Tool scripts should not use PrivilegedAPI from 'public/v3/privileged-api.js'.
1194         https://bugs.webkit.org/show_bug.cgi?id=184766
1195
1196         Reviewed by Ryosuke Niwa.
1197
1198         For tools, we should not use PrivilegedAPI for tools as current PrivilegedAPI
1199         is used by UI and it is unnecessary to generate CSRF token for tools.
1200         Will post a followup patch that creates a PrivilegedAPI used by tools.
1201         Make a change on TestServer.inject and MockRemoteAPI.inject to allow specifying
1202         BrowserPrivilegedAPI or NodePrivilegedAPI in the test. Currently defaults to
1203         BrowserPrivilegedAPI as this is the test behavior before this change.
1204
1205         * server-tests/resources/common-operations.js: Allow passing type of privileged api
1206         information to TestServer.inject.
1207         * server-tests/resources/test-server.js: Conditionally inject PrivilegedAPI based on
1208         type of privileged api.
1209         (TestServer.prototype.inject):
1210         (TestServer):
1211         * server-tests/tools-buildbot-triggerable-tests.js: Updated 'prepareServerTest' invocation.
1212         * server-tests/tools-os-build-fetcher-tests.js: Updated 'prepareServerTest' invocation.
1213         * server-tests/tools-sync-buildbot-integration-tests.js: Temporarily injecting
1214         BrowserPrivilegedAPI for mocking UploadedFile. The actual script does not rely on
1215         BrowserPrivilegedAPI at all.
1216         (async.createTestGroupWihPatch):
1217         (beforeEach):
1218         * tools/js/privileged-api.js: Added NodePrivilegedAPI
1219         (NodePrivilegedAPI.prototype.sendRequest):
1220         (NodePrivilegedAPI.configure): Configure the slave name and password.
1221         (NodePrivilegedAPI):
1222         * tools/js/v3-models.js: Removed the import of PrivilegedAPI.
1223         * unit-tests/privileged-api-tests.js:. Added unit tests for NodePrivilegedAPI.
1224         * unit-tests/resources/mock-remote-api.js: Conditionally inject PrivilegedAPI based on
1225         the type of privileged api.
1226         (MockRemoteAPI.inject):
1227
1228 2018-04-23  Dewei Zhu  <dewei_zhu@apple.com>
1229
1230         Revision information returned by querying measurement set api with analysis task id should contain commit order.
1231         https://bugs.webkit.org/show_bug.cgi?id=184902
1232
1233         Reviewed by Ryosuke Niwa.
1234
1235         This is a bug fix for r230719 which does not cover the case while querying `measurement-set.php?analysisTask=$task_id`
1236
1237         * public/api/measurement-set.php: AnalysisResultsFetcher.fetch_commits results should contains commit order.
1238         * server-tests/api-measurement-set-tests.js: Added unit test for this change.
1239
1240 2018-04-19  Dewei Zhu  <dewei_zhu@apple.com>
1241
1242         Add a bisect button to automatically schedule bisecting A/B tasks.
1243         https://bugs.webkit.org/show_bug.cgi?id=183888
1244
1245         Reviewed by Ryosuke Niwa.
1246
1247         Extended AnalysisTask's ability to figure out bisecting A/B tasks based on existing data points and test groups.
1248         Updated analysis page UI to show bisect button which will only appear when the middle commit set of the range in
1249         test group can be found.
1250
1251         Finding middle commit set algorithm is described as follows:
1252         1. Find all commits from multiple repositories among the ranges specified by two commit sets in test group. In
1253         the meanwhile, merge all commits that have commit time into a single list. For commits only have commit order,
1254         put those commits into separate lists.
1255         2. Filter all the available commit sets in current analysis task by keeping the ones have exact repositories
1256         as the two commit sets in specified test group, and every commit of a commit set is in side the commit range.
1257         After filtering the commit sets, sort the remaining ones and only keep one commit set if multiple commit sets
1258         are equal to each other.
1259         3. Among commits processed by step 2, find the commit sets that have the commit which is closest to the middle of
1260         all commits that have commit time created from step 1.
1261         4. Among commits processed by step 3, find the commit sets that have the commit which is closest to the middle of
1262         commits that only have commit order and categorized by repository. We have to iterate through repository as commit
1263         order is not granted to be comparable between different repositories.
1264         5. If more than one commit sets are found, choose the middle commit set.
1265
1266         * public/v3/commit-set-range-bisector.js: Added.
1267         (CommitSetRangeBisector.async.commitSetClosestToMiddleOfAllCommits): Instead of naively returning the middle of
1268         existing commit set array, this function selects a bisect bisection points that is closest to actually middle of
1269         the revision range based on all revisions reported to performance dashboard.
1270         (CommitSetRangeBisector._findCommitSetsWithinRange): Helper function to find commit sets those are in specified range.
1271         (CommitSetRangeBisector._orderCommitSetsByTimeAndOrderThenDeduplicate): Helper function to sort and deduplicate commit sets.
1272         (CommitSetRangeBisector._closestCommitSetsToBisectingCommitByTime): Helper function to find the commit sets those
1273         are closest to the middle of among all the commits in the range that have commit time.
1274         (CommitSetRangeBisector._findCommitSetsClosestToMiddleOfCommitsWithOrder): Helper function which goes through all
1275         repositories the commit of which has commit order, and find the commit sets those are closest to the middle of
1276         commits for each repository.
1277         (CommitSetRangeBisector._buildCommitToCommitSetMap): Helper function to builder mapping from a commit to commit
1278         sets those contain this commit.
1279         (CommitSetRangeBisector._findCommitClosestToMiddleIndex): Helper function to find closest commit to the middle of index.
1280         (CommitSetRangeBisector):
1281         * public/v3/index.html: Imports 'public/v3/commit-set-range-bisector.js'.
1282         * public/v3/models/analysis-task.js:
1283         (AnalysisTask.prototype.async.commitSetsFromTestGroupsAndMeasurementSet): Aggregates all existing commit sets in
1284         test groups of current analysis tasks.
1285         * public/v3/models/commit-log.js:
1286         (CommitLog.prototype.hasCommitTime): A helper function determine whether a commit has a commit time. For commit
1287         that does not have time, server will return commit time as zero. As it is unrealistic for a commit has commit time
1288         0, it would be safe to assume a valid commit time is greater than 0.
1289         (CommitLog.prototype.hasCommitOrder): Returns whether a commit has a commit oder.
1290         (CommitLog.hasOrdering): Determine whether we can order two commits by commit time or commit order.
1291         (CommitLog.orderTwoCommits): Order two commits incrementally.
1292         * public/v3/models/commit-set.js:
1293         (CommitSet.prototype.hasSameRepositories): A helper function to determine whether a commit set has same repositories
1294         as current repository.
1295         (CommitSet.containsRootOrPatchOrOwnedCommit): A helper function to determine whether current commit set has root,
1296         patch or owned commit.
1297         (CommitSet.commitForRepository): This function defined twice identically, remove one of them.
1298         * public/v3/models/test-group.js: Make '_computeRequestedCommitSets' a static function as it does not use any
1299         instance variables.
1300         * public/v3/pages/analysis-task-page.js: Added bisect button.
1301         (AnalysisTaskTestGroupPane):
1302         (AnalysisTaskTestGroupPane.prototype.didConstructShadowTree):
1303         (AnalysisTaskTestGroupPane.prototype.setTestGroups): Update 'setTestGroups' to update _bisectingCommitSetByTestGroup
1304         when the test groups changes.
1305         (AnalysisTaskTestGroupPane.prototype._renderCurrentTestGroup): Added code to conditionally show bisect button.
1306         Bisect button will only show when there is a middle commit set for that test group.
1307         (AnalysisTaskTestGroupPane.htmlTemplate):
1308         (AnalysisTaskTestGroupPane.cssTemplate):
1309         (AnalysisTaskPage.prototype.didConstructShadowTree):
1310         (AnalysisTaskPage.prototype._retryCurrentTestGroup):
1311         (AnalysisTaskPage.prototype.async._bisectCurrentTestGroup): A callback when bisect button is clicked.
1312         * tools/js/v3-models.js:
1313         * unit-tests/commit-log-tests.js: Added unit tests for 'CommitLog.hasCommitTime', 'CommitLog.hasCommitOrder',
1314         'CommitLog.orderTwoCommits', 'CommitLog.hasOrdering'.
1315         * unit-tests/commit-set-range-bisector-tests.js: Unit tests for 'CommitSetRangeBisector.commitSetClosestToMiddleOfAllCommits'.
1316         * unit-tests/commit-set-tests.js: Added unit tests for 'CommitSet.hasSameRepositories' and 'CommitSet.containsRootOrPatchOrOwnedCommit'.
1317
1318 2018-04-16  Dewei Zhu  <dewei_zhu@apple.com>
1319
1320         Commit order should always be returned by api.
1321         https://bugs.webkit.org/show_bug.cgi?id=184674
1322
1323         Reviewed by Ryosuke Niwa.
1324
1325         Commit order sometimes missing in CommitLog object before this change.
1326         This makes ordering commits logic become unnecessarily complicate.
1327         This change will ensure commit order is always fetched for a CommitLog object.
1328         Change measurement-set API to contain commit order information.
1329         Change commits API to contain commit order information.
1330
1331         * public/api/measurement-set.php: Includes commit order information.
1332         * public/include/commit-log-fetcher.php:
1333         * public/v3/models/commit-log.js: Added a function to return order information.
1334         (CommitLog.prototype.updateSingleton): This function should update commit order.
1335         (CommitLog.prototype.order): Returns the order of commit.
1336         * public/v3/models/commit-set.js:
1337         (MeasurementCommitSet): Update MeasurementCommitSet to contain commit order information when creating CommitLog object.
1338         * server-tests/api-measurement-set-tests.js: Updated unit tests.
1339         * unit-tests/analysis-task-tests.js: Update unit tests to contain commit order information in mock data.
1340         (measurementCluster):
1341         * unit-tests/commit-log-tests.js: Added unit tests for CommitLog.order.
1342         * unit-tests/commit-set-tests.js: Added commit order in MeasurementCommitSet.
1343         * unit-tests/measurement-adaptor-tests.js: Updated unit tests to contain commit order information in mock data.
1344         * unit-tests/measurement-set-tests.js: Updated unit tests to contain commit order information in mock data.
1345
1346 2018-04-15  Ryosuke Niwa  <rniwa@webkit.org>
1347
1348         Make it possible to hide some repository groups
1349         https://bugs.webkit.org/show_bug.cgi?id=184632
1350
1351         Reviewed by Saam Barati.
1352
1353         Added the ability to hide repository groups in the custom analysis task configurator from the admin page.
1354         Hidden repositroy groups will continue to function for existing test groups. This is purely an UI change.
1355
1356         * init-database.sql: Added repositorygroup_hidden as a new column to triggerable_repository_groups.
1357         * public/admin/triggerables.php: Added a form field to hide a repository group.
1358         * public/include/manifest-generator.php: Include hidden state in the manifest file.
1359         * public/v3/components/custom-analysis-task-configurator.js:
1360         (CustomAnalysisTaskConfigurator.prototype._renderRepositoryPanes): Filter out hidden repository groups.
1361         * public/v3/models/triggerable.js:
1362         (prototype.isHidden): Added.
1363         * server-tests/api-manifest-tests.js: Updated an existing test case to test a hidden repository group.
1364
1365 2018-04-06  Dewei Zhu  <dewei_zhu@apple.com>
1366
1367         Added 'CommitSet.diff' which will be shared between multiple independent incoming changes.
1368         https://bugs.webkit.org/show_bug.cgi?id=184368
1369
1370         Reviewed by Ryosuke Niwa.
1371
1372         'CommitSet.diff' will be used in multiple independent incoming changes.
1373         It would be easier to make this a separate change to parallelize the changes depends on this API.
1374
1375         * public/v3/models/commit-set.js:
1376         (CommitSet.prototype.createNameWithoutCollision): Moved from 'AnalysisTaskPage' and make it more generic.
1377         (CommitSet.prototype.diff): Describe differences between 2 commit sets including commit, root and patch differences.
1378         * public/v3/pages/analysis-task-page.js: Move 'AnalysisTaskPage._createRetryNameForTestGroup' to CommitSet in a more generic form.
1379         (AnalysisTaskPage.prototype._retryCurrentTestGroup): Use 'CommitSet.withoutRootPatchOrOwnedCommit' instead.
1380         (AnalysisTaskPage.prototype._createRetryNameForTestGroup): Moved to CommitSet in a more generic form.
1381         * unit-tests/commit-set-tests.js: Added unit tests for 'CommitSet.diff'.
1382
1383 2018-04-05  Dewei Zhu  <dewei_zhu@apple.com>
1384
1385         Fix a bug introduced in r230295 that A/B test result is not shown.
1386         https://bugs.webkit.org/show_bug.cgi?id=184350
1387
1388         Reviewed by Ryosuke Niwa.
1389
1390         result.label should be assigned in `TestGroup._computeRequestedCommitSets`.
1391
1392         * public/v3/models/test-group.js:
1393         (TestGroup.prototype._computeRequestedCommitSets):
1394
1395 2018-03-29  Dewei Zhu  <dewei_zhu@apple.com>
1396
1397         Added UI to show potential regressions in chart with t-testing against segmentations.
1398         https://bugs.webkit.org/show_bug.cgi?id=184131
1399
1400         Reviewed by Ryosuke Niwa.
1401
1402         Added UI in the chart-pane so that user can use new option in trendline which not only
1403         shows the segmentation, but also t-test against potential changes indicated by segmentation.
1404
1405         Fix a bug in AnalysisTaskPage that chart is not updated when change type of task changes.
1406
1407         * browser-tests/interactive-time-series-chart-tests.js: Fix a unit tests.
1408         * browser-tests/time-series-chart-tests.js: Fix a unit tests.
1409         * public/shared/statistics.js: Added a function to t-test certain range based on segmentation results.
1410         (Statistics.supportedOneSideTTestProbabilities):
1411         (Statistics.findRangesForChangeDetectionsWithWelchsTTest): The argument `segmentations`, every 2 items in the list defines 
1412         segmentation, that is why the index incremental is 2 in this funcion.
1413         * public/v3/components/chart-pane-base.js: Will select the range if user clicks on a suggested annotation.
1414         (ChartPaneBase.prototype.configure):
1415         (ChartPaneBase.prototype._didClickAnnotation):
1416         * public/v3/components/chart-styles.js:
1417         (ChartStyles.annotationFillStyleForTask): Added 'annotationFillStyleForTask' to determine the fillStyle for annotation based on change type of a analysis task.
1418         * public/v3/components/interactive-time-series-chart.js:
1419         (InteractiveTimeSeriesChart.prototype._findAnnotation): Also need to search among suggested annotaions.
1420         * public/v3/components/time-series-chart.js: Introduced 'suggested annotaion' which does not have an existing task and is suggested by t-test based on segmentation.
1421         (TimeSeriesChart):
1422         (TimeSeriesChart.prototype.setSuggestedAnnotations):
1423         (TimeSeriesChart.prototype.allAnnotations): Returns both annotations with and without analysis task.
1424         (TimeSeriesChart.prototype._layoutAnnotationBars): Should take all annotations in the calculation.
1425         * public/v3/models/measurement-set.js:
1426         (MeasurementSet.prototype.metricId): Returns metric id.
1427         * public/v3/models/metric.js:
1428         (Metric.prototype.summarizeForValues): Added helper function to summarize a given value
1429         * public/v3/models/test-group.js:
1430         (TestGroup.prototype.compareTestResults): Adapted to use 'Metric.summarizeForValues'.
1431         * public/v3/pages/chart-pane.js: Added 'Segmentation with t-test analysis' to 'ChartTrendLineTypes'.
1432         (ChartPane.prototype._renderTrendLinePopover):
1433         (ChartPane.prototype.async._updateTrendLine): make it an async function.
1434         * unit-tests/statistics-tests.js: Added unit tests for 'findRangesForChangeDetectionsWithWelchsTTest'.
1435
1436 2018-04-02  Aakash Jain  <aakash_jain@apple.com>
1437
1438         Remove deprecated Buildbot 0.8 code from Perf syncing scripts
1439         https://bugs.webkit.org/show_bug.cgi?id=183915
1440
1441         Reviewed by Ryosuke Niwa.
1442
1443         * server-tests/resources/mock-data.js:
1444         (MockData.buildbotBuildersURLDeprecated): Deleted.
1445         (MockData.mockBuildbotBuildersDeprecated): Deleted.
1446         (MockData.pendingBuildDeprecated): Deleted.
1447         (MockData.runningBuildDeprecated): Deleted.
1448         (MockData.finishedBuildDeprecated): Deleted.
1449         * tools/js/buildbot-syncer.js:
1450         (BuildbotBuildEntryDeprecated): Deleted.
1451         (BuildbotBuildEntryDeprecated.prototype.initialize): Deleted.
1452         (BuildbotBuildEntryDeprecated.prototype.url): Deleted.
1453         (BuildbotSyncer.prototype.scheduleBuildOnBuildbotDeprecated): Deleted.
1454         (BuildbotSyncer.prototype._pullRecentBuildsDeprecated): Deleted.
1455         (BuildbotSyncer.prototype.pathForPendingBuildsJSONDeprecated): Deleted.
1456         (BuildbotSyncer.prototype.pathForBuildJSONDeprecated): Deleted.
1457         (BuildbotSyncer.prototype.pathForForceBuildDeprecated): Deleted.
1458         (BuildbotSyncer.prototype.url): Deleted.
1459         (BuildbotSyncer.prototype.urlForBuildNumberDeprecated): Deleted.
1460         * tools/js/buildbot-triggerable.js:
1461         (BuildbotTriggerable.prototype.getBuilderNameToIDMapDeprecated): Deleted.
1462         * unit-tests/buildbot-syncer-tests.js:
1463         (smallPendingBuildDeprecated): Deleted.
1464         (smallInProgressBuildDeprecated): Deleted.
1465         (smallFinishedBuildDeprecated): Deleted.
1466         (samplePendingBuildRequestDeprecated): Deleted.
1467         (sampleInProgressBuildDeprecated): Deleted.
1468         (sampleFinishedBuildDeprecated): Deleted.
1469
1470 2018-03-19  Aakash Jain  <aakash_jain@apple.com>
1471
1472         Update Perf buildbot syncing scripts for Buildbot 0.9
1473         https://bugs.webkit.org/show_bug.cgi?id=175969
1474
1475         Reviewed by Ryosuke Niwa.
1476
1477         * tools/js/buildbot-triggerable.js:
1478         (BuildbotTriggerable.prototype.initSyncers): Switch from Deprecated version to new version of getBuilderNameToIDMap.
1479         * tools/js/buildbot-syncer.js:
1480         (BuildbotSyncer.prototype.scheduleRequestInGroupIfAvailable): Switch from Deprecated version to new version of scheduleRequest.
1481         (BuildbotSyncer.prototype.pullBuildbot): Switch from Deprecated version to new version of pathForPendingBuilds, _pullRecentBuilds 
1482         and BuildbotBuildEntry. Parse the pending build-requests data in Buildbot 0.9 format.
1483         * unit-tests/buildbot-syncer-tests.js: Updated as per Buildbot 0.9 code.
1484         * server-tests/tools-sync-buildbot-integration-tests.js: Ditto.
1485         * server-tests/tools-buildbot-triggerable-tests.js: Ditto.
1486         * server-tests/resources/mock-data.js: Ditto.
1487         (MockData.pendingBuildsUrl): Method to construct pendingBuildsUrl in Buildbot 0.9 format.
1488         (MockData.recentBuildsUrl): Ditto for recent builds url.
1489         (MockData.statusUrl): Ditto for status url.
1490         (MockData.builderIDForName): Method to get builder ID from builder name.
1491
1492 2018-03-15  Aakash Jain  <aakash_jain@apple.com>
1493
1494         BuildbotBuildEntry creates an incorrect url for pending builds
1495         https://bugs.webkit.org/show_bug.cgi?id=183670
1496
1497         Reviewed by Ryosuke Niwa.
1498
1499         * tools/js/buildbot-syncer.js:
1500         (BuildbotBuildEntry.prototype.initialize): Fetch buildrequestid from Buildbot.
1501         (BuildbotBuildEntry.prototype.url): Construct url for pending build using buildrequestid from Buildbot.
1502         * unit-tests/buildbot-syncer-tests.js: Updated unit-test.
1503
1504 2018-03-14  Aakash Jain  <aakash_jain@apple.com>
1505
1506         Add support for boolean properties in BuildbotSyncer while submitting build request to Buildbot 0.9 server
1507         https://bugs.webkit.org/show_bug.cgi?id=183638
1508
1509         Reviewed by Ryosuke Niwa.
1510
1511         * tools/js/buildbot-syncer.js:
1512         (BuildbotSyncer._parseRepositoryGroupPropertyTemplate): Allow boolean properties.
1513         * server-tests/tools-sync-buildbot-integration-tests.js: Tests for boolean properties.
1514         * unit-tests/buildbot-syncer-tests.js: Ditto.
1515
1516 2018-03-04  Dewei Zhu  <dewei_zhu@apple.com>
1517
1518         Create analysis task should use build time as fallback when commit time is not available.
1519         https://bugs.webkit.org/show_bug.cgi?id=183309
1520
1521         Reviewed by Ryosuke Niwa.
1522
1523         Added the ability to schedule analysis task for the range without commit time.
1524
1525         * public/privileged-api/create-analysis-task.php: Use build time as fallback.
1526         * server-tests/privileged-api-create-analysis-task-tests.js: Added a unit test for this change.
1527
1528 2018-03-04  Aakash Jain  <aakash_jain@apple.com>
1529
1530         BuildbotBuildEntry for buildbot 0.9 uses incorrect buildrequestid
1531         https://bugs.webkit.org/show_bug.cgi?id=183194
1532
1533         Reviewed by Ryosuke Niwa.
1534
1535         * tools/js/buildbot-syncer.js:
1536         (BuildbotBuildEntry.prototype.initialize): Updated _buildRequestId to use correct build-request-id, as set in syncer._buildRequestPropertyName.
1537         (BuildbotSyncer.prototype.pathForPendingBuilds): Updated url to fetch properties for build-requests.
1538         * unit-tests/buildbot-syncer-tests.js:
1539         (sampleBuildData): Updated sampleBuildData with correct build-request-id in properties. Added
1540         properties to samplePendingBuildRequestData.
1541
1542 2018-02-28  Aakash Jain  <aakash_jain@apple.com>
1543
1544         Rename samplePendingBuild to samplePendingBuildRequest
1545         https://bugs.webkit.org/show_bug.cgi?id=183171
1546
1547         Reviewed by Ryosuke Niwa.
1548
1549         * unit-tests/buildbot-syncer-tests.js:
1550         (samplePendingBuildRequests): Renamed from samplePendingBuild.
1551         (samplePendingBuildRequestDeprecated): Renamed from samplePendingBuildDeprecated.
1552         (samplePendingBuild): Deleted.
1553         (samplePendingBuildDeprecated): Deleted.
1554
1555 2018-02-02  Aakash Jain  <aakash_jain@apple.com>
1556
1557         Add support for submitting build request to Buildbot 0.9 server in BuildbotSyncer
1558         https://bugs.webkit.org/show_bug.cgi?id=182218
1559
1560         Reviewed by Ryosuke Niwa.
1561
1562         * tools/js/buildbot-syncer.js:
1563         (BuildbotSyncer.prototype.scheduleRequest): Added assert to ensure forcescheduler property is always defined. Builds can not
1564         be scheduled on Buildbot without this property. Updated unit-tests and server-tests accordingly.
1565         (BuildbotSyncer.prototype.scheduleBuildOnBuildbotDeprecated): Method to schedule build request on Buildbot 0.8 server.
1566         (BuildbotSyncer.prototype.scheduleBuildOnBuildbot): Method to schedule build request on Buildbot 0.9 server.
1567         (BuildbotSyncer.prototype.pathForForceBuildDeprecated): Path for scheudling build on Buildbot 0.8 server.
1568         (BuildbotSyncer.prototype.pathForForceBuild): Path for scheudling build on Buildbot 0.9 server.
1569         * unit-tests/buildbot-syncer-tests.js:
1570         (smallConfiguration): Added test-case for scheduleBuildOnBuildbot. Also added forcescheduler property in sample data.
1571         * server-tests/resources/mock-data.js: Added forcescheduler property in sample data.
1572         * server-tests/tools-buildbot-triggerable-tests.js: Updated server-tests to take care of added forcescheduler property.
1573
1574 2018-02-02  Aakash Jain  <aakash_jain@apple.com>
1575
1576         Add support for fetching recent builds in Buildbot 0.9 format in BuildbotSyncer
1577         https://bugs.webkit.org/show_bug.cgi?id=179743
1578
1579         Reviewed by Ryosuke Niwa.
1580
1581         * tools/js/buildbot-syncer.js:
1582         (BuildbotSyncer.prototype._pullRecentBuildsDeprecated): Renamed from _pullRecentBuilds. This method fetch
1583         from Buildbot 0.8 server.
1584         (BuildbotSyncer.prototype._pullRecentBuilds): Method to fetch recent builds from Buildbot 0.9 server.
1585         (BuildbotSyncer.prototype.pathForRecentBuilds): URL for fetching recent builds from Buildbot 0.9 server.
1586         (BuildbotSyncer.prototype.pathForBuildJSONDeprecated): Renamed from pathForBuildJSON.
1587         * unit-tests/buildbot-syncer-tests.js:
1588         (_pullRecentBuilds.it): unit-test - should not fetch recent builds when count is zero.
1589         (_pullRecentBuilds.it): unit-test - should pull the right number of recent builds.
1590         (_pullRecentBuilds.it): unit-test - should handle unexpected error while fetching recent builds.
1591         (_pullRecentBuilds.it): unit-test - should create BuildbotBuildEntry after fetching recent builds.
1592
1593 2018-02-01  Aakash Jain  <aakash_jain@apple.com>
1594
1595         Create BuildbotBuildEntry in Buildbot syncer in Buildbot 0.9 format
1596         https://bugs.webkit.org/show_bug.cgi?id=182036
1597
1598         Reviewed by Ryosuke Niwa.
1599
1600         * tools/js/buildbot-syncer.js:
1601         (BuildbotBuildEntry): Class for Buildbot entry in Buildbot 0.9 data format.
1602         (BuildbotBuildEntryDeprecated): Renamed from BuildbotBuildEntry, sub-classed from BuildBotEntry. Handles Buildbot 0.8 data format.
1603         (BuildbotBuildEntryDeprecated.prototype.url): URL in buildbot 0.8 format.
1604         (BuildbotSyncer.prototype.builderID): Added.
1605         (BuildbotSyncer.prototype.pathForPendingBuildsJSONDeprecated): Renamed from BuildbotSyncer.prototype.pathForPendingBuildsJSON.
1606         (BuildbotSyncer.prototype.pathForPendingBuilds): Path for pending builds in Buildbot 0.9 format.
1607         (BuildbotSyncer.prototype.urlForBuildNumberDeprecated): Deprecated. Renamed from urlForBuildNumber.
1608         (BuildbotSyncer.prototype.urlForBuildNumber): Updated in Buildbot 0.9 format.
1609         (BuildbotSyncer.prototype.urlForPendingBuild): Buildbot 0.9 has individual webpage for pending buildrequests as well. URL to that page.
1610         * unit-tests/buildbot-syncer-tests.js: Renamed BuildbotBuildEntry to BuildbotBuildEntryDeprecated.
1611         (sampleBuildData): Sample build data. Common method for in-progress and finished build data.
1612         (samplePendingBuildData): Sample data for a pending build. Separate method so that we can easily create sample data with multiple builds.
1613         (sampleInProgressBuildData): Ditto for in-progress build.
1614         (sampleFinishedBuildData): Ditto for finished build.
1615         (samplePendingBuild): Sample data for single pending build.
1616         (sampleInProgressBuild): Ditto for in-progress build.
1617         (sampleFinishedBuild): Ditto for finished build.
1618         (samplePendingBuildDeprecated): Renamed from samplePendingBuild.
1619         (sampleInProgressBuildDeprecated): Renamed from sampleInProgressBuild.
1620         (sampleFinishedBuildDeprecated): Renamed from sampleFinishedBuild.
1621         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for pending build.
1622         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for in-progress build.
1623         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for finished build.
1624         (BuildbotBuildEntry.it: Added unit-test for creating BuildbotBuildEntry for mix of in-progress and finished build.
1625
1626 2018-01-31  Dewei Zhu  <dewei_zhu@apple.com>
1627
1628         Should chose the best match during 'route' if there are multiple matches.
1629         https://bugs.webkit.org/show_bug.cgi?id=182326
1630
1631         Reviewed by Ryosuke Niwa.
1632
1633         r227749 made a change that 'analysisCategoryPage' will be added before 'analysisTaskPage'.
1634         As route names for both pages starts with 'analysis', whichever added first will be chosen.
1635         For a route like 'analysis/task/1'. As a result, 'analysisCategoryPage' will be chosen and
1636         this is not expected behavior. Adding the logic on the cases when route name does not extact
1637         match the route name, always choose the longest mathcing route name.
1638
1639         Also modernized the code of 'page-router.js' to use const & let instead of var.
1640
1641         Added a browser test to guard against this bug.
1642
1643         * browser-tests/index.html: Import 'page-router-tests.js'.
1644         * browser-tests/page-router-tests.js: Added unit test to guard against this bug.
1645         * public/v3/pages/page-router.js:
1646         (PageRouter.prototype.route): Added logic to find best matching in the case of inexact match.
1647         (PageRouter.prototype.pageDidOpen):
1648         (PageRouter.prototype._updateURLState):
1649         (PageRouter.prototype._serializeToHash):
1650         (PageRouter.prototype._deserializeFromHash):
1651         (PageRouter.prototype._serializeHashQueryValue):
1652         (PageRouter.prototype._deserializeHashQueryValue):
1653         (PageRouter.prototype._countOccurrences):
1654         (PageRouter):
1655
1656 2018-01-29  Dewei Zhu  <dewei_zhu@apple.com>
1657
1658         Should fetch owner commits in build-requests-fetcher.
1659         https://bugs.webkit.org/show_bug.cgi?id=182266
1660
1661         Reviewed by Ryosuke Niwa.
1662
1663         In a build request, owner commit of a commit is not always one of a commit in the commit set.
1664         Build request api should contain owner commits in the 'commits' field of the return value.
1665
1666         * public/include/build-requests-fetcher.php: Added logic to fetch owner commits and added them into 'commits'.
1667         * server-tests/api-build-requests-tests.js: Added a unit test.
1668         * server-tests/resources/mock-data.js:
1669         (MockData.set addTestGroupWithOwnerCommitNotInCommitSet): Added a test group with a build request, the commit set of which does
1670         not contain owner commit of one commit.
1671
1672 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1673
1674         Add the support for reporting Speedometer 2.0 results to perf dashboard
1675         https://bugs.webkit.org/show_bug.cgi?id=182089
1676         <rdar://problem/36172346>
1677
1678         Rubber-stamped by Chris Dumez.
1679
1680         Apparently, this has always worked since the very first version of the perf dashboard added in r163688.
1681         The relevant code is at the line 313 of report-processor.php now.
1682
1683         Added regression tests for this feature since we didn't have any tests four years ago.
1684
1685         * server-tests/api-report-tests.js:
1686
1687 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1688
1689         REGRESSION(r225898): The perf dashboard fails to open when there are no summary pages
1690         https://bugs.webkit.org/show_bug.cgi?id=182210
1691
1692         Rubber-stamped by Chris Dumez.
1693
1694         The bug was caused by TestFreshnessPage unconditionally assuming that summaryPageConfiguration is set.
1695         Fixed it by not creating TestFreshnessPage when there are no summary pages specified.
1696
1697         Also modernized the code to use const & let instead of var.
1698
1699         * public/v3/main.js:
1700         (main):
1701
1702 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1703
1704         Perf dashboard's page title can be set to a previously visited page
1705         https://bugs.webkit.org/show_bug.cgi?id=182209
1706
1707         Rubber-stamped by Chris Dumez.
1708
1709         Before this patch, opening a page and navigating away from it could result in the page title
1710         getting set to that of the previously visited page after the new page had been opened.
1711
1712         This bug was caused by Page.render keep setting document.title even though the page is no longer
1713         the currently open page of the router. Fixed it by exiting early in Page.enqueueToRender when
1714         this page is not the currently open page of the router.
1715
1716         Also added basic tests for Page.
1717
1718         * browser-tests/index.html:
1719         * browser-tests/page-tests.js: Added.
1720         * public/v3/pages/page.js:
1721         (Page): Removed the unused second constructor argument.
1722         (Page.prototype.enqueueToRender): Fixed the bug.
1723         (Page.prototype.render): Use const instead of var.
1724
1725 2018-01-29  Ryosuke Niwa  <rniwa@webkit.org>
1726
1727         CommitLogViewer should not fetch commits in serial
1728         https://bugs.webkit.org/show_bug.cgi?id=182207
1729
1730         Rubber-stamped by Chris Dumez.
1731
1732         Fetch both the commits in the range as well as the preceding commit at once instead of
1733         fetching the preceding commit only after the commits in the range had been fetched.
1734
1735         * browser-tests/commit-log-viewer-tests.js: Fixed the tcoest case after r224227.
1736         * public/v3/components/commit-log-viewer.js:
1737         (CommitLogViewer.prototype._fetchCommitLogs): Fetch commits in parallel.
1738
1739 2018-01-24  Dewei Zhu  <dewei_zhu@apple.com>
1740
1741         Check existence of 'node_modules_dir' before creating it.
1742         https://bugs.webkit.org/show_bug.cgi?id=182040
1743
1744         Reviewed by Aakash Jain.
1745
1746         Fix the bug introduced in r227395.
1747
1748         * tools/run-tests.py: Added directory existence check.
1749
1750 2018-01-22  Dewei Zhu  <dewei_zhu@apple.com>
1751
1752         Fix the bug that 'TestGroupResultsViewer' creates unnecessary rows.
1753         https://bugs.webkit.org/show_bug.cgi?id=181967
1754
1755         Reviewed by Ryosuke Niwa.
1756
1757         Fixed a bug caused by a typo in CommitSet.equals, which makes it returns incorrect results for most
1758         comparison between a CommitSet and a MeasurementCommitSet.
1759
1760         MeasurementCommitSet does not have full information for the commits, thus, it cannot build mappings
1761         between root/patch/owner commit/requires build to repository. When querying whether a given repository
1762         needs to be built, MeasurementCommitSet will return undefined. Due to 'undefined != false', this
1763         equality check will fail. Making 'CommitSet.requiresBuildForRepository' defaults to 'false' would fix
1764         this bug.
1765
1766         * public/v3/models/commit-set.js:
1767         (CommitSet.prototype.requiresBuildForRepository): Make it return false when key does not exist
1768         instead of 'undefined'.
1769         (CommitSet.prototype.equals): Fixed the typo that causes the bug.
1770         Use wrapped functions instead of querying the mapping directly.
1771         * unit-tests/commit-set-tests.js: Added unit tests.
1772
1773 2018-01-18  Dewei Zhu  <dewei_zhu@apple.com>
1774
1775         'run-test.py' script should make sure 'node_modules' directory exists before installing node packages.
1776         https://bugs.webkit.org/show_bug.cgi?id=181808
1777
1778         Reviewed by Ryosuke Niwa.
1779
1780         'run-test.py' will fail if 'node_modules' does not exist before running this script.
1781         Instead of calling 'os.chdir' to change directory, use 'cwd' in subprocess instead.
1782
1783         * tools/run-tests.py: Added the logic to ensure 'node_modules' exists.
1784         Also use 'cwd' in subprocess.call instead of calling 'os.chdir' ahead.
1785
1786 2018-01-20  Dewei Zhu  <dewei_zhu@apple.com>
1787
1788         Extend 'ifBuilt' config key to set property based on whether certain repositories are built or not.
1789         https://bugs.webkit.org/show_bug.cgi?id=181906
1790
1791         Reviewed by Ryosuke Niwa.
1792
1793         Before this change, 'ifBuilt' will always set specified property for test properties as long as there
1794         is a build type build in the same build request group. However, this is no longer valid as we don't
1795         want to set specified property for testing when only owned commit is built in previous build.
1796         'ifBuilt' needs to conditionally set property based on whether certain required repositories are built.
1797         Empty required repository list means no requirement on repository to set property.
1798
1799         * tools/js/buildbot-syncer.js:
1800         (BuildbotSyncer.prototype._propertiesForBuildRequest):In the case of 'built', only set property when
1801         repository requirment is meet and there is a 'build' root request in the same build request group.
1802         (BuildbotSyncer._parseRepositoryGroup): Extend 'ifBuild' to pass information based on contition.
1803         * unit-tests/buildbot-syncer-tests.js: Added unit tests.
1804
1805 2018-01-19  Dewei Zhu  <dewei_zhu@apple.com>
1806
1807         Should reject updating a build request which has an associated build.
1808         https://bugs.webkit.org/show_bug.cgi?id=181893
1809
1810         Reviewed by Ryosuke Niwa.
1811
1812         Current code does not prevent submitting to same build request multiple times.
1813         This could lead to a build losing its associated build request.
1814         As a result, this build will be visible in charts which is not right.
1815         Added a check when a build request is reported.
1816         Addressed a 'FIXME' for the race condition inside ReportProcessor->resolve_build_id by surrounding
1817         it with a database transaction.
1818
1819         * public/include/report-processor.php:
1820         Wrap adding platform and resolve_build_id with a database transaction.
1821         Add a check to make sure only a build request has no associated build can be updated.
1822         * server-tests/api-report-tests.js: Added unit tests accordingly.
1823
1824 2018-01-18  Dewei Zhu  <dewei_zhu@apple.com>
1825
1826         Should allow updating a build-request to 'canceled'.
1827         https://bugs.webkit.org/show_bug.cgi?id=181819
1828
1829         Reviewed by Ryosuke Niwa.
1830
1831         It's possible syncing script update a build-request to 'canceled' state.
1832
1833         * public/api/build-requests.php: Added 'canceled' as an acceptable update state.
1834         * server-tests/api-build-requests-tests.js: Added a unit test to update a build-request to 'canceled'.
1835
1836 2018-01-18  Aakash Jain  <aakash_jain@apple.com>
1837
1838         Add support for builderNameToIDMap in BuildbotSyncer
1839         https://bugs.webkit.org/show_bug.cgi?id=176526
1840
1841         Reviewed by Ryosuke Niwa.
1842
1843         * tools/js/buildbot-syncer.js:
1844         (BuildbotSyncer._loadConfig): Added builderNameToIDMap parameter. It would be used later on.
1845         (BuildbotSyncer._resolveBuildersWithPlatforms): Ditto.
1846         (BuildbotSyncer._validateAndMergeConfig): Added builderID as a valid config parameter.
1847         * tools/js/buildbot-triggerable.js:
1848         (BuildbotTriggerable.prototype.getBuilderNameToIDMap): Method to fetch BuilderNameToIDMap from Buildbot 0.9.
1849         (BuildbotTriggerable.prototype.getBuilderNameToIDMapDeprecated): Method to fetch BuilderNameToIDMap from Buildbot 0.8.
1850         (BuildbotTriggerable.prototype.initSyncers): Updated to use getBuilderNameToIDMap.
1851         * unit-tests/buildbot-syncer-tests.js: Updated unit-tests.
1852         * server-tests/resources/mock-data.js:
1853         (MockData.buildbotBuildersURLDeprecated): URL for fetching Builders list.
1854         (MockData.buildbotBuildersURL): Ditto for Buildbot 0.9
1855         (MockData.mockBuildbotBuildersDeprecated): Sample builders data for Buildbot 0.8
1856         (MockData.mockBuildbotBuilders): Ditto for Buildbot 0.9
1857         * server-tests/tools-buildbot-triggerable-tests.js: Added test for getBuilderNameToIDMap. Updated tests to handle
1858         newly added promise for fetching builders list from Buildbot.
1859         * server-tests/tools-sync-buildbot-integration-tests.js: Ditto.
1860
1861 2018-01-18  Ryosuke Niwa  <rniwa@webkit.org>
1862
1863         Charts can be empty when values are all identical
1864         https://bugs.webkit.org/show_bug.cgi?id=181828
1865
1866         Reviewed by Alexey Proskuryakov.
1867
1868         Fixed the bug that when SampleVarianceUpperTriangularMatrix can store -Infinity as the initial cost
1869         of some entries when the sample standard deviation between two points turns out to be 0,
1870         and cause splitIntoSegmentsUntilGoodEnough to return undefiend because no segmentation has a finite cost.
1871
1872         Also fixed the bug that the time series chart fails to show any data points when all data points have
1873         identical values as the entire y-coordinate gets collapsed to an empty value range by adjusting the max value
1874         when min & max values are identical.
1875
1876         * public/v3/components/time-series-chart.js:
1877         (TimeSeriesChart.prototype._ensureValueRangeCache): Raise the max slightly when min & max are identical
1878         to avoid the chart becoming empty. Otherwise valueDiff in _computeVerticalRenderingMetrics becomes 0
1879         and value-to-y-coordinate conversion always results in NaN.
1880         * public/shared/statistics.js:
1881         (Statistics..SampleVarianceUpperTriangularMatrix):
1882         * unit-tests/statistics-tests.js: Added a test case.
1883
1884 2018-01-18  Ryosuke Niwa  <rniwa@webkit.org>
1885
1886         Don't fetch more than two builds to check duplicity of builds in ReportProcessor
1887         https://bugs.webkit.org/show_bug.cgi?id=181786
1888
1889         Reviewed by Wenson Hsieh.
1890
1891         Limit the number of builds to check to avoid using a lot of memory with a long delay.
1892
1893         * public/include/report-processor.php:
1894         (ReportProcessor::resolve_build_id): 
1895
1896 2018-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1897
1898         Rename config.json to config.json.sample
1899         https://bugs.webkit.org/show_bug.cgi?id=181785
1900
1901         Reviewed by Wenson Hsieh.
1902
1903         * .gitignore: Added config.json.
1904         * ReadMe.md: Updated the instruction.
1905         * config.json.sample: Renamed from config.json.
1906
1907 2018-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1908
1909         Unreviewed build fixes in TestGroupResultsViewer.
1910
1911         * public/v3/components/test-group-results-viewer.js:
1912         (TestGroupResultsViewer.prototype.render): _renderCurrentMetricsLazily was never called.
1913         (TestGroupResultsViewer.prototype._buildRowForMetric): Don't try to render null or NaN.
1914
1915 2018-01-17  Ryosuke Niwa  <rniwa@webkit.org>
1916
1917         Fix perf dashboard tests for node v8
1918         https://bugs.webkit.org/show_bug.cgi?id=181782
1919
1920         Reviewed by Wenson Hsieh.
1921
1922         Fixed the various tests for node.js v8, which is the latest LTS version.
1923
1924         * server-tests/api-manifest-tests.js: Replaced the missing Triggerable.acceptsTest by Triggerable.acceptedTests
1925         after r226836.
1926         * server-tests/api-measurement-set-tests.js: Added "Z" to the end timestamps to force UTF timezone now that Date
1927         in node.js parses using the local timezone by default.
1928         * server-tests/resources/test-server.js:
1929         (TestServer.prototype._restoreDataDirectory): Fixed the bug that this function was erroneously using the async
1930         function to rename a directory per new warnings. This code was racy, and it used to cause a test error occasionally.
1931         * server-tests/tools-os-build-fetcher-tests.js: Fixed the assertions to make it work in the latest node.js.
1932         * unit-tests/measurement-set-tests.js:
1933         (waitForMeasurementSet): Wait for setTimeout to cycle through all microtasks instead of just two microtask cycles.
1934
1935 2018-01-11  Ryosuke Niwa  <rniwa@webkit.org>
1936
1937         Cannot trigger Dromaeo tests on internal perf try bots
1938         https://bugs.webkit.org/show_bug.cgi?id=179712
1939
1940         Reviewed by Chris Dumez.
1941
1942         The bug was caused by CustomAnalysisTaskConfigurator only showing the top-level tests that are triggerable
1943         instead of the list of highest level tests that are triggerable.
1944
1945         * public/v3/components/custom-analysis-task-configurator.js:
1946         (CustomAnalysisTaskConfigurator.prototype.selectTests): Update the test group name when a new test is picked.
1947         (CustomAnalysisTaskConfigurator.prototype.selectPlatform):
1948         (CustomAnalysisTaskConfigurator.prototype._didUpdateSelectedPlatforms): Extracted from selectPlatform.
1949         (CustomAnalysisTaskConfigurator.prototype._renderTriggerableTests): Include the list of all highest-level tests
1950         which are triggerable.
1951         (CustomAnalysisTaskConfigurator.prototype._renderRadioButtonList): Added labelForObject which returns the label
1952         to be used in the list items. For tests, we want to use the full name, not just its label.
1953         * public/v3/models/analysis-task.js:
1954         (AnalysisTask.fetchById):
1955         * public/v3/models/triggerable.js:
1956         (Triggerable.prototype.acceptedTests): Added.
1957         (Triggerable.prototype.acceptsTest): Deleted.
1958
1959 == Rolled over to ChangeLog-2018-01-01 ==