From e5a73ede17454259c83686243be5dc7a83b6319d Mon Sep 17 00:00:00 2001 From: Rodion Borovyk Date: Tue, 12 Aug 2025 09:19:39 +0200 Subject: [PATCH] script: Send JS evaluation errors to constellation (#38602) Send JS evaluation errors to constellation in `script_thread::handle_evaluate_javascript` instead of silently swallowing. Testing: New test cases in `tests/webview.rs`: one for compilation failure, another for evaluation failure. Fixes: #37810 Signed-off-by: Rodion Borovyk --- components/script/script_thread.rs | 11 +++++++++-- components/servo/tests/webview.rs | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 07c0174e1f7..8c842debd0d 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -4048,14 +4048,21 @@ impl ScriptThread { let context = window.get_cx(); rooted!(in(*context) let mut return_value = UndefinedValue()); - _ = global_scope.evaluate_js_on_global_with_result( + if let Err(err) = global_scope.evaluate_js_on_global_with_result( &script, return_value.handle_mut(), ScriptFetchOptions::default_classic_script(global_scope), global_scope.api_base_url(), can_gc, None, // No known `introductionType` for JS code from embedder - ); + ) { + _ = self.senders.pipeline_to_constellation_sender.send(( + pipeline_id, + ScriptToConstellationMessage::FinishJavaScriptEvaluation(evaluation_id, Err(err)), + )); + return; + }; + let result = match jsval_to_webdriver( context, global_scope, diff --git a/components/servo/tests/webview.rs b/components/servo/tests/webview.rs index d7cb9a965e0..dbcc4f9fcb5 100644 --- a/components/servo/tests/webview.rs +++ b/components/servo/tests/webview.rs @@ -125,6 +125,12 @@ fn test_evaluate_javascript_basic(servo_test: &ServoTest) -> Result<(), anyhow:: ); ensure!(matches!(result, Ok(JSValue::Frame(..)))); + let result = evaluate_javascript(servo_test, webview.clone(), "lettt badsyntax = 123"); + ensure!(result == Err(JavaScriptEvaluationError::CompilationFailure)); + + let result = evaluate_javascript(servo_test, webview.clone(), "throw new Error()"); + ensure!(result == Err(JavaScriptEvaluationError::EvaluationFailure)); + Ok(()) }