diff --git a/moli-renderer-v8/src/native_bridge/context_host/host_loads.rs b/moli-renderer-v8/src/native_bridge/context_host/host_loads.rs index 6cc269a2bf..448adc5ec9 100644 --- a/moli-renderer-v8/src/native_bridge/context_host/host_loads.rs +++ b/moli-renderer-v8/src/native_bridge/context_host/host_loads.rs @@ -453,6 +453,11 @@ impl JsContextHost { self.trace_stale_child_load_delivery(action, "owner_element_load"); return ChildFrameLoadDeliveryPhaseResult::after_callback(None); } + // Load callbacks may insert a new refresh, but must not cancel an + // existing document-owned refresh by moving its meta element away. + if !self.child_meta_refresh_navigations.contains_key(&handle) { + self.queue_child_meta_refresh_navigation_if_needed(scope, handle); + } ChildFrameLoadDeliveryPhaseResult::after_callback(progress) } diff --git a/moli-renderer-v8/src/script_vm/tests/dom_elements/dom_surface/extracted/frame_navigation_and_history.rs b/moli-renderer-v8/src/script_vm/tests/dom_elements/dom_surface/extracted/frame_navigation_and_history.rs index e8fd18bee9..3885668360 100644 --- a/moli-renderer-v8/src/script_vm/tests/dom_elements/dom_surface/extracted/frame_navigation_and_history.rs +++ b/moli-renderer-v8/src/script_vm/tests/dom_elements/dom_surface/extracted/frame_navigation_and_history.rs @@ -1358,6 +1358,61 @@ async fn detached_child_navigation_error_exposes_committed_entry_during_dispatch "committed:true|error:true:true:AbortError|finished-rejected:AbortError||true" ); } +async fn assert_child_meta_refresh_can_be_inserted_during_load(in_window_load: bool) { + let loader = ResourceRequestClient::new(&moli_fetch::FetchConfig::default()).expect("loader"); + let mut vm = new_storage_test_vm_with_loader("https://child-meta-refresh.test/", &loader); + vm.eval(&format!( + "globalThis.insertInWindowLoad = {in_window_load};" + )) + .unwrap(); + vm.eval( + r#" +const root = document.documentElement || document.appendChild(document.createElement('html')); +const frame = document.createElement('iframe'); +frame.onload = () => { + if (!insertInWindowLoad) { + frame.contentDocument.body.innerHTML = ''; + } +}; +frame.srcdoc = `