diff --git a/moli-renderer-v8/src/runtime/phase_one/tests/extracted/parser_script_handoffs.rs b/moli-renderer-v8/src/runtime/phase_one/tests/extracted/parser_script_handoffs.rs index 8f5431be17..9ee39f735d 100644 --- a/moli-renderer-v8/src/runtime/phase_one/tests/extracted/parser_script_handoffs.rs +++ b/moli-renderer-v8/src/runtime/phase_one/tests/extracted/parser_script_handoffs.rs @@ -1299,7 +1299,7 @@ fn parser_owner_style_import_handoff_is_stylesheet_gated_on_live_page_vm() { let outcome = driver .advance_parser_step( &mut page_vm, - "
", + "", None, ) .await @@ -1309,5 +1309,19 @@ fn parser_owner_style_import_handoff_is_stylesheet_gated_on_live_page_vm() { matches!(outcome, ParserStepAdvanceOutcome::BlockedOnStylesheet(_)), "parser-created style import should gate parser-blocking script on live PageVm" ); + let style = page_vm + .vm() + .document_runtime + .dom_host() + .element_handle_by_id("blocking-style") + .expect("parser-created style owner"); + assert_eq!( + page_vm + .vm() + .document_runtime + .pending_style_import_binding_for_test(style), + Some((1, true)), + "the parser-discovered import must bind its live stylesheet root before the script gate is released" + ); })); } diff --git a/moli-renderer-v8/src/script_vm/main_document_owner.rs b/moli-renderer-v8/src/script_vm/main_document_owner.rs index 66e69ceb6a..247923f5e1 100644 --- a/moli-renderer-v8/src/script_vm/main_document_owner.rs +++ b/moli-renderer-v8/src/script_vm/main_document_owner.rs @@ -63,6 +63,22 @@ impl ScriptVm { .document_runtime .note_discovered_document_owned_blocking_stylesheet_inputs(inputs.iter()); self.settle_stylesheet_link_clients(completed_stylesheet_clients); + if inputs.iter().any(|input| { + matches!( + input.signature(), + crate::stylesheet_blocking::DocumentBlockingStylesheetSignature::ParserCreatedStyleImport { .. } + ) + }) { + // The import graph owns the parser gate, while the connected + // style operation owns its CSSOM installation. Bind both views to + // the same live root before an already-fast graph can release the + // parser-blocking script. + self.sync_live_document_style_sources(); + let prepared = self + .document_runtime + .prepare_parser_discovered_style_import_loads(inputs); + self.commit_and_apply_connected_style_loads(prepared); + } inputs.len() } diff --git a/moli-renderer-v8/src/stylesheet_runtime/connected.rs b/moli-renderer-v8/src/stylesheet_runtime/connected.rs index e4a58dea69..e1ec05afba 100644 --- a/moli-renderer-v8/src/stylesheet_runtime/connected.rs +++ b/moli-renderer-v8/src/stylesheet_runtime/connected.rs @@ -9,9 +9,9 @@ use crate::module_runtime::{ use crate::planning::{ScriptFetchMetadata, module_script_credentials_mode}; use crate::service_worker_runtime::ServiceWorkerRequestDestination; use crate::stylesheet_blocking::{ - StylesheetFetchOptions, connected_preload_like_link_url, - document_owned_blocking_stylesheet_candidate_for_node, link_rel_includes_token, - preload_like_link_loads_stylesheet, stylesheet_link_disposition, + DocumentOwnedBlockingStylesheetDiscoveryInput, StylesheetFetchOptions, + connected_preload_like_link_url, document_owned_blocking_stylesheet_candidate_for_node, + link_rel_includes_token, preload_like_link_loads_stylesheet, stylesheet_link_disposition, stylesheet_preload_link_request, }; use crate::types::{AsyncSubresourceFetchResponseFilter, SubresourceResourceType}; @@ -238,6 +238,24 @@ impl DocumentRuntime { prepared } + pub(crate) fn prepare_parser_discovered_style_import_loads( + &mut self, + inputs: &[DocumentOwnedBlockingStylesheetDiscoveryInput], + ) -> Vec