Browse Source

LibWeb: Add a feature to LibWeb tests to fail on unhandled exceptions

Previously, if there was an unhandled exception in an async test, it
might fail to call done() and timeout. Now we have a default "error"
handler to catch unhandled exceptions and fail the test. A few tests
want to actually test the behavior of window.onerror, so they need an
escape hatch.
Andrew Kaster 9 months ago
parent
commit
8edaec79de

+ 1 - 0
Tests/LibWeb/Text/expected/all-window-properties.txt

@@ -395,6 +395,7 @@ asyncTest
 printElement
 printElement
 println
 println
 promiseTest
 promiseTest
+removeTestErrorHandler
 spoofCurrentURL
 spoofCurrentURL
 test
 test
 timeout
 timeout

+ 3 - 0
Tests/LibWeb/Text/input/HTML/Window-onerror.html

@@ -2,6 +2,9 @@
 <script src="../include.js"></script>
 <script src="../include.js"></script>
 <script>
 <script>
     asyncTest(done => {
     asyncTest(done => {
+
+        removeTestErrorHandler()
+
         window.addEventListener("error", (event) => {
         window.addEventListener("error", (event) => {
             println(`onerror event fired: ${event.error}`);
             println(`onerror event fired: ${event.error}`);
             done();
             done();

+ 2 - 0
Tests/LibWeb/Text/input/HTML/WindowOrWorkerGlobalScope-reportError.html

@@ -1,6 +1,8 @@
 <script src="../include.js"></script>
 <script src="../include.js"></script>
 <script>
 <script>
     test(() => {
     test(() => {
+        removeTestErrorHandler()
+
         window.onerror = (message, filename, lineno, colno, error) => {
         window.onerror = (message, filename, lineno, colno, error) => {
             println(`message = ${message}`);
             println(`message = ${message}`);
             println(`lineno = ${lineno}`);
             println(`lineno = ${lineno}`);

+ 14 - 0
Tests/LibWeb/Text/input/include.js

@@ -52,6 +52,20 @@ function timeout(ms) {
     return promise;
     return promise;
 }
 }
 
 
+const __testErrorHandlerController = new AbortController();
+window.addEventListener(
+    "error",
+    event => {
+        println(`Uncaught Error In Test: ${event.message}`);
+        __finishTest();
+    },
+    { signal: __testErrorHandlerController.signal }
+);
+
+function removeTestErrorHandler() {
+    __testErrorHandlerController.abort();
+}
+
 document.addEventListener("DOMContentLoaded", function () {
 document.addEventListener("DOMContentLoaded", function () {
     __outputElement = document.createElement("pre");
     __outputElement = document.createElement("pre");
     __outputElement.setAttribute("id", "out");
     __outputElement.setAttribute("id", "out");