From ec83aaab72d69835a8022fb42e388facf884e9bc Mon Sep 17 00:00:00 2001 From: ldm0 Date: Sun, 1 Nov 2026 19:06:06 +0800 Subject: [PATCH] fix(dom): restore copied document URL after cloned base removal fix(dom): restore copied document URL after cloned base removal. Extracted from development commit 77ef817c7e8 and adapted to main. Validation (32 build jobs and test threads): cargo fmt --all; cargo clippy --workspace --all-targets --all-features -- -D warnings; cargo nextest run --no-fail-fast. Summary [ 140.724s] 22165 tests run: 22165 passed (9 slow), 20 skipped --- .../detached_surface/creation/clone_adopt.rs | 9 +++++++ .../document_lifecycle_and_adoption.rs | 24 ++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/moli-renderer-v8/src/native_bridge/document/detached_surface/creation/clone_adopt.rs b/moli-renderer-v8/src/native_bridge/document/detached_surface/creation/clone_adopt.rs index 7b33d6c049..a6d6549583 100644 --- a/moli-renderer-v8/src/native_bridge/document/detached_surface/creation/clone_adopt.rs +++ b/moli-renderer-v8/src/native_bridge/document/detached_surface/creation/clone_adopt.rs @@ -85,6 +85,15 @@ fn clone_detached_document_shell<'s>( { return None; } + // Browser Document clones fall back to their copied URL/about base URL + // when a copied is removed. The native clone helper also serves + // callers that need a frozen computed base; do not expose that override. + unsafe { &mut *clone_runtime } + .dom_host_mut() + .node_mut(clone_handle)? + .data_mut() + .as_document_mut()? + .set_base_url_override(None); if !deep { return Some(cloned); } diff --git a/moli-renderer-v8/src/script_vm/tests/dom_elements/detached/document_lifecycle_and_adoption.rs b/moli-renderer-v8/src/script_vm/tests/dom_elements/detached/document_lifecycle_and_adoption.rs index 39f9240e8f..76b93e043f 100644 --- a/moli-renderer-v8/src/script_vm/tests/dom_elements/detached/document_lifecycle_and_adoption.rs +++ b/moli-renderer-v8/src/script_vm/tests/dom_elements/detached/document_lifecycle_and_adoption.rs @@ -45,7 +45,7 @@ fn detached_document_clones_keep_url_and_document_uri_in_sync_with_native_metada } #[test] -fn document_clone_base_uri_survives_base_element_removal() { +fn document_clone_base_uri_falls_back_to_copied_url_after_base_removal() { let mut vm = new_storage_test_vm("https://document-clone-base.test/path/page.html"); let result = vm .eval( @@ -80,8 +80,26 @@ fn document_clone_base_uri_survives_base_element_removal() { "#, ) .expect("document clone base URI probe should evaluate"); - let row = r#"["https://cdn.example/assets/","https://other.example/","https://cdn.example/assets/","https://cdn.example/assets/image.png","https://cdn.example/assets/"]"#; - assert_eq!(result, format!("[{row},{row}]")); + let fallback = "https://document-clone-base.test/path/page.html"; + assert_eq!( + serde_json::from_str::(&result).unwrap(), + serde_json::json!([ + [ + fallback, + "https://other.example/", + fallback, + "https://document-clone-base.test/path/image.png", + fallback + ], + [ + "https://cdn.example/assets/", + "https://other.example/", + fallback, + "https://document-clone-base.test/path/image.png", + fallback + ], + ]) + ); } #[test]