/* global add_completion_callback */ /* global setup */ /* * This file is intended for vendors to implement code needed to integrate * testharness.js tests with their own test systems. * * Typically test system integration will attach callbacks when each test has * run, using add_result_callback(callback(test)), or when the whole test file * has completed, using * add_completion_callback(callback(tests, harness_status)). * * For more documentation about the callback functions and the * parameters they are called with see testharness.js */ /* * If the query parameter token is available means that the test was loaded by * the WAVE test runner and the results need to be reported to the server using * the provided token to identify the session associated this token. */ if (location.search && location.search.indexOf("token=") != -1) { var __WAVE__HOSTNAME = location.hostname; var __WAVE__PORT = location.port; var __WAVE__PROTOCOL = location.protocol.replace(/:/, ""); var __WAVE__QUERY = location.search; var queryParameters = {}; var keysAndValues = location.search.replace("?", "").split("&"); for (var i = 0; i < keysAndValues.length; i++) { var key = keysAndValues[i].split("=")[0]; var value = keysAndValues[i].split("=")[1]; queryParameters[key] = value; } var __HTTPS_PORT = parseInt(queryParameters["https_port"] || 443); var __WAVE__TIMEOUT = parseInt(queryParameters["timeout"] || 65000); var __WAVE__WEB_ROOT = queryParameters["web_root"] || "/_wave/"; var __WAVE__TOKEN = queryParameters["token"] || null; var __WAVE__TEST = location.pathname; var nextUrl = null; var resultSent = false; var screenConsole; try { var documentRoot = document.body ? document.body : document.documentElement; documentRoot.style["background-color"] = "#FFF"; window.open = function () { logToConsole( "window.open() is overridden in testharnessreport.js and has not effect" ); var dummyWin = { close: function () { logToConsole( "dummyWindow.close() in testharnessreport.js and has not effect" ); }, }; return dummyWin; }; window.close = function () { logToConsole( "window.close() is overridden in testharnessreport.js and has not effect" ); }; } catch (err) {} setTimeout(function () { loadNext(); }, __WAVE__TIMEOUT); function logToConsole() { var text = ""; for (var i = 0; i < arguments.length; i++) { text += arguments[i] + " "; } if (console && console.log) { console.log(text); } if (screenConsole) { try { text = text.replace(/ /gm, " "); text = text.replace(/\n/gm, "
"); screenConsole.innerHTML += "
" + text; } catch (error) { screenConsole.innerText += "\n" + text; } } } function dump_and_report_test_results(tests, status) { var results_element = document.createElement("script"); results_element.type = "text/json"; results_element.id = "__testharness__results__"; var test_results = tests.map(function (x) { return { name: x.name, status: x.status, message: x.message, stack: x.stack, }; }); var data = { test: window.location.href, tests: test_results, status: status.status, message: status.message, stack: status.stack, }; results_element.textContent = JSON.stringify(data); // To avoid a HierarchyRequestError with XML documents, ensure that 'results_element' // is inserted at a location that results in a valid document. var parent = document.body ? document.body // is required in XHTML documents : document.documentElement; // fallback for optional in HTML5, SVG, etc. parent.appendChild(results_element); screenConsole = document.getElementById("console"); if (!screenConsole) { screenConsole = document.createElement("div"); screenConsole.setAttribute("id", "console"); screenConsole.setAttribute("style", "font-family: monospace; padding: 5px"); parent.appendChild(screenConsole); } window.onerror = logToConsole; finishWptTest(data); } function finishWptTest(data) { logToConsole("Creating result ..."); data.test = __WAVE__TEST; createResult( __WAVE__TOKEN, data, function () { logToConsole("Result created."); loadNext(); }, function () { logToConsole("Failed to create result."); logToConsole("Trying alternative method ..."); createResultAlt(__WAVE__TOKEN, data); } ); } function loadNext() { logToConsole("Loading next test ..."); readNextTest( __WAVE__TOKEN, function (url) { logToConsole("Redirecting to " + url); location.href = url; }, function () { logToConsole("Could not load next test."); logToConsole("Trying alternative method ..."); readNextAlt(__WAVE__TOKEN); } ); } function readNextTest(token, onSuccess, onError) { sendRequest( "GET", "api/tests/" + token + "/next", null, null, function (response) { var jsonObject = JSON.parse(response); onSuccess(jsonObject.next_test); }, onError ); } function readNextAlt(token) { location.href = location.protocol + "//" + location.host + getWaveUrl("next.html?token=" + token); } function createResult(token, result, onSuccess, onError) { sendRequest( "POST", "api/results/" + token, { "Content-Type": "application/json", }, JSON.stringify(result), function () { onSuccess(); }, onError ); } function createResultAlt(token, result) { location.href = __WAVE__WEB_ROOT + "submitresult.html" + "?token=" + token + "&result=" + encodeURIComponent(JSON.stringify(result)); } function sendRequest(method, uri, headers, data, onSuccess, onError) { var url = getWaveUrl(uri); url = location.protocol + "//" + location.host + url; var xhr = new XMLHttpRequest(); xhr.addEventListener("load", function () { onSuccess(xhr.response); }); xhr.addEventListener("error", function () { if (onError) onError(); }); logToConsole("Sending", method, 'request to "' + url + '"'); xhr.open(method, url, true); if (headers) { for (var header in headers) { xhr.setRequestHeader(header, headers[header]); } } xhr.send(data); } function getWaveUrl(uri) { var url = __WAVE__WEB_ROOT + uri; return url; } add_completion_callback(dump_and_report_test_results); } else { function dump_test_results(tests, status) { var results_element = document.createElement("script"); results_element.type = "text/json"; results_element.id = "__testharness__results__"; var test_results = tests.map(function (x) { return { name: x.name, status: x.status, message: x.message, stack: x.stack, }; }); var data = { test: window.location.href, tests: test_results, status: status.status, message: status.message, stack: status.stack, }; results_element.textContent = JSON.stringify(data); // To avoid a HierarchyRequestError with XML documents, ensure that 'results_element' // is inserted at a location that results in a valid document. var parent = document.body ? document.body // is required in XHTML documents : document.documentElement; // fallback for optional in HTML5, SVG, etc. parent.appendChild(results_element); } add_completion_callback(dump_test_results); /* If the parent window has a testharness_properties object, * we use this to provide the test settings. This is used by the * default in-browser runner to configure the timeout and the * rendering of results */ try { if (window.opener && "testharness_properties" in window.opener) { /* If we pass the testharness_properties object as-is here without * JSON stringifying and reparsing it, IE fails & emits the message * "Could not complete the operation due to error 80700019". */ setup(JSON.parse(JSON.stringify(window.opener.testharness_properties))); } } catch (e) {} }