summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/dts/lib.deno.window.d.ts55
-rw-r--r--cli/tests/integration/run_tests.rs29
-rw-r--r--cli/tests/testdata/event_listener_error.ts6
-rw-r--r--cli/tests/testdata/event_listener_error.ts.out7
-rw-r--r--cli/tests/testdata/event_listener_error_handled.ts23
-rw-r--r--cli/tests/testdata/event_listener_error_handled.ts.out17
-rw-r--r--cli/tests/testdata/event_listener_error_immediate_exit.ts12
-rw-r--r--cli/tests/testdata/event_listener_error_immediate_exit.ts.out6
-rw-r--r--cli/tests/testdata/set_timeout_error.ts3
-rw-r--r--cli/tests/testdata/set_timeout_error.ts.out5
-rw-r--r--cli/tests/testdata/set_timeout_error_handled.ts19
-rw-r--r--cli/tests/testdata/set_timeout_error_handled.ts.out13
-rw-r--r--cli/tests/testdata/worker_drop_handle_race.js.out2
-rw-r--r--cli/tests/testdata/worker_event_handler_test.js.out8
-rw-r--r--cli/tests/testdata/workers/nonexistent_worker.out2
-rw-r--r--cli/tests/testdata/workers/permissions_blob_local.ts.out2
-rw-r--r--cli/tests/testdata/workers/permissions_blob_remote.ts.out2
-rw-r--r--cli/tests/testdata/workers/permissions_data_local.ts.out2
-rw-r--r--cli/tests/testdata/workers/permissions_data_remote.ts.out2
-rw-r--r--cli/tests/testdata/workers/permissions_dynamic_remote.ts.out2
-rw-r--r--cli/tests/testdata/workers/permissions_remote_remote.ts.out2
-rw-r--r--cli/tests/testdata/workers/worker_async_error.ts.out2
-rw-r--r--cli/tests/testdata/workers/worker_error.ts.out2
-rw-r--r--cli/tests/testdata/workers/worker_message_handler_error.ts.out4
-rw-r--r--cli/tests/testdata/workers/worker_nested_error.ts.out4
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])