Add a bisect button to automatically schedule bisecting A/B tasks.
[WebKit-https.git] / Websites / perf.webkit.org / public / cycler.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta http-equiv="refresh" content="3600">
5 <style>
6 html, body, iframe { margin: 0; padding: 0; border: none; width: 100%; height: 100%; }
7 </style>
8 </head>
9 <body>
10 <script>
11
12 const urls = [];
13 const CycleSeconds = 30;
14
15 const request = new XMLHttpRequest();
16 request.open('GET', '/data/manifest.json', true);
17 request.send(null);
18 request.onreadystatechange = function () {
19     if (request.readyState != XMLHttpRequest.DONE)
20         return;
21     if (request.status !== 200) {
22         alert('Failed with status: ' + request.status);
23         return;
24     }
25
26     const manifest = JSON.parse(request.responseText);
27     const dashboards = [];
28     for (const dashboardName in manifest.dashboards)
29         dashboards.push(dashboardName);
30
31     for (const dashboardName of dashboards)
32         urls.push('/v3/#/dashboard/' + dashboardName);
33
34     loadURLAt(0);
35 }
36
37 let oldIframe = null;
38 function loadURLAt(i)
39 {
40     const newIframe = document.createElement('iframe');
41     document.body.appendChild(newIframe);
42     newIframe.src = urls[i];
43     newIframe.onload = () => {
44         scrollUpIfNeeded(oldIframe).then(() => {
45             showNewFrame(i, newIframe);
46             setTimeout(() => scrollDownIfNeeded(newIframe), CycleSeconds * 1000 / 2);
47         });
48     }
49 }
50
51 function showNewFrame(i, iframe)
52 {
53     if (oldIframe)
54         document.body.removeChild(oldIframe);
55     oldIframe = iframe;
56
57     i = (i + 1) % urls.length;
58     setTimeout(loadURLAt.bind(window, i), CycleSeconds * 1000);
59 }
60
61 function scrollUpIfNeeded(iframe)
62 {
63     const diff = iframe ? iframe.scrollDiff : 0;
64     if (!diff)
65         return Promise.resolve();
66     for (let i = 0; i < 500; i++)
67         setTimeout(() => iframe.contentWindow.scrollTo(0, oldIframe.scrollDiff / 500 * (500 - i)), i);
68     return new Promise((resolve) => setTimeout(resolve, 800));
69 }
70
71 function scrollDownIfNeeded(iframe)
72 {
73     const viewportHeight = iframe.contentWindow.innerHeight;
74     const contentHeight = iframe.contentDocument.body.offsetHeight;
75     if (viewportHeight >= contentHeight)
76         return;
77     const diff = contentHeight - viewportHeight;
78     for (let i = 0; i < 500; i++)
79         setTimeout(() => iframe.contentWindow.scrollTo(0, diff / 500 * i), i);
80     iframe.scrollDiff = diff;
81 }
82
83 </script>
84 </body>
85 </html>