perf-o-matic should store test results' units
[WebKit-https.git] / Websites / webkit-perf.appspot.com / js / admin.js
1 function submitXHR(method, action, payload, callback) {
2     var xhr = new XMLHttpRequest;
3     xhr.onreadystatechange = function () {
4         if (xhr.readyState != 4)
5             return;
6         if (xhr.status != 200)
7             error('HTTP status: ' + xhr.status);
8         else if (xhr.responseText != 'OK')
9             error(xhr.responseText);
10         if (callback)
11             callback()
12     }
13     xhr.open(method, action, true);
14     xhr.send(payload);
15 }
16
17 function removeNonFormListItems(list) {
18     list.children().each(function () {
19         if ($.inArray('form', this.classList))
20             $(this).remove();
21     });
22 }
23
24 function createKeyNameReloader(name, visibilityAction, callback) {
25     return function () {
26         $.getJSON(name, function (entries) {
27             var list = $('#' + name + ' ul');
28             entries = sortProperties(entries);
29
30             $.each(entries, function (key, values) {
31                 var label = key == values['name'] ? key : key + ' : ' + values['name'];
32                 list.append('<li><h3 id="' + key + '">' + label + '</h3></li>');
33                 var item = list[0].lastChild;
34
35                 if (values['hidden'])
36                     item.className = 'hidden';
37
38                 if (visibilityAction) {
39                     $(item).append(' <a class="hide"></a>');
40                     $(item.lastChild).click(function () {
41                         var json = {'hide': !this.parentNode.classList.contains('hidden')}
42                         json[visibilityAction] = this.parentNode.firstChild.id;
43
44                         submitXHR('POST', 'change-visibility', JSON.stringify(json));
45                         list.find('form').trigger('reload');
46                     });
47                 }
48
49                 if (callback)
50                     callback.call(item, values['hidden']);
51             });
52             list.append($('#' + name + ' ul .form'));
53         });
54     }
55 }
56
57 $('#branches form').bind('reload', createKeyNameReloader('branches'));
58 $('#platforms form').bind('reload', createKeyNameReloader('platforms', 'platform'));
59
60 $('#builders form').bind('reload', function () {
61     $.getJSON('builders', function (builders) {
62         var list = $('#builders ul');
63         removeNonFormListItems(list);
64         builders = builders.sort();
65         for (var i = 0; i < builders.length; i++)
66             list.append('<li><h3><a href="http://build.webkit.org/builders/' + builders[i] + '">' + builders[i] + '</a></h3></li>');
67         list.append($('#builders ul .form'));
68     });
69 });
70
71 var testReloader = createKeyNameReloader('tests', 'test', function (hidden) {
72     var testName = this.firstChild.id;
73     $('#tests select').append('<option value="' + testName + '">' + testName + '</option>');
74
75 });
76 $('#tests form').bind('reload', function () {
77     var select = $('#tests select');
78     select.children().remove();
79     testReloader();
80 });
81
82 $.ajaxSetup({
83     'error': function(xhr, e, message) { console.log(xhr); error('Failed with HTTP status: ' + xhr.status, e); },
84     cache: true,
85 });
86
87 $('form').trigger('reload');
88
89 $('form').bind('submit', function (event) {
90     event.preventDefault();
91
92     var payload;
93     if (this.payload)
94         payload = this.payload.value;
95     else {
96         var contents = {};
97         for (var i = 0; i < this.elements.length; i++)
98             contents[this.elements[i].name] = this.elements[i].value;
99         payload = JSON.stringify(contents);
100     }
101
102     submitXHR(this.method, this.action, payload, function () {
103         $(this).trigger('reload');
104     })
105 });
106
107 $('#manual-submission textarea').val(JSON.stringify({
108     'branch': 'webkit-trunk',
109     'platform': 'chromium-mac',
110     'builder-name': 'Chromium Mac Release (Perf)',
111     'build-number': '123',
112     'timestamp': parseInt(Date.now() / 1000),
113     'webkit-revision': 104856,
114     'chromium-revision': 123059,
115     'results':
116         {
117             'webkit_style_test': {'avg': 100, 'median': 102, 'stdev': 5, 'min': 90, 'max': 110},
118             'some_test': 54,
119         },
120 }, null, '  '));