diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/lsp/testing/execution.rs | 6 | ||||
-rw-r--r-- | cli/main.rs | 38 | ||||
-rw-r--r-- | cli/standalone.rs | 9 | ||||
-rw-r--r-- | cli/tests/integration/run_tests.rs | 6 | ||||
-rw-r--r-- | cli/tests/testdata/before_unload.js | 21 | ||||
-rw-r--r-- | cli/tests/testdata/before_unload.js.out | 8 | ||||
-rw-r--r-- | cli/tools/bench.rs | 6 | ||||
-rw-r--r-- | cli/tools/test.rs | 7 |
8 files changed, 94 insertions, 7 deletions
diff --git a/cli/lsp/testing/execution.rs b/cli/lsp/testing/execution.rs index 6b4e947a0..83f74e5ed 100644 --- a/cli/lsp/testing/execution.rs +++ b/cli/lsp/testing/execution.rs @@ -226,6 +226,12 @@ async fn test_specifier( worker.js_runtime.resolve_value(test_result).await?; + loop { + if !worker.dispatch_beforeunload_event(&located_script_name!())? { + break; + } + worker.run_event_loop(false).await?; + } worker.dispatch_unload_event(&located_script_name!())?; } diff --git a/cli/main.rs b/cli/main.rs index e74ed8518..de44add17 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -639,7 +639,13 @@ async fn eval_command( } worker.execute_main_module(&main_module).await?; worker.dispatch_load_event(&located_script_name!())?; - worker.run_event_loop(false).await?; + loop { + worker.run_event_loop(false).await?; + + if !worker.dispatch_beforeunload_event(&located_script_name!())? { + break; + } + } worker.dispatch_unload_event(&located_script_name!())?; Ok(0) } @@ -975,7 +981,12 @@ async fn run_from_stdin(flags: Flags) -> Result<i32, AnyError> { } worker.execute_main_module(&main_module).await?; worker.dispatch_load_event(&located_script_name!())?; - worker.run_event_loop(false).await?; + loop { + worker.run_event_loop(false).await?; + if !worker.dispatch_beforeunload_event(&located_script_name!())? { + break; + } + } worker.dispatch_unload_event(&located_script_name!())?; Ok(worker.get_exit_code()) } @@ -1014,7 +1025,15 @@ async fn run_with_watch(flags: Flags, script: String) -> Result<i32, AnyError> { self.worker.dispatch_load_event(&located_script_name!())?; self.pending_unload = true; - let result = self.worker.run_event_loop(false).await; + let result = loop { + let result = self.worker.run_event_loop(false).await; + if !self + .worker + .dispatch_beforeunload_event(&located_script_name!())? + { + break result; + } + }; self.pending_unload = false; if let Err(err) = result { @@ -1162,9 +1181,16 @@ async fn run_command( } worker.dispatch_load_event(&located_script_name!())?; - worker - .run_event_loop(maybe_coverage_collector.is_none()) - .await?; + + loop { + worker + .run_event_loop(maybe_coverage_collector.is_none()) + .await?; + if !worker.dispatch_beforeunload_event(&located_script_name!())? { + break; + } + } + worker.dispatch_unload_event(&located_script_name!())?; if let Some(coverage_collector) = maybe_coverage_collector.as_mut() { diff --git a/cli/standalone.rs b/cli/standalone.rs index d66eb7694..50baf70ea 100644 --- a/cli/standalone.rs +++ b/cli/standalone.rs @@ -316,7 +316,14 @@ pub async fn run( ); worker.execute_main_module(main_module).await?; worker.dispatch_load_event(&located_script_name!())?; - worker.run_event_loop(true).await?; + + loop { + worker.run_event_loop(false).await?; + if !worker.dispatch_beforeunload_event(&located_script_name!())? { + break; + } + } + worker.dispatch_unload_event(&located_script_name!())?; std::process::exit(0); } diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index bd27cd8dd..1cd1db0ef 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -249,6 +249,12 @@ itest!(webstorage_serialization { output: "webstorage/serialization.ts.out", }); +// tests the beforeunload event +itest!(beforeunload_event { + args: "run before_unload.js", + output: "before_unload.js.out", +}); + // tests to ensure that when `--location` is set, all code shares the same // localStorage cache based on the origin of the location URL. #[test] diff --git a/cli/tests/testdata/before_unload.js b/cli/tests/testdata/before_unload.js new file mode 100644 index 000000000..2572e512b --- /dev/null +++ b/cli/tests/testdata/before_unload.js @@ -0,0 +1,21 @@ +let count = 0; + +console.log("0"); + +globalThis.addEventListener("beforeunload", (e) => { + console.log("GOT EVENT"); + if (count === 0 || count === 1) { + e.preventDefault(); + setTimeout(() => { + console.log("3"); + }, 100); + } + + count++; +}); + +console.log("1"); + +setTimeout(() => { + console.log("2"); +}, 100); diff --git a/cli/tests/testdata/before_unload.js.out b/cli/tests/testdata/before_unload.js.out new file mode 100644 index 000000000..f1f2ab49a --- /dev/null +++ b/cli/tests/testdata/before_unload.js.out @@ -0,0 +1,8 @@ +0 +1 +2 +GOT EVENT +3 +GOT EVENT +3 +GOT EVENT diff --git a/cli/tools/bench.rs b/cli/tools/bench.rs index 3c40b4e95..3a40a4e97 100644 --- a/cli/tools/bench.rs +++ b/cli/tools/bench.rs @@ -404,6 +404,12 @@ async fn bench_specifier( worker.js_runtime.resolve_value(bench_result).await?; + loop { + if !worker.dispatch_beforeunload_event(&located_script_name!())? { + break; + } + worker.run_event_loop(false).await?; + } worker.dispatch_unload_event(&located_script_name!())?; Ok(()) diff --git a/cli/tools/test.rs b/cli/tools/test.rs index ac146fdbf..71374d94e 100644 --- a/cli/tools/test.rs +++ b/cli/tools/test.rs @@ -814,6 +814,13 @@ async fn test_specifier( worker.js_runtime.resolve_value(test_result).await?; + loop { + if !worker.dispatch_beforeunload_event(&located_script_name!())? { + break; + } + worker.run_event_loop(false).await?; + } + worker.dispatch_unload_event(&located_script_name!())?; if let Some(coverage_collector) = maybe_coverage_collector.as_mut() { |