| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | |
| <title>Web Media API Snapshot Test Suite</title> | |
| <link rel="stylesheet" href="css/bulma-0.7.5/bulma.min.css" /> | |
| <link rel="stylesheet" href="css/fontawesome.min.css" /> | |
| <script src="lib/keycodes.js"></script> | |
| <script src="lib/wave-service.js"></script> | |
| <script src="lib/davidshimjs/qrcode.js"></script> | |
| </head> | |
| <body> | |
| <section class="section"> | |
| <div class="container"> | |
| <img | |
| style="max-width: 300px; margin-bottom: 30px; margin-left: -15px;" | |
| src="res/wavelogo_2016.jpg" | |
| alt="WAVE (Web Application Video Ecosystem) Project Logo" | |
| /> | |
| <h1 class="title is-spaced"> | |
| WAVE WMAS Test Suite | |
| </h1> | |
| <p class="subtitle"> | |
| <a href="https://github.com/w3c/webmediaapi/">GitHub</a> - | |
| </p> | |
| </div> | |
| <div class="container" style="margin-top: 2em;"> | |
| <h2 class="title is-5"> | |
| New test session | |
| </h2> | |
| <div class="columns is-vcentered" style="margin-top: 20px;"> | |
| <div class="column is-narrow"> | |
| <div | |
| id="qr-code" | |
| style=" | |
| width: 256px; | |
| height: 256px; | |
| padding: 5px; | |
| border: 1px gray solid; | |
| border-radius: 3px; | |
| " | |
| ></div> | |
| </div> | |
| <div class="column"> | |
| <table style="margin-bottom: 1.5em;"> | |
| <tr> | |
| <td class="has-text-weight-bold" style="padding-right: 1rem;"> | |
| Token: | |
| </td> | |
| <td id="session-token" class="is-family-monospace"></td> | |
| </tr> | |
| <tr> | |
| <td class="has-text-weight-bold" style="padding-right: 1rem;"> | |
| Expires: | |
| </td> | |
| <td id="expiary-date"></td> | |
| </tr> | |
| <tr> | |
| <td></td> | |
| <td> | |
| <p class="is-size-7">(Session start revokes expiration.)</p> | |
| </td> | |
| </tr> | |
| </table> | |
| <p style="max-width: 32rem; margin-bottom: 1rem;"> | |
| Configure a new session on a second device by scanning the | |
| QR-Code, or click the button: | |
| </p> | |
| <div | |
| class="button" | |
| style="margin-bottom: 1rem;" | |
| id="configure-button" | |
| > | |
| <span class="icon"><i class="fas fa-sliders-h"></i></span> | |
| <span>Configure Session</span> | |
| </div> | |
| <p style="max-width: 32rem;"> | |
| The tests will start running in this window, as soon as the | |
| session is started from the configuration view. | |
| </p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="container" style="margin-top: 2em;"> | |
| <h2 class="title is-5"> | |
| Resume running session | |
| </h2> | |
| <article | |
| id="unknown_token_error" | |
| style="max-width: 30em; display: none;" | |
| class="message is-danger" | |
| > | |
| <div class="message-body"> | |
| Unknown token | |
| </div> | |
| </article> | |
| <div class="columns is-vcentered"> | |
| <div id="resume_token" class="column is-narrow"></div> | |
| <div class="button-group column"> | |
| <button | |
| id="resume-button" | |
| class="button is-success tabbable" | |
| type="submit" | |
| data-uid="100" | |
| autofocus | |
| > | |
| <span class="icon"><i class="fas fa-redo"></i></span> | |
| <span>Resume</span> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <script> | |
| var selectedTabbable = -1; | |
| function removeClass(element, className) { | |
| var elementClass = element.className; | |
| var index = elementClass.indexOf(className); | |
| if (index !== -1) { | |
| element.className = elementClass.replace(className, ""); | |
| } | |
| } | |
| function addClass(element, className) { | |
| element.className += " " + className; | |
| } | |
| function skipFocus(steps) { | |
| var tabbables = document.getElementsByClassName("tabbable"); | |
| if (selectedTabbable === -1) { | |
| selectedTabbable = 0; | |
| } else { | |
| removeClass(tabbables[selectedTabbable], "focused"); | |
| selectedTabbable += steps; | |
| } | |
| if (selectedTabbable >= tabbables.length) { | |
| selectedTabbable = 0; | |
| } | |
| if (selectedTabbable < 0) { | |
| selectedTabbable = tabbables.length - 1; | |
| } | |
| tabbables[selectedTabbable].focus(); | |
| addClass(tabbables[selectedTabbable], "focused"); | |
| } | |
| function focusNext() { | |
| skipFocus(1); | |
| } | |
| function focusPrevious() { | |
| skipFocus(-1); | |
| } | |
| // Resume | |
| var resumeToken = ""; | |
| var cookies = document.cookie.split(";"); | |
| for (var i = 0; i < cookies.length; i++) { | |
| var cookie = cookies[i]; | |
| if (cookie.split("=")[0].replace(/ /g, "") === "resume_token") { | |
| resumeToken = cookie.split("=")[1]; | |
| break; | |
| } | |
| } | |
| if (!resumeToken) resumeToken = ""; | |
| var resumeButton = document.getElementById("resume-button"); | |
| var tokenText = document.getElementById("resume_token"); | |
| if (resumeToken) { | |
| tokenText.innerText = "Last session: " + resumeToken; | |
| } else { | |
| tokenText.innerText = "No recent session."; | |
| resumeButton.setAttribute("disabled", ""); | |
| } | |
| var unknownTokenError = document.getElementById("unknown_token_error"); | |
| resumeButton.onclick = function (event) { | |
| location.href = WEB_ROOT + "next.html?token=" + resumeToken; | |
| }; | |
| resumeButton.onkeydown = function (event) { | |
| var charCode = | |
| typeof event.which === "number" ? event.which : event.keyCode; | |
| if (ACTION_KEYS.indexOf(charCode) === -1) return; | |
| location.href = WEB_ROOT + "next.html?token=" + resumeToken; | |
| }; | |
| document.onkeydown = function (event) { | |
| event = event || window.event; | |
| var charCode = | |
| typeof event.which === "number" ? event.which : event.keyCode; | |
| if (ACTION_KEYS.indexOf(charCode) !== -1) { | |
| event.preventDefault(); | |
| var tabbables = document.getElementsByClassName("tabbable"); | |
| var element = tabbables[selectedTabbable]; | |
| if (!element) return; | |
| if (element.type === "checkbox") { | |
| element.checked = !element.checked; | |
| } else { | |
| element.click(); | |
| } | |
| } | |
| if (PREV_KEYS.indexOf(charCode) !== -1) { | |
| focusPrevious(); | |
| } | |
| if (NEXT_KEYS.indexOf(charCode) !== -1) { | |
| focusNext(); | |
| } | |
| }; | |
| var lifeTime = 30 * 60 * 1000; // 30min | |
| WaveService.createSession( | |
| { expirationDate: new Date().getTime() + lifeTime }, | |
| function (token) { | |
| var sessionTokenElement = document.getElementById("session-token"); | |
| sessionTokenElement.innerText = token; | |
| WaveService.readSessionStatus(token, function (config) { | |
| var expiaryDateElement = document.getElementById("expiary-date"); | |
| expiaryDateElement.innerText = config.expirationDate.toLocaleString(); | |
| }); | |
| var configurationUrl = | |
| location.origin + | |
| WEB_ROOT + | |
| "configuration.html?token=" + | |
| token + | |
| "&resume=" + | |
| resumeToken; | |
| new QRCode(document.getElementById("qr-code"), configurationUrl); | |
| document.getElementById("configure-button").onclick = function () { | |
| window.open(configurationUrl, "_blank"); | |
| }; | |
| WaveService.addSessionEventListener(token, function (message) { | |
| if (message.type === "resume") { | |
| var resumeToken = message.data; | |
| location.href = WEB_ROOT + "next.html?token=" + resumeToken; | |
| } | |
| if (message.type !== "status") return; | |
| if (message.data === "pending") return; | |
| location.href = WEB_ROOT + "next.html?token=" + token; | |
| }); | |
| } | |
| ); | |
| document.getElementById("resume-button").focus(); | |
| </script> | |
| </body> | |
| </html> |