From 425f575a6754fa293ff4ef0fb31e1d942d8aaa6d Mon Sep 17 00:00:00 2001 From: ldm0 Date: Tue, 8 Sep 2026 12:11:35 +0800 Subject: [PATCH] fix(modules): preserve original exceptions through error reporting --- ...ow_error_payload_does_not_abort_queue.html | 11 +- ...dow_error_payload_before_later_module.html | 11 +- moli-core/tests/scripts.rs | 10 +- moli-module-script-tree/src/job.rs | 26 ++- .../src/document_module_graph/diagnostics.rs | 13 +- .../script_scheduling/script_handles.rs | 21 +- .../document_script_scheduler/owner_work.rs | 18 +- .../src/document_script_scheduler/store.rs | 6 +- moli-renderer-v8/src/dynamic_script_owner.rs | 78 ++++--- moli-renderer-v8/src/host/scripts.rs | 16 +- moli-renderer-v8/src/host/scripts/policy.rs | 28 ++- moli-renderer-v8/src/host/scripts/tests.rs | 2 +- .../src/module_script_continuation.rs | 4 +- .../src/native_bridge/context_host/core.rs | 8 +- .../src/native_bridge/context_host/mod.rs | 4 +- .../src/page_task_queue/module_reaction.rs | 12 +- moli-renderer-v8/src/page_task_queue/tasks.rs | 12 +- .../src/parser_module_evaluation.rs | 6 +- moli-renderer-v8/src/runtime/page_vm/mod.rs | 75 +++---- .../page_owned_document_script_hooks.rs | 4 +- .../page_vm/parser_owned_module_completion.rs | 10 +- .../src/runtime/page_vm/tests/mod.rs | 1 + .../page_vm/tests/module_error_reporting.rs | 197 ++++++++++++++++++ .../child_document_script_scheduler.rs | 6 +- moli-renderer-v8/src/script_vm/eval_exec.rs | 24 +-- .../src/script_vm/input_helpers.rs | 16 +- .../main_document_post_parse_body.rs | 2 +- .../src/script_vm/native_module.rs | 81 +++---- .../native_module/child_dynamic_import.rs | 6 + .../native_module/child_parser_module/mod.rs | 4 +- .../src/script_vm/native_module/load_error.rs | 32 +-- .../src/script_vm/page_task_enqueue.rs | 12 +- .../src/script_vm/post_parse_lifecycle.rs | 64 +++--- .../src/script_vm/runtime_bindings.rs | 6 + .../src/script_vm/script_event_body.rs | 28 ++- .../script_vm/script_terminal_completion.rs | 36 ++-- .../tests/browser_api/promise_rejection.rs | 24 +++ .../tests/script_terminal_completion.rs | 41 ++++ moli-renderer-v8/src/types.rs | 15 ++ 39 files changed, 652 insertions(+), 318 deletions(-) create mode 100644 moli-renderer-v8/src/runtime/page_vm/tests/module_error_reporting.rs diff --git a/moli-core/tests/fixtures/runtime/dynamic_module_tla_exotic_rejection_reports_window_error_payload_does_not_abort_queue.html b/moli-core/tests/fixtures/runtime/dynamic_module_tla_exotic_rejection_reports_window_error_payload_does_not_abort_queue.html index ebf3ec630..bfd2f7bbe 100644 --- a/moli-core/tests/fixtures/runtime/dynamic_module_tla_exotic_rejection_reports_window_error_payload_does_not_abort_queue.html +++ b/moli-core/tests/fixtures/runtime/dynamic_module_tla_exotic_rejection_reports_window_error_payload_does_not_abort_queue.html @@ -6,10 +6,13 @@ window.addEventListener("error", (event) => { window.dynamicModuleTlaPayloadOrder.push("window-error"); window.dynamicModuleTlaPayloadErrorMessageMatches = Boolean( - event.error && - typeof event.error.message === "string" && - event.error.message.length > 0, + typeof event.message === "string" && event.message.length > 0, ); + window.dynamicModuleTlaPayloadErrorIdentityMatches = + event.error === window.dynamicModuleTlaPayloadReason && + Object.getPrototypeOf(event.error) === null && + !Object.hasOwn(event.error, "message") && + !Object.hasOwn(event.error, "fileName"); window.dynamicModuleTlaPayloadFilenameMatches = typeof event.filename === "string" && event.filename.includes( @@ -23,7 +26,7 @@ window.dynamicModuleTlaPayloadOrder.push("script-error"); }; broken.text = - 'const reason = Object.create(null); await Promise.reject(reason);'; + 'const reason = window.dynamicModuleTlaPayloadReason = Object.create(null); await Promise.reject(reason);'; document.body.appendChild(broken); const later = document.createElement("script"); diff --git a/moli-core/tests/fixtures/runtime/parser_owned_module_tla_exotic_rejection_reports_window_error_payload_before_later_module.html b/moli-core/tests/fixtures/runtime/parser_owned_module_tla_exotic_rejection_reports_window_error_payload_before_later_module.html index 65d5543ad..6dc6bddd0 100644 --- a/moli-core/tests/fixtures/runtime/parser_owned_module_tla_exotic_rejection_reports_window_error_payload_before_later_module.html +++ b/moli-core/tests/fixtures/runtime/parser_owned_module_tla_exotic_rejection_reports_window_error_payload_before_later_module.html @@ -6,10 +6,13 @@ window.addEventListener("error", (event) => { window.parserOwnedModuleTlaPayloadOrder.push("window-error"); window.parserOwnedModuleTlaPayloadErrorMessageMatches = Boolean( - event.error && - typeof event.error.message === "string" && - event.error.message.length > 0, + typeof event.message === "string" && event.message.length > 0, ); + window.parserOwnedModuleTlaPayloadErrorIdentityMatches = + event.error === window.parserOwnedModuleTlaPayloadReason && + Object.getPrototypeOf(event.error) === null && + !Object.hasOwn(event.error, "message") && + !Object.hasOwn(event.error, "fileName"); window.parserOwnedModuleTlaPayloadFilenameMatches = typeof event.filename === "string" && event.filename.includes( @@ -21,7 +24,7 @@ type="module" onerror="window.parserOwnedModuleTlaPayloadOrder.push('script-error');" > - const reason = Object.create(null); + const reason = window.parserOwnedModuleTlaPayloadReason = Object.create(null); await Promise.reject(reason);