summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2022-04-19 09:59:51 +0100
committerGitHub <noreply@github.com>2022-04-19 10:59:51 +0200
commitc30d95f2e36cb3519e1e23c0934b388ebba6bc2c (patch)
treef34db42cce4803e76affb12ccb95ad59a77354ad /ext
parenta64e63c3614b98aa2b51fb6b7ef4e30251e03111 (diff)
feat(ext/web): add globalThis.reportError() (#13799)
Diffstat (limited to 'ext')
-rw-r--r--ext/web/02_event.js15
-rw-r--r--ext/web/lib.deno_web.d.ts19
2 files changed, 34 insertions, 0 deletions
diff --git a/ext/web/02_event.js b/ext/web/02_event.js
index 677768ac9..06df6429c 100644
--- a/ext/web/02_event.js
+++ b/ext/web/02_event.js
@@ -1367,6 +1367,20 @@
reportExceptionStackedCalls--;
}
+ function checkThis(thisArg) {
+ if (thisArg !== null && thisArg !== undefined && thisArg !== globalThis) {
+ throw new TypeError("Illegal invocation");
+ }
+ }
+
+ // https://html.spec.whatwg.org/#dom-reporterror
+ function reportError(error) {
+ checkThis(this);
+ const prefix = "Failed to call 'reportError'";
+ webidl.requiredArguments(arguments.length, 1, { prefix });
+ reportException(error);
+ }
+
window.Event = Event;
window.EventTarget = EventTarget;
window.ErrorEvent = ErrorEvent;
@@ -1377,6 +1391,7 @@
window.dispatchEvent = EventTarget.prototype.dispatchEvent;
window.addEventListener = EventTarget.prototype.addEventListener;
window.removeEventListener = EventTarget.prototype.removeEventListener;
+ window.reportError = reportError;
window.__bootstrap.eventTarget = {
EventTarget,
setEventTargetData,
diff --git a/ext/web/lib.deno_web.d.ts b/ext/web/lib.deno_web.d.ts
index 77c502fac..8c845ced1 100644
--- a/ext/web/lib.deno_web.d.ts
+++ b/ext/web/lib.deno_web.d.ts
@@ -890,3 +890,22 @@ declare class DecompressionStream {
readonly readable: ReadableStream<Uint8Array>;
readonly writable: WritableStream<Uint8Array>;
}
+
+/** Dispatch an uncaught exception. Similar to a synchronous version of:
+ * ```ts
+ * setTimeout(() => { throw error; }, 0);
+ * ```
+ * The error can not be caught with a `try/catch` block. An error event will
+ * be dispatched to the global scope. You can prevent the error from being
+ * reported to the console with `Event.prototype.preventDefault()`:
+ * ```ts
+ * addEventListener("error", (event) => {
+ * event.preventDefault();
+ * });
+ * reportError(new Error("foo")); // Will not be reported.
+ * ```
+ * In Deno, this error will terminate the process if not intercepted like above.
+ */
+declare function reportError(
+ error: any,
+): void;