Add a page that cycles through v2 dashboards
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Oct 2015 02:06:40 +0000 (02:06 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Oct 2015 02:06:40 +0000 (02:06 +0000)
https://bugs.webkit.org/show_bug.cgi?id=149907

Reviewed by Chris Dumez.

Add cycler.html that goes through each dashboard on v2 UI.

This allows the dashboards to be cycled through on a TV screen.

* public/cycler.html: Added.
(loadURLAt): Appends a new iframe to load the next URL (i is the index of the dashboard to be shown)
at the end of body. We don't immediately show the new iframe since it might take a while to load.
(showNewFrameIfLoaded): Remove the current iframe and show the next iframe if the next dashboard has
finished loading. We can't rely on DOMContentLoaded or load events because we use asynchronous XHR to
load each chart's data. Instead, wait until some chart becomes available or fails to load and none of
charts are still in progress to be shown.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@190702 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Websites/perf.webkit.org/ChangeLog
Websites/perf.webkit.org/public/cycler.html [new file with mode: 0644]

index b831475..c2970c4 100644 (file)
@@ -1,5 +1,24 @@
 2015-10-07  Ryosuke Niwa  <rniwa@webkit.org>
 
+        Add a page that cycles through v2 dashboards
+        https://bugs.webkit.org/show_bug.cgi?id=149907
+
+        Reviewed by Chris Dumez.
+
+        Add cycler.html that goes through each dashboard on v2 UI.
+
+        This allows the dashboards to be cycled through on a TV screen.
+
+        * public/cycler.html: Added.
+        (loadURLAt): Appends a new iframe to load the next URL (i is the index of the dashboard to be shown)
+        at the end of body. We don't immediately show the new iframe since it might take a while to load.
+        (showNewFrameIfLoaded): Remove the current iframe and show the next iframe if the next dashboard has
+        finished loading. We can't rely on DOMContentLoaded or load events because we use asynchronous XHR to
+        load each chart's data. Instead, wait until some chart becomes available or fails to load and none of
+        charts are still in progress to be shown.
+
+2015-10-07  Ryosuke Niwa  <rniwa@webkit.org>
+
         Allow custom revisions to be specified in A/B testing
         https://bugs.webkit.org/show_bug.cgi?id=149905
 
diff --git a/Websites/perf.webkit.org/public/cycler.html b/Websites/perf.webkit.org/public/cycler.html
new file mode 100644 (file)
index 0000000..4649d74
--- /dev/null
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="refresh" content="3600">
+<style>
+html, body, iframe { margin: 0; padding: 0; border: none; width: 100%; height: 100%; }
+</style>
+</head>
+<body>
+<script>
+
+var urls = [];
+var CycleSeconds = 30;
+
+var request = new XMLHttpRequest();
+request.open('GET', '/data/manifest.json', true);
+request.send(null);
+request.onreadystatechange = function () {
+    if (request.readyState != XMLHttpRequest.DONE)
+        return;
+    if (request.status !== 200) {
+        alert('Failed with status: ' + request.status);
+        return;
+    }
+
+    var manifest = JSON.parse(request.responseText);
+    var dashboards = [];
+    for (var dashboardName in manifest.dashboards)
+        dashboards.push(dashboardName);
+    dashboards = dashboards.sort();
+
+    for (var dashboardName of dashboards)
+        urls.push('/v2/#/dashboard/' + dashboardName);
+
+    loadURLAt(0);
+}
+
+var oldIframe = null;
+function loadURLAt(i) {
+    var newIframe = document.createElement('iframe');
+    document.body.appendChild(newIframe);
+    newIframe.src = urls[i];
+    newIframe.onload = showNewFrameIfLoaded.bind(window, i, newIframe);
+}
+
+function showNewFrameIfLoaded(i, iframe) {
+    var doc = iframe.contentDocument;
+    if ((!doc.querySelector('.chart') && !doc.querySelector('.failure')) || doc.querySelector('.progress'))
+        return setTimeout(showNewFrameIfLoaded.bind(window, i, iframe), 500);
+
+    if (oldIframe)
+        document.body.removeChild(oldIframe);
+    oldIframe = iframe;
+
+    i = (i + 1) % urls.length;
+    setTimeout(loadURLAt.bind(window, i), CycleSeconds * 1000);
+}
+
+</script>
+</body>
+</html>