Merge Speedometer 2.0 fixes up to r217121 to browserbench.org
[WebKit-https.git] / Websites / browserbench.org / Speedometer2.0 / resources / tests.js
1 var numberOfItemsToAdd = 100;
2 var Suites = [];
3 var ENTER_KEY_CODE = 13;
4
5 var triggerEnter = function (element, type) {
6     var event = document.createEvent('Events');
7     event.initEvent(type, true, true);
8     event.keyCode = ENTER_KEY_CODE;
9     event.which = ENTER_KEY_CODE;
10     event.key = 'ENTER';
11     element.dispatchEvent(event);
12 }
13
14 Suites.push({
15     name: 'VanillaJS-TodoMVC',
16     url: 'todomvc/vanilla-examples/vanillajs/index.html',
17     prepare: function (runner, contentWindow, contentDocument) {
18         return runner.waitForElement('.new-todo').then(function (element) {
19             element.focus();
20             return element;
21         });
22     },
23     tests: [
24         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
25             for (var i = 0; i < numberOfItemsToAdd; i++) {
26                 newTodo.value = 'Something to do ' + i;
27                 newTodo.dispatchEvent(new Event('change'));
28                 triggerEnter(newTodo, 'keypress');
29             }
30         }),
31         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
32             var checkboxes = contentDocument.querySelectorAll('.toggle');
33             for (var i = 0; i < checkboxes.length; i++)
34                 checkboxes[i].click();
35         }),
36         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
37             var deleteButtons = contentDocument.querySelectorAll('.destroy');
38             for (var i = 0; i < deleteButtons.length; i++)
39                 deleteButtons[i].click();
40         }),
41     ]
42 });
43
44 Suites.push({
45     name: 'Vanilla-ES2015-TodoMVC',
46     url: 'todomvc/vanilla-examples/es2015/index.html',
47     prepare: function (runner, contentWindow, contentDocument) {
48         return runner.waitForElement('.new-todo').then(function (element) {
49             element.focus();
50             return element;
51         });
52     },
53     tests: [
54         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
55             for (var i = 0; i < numberOfItemsToAdd; i++) {
56                 newTodo.value = 'Something to do ' + i;
57                 newTodo.dispatchEvent(new Event('change'));
58                 triggerEnter(newTodo, 'keypress');
59             }
60         }),
61         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
62             var checkboxes = contentDocument.querySelectorAll('.toggle');
63             for (var i = 0; i < checkboxes.length; i++)
64                 checkboxes[i].click();
65         }),
66         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
67             var deleteButtons = contentDocument.querySelectorAll('.destroy');
68             for (var i = 0; i < deleteButtons.length; i++)
69                 deleteButtons[i].click();
70         }),
71     ]
72 });
73
74 Suites.push({
75     name: 'Vanilla-ES2015-Babel-Webpack-TodoMVC',
76     url: 'todomvc/vanilla-examples/es2015-babel-webpack/dist/index.html',
77     prepare: function (runner, contentWindow, contentDocument) {
78         return runner.waitForElement('.new-todo').then(function (element) {
79             element.focus();
80             return element;
81         });
82     },
83     tests: [
84         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
85             for (var i = 0; i < numberOfItemsToAdd; i++) {
86                 newTodo.value = 'Something to do ' + i;
87                 newTodo.dispatchEvent(new Event('change'));
88                 triggerEnter(newTodo, 'keypress');
89             }
90         }),
91         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
92             var checkboxes = contentDocument.querySelectorAll('.toggle');
93             for (var i = 0; i < checkboxes.length; i++)
94                 checkboxes[i].click();
95         }),
96         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
97             var deleteButtons = contentDocument.querySelectorAll('.destroy');
98             for (var i = 0; i < deleteButtons.length; i++)
99                 deleteButtons[i].click();
100         }),
101     ]
102 });
103
104 Suites.push({
105     name: 'React-TodoMVC',
106     url: 'todomvc/architecture-examples/react/index.html',
107     prepare: function (runner, contentWindow, contentDocument) {
108         contentWindow.app.Utils.store = function () {}
109         return runner.waitForElement('.new-todo').then(function (element) {
110             element.focus();
111             return element;
112         });
113     },
114     tests: [
115         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
116             for (var i = 0; i < numberOfItemsToAdd; i++) {
117                 newTodo.value = 'Something to do ' + i;
118                 newTodo.dispatchEvent(new Event('input', {
119                   bubbles: true,
120                   cancelable: true
121                 }));
122                 triggerEnter(newTodo, 'keydown');
123             }
124         }),
125         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
126             var checkboxes = contentDocument.querySelectorAll('.toggle');
127             for (var i = 0; i < checkboxes.length; i++)
128                 checkboxes[i].click();
129         }),
130         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
131             var deleteButtons = contentDocument.querySelectorAll('.destroy');
132             for (var i = 0; i < deleteButtons.length; i++)
133                 deleteButtons[i].click();
134         }),
135     ]
136 });
137
138 Suites.push({
139     name: 'React-Redux-TodoMVC',
140     url: 'todomvc/architecture-examples/react-redux/dist/index.html',
141     prepare: function (runner, contentWindow, contentDocument) {
142         return runner.waitForElement('.new-todo').then(function (element) {
143             element.focus();
144             return element;
145         });
146     },
147     tests: [
148         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
149             for (var i = 0; i < numberOfItemsToAdd; i++) {
150                 newTodo.value = 'Something to do ' + i;
151                 triggerEnter(newTodo, 'keydown');
152             }
153         }),
154         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
155             var checkboxes = contentDocument.querySelectorAll('.toggle');
156             for (var i = 0; i < checkboxes.length; i++)
157                 checkboxes[i].click();
158         }),
159         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
160             var deleteButtons = contentDocument.querySelectorAll('.destroy');
161             for (var i = 0; i < deleteButtons.length; i++)
162                 deleteButtons[i].click();
163         }),
164     ]
165 });
166
167 Suites.push({
168     name: 'EmberJS-TodoMVC',
169     url: 'todomvc/architecture-examples/emberjs/index.html',
170     prepare: function (runner, contentWindow, contentDocument) {
171         return runner.waitForElement('#new-todo').then(function (element) {
172             element.focus();
173             return element;
174         });
175     },
176     tests: [
177         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
178             for (var i = 0; i < numberOfItemsToAdd; i++) {
179                 newTodo.value = 'Something to do ' + i;
180                 triggerEnter(newTodo, 'keydown');
181             }
182         }),
183         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
184             var checkboxes = contentDocument.querySelectorAll('.toggle');
185             for (var i = 0; i < checkboxes.length; i++)
186                 checkboxes[i].click();
187         }),
188         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
189             var deleteButtons = contentDocument.querySelectorAll('.destroy');
190             for (var i = 0; i < deleteButtons.length; i++)
191                 deleteButtons[i].click();
192         }),
193     ]
194 });
195
196 Suites.push({
197     name: 'BackboneJS-TodoMVC',
198     url: 'todomvc/architecture-examples/backbone/index.html',
199     prepare: function (runner, contentWindow, contentDocument) {
200     contentWindow.Backbone.sync = function () {}
201         return runner.waitForElement('.new-todo').then(function (element) {
202             element.focus();
203             return element;
204         });
205     },
206     tests: [
207         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
208             for (var i = 0; i < numberOfItemsToAdd; i++) {
209                 newTodo.value = 'Something to do ' + i;
210                 triggerEnter(newTodo, 'keypress');
211             }
212         }),
213         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
214             var checkboxes = contentDocument.querySelectorAll('.toggle');
215             for (var i = 0; i < checkboxes.length; i++)
216                 checkboxes[i].click();
217         }),
218         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
219             var deleteButtons = contentDocument.querySelectorAll('.destroy');
220             for (var i = 0; i < deleteButtons.length; i++)
221                 deleteButtons[i].click();
222         }),
223     ]
224 });
225
226 Suites.push({
227     name: 'AngularJS-TodoMVC',
228     url: 'todomvc/architecture-examples/angularjs/index.html',
229     prepare: function (runner, contentWindow, contentDocument) {
230         return runner.waitForElement('#new-todo').then(function (element) {
231             element.focus();
232             return element;
233         });
234     },
235     tests: [
236         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
237             var submitEvent = document.createEvent('Event');
238             submitEvent.initEvent('submit', true, true);
239             var inputEvent = document.createEvent('Event');
240             inputEvent.initEvent('input', true, true);
241             for (var i = 0; i < numberOfItemsToAdd; i++) {
242                 newTodo.value = 'Something to do ' + i;
243                 newTodo.dispatchEvent(inputEvent);
244                 newTodo.form.dispatchEvent(submitEvent);
245             }
246         }),
247         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
248             var checkboxes = contentDocument.querySelectorAll('.toggle');
249             for (var i = 0; i < checkboxes.length; i++)
250                 checkboxes[i].click();
251         }),
252         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
253             for (var i = 0; i < numberOfItemsToAdd; i++)
254                 contentDocument.querySelector('.destroy').click();
255         }),
256     ]
257 });
258
259 Suites.push({
260     name: 'Angular2-TypeScript-TodoMVC',
261     url: 'todomvc/architecture-examples/angular/dist/index.html',
262     prepare: function (runner, contentWindow, contentDocument) {
263         return runner.waitForElement('.new-todo').then(function (element) {
264             element.focus();
265             return element;
266         });
267     },
268     tests: [
269         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
270             for (var i = 0; i < numberOfItemsToAdd; i++) {
271                 newTodo.value = 'Something to do ' + i;
272                 newTodo.dispatchEvent(new Event('input', {
273                   bubbles: true,
274                   cancelable: true
275                 }));
276                 triggerEnter(newTodo, 'keyup');
277             }
278         }),
279         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
280             var checkboxes = contentDocument.querySelectorAll('.toggle');
281             for (var i = 0; i < checkboxes.length; i++)
282                 checkboxes[i].click();
283         }),
284         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
285             var deleteButtons = contentDocument.querySelectorAll('.destroy');
286             for (var i = 0; i < deleteButtons.length; i++)
287                 deleteButtons[i].click();
288         }),
289     ]
290 });
291
292 Suites.push({
293     name: 'VueJS-TodoMVC',
294     url: 'todomvc/architecture-examples/vuejs-cli/dist/index.html',
295     prepare: function (runner, contentWindow, contentDocument) {
296         return runner.waitForElement('.new-todo').then(function (element) {
297             element.focus();
298             return element;
299         });
300     },
301     tests: [
302         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
303             for (var i = 0; i < numberOfItemsToAdd; i++) {
304                 newTodo.value = 'Something to do ' + i;
305                 newTodo.dispatchEvent(new Event('input', {
306                   bubbles: true,
307                   cancelable: true
308                 }));
309                 triggerEnter(newTodo, 'keyup');
310             }
311         }),
312         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
313             var checkboxes = contentDocument.querySelectorAll('.toggle');
314             for (var i = 0; i < checkboxes.length; i++)
315                 checkboxes[i].click();
316         }),
317         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
318             var deleteButtons = contentDocument.querySelectorAll('.destroy');
319             for (var i = 0; i < deleteButtons.length; i++)
320                 deleteButtons[i].click();
321         }),
322     ]
323 });
324
325 Suites.push({
326     name: 'jQuery-TodoMVC',
327     url: 'todomvc/architecture-examples/jquery/index.html',
328     prepare: function (runner, contentWindow, contentDocument) {
329         return runner.waitForElement('#new-todo').then(function (element) {
330             element.focus();
331             return element;
332         });
333     },
334     tests: [
335         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
336             for (var i = 0; i < numberOfItemsToAdd; i++) {
337                 newTodo.value = 'Something to do ' + i;
338                 triggerEnter(newTodo, 'keyup');
339             }
340         }),
341         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
342             var checkboxes = contentDocument.getElementsByClassName('toggle');
343             for (var i = 0; i < checkboxes.length; i++)
344                 checkboxes[i].click();
345         }),
346         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
347             for (var i = 0; i < numberOfItemsToAdd; i++)
348                 contentDocument.querySelector('.destroy').click();
349         }),
350     ]
351 })
352
353 Suites.push({
354     name: 'Preact-TodoMVC',
355     url: 'todomvc/architecture-examples/preact/dist/index.html',
356     prepare: function (runner, contentWindow, contentDocument) {
357         return runner.waitForElement('.new-todo').then(function (element) {
358             element.focus();
359             return element;
360         });
361     },
362     tests: [
363         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
364             for (var i = 0; i < numberOfItemsToAdd; i++) {
365                 newTodo.value = 'Something to do ' + i;
366                 triggerEnter(newTodo, 'keydown');
367             }
368         }),
369         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
370             var checkboxes = contentDocument.querySelectorAll('.toggle');
371             for (var i = 0; i < checkboxes.length; i++)
372                 checkboxes[i].click();
373         }),
374         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
375             var deleteButtons = contentDocument.querySelectorAll('.destroy');
376             for (var i = 0; i < deleteButtons.length; i++)
377                 deleteButtons[i].click();
378         }),
379     ]
380 });
381
382 Suites.push({
383     name: 'Inferno-TodoMVC',
384     url: 'todomvc/architecture-examples/inferno/index.html',
385     prepare: function (runner, contentWindow, contentDocument) {
386         return runner.waitForElement('.new-todo').then(function (element) {
387             element.focus();
388             return element;
389         });
390     },
391     tests: [
392         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
393             for (var i = 0; i < numberOfItemsToAdd; i++) {
394                 newTodo.value = 'Something to do ' + i;
395                 newTodo.dispatchEvent(new Event('change', {
396                   bubbles: true,
397                   cancelable: true
398                 }));
399                 triggerEnter(newTodo, 'keydown');
400             }
401         }),
402         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
403             var checkboxes = contentDocument.querySelectorAll('.toggle');
404             for (var i = 0; i < checkboxes.length; i++)
405                 checkboxes[i].click();
406         }),
407         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
408             var deleteButtons = contentDocument.querySelectorAll('.destroy');
409             for (var i = 0; i < numberOfItemsToAdd; i++)
410                 contentDocument.querySelector('.destroy').click();
411         }),
412     ]
413 });
414
415 function processElmWorkQueue(contentWindow)
416 {
417     contentWindow.elmWork();
418     var callbacks = contentWindow.rAFCallbackList;
419     var i = 0;
420     while (i < callbacks.length) {
421         callbacks[i]();
422         i++;
423     }
424     contentWindow.rAFCallbackList = [];
425 }
426
427 Suites.push({
428     name: 'Elm-TodoMVC',
429     url: 'todomvc/functional-prog-examples/elm/index.html',
430     prepare: function (runner, contentWindow, contentDocument) {
431         return runner.waitForElement('.new-todo').then(function (element) {
432             element.focus();
433             return element;
434         });
435     },
436     tests: [
437         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
438             for (var i = 0; i < numberOfItemsToAdd; i++) {
439                 newTodo.value = 'Something to do ' + i;
440                 newTodo.dispatchEvent(new Event('input', {
441                   bubbles: true,
442                   cancelable: true
443                 }));
444                 processElmWorkQueue(contentWindow);
445                 triggerEnter(newTodo, 'keydown');
446                 processElmWorkQueue(contentWindow);
447             }
448         }),
449         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
450             var checkboxes = contentDocument.querySelectorAll('.toggle');
451             for (var i = 0; i < checkboxes.length; i++) {
452                 checkboxes[i].click();
453                 processElmWorkQueue(contentWindow);
454             }
455         }),
456         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
457             for (var i = 0; i < numberOfItemsToAdd; i++) {
458                 contentDocument.querySelector('.destroy').click();
459                 processElmWorkQueue(contentWindow);
460             }
461         }),
462     ]
463 });
464
465 Suites.push({
466     name: 'Flight-TodoMVC',
467     url: 'todomvc/dependency-examples/flight/flight/index.html',
468     prepare: function (runner, contentWindow, contentDocument) {
469         return runner.waitForElement('#appIsReady').then(function (element) {
470             var newTodo = contentDocument.getElementById('new-todo');
471             newTodo.focus();
472             return newTodo;
473         });
474     },
475     tests: [
476         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
477             for (var i = 0; i < numberOfItemsToAdd; i++) {
478                 newTodo.value = 'Something to do ' + i;
479                 triggerEnter(newTodo, 'keydown');
480             }
481         }),
482         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
483             var checkboxes = contentDocument.querySelectorAll('.toggle');
484             for (var i = 0; i < checkboxes.length; i++)
485                 checkboxes[i].click();
486         }),
487         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
488             var deleteButtons = contentDocument.querySelectorAll('.destroy');
489             for (var i = 0; i < deleteButtons.length; i++)
490                 deleteButtons[i].click();
491         }),
492     ]
493 });
494
495 var actionCount = 50;
496 Suites.push({
497     disabled: true,
498     name: 'FlightJS-MailClient',
499     url: 'flightjs-example-app/index.html',
500     prepare: function (runner, contentWindow, contentDocument) {
501         return runner.waitForElement('.span8').then(function (element) {
502             element.focus();
503             return element;
504         });
505     },
506     tests: [
507         new BenchmarkTestStep('OpeningTabs' + actionCount + 'Times', function (newTodo, contentWindow, contentDocument) {
508             contentDocument.getElementById('inbox').click();
509             for (var i = 0; i < actionCount; i++) {
510                 contentDocument.getElementById('later').click();
511                 contentDocument.getElementById('sent').click();
512                 contentDocument.getElementById('trash').click();
513                 contentDocument.getElementById('inbox').click();
514             }
515         }),
516         new BenchmarkTestStep('MovingEmails' + actionCount + 'Times', function (newTodo, contentWindow, contentDocument) {
517             contentDocument.getElementById('inbox').click();
518             for (var i = 0; i < actionCount; i++) {
519                 contentDocument.getElementById('mail_2139').click();
520                 contentDocument.getElementById('move_mail').click();
521                 contentDocument.querySelector('#move_to_selector #later').click();
522                 contentDocument.getElementById('later').click();
523                 contentDocument.getElementById('mail_2139').click();
524                 contentDocument.getElementById('move_mail').click();
525                 contentDocument.querySelector('#move_to_selector #trash').click();
526                 contentDocument.getElementById('trash').click();
527                 contentDocument.getElementById('mail_2139').click();
528                 contentDocument.getElementById('move_mail').click();
529                 contentDocument.querySelector('#move_to_selector #inbox').click();
530                 contentDocument.getElementById('inbox').click();
531             }
532         }),
533         new BenchmarkTestStep('Sending' + actionCount + 'NewEmails', function (newTodo, contentWindow, contentDocument) {
534             for (var i = 0; i < actionCount; i++) {
535                 contentDocument.getElementById('new_mail').click();
536                 contentDocument.getElementById('recipient_select').selectedIndex = 1;
537                 var subject = contentDocument.getElementById('compose_subject');
538                 var message = contentDocument.getElementById('compose_message');
539                 subject.focus();
540                 contentWindow.$(subject).trigger('keydown');
541                 contentWindow.$(subject).text('Hello');
542                 message.focus();
543                 contentWindow.$(message).trigger('keydown');
544                 contentWindow.$(message).text('Hello,\n\nThis is a test message.\n\n- WebKitten');
545                 contentDocument.getElementById('send_composed').click();
546             }
547         }),
548     ]
549 });