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(()) }