From 09007bc03ad02366324daf2a4e7d95136a318d84 Mon Sep 17 00:00:00 2001 From: ldm0 Date: Tue, 1 Sep 2026 06:13:30 +0800 Subject: [PATCH] fix(html): report errors in receiver realm --- .../browser_api/events_selection_storage.rs | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/moli-renderer-v8/src/script_vm/tests/browser_api/events_selection_storage.rs b/moli-renderer-v8/src/script_vm/tests/browser_api/events_selection_storage.rs index 1eb7fb72c4..2e5d3aa2f5 100644 --- a/moli-renderer-v8/src/script_vm/tests/browser_api/events_selection_storage.rs +++ b/moli-renderer-v8/src/script_vm/tests/browser_api/events_selection_storage.rs @@ -2392,6 +2392,80 @@ fn same_realm_onerror_throw_does_not_reenter_error_reporting() { assert_eq!(result, "1"); } +#[test] +fn report_error_uses_the_receiver_realm_without_observing_exception_getters() { + let mut vm = new_storage_test_vm("https://report-error-receiver-realm.test/"); + + vm.eval( + r#" + (() => { + const frame = document.createElement("iframe"); + (document.body || document.documentElement || document).appendChild(frame); + globalThis.__reportErrorRealmFrame = frame; + return "ready"; + })() + "#, + ) + .expect("reportError receiver Realm setup should evaluate"); + vm.drain_pending_child_frame_work_for_test(); + + let result = vm + .eval( + r#" + (() => { + const child = globalThis.__reportErrorRealmFrame.contentWindow; + const childEvents = []; + let topEvents = 0; + let getterCalls = 0; + window.addEventListener("error", () => topEvents++); + child.addEventListener("error", event => childEvents.push(event)); + + const error = new TypeError("receiver failure"); + window.reportError.call(child, error); + + const opaqueReason = {}; + for (const name of ["name", "message", "fileName", "lineNumber", "columnNumber"]) { + Object.defineProperty(opaqueReason, name, { + get() { + getterCalls++; + throw new Error(`unexpected ${name} getter`); + } + }); + } + window.reportError.call(child, opaqueReason); + + let missingArgumentError = null; + try { + window.reportError(); + } catch (exception) { + missingArgumentError = exception.name; + } + + globalThis.__reportErrorRealmFrame.remove(); + child.reportError("detached failure"); + const detachedCallCompleted = true; + + return JSON.stringify({ + topEvents, + eventCount: childEvents.length, + exactErrors: [childEvents[0].error === error, childEvents[1].error === opaqueReason], + receiverRealm: childEvents.every(event => event instanceof child.ErrorEvent), + messagesAreNonEmpty: childEvents.every(event => event.message.length > 0), + getterCalls, + missingArgumentError, + detachedCallCompleted + }); + })() + "#, + ) + .expect("cross-Realm reportError probe should evaluate"); + + assert_eq!( + result, + r#"{"topEvents":0,"eventCount":2,"exactErrors":[true,true],"receiverRealm":true,"messagesAreNonEmpty":true,"getterCalls":0,"missingArgumentError":"TypeError","detachedCallCompleted":true}"#, + ); +} + #[test] fn host_event_microtasks_observe_current_window_event_until_checkpoint_cleanup() { let mut vm = new_storage_test_vm("https://host-event-microtasks.test/");