/* * This file is intended for vendors to implement * code needed to integrate testharness.js tests with their own test systems. * * Typically such integration will attach callbacks when each test is * 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 */ // Setup for WebKit JavaScript tests if (self.testRunner) { testRunner.dumpAsText(); testRunner.waitUntilDone(); testRunner.setCanOpenWindows(); testRunner.grantWebNotificationPermission("http://localhost:8800"); // Let's restrict calling testharness timeout() to wptserve tests for the moment. // That will limit the impact to a small number of tests. // The risk is that testharness timeout() might be called to late on slow bots to finish properly. if (testRunner.timeout && (location.port == 8800 || location.port == 9443)) setTimeout(timeout, testRunner.timeout * 0.9); if (location.port == 8800 || location.port == 9443) { if (self.internals) { // Use 44100 sample rate by default instead of the hardware sample rate so that we get consistent results across machines. internals.settings.setDefaultAudioContextSampleRate(44100); } } if (testRunner.setStatisticsShouldDowngradeReferrer) testRunner.setStatisticsShouldDowngradeReferrer(false, function() { }); } if (self.internals && internals.setICECandidateFiltering) internals.setICECandidateFiltering(false); // Function used to convert the test status code into // the corresponding string function convertResult(resultStatus) { if(resultStatus == 0) return("PASS"); else if(resultStatus == 1) return("FAIL"); else if(resultStatus == 2) return("TIMEOUT"); else return("NOTRUN"); } if (self.testRunner) { /* Disable the default output of testharness.js. The default output formats * test results into an HTML table. When that table is dumped as text, no * spacing between cells is preserved, and it is therefore not readable. By * setting output to false, the HTML table will not be created */ setup({"output": false, "explicit_timeout": true}); /* Using a callback function, test results will be added to the page in a * manner that allows dumpAsText to produce readable test results */ add_completion_callback(function (tests, harness_status) { var resultStr = "\n"; // Sanitizes the given text for display in test results. function sanitize(text) { if (!text) { return ""; } text = text.replace(/\0/g, "\\0"); return text.replace(/\r/g, "\\r"); } if(harness_status.status != 0) resultStr += "Harness Error (" + convertResult(harness_status.status) + "), message = " + harness_status.message + "\n\n"; // Truncate decimal values from output in webaudio tests to avoid test flakiness due to floating point precision issues. const isWebAudioTest = document.URL.indexOf('/webaudio') >= 0; for (var i = 0; i < tests.length; i++) { var message = sanitize(tests[i].message); if (tests[i].status == 1 && !tests[i].dumpStack) { // Remove stack for failed tests for proper string comparison without file paths. // For a test to dump the stack set its dumpStack attribute to true. var stackIndex = message.indexOf("(stack:"); if (stackIndex > 0) message = message.substr(0, stackIndex); } let testName = tests[i].name; if (isWebAudioTest) { testName = testName.replace(/\[[0-9.,\-e]*[0-9]\.[0-9]{7,}[0-9.,\-e]*\]/, "[expected array]"); testName = testName.replace(/[0-9]\.[0-9]{7,}/g, (match, offset, string) => { return parseFloat(match).toFixed(6); }); testName = testName.replace(/ \(contains [0-9]+ different values\)./, "."); testName = testName.replace(/ \(contains 1 different value\)./, "."); testName = testName.replace(/: Actual Tail Frame [0-9]+ is greater than or equal to [0-9]+./, "."); } resultStr += convertResult(tests[i].status) + " " + sanitize(testName) + " " + message + "\n"; } var results = document.createElementNS("http://www.w3.org/1999/xhtml", "pre"); results.innerText = resultStr; var log = document.getElementById("log"); if (log) log.appendChild(results); else if (document.body) document.body.appendChild(results); else { var root = document.documentElement; var is_html = root && root.namespaceURI == "http://www.w3.org/1999/xhtml" && root.localName == "html"; var is_svg = document.defaultView && "SVGSVGElement" in document.defaultView && root instanceof document.defaultView.SVGSVGElement; if (is_svg) { var foreignObject = document.createElementNS("http://www.w3.org/2000/svg", "foreignObject"); foreignObject.setAttribute("width", "100%"); foreignObject.setAttribute("height", "100%"); root.appendChild(foreignObject); foreignObject.appendChild(results); } else if (is_html) { root.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "body")) .appendChild(results); } else { root.appendChild(results); } } // Wait for any other completion callbacks, which may eliminate test elements // from the page and therefore reduce the output. setTimeout(function () { testRunner.forceImmediateCompletion(); }, 0); }); }