Source code

Revision control

Copy as Markdown

Other Tools

/* 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, "&nbsp;");
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) {}
}