diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/tools/wave/resources | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/tools/wave/resources')
-rw-r--r-- | testing/web-platform/tests/tools/wave/resources/testharnessreport.js | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/testing/web-platform/tests/tools/wave/resources/testharnessreport.js b/testing/web-platform/tests/tools/wave/resources/testharnessreport.js new file mode 100644 index 0000000000..394b4bf3a8 --- /dev/null +++ b/testing/web-platform/tests/tools/wave/resources/testharnessreport.js @@ -0,0 +1,284 @@ +/* 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, "<br/>"); + screenConsole.innerHTML += "<br/>" + 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 // <body> is required in XHTML documents + : document.documentElement; // fallback for optional <body> 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 // <body> is required in XHTML documents + : document.documentElement; // fallback for optional <body> 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) {} +} |