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