diff options
Diffstat (limited to 'cli')
25 files changed, 209 insertions, 22 deletions
diff --git a/cli/dts/lib.deno.window.d.ts b/cli/dts/lib.deno.window.d.ts index fbd0a967b..d0e04a7a8 100644 --- a/cli/dts/lib.deno.window.d.ts +++ b/cli/dts/lib.deno.window.d.ts @@ -7,10 +7,15 @@ /// <reference lib="deno.webstorage" /> /// <reference lib="esnext" /> +interface WindowEventMap { + "error": ErrorEvent; +} + declare class Window extends EventTarget { new(): Window; readonly window: Window & typeof globalThis; readonly self: Window & typeof globalThis; + onerror: ((this: Window, ev: ErrorEvent) => any) | null; onload: ((this: Window, ev: Event) => any) | null; onunload: ((this: Window, ev: Event) => any) | null; close: () => void; @@ -25,10 +30,38 @@ declare class Window extends EventTarget { location: Location; localStorage: Storage; sessionStorage: Storage; + + addEventListener<K extends keyof WindowEventMap>( + type: K, + listener: ( + this: Window, + ev: WindowEventMap[K], + ) => any, + options?: boolean | AddEventListenerOptions, + ): void; + addEventListener( + type: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | AddEventListenerOptions, + ): void; + removeEventListener<K extends keyof WindowEventMap>( + type: K, + listener: ( + this: Window, + ev: WindowEventMap[K], + ) => any, + options?: boolean | EventListenerOptions, + ): void; + removeEventListener( + type: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | EventListenerOptions, + ): void; } declare var window: Window & typeof globalThis; declare var self: Window & typeof globalThis; +declare var onerror: ((this: Window, ev: ErrorEvent) => any) | null; declare var onload: ((this: Window, ev: Event) => any) | null; declare var onunload: ((this: Window, ev: Event) => any) | null; declare var localStorage: Storage; @@ -77,10 +110,17 @@ declare function prompt(message?: string, defaultValue?: string): string | null; * dispatchEvent(new Event('unload')); * ``` */ +declare function addEventListener< + K extends keyof WindowEventMap, +>( + type: K, + listener: (this: Window, ev: WindowEventMap[K]) => any, + options?: boolean | AddEventListenerOptions, +): void; declare function addEventListener( type: string, - callback: EventListenerOrEventListenerObject | null, - options?: boolean | AddEventListenerOptions | undefined, + listener: EventListenerOrEventListenerObject, + options?: boolean | AddEventListenerOptions, ): void; /** Remove a previously registered event listener from the global scope @@ -91,10 +131,17 @@ declare function addEventListener( * removeEventListener('load', listener); * ``` */ +declare function removeEventListener< + K extends keyof WindowEventMap, +>( + type: K, + listener: (this: Window, ev: WindowEventMap[K]) => any, + options?: boolean | EventListenerOptions, +): void; declare function removeEventListener( type: string, - callback: EventListenerOrEventListenerObject | null, - options?: boolean | EventListenerOptions | undefined, + listener: EventListenerOrEventListenerObject, + options?: boolean | EventListenerOptions, ): void; // TODO(nayeemrmn): Move this to `extensions/web` where its implementation is. diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index a56e3f0f1..969a57a9f 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -2685,3 +2685,32 @@ itest!(future_check2 { output: "future_check2.out", envs: vec![("DENO_FUTURE_CHECK".to_string(), "1".to_string())], }); + +itest!(event_listener_error { + args: "run --quiet event_listener_error.ts", + output: "event_listener_error.ts.out", + exit_code: 1, +}); + +itest!(event_listener_error_handled { + args: "run --quiet event_listener_error_handled.ts", + output: "event_listener_error_handled.ts.out", +}); + +// https://github.com/denoland/deno/pull/14159#issuecomment-1092285446 +itest!(event_listener_error_immediate_exit { + args: "run --quiet event_listener_error_immediate_exit.ts", + output: "event_listener_error_immediate_exit.ts.out", + exit_code: 1, +}); + +itest!(set_timeout_error { + args: "run --quiet set_timeout_error.ts", + output: "set_timeout_error.ts.out", + exit_code: 1, +}); + +itest!(set_timeout_error_handled { + args: "run --quiet set_timeout_error_handled.ts", + output: "set_timeout_error_handled.ts.out", +}); diff --git a/cli/tests/testdata/event_listener_error.ts b/cli/tests/testdata/event_listener_error.ts new file mode 100644 index 000000000..1cbdf7bc2 --- /dev/null +++ b/cli/tests/testdata/event_listener_error.ts @@ -0,0 +1,6 @@ +addEventListener("foo", () => { + throw new Error("bar"); +}); +console.log(1); +dispatchEvent(new CustomEvent("foo")); +console.log(2); diff --git a/cli/tests/testdata/event_listener_error.ts.out b/cli/tests/testdata/event_listener_error.ts.out new file mode 100644 index 000000000..a20a91dfd --- /dev/null +++ b/cli/tests/testdata/event_listener_error.ts.out @@ -0,0 +1,7 @@ +1 +error: Uncaught Error: bar + throw new Error("bar"); + ^ + at [WILDCARD]/event_listener_error.ts:2:9 + at [WILDCARD] + at [WILDCARD]/event_listener_error.ts:5:1 diff --git a/cli/tests/testdata/event_listener_error_handled.ts b/cli/tests/testdata/event_listener_error_handled.ts new file mode 100644 index 000000000..c4c8fd1cd --- /dev/null +++ b/cli/tests/testdata/event_listener_error_handled.ts @@ -0,0 +1,23 @@ +addEventListener("error", (event) => { + console.log({ + cancelable: event.cancelable, + message: event.message, + filename: event.filename?.slice?.(-100), + lineno: event.lineno, + colno: event.colno, + error: event.error, + }); + event.preventDefault(); +}); + +onerror = (event) => { + console.log("onerror() called", event.error); +}; + +addEventListener("foo", () => { + throw new Error("bar"); +}); + +console.log(1); +dispatchEvent(new CustomEvent("foo")); +console.log(2); diff --git a/cli/tests/testdata/event_listener_error_handled.ts.out b/cli/tests/testdata/event_listener_error_handled.ts.out new file mode 100644 index 000000000..d3cf525c3 --- /dev/null +++ b/cli/tests/testdata/event_listener_error_handled.ts.out @@ -0,0 +1,17 @@ +1 +{ + cancelable: true, + message: "Uncaught Error: bar", + filename: "[WILDCARD]/event_listener_error_handled.ts", + lineno: 18, + colno: 9, + error: Error: bar + at [WILDCARD]/event_listener_error_handled.ts:18:9 + at [WILDCARD] + at [WILDCARD]/event_listener_error_handled.ts:22:1 +} +onerror() called Error: bar + at [WILDCARD]/event_listener_error_handled.ts:18:9 + at [WILDCARD] + at [WILDCARD]/event_listener_error_handled.ts:22:1 +2 diff --git a/cli/tests/testdata/event_listener_error_immediate_exit.ts b/cli/tests/testdata/event_listener_error_immediate_exit.ts new file mode 100644 index 000000000..c9e94c01b --- /dev/null +++ b/cli/tests/testdata/event_listener_error_immediate_exit.ts @@ -0,0 +1,12 @@ +addEventListener("foo", () => { + queueMicrotask(() => console.log("queueMicrotask")); + setTimeout(() => console.log("timer"), 0); + throw new Error("bar"); +}); +console.log(1); +// @ts-ignore Deno.core +Deno.core.setNextTickCallback(() => console.log("nextTick")); +// @ts-ignore Deno.core +Deno.core.setHasTickScheduled(true); +dispatchEvent(new CustomEvent("foo")); +console.log(2); diff --git a/cli/tests/testdata/event_listener_error_immediate_exit.ts.out b/cli/tests/testdata/event_listener_error_immediate_exit.ts.out new file mode 100644 index 000000000..8f03f71b8 --- /dev/null +++ b/cli/tests/testdata/event_listener_error_immediate_exit.ts.out @@ -0,0 +1,6 @@ +1 +error: Uncaught Error: bar + throw new Error("bar"); + ^ + at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9[WILDCARD] + at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1 diff --git a/cli/tests/testdata/set_timeout_error.ts b/cli/tests/testdata/set_timeout_error.ts new file mode 100644 index 000000000..2864574e7 --- /dev/null +++ b/cli/tests/testdata/set_timeout_error.ts @@ -0,0 +1,3 @@ +setTimeout(() => { + throw new Error("foo"); +}, 0); diff --git a/cli/tests/testdata/set_timeout_error.ts.out b/cli/tests/testdata/set_timeout_error.ts.out new file mode 100644 index 000000000..9db053f6c --- /dev/null +++ b/cli/tests/testdata/set_timeout_error.ts.out @@ -0,0 +1,5 @@ +error: Uncaught Error: foo + throw new Error("foo"); + ^ + at [WILDCARD]/set_timeout_error.ts:2:9 + at [WILDCARD] diff --git a/cli/tests/testdata/set_timeout_error_handled.ts b/cli/tests/testdata/set_timeout_error_handled.ts new file mode 100644 index 000000000..aee2d97d2 --- /dev/null +++ b/cli/tests/testdata/set_timeout_error_handled.ts @@ -0,0 +1,19 @@ +addEventListener("error", (event) => { + console.log({ + cancelable: event.cancelable, + message: event.message, + filename: event.filename?.slice?.(-100), + lineno: event.lineno, + colno: event.colno, + error: event.error, + }); + event.preventDefault(); +}); + +onerror = (event) => { + console.log("onerror() called", event.error); +}; + +setTimeout(() => { + throw new Error("foo"); +}, 0); diff --git a/cli/tests/testdata/set_timeout_error_handled.ts.out b/cli/tests/testdata/set_timeout_error_handled.ts.out new file mode 100644 index 000000000..054dd9b6b --- /dev/null +++ b/cli/tests/testdata/set_timeout_error_handled.ts.out @@ -0,0 +1,13 @@ +{ + cancelable: true, + message: "Uncaught Error: foo", + filename: "[WILDCARD]/set_timeout_error_handled.ts", + lineno: 18, + colno: 9, + error: Error: foo + at [WILDCARD]/set_timeout_error_handled.ts:18:9 + at [WILDCARD] +} +onerror() called Error: foo + at [WILDCARD]/set_timeout_error_handled.ts:18:9 + at [WILDCARD] diff --git a/cli/tests/testdata/worker_drop_handle_race.js.out b/cli/tests/testdata/worker_drop_handle_race.js.out index 34c2d5be2..a81684bfa 100644 --- a/cli/tests/testdata/worker_drop_handle_race.js.out +++ b/cli/tests/testdata/worker_drop_handle_race.js.out @@ -4,5 +4,5 @@ error: Uncaught (in worker "") Error at [WILDCARD]/workers/drop_handle_race.js:2:9 at Object.action (deno:ext/web/02_timers.js:[WILDCARD]) at handleTimerMacrotask (deno:ext/web/02_timers.js:[WILDCARD]) -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl (deno:runtime/js/11_workers.js:[WILDCARD]) diff --git a/cli/tests/testdata/worker_event_handler_test.js.out b/cli/tests/testdata/worker_event_handler_test.js.out index 5556633b1..b3eed7f6c 100644 --- a/cli/tests/testdata/worker_event_handler_test.js.out +++ b/cli/tests/testdata/worker_event_handler_test.js.out @@ -1,10 +1,10 @@ Target from self.onmessage: [object DedicatedWorkerGlobalScope] Target from message event listener: [object DedicatedWorkerGlobalScope] Arguments from self.onerror: [ - "Some error message", - "", - 0, - 0, + "Uncaught Error: Some error message", + "[WILDCARD]/worker_event_handlers.js", + 9, + 9, Error: Some error message at [WILDCARD] ] diff --git a/cli/tests/testdata/workers/nonexistent_worker.out b/cli/tests/testdata/workers/nonexistent_worker.out index 1b5111b14..08a7e74e7 100644 --- a/cli/tests/testdata/workers/nonexistent_worker.out +++ b/cli/tests/testdata/workers/nonexistent_worker.out @@ -1,3 +1,3 @@ [WILDCARD]error: Uncaught (in worker "") Module not found "file:///[WILDCARD]/workers/doesnt_exist.js". -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/permissions_blob_local.ts.out b/cli/tests/testdata/workers/permissions_blob_local.ts.out index ee19c7ab5..9d5336bfe 100644 --- a/cli/tests/testdata/workers/permissions_blob_local.ts.out +++ b/cli/tests/testdata/workers/permissions_blob_local.ts.out @@ -1,4 +1,4 @@ error: Uncaught (in worker "") Requires read access to "[WILDCARD]local_file.ts", run again with the --allow-read flag at blob:null/[WILDCARD]:1:8 -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/permissions_blob_remote.ts.out b/cli/tests/testdata/workers/permissions_blob_remote.ts.out index 597e5bf1e..ac06e6ccb 100644 --- a/cli/tests/testdata/workers/permissions_blob_remote.ts.out +++ b/cli/tests/testdata/workers/permissions_blob_remote.ts.out @@ -1,4 +1,4 @@ error: Uncaught (in worker "") Requires net access to "example.com", run again with the --allow-net flag at blob:null/[WILDCARD]:1:8 -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/permissions_data_local.ts.out b/cli/tests/testdata/workers/permissions_data_local.ts.out index 5c9bcf1c1..96711f9a0 100644 --- a/cli/tests/testdata/workers/permissions_data_local.ts.out +++ b/cli/tests/testdata/workers/permissions_data_local.ts.out @@ -1,4 +1,4 @@ error: Uncaught (in worker "") Requires read access to "[WILDCARD]local_file.ts", run again with the --allow-read flag at data:application/javascript;base64,[WILDCARD]:1:8 -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/permissions_data_remote.ts.out b/cli/tests/testdata/workers/permissions_data_remote.ts.out index 0273664bd..a9ed5c240 100644 --- a/cli/tests/testdata/workers/permissions_data_remote.ts.out +++ b/cli/tests/testdata/workers/permissions_data_remote.ts.out @@ -1,4 +1,4 @@ error: Uncaught (in worker "") Requires net access to "example.com", run again with the --allow-net flag at data:application/javascript;base64,aW1wb3J0ICJodHRwczovL2V4YW1wbGUuY29tL3NvbWUvZmlsZS50cyI7:1:8 -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/permissions_dynamic_remote.ts.out b/cli/tests/testdata/workers/permissions_dynamic_remote.ts.out index e5015abff..cbddb61e0 100644 --- a/cli/tests/testdata/workers/permissions_dynamic_remote.ts.out +++ b/cli/tests/testdata/workers/permissions_dynamic_remote.ts.out @@ -2,5 +2,5 @@ error: Uncaught (in worker "") (in promise) TypeError: Requires net access to "e await import("https://example.com/some/file.ts"); ^ at async http://localhost:4545/workers/dynamic_remote.ts:2:1 -[WILDCARD]error: Uncaught (in promise) Error: Unhandled error event in child worker. +[WILDCARD]error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/permissions_remote_remote.ts.out b/cli/tests/testdata/workers/permissions_remote_remote.ts.out index 42602cf71..be96b5d4e 100644 --- a/cli/tests/testdata/workers/permissions_remote_remote.ts.out +++ b/cli/tests/testdata/workers/permissions_remote_remote.ts.out @@ -1,4 +1,4 @@ error: Uncaught (in worker "") Requires net access to "example.com", run again with the --allow-net flag at http://localhost:4545/workers/static_remote.ts:2:8 -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/worker_async_error.ts.out b/cli/tests/testdata/workers/worker_async_error.ts.out index 0a05534c5..16f6a6b84 100644 --- a/cli/tests/testdata/workers/worker_async_error.ts.out +++ b/cli/tests/testdata/workers/worker_async_error.ts.out @@ -3,5 +3,5 @@ error: Uncaught (in worker "foo") (in promise) Error: bar ^ at [WILDCARD]/async_error.ts:[WILDCARD] at [WILDCARD]/async_error.ts:[WILDCARD] -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/worker_error.ts.out b/cli/tests/testdata/workers/worker_error.ts.out index cb0a02550..e7b0ea14d 100644 --- a/cli/tests/testdata/workers/worker_error.ts.out +++ b/cli/tests/testdata/workers/worker_error.ts.out @@ -1,5 +1,5 @@ [WILDCARD]error: Uncaught (in worker "bar") Error: foo[WILDCARD] at foo ([WILDCARD]) at [WILDCARD] -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/worker_message_handler_error.ts.out b/cli/tests/testdata/workers/worker_message_handler_error.ts.out index 56458d5e4..0c51ca9d2 100644 --- a/cli/tests/testdata/workers/worker_message_handler_error.ts.out +++ b/cli/tests/testdata/workers/worker_message_handler_error.ts.out @@ -1,7 +1,7 @@ -error: Uncaught (in worker "foo") (in promise) Error: bar +error: Uncaught (in worker "foo") Error: bar throw new Error("bar"); ^ at onmessage ([WILDCARD]/message_handler_error.ts:[WILDCARD]) at [WILDCARD] -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) diff --git a/cli/tests/testdata/workers/worker_nested_error.ts.out b/cli/tests/testdata/workers/worker_nested_error.ts.out index 5c978ca9b..afd9f59e2 100644 --- a/cli/tests/testdata/workers/worker_nested_error.ts.out +++ b/cli/tests/testdata/workers/worker_nested_error.ts.out @@ -3,7 +3,7 @@ ^ at foo ([WILDCARD]/workers/error.ts:[WILDCARD]) at [WILDCARD]/workers/error.ts:[WILDCARD] -error: Uncaught (in worker "baz") (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in worker "baz") (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) -error: Uncaught (in promise) Error: Unhandled error event in child worker. +error: Uncaught (in promise) Error: Unhandled error in child worker. at Worker.#pollControl ([WILDCARD]) |