summaryrefslogtreecommitdiff
path: root/ext/web/02_event.js
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2022-07-14 22:39:20 +0200
committerGitHub <noreply@github.com>2022-07-14 22:39:20 +0200
commit1a7259b04b7229f6350a7a7c21b50497b5c80c17 (patch)
tree2bcea50749221b080d0402f5cf9bd55052437ae0 /ext/web/02_event.js
parent48a7312f3871e3b76c51eb0143ca1c48da43b20c (diff)
feat: add "unhandledrejection" event support (#12994) (#15080)
Relanding #12994 This commit adds support for "unhandledrejection" event. This event will trigger event listeners registered using: "globalThis.addEventListener("unhandledrejection") "globalThis.onunhandledrejection" This is done by registering a default handler using "Deno.core.setPromiseRejectCallback" that allows to handle rejected promises in JavaScript instead of Rust. This commit will make it possible to polyfill "process.on("unhandledRejection")" in the Node compat layer. Co-authored-by: Colin Ihrig <cjihrig@gmail.com>
Diffstat (limited to 'ext/web/02_event.js')
-rw-r--r--ext/web/02_event.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/ext/web/02_event.js b/ext/web/02_event.js
index 5d8f69673..105c7d3c4 100644
--- a/ext/web/02_event.js
+++ b/ext/web/02_event.js
@@ -1278,6 +1278,58 @@
[SymbolToStringTag] = "ProgressEvent";
}
+ class PromiseRejectionEvent extends Event {
+ #promise = null;
+ #reason = null;
+
+ get promise() {
+ return this.#promise;
+ }
+ get reason() {
+ return this.#reason;
+ }
+
+ constructor(
+ type,
+ {
+ bubbles,
+ cancelable,
+ composed,
+ promise,
+ reason,
+ } = {},
+ ) {
+ super(type, {
+ bubbles: bubbles,
+ cancelable: cancelable,
+ composed: composed,
+ });
+
+ this.#promise = promise;
+ this.#reason = reason;
+ }
+
+ [SymbolFor("Deno.privateCustomInspect")](inspect) {
+ return inspect(consoleInternal.createFilteredInspectProxy({
+ object: this,
+ evaluate: this instanceof PromiseRejectionEvent,
+ keys: [
+ ...EVENT_PROPS,
+ "promise",
+ "reason",
+ ],
+ }));
+ }
+
+ // TODO(lucacasonato): remove when this interface is spec aligned
+ [SymbolToStringTag] = "PromiseRejectionEvent";
+ }
+
+ defineEnumerableProps(PromiseRejectionEvent, [
+ "promise",
+ "reason",
+ ]);
+
const _eventHandlers = Symbol("eventHandlers");
function makeWrappedHandler(handler, isSpecialErrorEventHandler) {
@@ -1426,6 +1478,7 @@
window.MessageEvent = MessageEvent;
window.CustomEvent = CustomEvent;
window.ProgressEvent = ProgressEvent;
+ window.PromiseRejectionEvent = PromiseRejectionEvent;
window.dispatchEvent = EventTarget.prototype.dispatchEvent;
window.addEventListener = EventTarget.prototype.addEventListener;
window.removeEventListener = EventTarget.prototype.removeEventListener;