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 = `