diff --git a/moli-core/src/browser_host/mod.rs b/moli-core/src/browser_host/mod.rs index 5db13fbe98..17925c765b 100644 --- a/moli-core/src/browser_host/mod.rs +++ b/moli-core/src/browser_host/mod.rs @@ -16,6 +16,7 @@ mod handle; mod identity; mod identity_allocator; mod initial_target_navigation; +mod navigation_access; mod navigation_owner; mod network_artifacts; mod network_body; diff --git a/moli-core/src/browser_host/navigation_access.rs b/moli-core/src/browser_host/navigation_access.rs new file mode 100644 index 0000000000..096508db47 --- /dev/null +++ b/moli-core/src/browser_host/navigation_access.rs @@ -0,0 +1,492 @@ +use std::{sync::Arc, time::Duration}; + +use crate::{ + RendererOutputTransportSender, + network::ResourceRequestClient, + page::{ + CompletedPageCommand, Page, PendingPageCommand, RendererCommandTurnOutput, + RendererDocumentLifecycleEvent, RendererPageLifetimeOwner, SameDocumentHistoryUpdate, + }, + runtime::{NavigationEngine, NavigationResourceStorageHandles}, +}; + +use super::{ + BrowserContextActivation, BrowserContextDisposalReservation, BrowserContextHandle, + BrowserContextRegistryError, BrowserContextSelectionProjection, BrowserDocumentNavigation, + BrowserExactHistoryTraversalResolutionError, BrowserFactEnvelope, BrowserFactPublishError, + BrowserHistoryTraversalDestination, BrowserHistoryTraversalResolution, + BrowserHistoryTraversalResolutionError, BrowserHostState, BrowserInitialEmptyDocumentSeed, + BrowserNavigationFailure, BrowserNavigationHistoryEntry, BrowserNavigationHistoryPageSnapshot, + BrowserNavigationHistorySeed, BrowserNavigationTraceContext, BrowserPageFetchConfiguration, + BrowserPageOwnerKey, BrowserPageReplacement, BrowserPageReplacementCommitError, + BrowserPageReplacementPermit, BrowserPageResidenceTransition, + BrowserPageResidenceTransitionCommitError, BrowserPageResidenceTransitionPermit, + BrowserPageRuntimeOwner, BrowserSameDocumentNavigationCommitError, BrowserTargetActivation, + BrowserTargetCreationMetadata, BrowserTargetEngineAdoptionError, + BrowserTargetEngineOwnerMismatch, BrowserTargetEngineResidence, BrowserTargetRegistration, + BrowserTargetRegistryError, BrowserTargetTermination, BrowserTargetTerminationCommitError, + BrowserTargetTerminationPermit, BrowserTargetTopologyProjection, PageResidenceIdentity, +}; + +/// Narrow mutation entry points for authoritative Browser navigation state. +/// +/// Protocol callers can request one complete owner operation, but cannot hold +/// a mutable borrow of the underlying registry aggregate or combine arbitrary +/// mutations outside this boundary. +impl BrowserHostState { + pub fn activate_browser_context( + &self, + browser_context_id: &str, + projection: BrowserContextSelectionProjection, + create_replacement: F, + ) -> Result + where + F: FnOnce() -> NavigationEngine, + { + self.navigation_owner_mut().activate_browser_context( + browser_context_id, + projection, + create_replacement, + ) + } + + pub fn begin_browser_context_disposal( + &self, + browser_context_handle: &BrowserContextHandle, + ) -> Result { + self.navigation_owner_mut() + .begin_browser_context_disposal(browser_context_handle) + } + + pub fn rollback_browser_context_disposal( + &self, + reservation: BrowserContextDisposalReservation, + ) -> bool { + self.navigation_owner_mut() + .rollback_browser_context_disposal(reservation) + } + + pub fn register_background_target_with_creation_metadata( + &self, + browser_context_id: &str, + target_id: &str, + creation_metadata: BrowserTargetCreationMetadata, + topology_projection: BrowserTargetTopologyProjection, + ) -> Result { + self.navigation_owner_mut() + .register_background_target_with_creation_metadata( + browser_context_id, + target_id, + creation_metadata, + topology_projection, + ) + } + + #[allow(clippy::too_many_arguments)] + pub fn register_active_target_with_creation_metadata( + &self, + browser_context_id: &str, + target_id: &str, + creation_metadata: BrowserTargetCreationMetadata, + topology_projection: BrowserTargetTopologyProjection, + selection_projection: BrowserContextSelectionProjection, + create_replacement: F, + ) -> Result + where + F: FnOnce() -> NavigationEngine, + { + self.navigation_owner_mut() + .register_active_target_with_creation_metadata( + browser_context_id, + target_id, + creation_metadata, + topology_projection, + selection_projection, + create_replacement, + ) + } + + #[allow(clippy::too_many_arguments)] + pub fn replace_active_target_with_creation_metadata( + &self, + browser_context_id: &str, + expected_target_id: &str, + replacement_target_id: &str, + creation_metadata: BrowserTargetCreationMetadata, + topology_projection: BrowserTargetTopologyProjection, + selection_projection: BrowserContextSelectionProjection, + create_replacement: F, + ) -> Result + where + F: FnOnce() -> NavigationEngine, + { + self.navigation_owner_mut() + .replace_active_target_with_creation_metadata( + browser_context_id, + expected_target_id, + replacement_target_id, + creation_metadata, + topology_projection, + selection_projection, + create_replacement, + ) + } + + pub fn activate_target( + &self, + browser_context_id: &str, + target_id: &str, + topology_projection: BrowserTargetTopologyProjection, + selection_projection: BrowserContextSelectionProjection, + create_replacement: F, + ) -> Result + where + F: FnOnce() -> NavigationEngine, + { + self.navigation_owner_mut().activate_target( + browser_context_id, + target_id, + topology_projection, + selection_projection, + create_replacement, + ) + } + + pub fn rollback_staged_background_target( + &self, + browser_context_id: &str, + target_id: &str, + topology_projection: BrowserTargetTopologyProjection, + ) -> Result, BrowserTargetRegistryError> { + self.navigation_owner_mut() + .rollback_staged_background_target(browser_context_id, target_id, topology_projection) + } + + pub fn commit_initial_document_page_materialization( + &self, + permit: BrowserPageResidenceTransitionPermit, + renderer_page_owner: &mut Option, + page_runtime_owner: &mut Option, + ) -> Result { + self.navigation_owner_mut() + .commit_initial_document_page_materialization( + permit, + renderer_page_owner, + page_runtime_owner, + ) + } + + pub fn commit_failed_navigation_page_discard( + &self, + permit: BrowserPageResidenceTransitionPermit, + ) -> Result { + self.navigation_owner_mut() + .commit_failed_navigation_page_discard(permit) + } + + pub fn commit_loaded_page_replacement( + &self, + permit: BrowserPageReplacementPermit, + history_page: BrowserNavigationHistoryPageSnapshot, + renderer_page_owner: &mut Option, + page_runtime_owner: &mut Option, + ) -> Result { + self.navigation_owner_mut().commit_loaded_page_replacement( + permit, + history_page, + renderer_page_owner, + page_runtime_owner, + ) + } + + #[cfg(any(test, feature = "test-support"))] + #[doc(hidden)] + pub fn commit_page_residence_transition_without_renderer_owner_for_testing( + &self, + permit: BrowserPageResidenceTransitionPermit, + ) -> Result { + self.navigation_owner_mut() + .commit_page_residence_transition_without_renderer_owner_for_testing(permit) + } + + #[cfg(any(test, feature = "test-support"))] + #[doc(hidden)] + pub fn commit_loaded_page_replacement_without_renderer_owner_for_testing( + &self, + permit: BrowserPageReplacementPermit, + history_page: BrowserNavigationHistoryPageSnapshot, + ) -> Result { + self.navigation_owner_mut() + .commit_loaded_page_replacement_without_renderer_owner_for_testing(permit, history_page) + } + + pub fn try_start_document_navigation_with_trace( + &self, + key: &BrowserPageOwnerKey, + loader_id: String, + trace: Option, + ) -> Option { + self.navigation_owner_mut() + .try_start_document_navigation_with_trace(key, loader_id, trace) + } + + pub fn commit_document_navigation_if_matches( + &self, + key: &BrowserPageOwnerKey, + navigation: &BrowserDocumentNavigation, + ) -> bool { + self.navigation_owner_mut() + .commit_document_navigation_if_matches(key, navigation) + } + + pub fn fail_document_navigation_if_matches( + &self, + key: &BrowserPageOwnerKey, + navigation: &BrowserDocumentNavigation, + failure: BrowserNavigationFailure, + ) -> bool { + self.navigation_owner_mut() + .fail_document_navigation_if_matches(key, navigation, failure) + } + + pub fn convert_document_navigation_to_download_if_matches( + &self, + key: &BrowserPageOwnerKey, + navigation: &BrowserDocumentNavigation, + ) -> bool { + self.navigation_owner_mut() + .convert_document_navigation_to_download_if_matches(key, navigation) + } + + pub fn record_document_lifecycle_facts( + &self, + expected_page: &PageResidenceIdentity, + events: &[RendererDocumentLifecycleEvent], + ) -> Result>, BrowserFactPublishError> { + self.navigation_owner_mut() + .record_document_lifecycle_facts(expected_page, events) + } + + pub fn register_target_initial_empty_document( + &self, + owner: &BrowserPageOwnerKey, + seed: BrowserInitialEmptyDocumentSeed, + ) -> Result<(), BrowserTargetRegistryError> { + self.navigation_owner_mut() + .register_target_initial_empty_document(owner, seed) + } + + pub fn mark_target_initial_empty_document_exited(&self, owner: &BrowserPageOwnerKey) { + self.navigation_owner_mut() + .mark_target_initial_empty_document_exited(owner); + } + + pub fn commit_target_termination( + &self, + permit: BrowserTargetTerminationPermit, + ) -> Result { + self.navigation_owner_mut() + .commit_target_termination(permit) + } + + pub fn configure_active_fetch(&self, configuration: BrowserPageFetchConfiguration) { + self.navigation_owner_mut() + .configure_active_fetch(configuration); + } + + pub fn ensure_active_resource_runtime_ready( + &self, + storage: NavigationResourceStorageHandles, + ) -> anyhow::Result<()> { + self.navigation_owner_mut() + .ensure_active_resource_runtime_ready(storage) + } + + pub fn rebuild_active_resource_request_client( + &self, + storage: NavigationResourceStorageHandles, + ) -> anyhow::Result { + self.navigation_owner_mut() + .rebuild_active_resource_request_client(storage) + } + + pub fn ensure_active_cookie_store( + &self, + storage: NavigationResourceStorageHandles, + ) -> anyhow::Result { + self.navigation_owner_mut() + .ensure_active_cookie_store(storage) + } + + pub fn reset_active_resource_runtime_without_loaded_page(&self) { + self.navigation_owner_mut() + .reset_active_resource_runtime_without_loaded_page(); + } + + pub fn start_active_page_child_frame_lifecycle_work( + &self, + storage: NavigationResourceStorageHandles, + page: &Page, + timeout: Duration, + ) -> anyhow::Result { + self.navigation_owner_mut() + .start_active_page_child_frame_lifecycle_work(storage, page, timeout) + } + + pub fn complete_active_page_child_frame_lifecycle_work( + &self, + page: &mut Page, + completion: CompletedPageCommand, + ) -> anyhow::Result<(bool, RendererCommandTurnOutput)> { + self.navigation_owner_mut() + .complete_active_page_child_frame_lifecycle_work(page, completion) + } + + pub fn set_renderer_output_transport_sender(&self, sender: RendererOutputTransportSender) { + self.navigation_owner_mut() + .set_renderer_output_transport_sender(sender); + } + + pub fn adopt_target_engine( + &self, + owner: BrowserPageOwnerKey, + residence: BrowserTargetEngineResidence, + engine: NavigationEngine, + ) -> Result<(), BrowserTargetEngineOwnerMismatch> { + self.navigation_owner_mut() + .adopt_target_engine(owner, residence, engine) + } + + pub fn adopt_registered_target_engine( + &self, + owner: BrowserPageOwnerKey, + engine: NavigationEngine, + ) -> Result { + self.navigation_owner_mut() + .adopt_registered_target_engine(owner, engine) + } + + pub fn adopt_selected_target_engine_or_unbound( + &self, + projected_owner: Option, + engine: NavigationEngine, + ) -> Result, BrowserTargetEngineAdoptionError> { + self.navigation_owner_mut() + .adopt_selected_target_engine_or_unbound(projected_owner, engine) + } + + pub fn navigation_history_snapshot( + &self, + key: &BrowserPageOwnerKey, + fallback_page_seed: Option, + ) -> (usize, Vec) { + self.navigation_owner_mut() + .navigation_history_snapshot(key, fallback_page_seed) + } + + pub fn resolve_navigation_history_traversal( + &self, + key: &BrowserPageOwnerKey, + fallback_page_seed: Option, + destination: BrowserHistoryTraversalDestination, + ) -> Result { + self.navigation_owner_mut() + .resolve_navigation_history_traversal(key, fallback_page_seed, destination) + } + + pub fn resolve_exact_navigation_history_traversal( + &self, + expected_page: &PageResidenceIdentity, + fallback_page_seed: Option, + destination: BrowserHistoryTraversalDestination, + ) -> Result + { + self.navigation_owner_mut() + .resolve_exact_navigation_history_traversal( + expected_page, + fallback_page_seed, + destination, + ) + } + + pub fn reset_navigation_history( + &self, + key: &BrowserPageOwnerKey, + fallback_page_seed: Option, + ) -> bool { + self.navigation_owner_mut() + .reset_navigation_history(key, fallback_page_seed) + } + + pub fn can_reset_navigation_history( + &self, + key: &BrowserPageOwnerKey, + fallback_page_seed: Option, + ) -> bool { + self.navigation_owner_mut() + .can_reset_navigation_history(key, fallback_page_seed) + } + + pub fn mark_next_navigation_history_replace_current(&self, key: &BrowserPageOwnerKey) { + self.navigation_owner_mut() + .mark_next_navigation_history_replace_current(key); + } + + pub fn mark_next_navigation_history_replace_initial_empty_document( + &self, + key: &BrowserPageOwnerKey, + ) { + self.navigation_owner_mut() + .mark_next_navigation_history_replace_initial_empty_document(key); + } + + pub fn mark_next_navigation_history_traverse_to_entry( + &self, + key: &BrowserPageOwnerKey, + entry_id: i32, + ) { + self.navigation_owner_mut() + .mark_next_navigation_history_traverse_to_entry(key, entry_id); + } + + pub fn clear_pending_navigation_history_update(&self, key: &BrowserPageOwnerKey) { + self.navigation_owner_mut() + .clear_pending_navigation_history_update(key); + } + + pub fn record_loaded_page_navigation_history( + &self, + key: &BrowserPageOwnerKey, + page: BrowserNavigationHistoryPageSnapshot, + ) { + self.navigation_owner_mut() + .record_loaded_page_navigation_history(key, page); + } + + pub fn update_current_document_title( + &self, + expected_page: &PageResidenceIdentity, + title: String, + ) -> Option { + self.navigation_owner_mut() + .update_current_document_title(expected_page, title) + } + + pub fn commit_same_document_navigation_history( + &self, + expected_page: &PageResidenceIdentity, + fallback_page_seed: Option, + url: String, + title: String, + update: SameDocumentHistoryUpdate, + ) -> Result<(), BrowserSameDocumentNavigationCommitError> { + self.navigation_owner_mut() + .commit_same_document_navigation_history( + expected_page, + fallback_page_seed, + url, + title, + update, + ) + } +} diff --git a/moli-core/src/browser_host/state.rs b/moli-core/src/browser_host/state.rs index bde010ce16..83b6cf397d 100644 --- a/moli-core/src/browser_host/state.rs +++ b/moli-core/src/browser_host/state.rs @@ -100,7 +100,7 @@ impl BrowserHostState { /// Mutably borrows the authoritative Browser state for one short /// synchronous owner operation. - pub fn navigation_owner_mut(&self) -> RefMut<'_, BrowserNavigationOwner> { + pub(crate) fn navigation_owner_mut(&self) -> RefMut<'_, BrowserNavigationOwner> { RefMut::map(self.inner.navigation_owner.borrow_mut(), |owner| { owner .as_mut() diff --git a/moli-protocol/src/conn.rs b/moli-protocol/src/conn.rs index f2b89e3351..42cb2f13b2 100644 --- a/moli-protocol/src/conn.rs +++ b/moli-protocol/src/conn.rs @@ -1552,7 +1552,6 @@ impl CdpConnection { sender: moli_core::RendererOutputTransportSender, ) { self.browser_host_state - .navigation_owner_mut() .set_renderer_output_transport_sender(sender); } diff --git a/moli-protocol/src/conn/activity_source.rs b/moli-protocol/src/conn/activity_source.rs index ad1bbc7cbc..63654975db 100644 --- a/moli-protocol/src/conn/activity_source.rs +++ b/moli-protocol/src/conn/activity_source.rs @@ -117,7 +117,6 @@ impl CdpConnection { return Err("NoDocumentLoaded".to_owned()); }; let pending = browser_host_state - .navigation_owner_mut() .start_active_page_child_frame_lifecycle_work( storage.into_navigation_storage(), &page, @@ -143,7 +142,6 @@ impl CdpConnection { return Err("NoDocumentLoaded".to_owned()); }; let completed = browser_host_state - .navigation_owner_mut() .complete_active_page_child_frame_lifecycle_work(&mut page, pending.completion) .map_err(|error| error.to_string())?; let _ = slot.ingest_owner_page_observable_output_updates(); diff --git a/moli-protocol/src/conn/browser_context/lifecycle.rs b/moli-protocol/src/conn/browser_context/lifecycle.rs index a23bc1d4d2..fc70872dca 100644 --- a/moli-protocol/src/conn/browser_context/lifecycle.rs +++ b/moli-protocol/src/conn/browser_context/lifecycle.rs @@ -42,7 +42,6 @@ impl CdpConnection { browser_context_handle: &BrowserContextHandle, ) -> Result { self.browser_host_state - .navigation_owner_mut() .begin_browser_context_disposal(browser_context_handle) } @@ -51,7 +50,6 @@ impl CdpConnection { reservation: BrowserContextDisposalReservation, ) -> bool { self.browser_host_state - .navigation_owner_mut() .rollback_browser_context_disposal(reservation) } diff --git a/moli-protocol/src/conn/browser_context/page_residence_projection.rs b/moli-protocol/src/conn/browser_context/page_residence_projection.rs index b6ae444320..116a2788ac 100644 --- a/moli-protocol/src/conn/browser_context/page_residence_projection.rs +++ b/moli-protocol/src/conn/browser_context/page_residence_projection.rs @@ -75,14 +75,13 @@ impl CdpConnection { }); } - let transition = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.commit_initial_document_page_materialization( + let transition = self + .browser_host_state + .commit_initial_document_page_materialization( permit, &mut renderer_page_owner, &mut page_runtime_owner, - ) - }; + ); let mut transition = match transition { Ok(transition) => transition, Err(error) => { @@ -152,10 +151,9 @@ impl CdpConnection { return Ok(None); }; let staged = self.stage_physical_page_residence_projection(&permit, false)?; - let transition = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.commit_failed_navigation_page_discard(permit) - }; + let transition = self + .browser_host_state + .commit_failed_navigation_page_discard(permit); let mut transition = match transition { Ok(transition) => transition, Err(error) => { diff --git a/moli-protocol/src/conn/browser_context/registry_projection.rs b/moli-protocol/src/conn/browser_context/registry_projection.rs index 9dc6bdebed..afe7f08d7d 100644 --- a/moli-protocol/src/conn/browser_context/registry_projection.rs +++ b/moli-protocol/src/conn/browser_context/registry_projection.rs @@ -378,7 +378,6 @@ impl CdpConnection { let replacement_inputs = BrowserEngineReplacementInputs::capture(self); let activation = self .browser_host_state - .navigation_owner_mut() .activate_browser_context(browser_context_id, projection, || { replacement_inputs.create_engine(renderer_runtime) }) @@ -419,12 +418,11 @@ impl CdpConnection { previous_browser_context_id, )); }; - let activation = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.activate_browser_context(browser_context_id, projection, || { - replacement_inputs.create_engine(renderer_runtime) - }) - }; + let activation = self.browser_host_state.activate_browser_context( + browser_context_id, + projection, + || replacement_inputs.create_engine(renderer_runtime), + ); let activation = match activation { Ok(activation) => activation, Err(error) => { diff --git a/moli-protocol/src/conn/browser_context/target_registry_projection.rs b/moli-protocol/src/conn/browser_context/target_registry_projection.rs index 146c96473e..d9cdd8e47b 100644 --- a/moli-protocol/src/conn/browser_context/target_registry_projection.rs +++ b/moli-protocol/src/conn/browser_context/target_registry_projection.rs @@ -74,15 +74,14 @@ impl CdpConnection { let mut staged = self.take_physical_browser_context_for_target_projection(browser_context_id)?; let topology = Self::browser_target_topology_projection(&staged.browser_context); - let registration = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.register_background_target_with_creation_metadata( + let registration = self + .browser_host_state + .register_background_target_with_creation_metadata( browser_context_id, target_id, creation_metadata, topology, - ) - }; + ); let registration = match registration { Ok(registration) => registration, Err(error) => { @@ -151,17 +150,16 @@ impl CdpConnection { let replacement_inputs = BrowserEngineReplacementInputs::capture(self); let mut staged = self.take_physical_browser_context_for_target_projection(&browser_context_id)?; - let registration = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.register_active_target_with_creation_metadata( + let registration = self + .browser_host_state + .register_active_target_with_creation_metadata( &browser_context_id, target_id, creation_metadata, topology, selection, || replacement_inputs.create_engine(renderer_runtime), - ) - }; + ); let registration = match registration { Ok(registration) => registration, Err(error) => { @@ -233,9 +231,9 @@ impl CdpConnection { let replacement_inputs = BrowserEngineReplacementInputs::capture(self); let mut staged = self.take_physical_browser_context_for_target_projection(&browser_context_id)?; - let registration = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.replace_active_target_with_creation_metadata( + let registration = self + .browser_host_state + .replace_active_target_with_creation_metadata( &browser_context_id, expected_target_id, replacement_target_id, @@ -243,8 +241,7 @@ impl CdpConnection { topology, selection, || replacement_inputs.create_engine(renderer_runtime), - ) - }; + ); let registration = match registration { Ok(registration) => registration, Err(error) => { @@ -327,16 +324,13 @@ impl CdpConnection { Some(staged_target) }; - let activation = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.activate_target( - &browser_context_id, - target_id, - topology, - selection, - || replacement_inputs.create_engine(renderer_runtime), - ) - }; + let activation = self.browser_host_state.activate_target( + &browser_context_id, + target_id, + topology, + selection, + || replacement_inputs.create_engine(renderer_runtime), + ); let activation = match activation { Ok(activation) => activation, Err(error) => { @@ -395,10 +389,9 @@ impl CdpConnection { }); }; let target = staged.browser_context.background_targets.remove(index); - let retired_renderer_page_owners = { - let mut browser_owner = self.browser_host_state.navigation_owner_mut(); - browser_owner.rollback_staged_background_target(browser_context_id, target_id, topology) - }; + let retired_renderer_page_owners = self + .browser_host_state + .rollback_staged_background_target(browser_context_id, target_id, topology); let retired_renderer_page_owners = match retired_renderer_page_owners { Ok(owners) => owners, Err(error) => { diff --git a/moli-protocol/src/conn/browser_context/target_session_owner.rs b/moli-protocol/src/conn/browser_context/target_session_owner.rs index 9a7dd4d1d6..d465f41704 100644 --- a/moli-protocol/src/conn/browser_context/target_session_owner.rs +++ b/moli-protocol/src/conn/browser_context/target_session_owner.rs @@ -2037,7 +2037,6 @@ impl CdpConnection { .page_owner() .clone(); self.browser_host_state - .navigation_owner_mut() .update_current_document_title(&page_owner, change.title.clone()); let physical_changed = self .with_target_owner_state_for_session_mut(session_id, |owner_state| { diff --git a/moli-protocol/src/conn/browser_document_navigation.rs b/moli-protocol/src/conn/browser_document_navigation.rs index 83bba20aba..9482d6378e 100644 --- a/moli-protocol/src/conn/browser_document_navigation.rs +++ b/moli-protocol/src/conn/browser_document_navigation.rs @@ -319,7 +319,6 @@ impl CdpConnection { self.runtime_session_owner_slot(session_id).ok()?; let token = self .browser_host_state - .navigation_owner_mut() .try_start_document_navigation_with_trace(&owner, loader_id, trace)?; self.runtime_session_owner_slot_mut(session_id) .expect("validated target runtime slot") @@ -339,7 +338,6 @@ impl CdpConnection { if owner.target_id() == token.target_id() { let _ = self .browser_host_state - .navigation_owner_mut() .commit_document_navigation_if_matches(&owner, token); } } @@ -354,10 +352,11 @@ impl CdpConnection { return false; }; if owner.target_id() != token.target_id() - || !self - .browser_host_state - .navigation_owner_mut() - .fail_document_navigation_if_matches(&owner, token, failure.clone()) + || !self.browser_host_state.fail_document_navigation_if_matches( + &owner, + token, + failure.clone(), + ) { return false; } @@ -386,7 +385,6 @@ impl CdpConnection { if owner.target_id() != token.target_id() || !self .browser_host_state - .navigation_owner_mut() .convert_document_navigation_to_download_if_matches(&owner, token) { return false; diff --git a/moli-protocol/src/conn/browser_fact_projection.rs b/moli-protocol/src/conn/browser_fact_projection.rs index e7a7f75392..2dd6a73f66 100644 --- a/moli-protocol/src/conn/browser_fact_projection.rs +++ b/moli-protocol/src/conn/browser_fact_projection.rs @@ -1110,7 +1110,6 @@ impl CdpConnection { }; let published = match self .browser_host_state - .navigation_owner_mut() .record_document_lifecycle_facts(page, events) { Ok(published) => { diff --git a/moli-protocol/src/conn/browser_initial_document.rs b/moli-protocol/src/conn/browser_initial_document.rs index 2e7632a425..757a7de51c 100644 --- a/moli-protocol/src/conn/browser_initial_document.rs +++ b/moli-protocol/src/conn/browser_initial_document.rs @@ -19,7 +19,6 @@ impl CdpConnection { seed: BrowserInitialEmptyDocumentSeed, ) -> Result<(), BrowserTargetRegistryError> { self.browser_host_state - .navigation_owner_mut() .register_target_initial_empty_document(owner, seed) } @@ -51,7 +50,6 @@ impl CdpConnection { return false; }; self.browser_host_state - .navigation_owner_mut() .mark_target_initial_empty_document_exited(&owner); true } diff --git a/moli-protocol/src/conn/browser_navigation_history.rs b/moli-protocol/src/conn/browser_navigation_history.rs index e8a22340b3..72e24c70b0 100644 --- a/moli-protocol/src/conn/browser_navigation_history.rs +++ b/moli-protocol/src/conn/browser_navigation_history.rs @@ -158,7 +158,6 @@ impl CdpConnection { let seed = self.navigation_history_query_seed_for_session_owner(session_id); Some( self.browser_host_state - .navigation_owner_mut() .navigation_history_snapshot(&owner, seed), ) } @@ -173,7 +172,6 @@ impl CdpConnection { let seed = self.navigation_history_query_seed_for_session_owner(session_id); Some( self.browser_host_state - .navigation_owner_mut() .resolve_navigation_history_traversal(&owner, seed, destination), ) } @@ -187,7 +185,6 @@ impl CdpConnection { { let seed = self.navigation_history_query_seed_for_session_owner(session_id); self.browser_host_state - .navigation_owner_mut() .resolve_exact_navigation_history_traversal(expected_page, seed, destination) } @@ -199,7 +196,6 @@ impl CdpConnection { let seed = self.navigation_history_query_seed_for_session_owner(session_id); Some( self.browser_host_state - .navigation_owner_mut() .reset_navigation_history(&owner, seed), ) } @@ -212,7 +208,6 @@ impl CdpConnection { let seed = self.navigation_history_query_seed_for_session_owner(session_id); Some( self.browser_host_state - .navigation_owner_mut() .can_reset_navigation_history(&owner, seed), ) } @@ -223,7 +218,6 @@ impl CdpConnection { ) -> Option<()> { let owner = self.navigation_history_owner_for_session(session_id)?; self.browser_host_state - .navigation_owner_mut() .mark_next_navigation_history_replace_current(&owner); Some(()) } @@ -233,7 +227,6 @@ impl CdpConnection { owner: &BrowserPageOwnerKey, ) { self.browser_host_state - .navigation_owner_mut() .mark_next_navigation_history_replace_initial_empty_document(owner); } @@ -244,7 +237,6 @@ impl CdpConnection { ) -> Option<()> { let owner = self.navigation_history_owner_for_session(session_id)?; self.browser_host_state - .navigation_owner_mut() .mark_next_navigation_history_traverse_to_entry(&owner, entry_id); Some(()) } @@ -255,7 +247,6 @@ impl CdpConnection { ) -> Option<()> { let owner = self.navigation_history_owner_for_session(session_id)?; self.browser_host_state - .navigation_owner_mut() .clear_pending_navigation_history_update(&owner); Some(()) } @@ -328,15 +319,13 @@ impl CdpConnection { PhysicalSameDocumentTargetIdentityProjection::Background(target) }; - browser_host_state - .navigation_owner_mut() - .commit_same_document_navigation_history( - expected_page, - seed, - url.to_string(), - title, - history_update, - )?; + browser_host_state.commit_same_document_navigation_history( + expected_page, + seed, + url.to_string(), + title, + history_update, + )?; physical_target.commit(url); Ok(target_id) } @@ -453,7 +442,6 @@ mod tests { .target_session_owner_navigation_history_snapshot(None) .expect("seed initial history"); conn.browser_host_state - .navigation_owner_mut() .record_loaded_page_navigation_history( &key, BrowserNavigationHistoryPageSnapshot::new("https://old.example/", "old"), @@ -463,7 +451,6 @@ mod tests { conn.clear_pending_navigation_history_update_for_session_owner(None) .expect("clear pending replace"); conn.browser_host_state - .navigation_owner_mut() .record_loaded_page_navigation_history( &key, BrowserNavigationHistoryPageSnapshot::new("https://new.example/", "new"), diff --git a/moli-protocol/src/conn/browser_page_replacement.rs b/moli-protocol/src/conn/browser_page_replacement.rs index 1677023c3b..e8c42b2321 100644 --- a/moli-protocol/src/conn/browser_page_replacement.rs +++ b/moli-protocol/src/conn/browser_page_replacement.rs @@ -172,15 +172,12 @@ impl CdpConnection { // no await or external callback. The connection actor therefore cannot // expose a core successor while protocol storage still names the old // Page. - let mut replacement = match self - .browser_host_state - .navigation_owner_mut() - .commit_loaded_page_replacement( - permit, - history_page, - &mut renderer_page_owner, - &mut page_runtime_owner, - ) { + let mut replacement = match self.browser_host_state.commit_loaded_page_replacement( + permit, + history_page, + &mut renderer_page_owner, + &mut page_runtime_owner, + ) { Ok(replacement) => replacement, Err(error) => { tracing::debug!( diff --git a/moli-protocol/src/conn/browser_target_engine_handoff.rs b/moli-protocol/src/conn/browser_target_engine_handoff.rs index 548027deaa..57fd52fd53 100644 --- a/moli-protocol/src/conn/browser_target_engine_handoff.rs +++ b/moli-protocol/src/conn/browser_target_engine_handoff.rs @@ -157,7 +157,6 @@ impl CdpConnection { ) -> Result, BrowserTargetEngineAdoptionError> { let projected_owner = self.selected_target_engine_owner_key(); self.browser_host_state - .navigation_owner_mut() .adopt_selected_target_engine_or_unbound(projected_owner, engine) } @@ -216,7 +215,6 @@ impl CdpConnection { )); } self.browser_host_state - .navigation_owner_mut() .adopt_target_engine( BrowserPageOwnerKey::new(browser_context_id, target_id), BrowserTargetEngineResidence::Retained, @@ -233,7 +231,6 @@ impl CdpConnection { engine: NavigationEngine, ) -> Result { self.browser_host_state - .navigation_owner_mut() .adopt_registered_target_engine(owner, engine) } @@ -671,7 +668,6 @@ mod tests { .active_renderer_owner_id_for_diagnostics(); let error = conn .browser_host_state - .navigation_owner_mut() .adopt_target_engine( divergent.clone(), BrowserTargetEngineResidence::Selected, diff --git a/moli-protocol/src/conn/browser_target_metadata_projection.rs b/moli-protocol/src/conn/browser_target_metadata_projection.rs index 29b278e788..07ca43ed71 100644 --- a/moli-protocol/src/conn/browser_target_metadata_projection.rs +++ b/moli-protocol/src/conn/browser_target_metadata_projection.rs @@ -115,7 +115,6 @@ mod tests { .expect("current navigation should prepare replacement"); let replacement = conn .browser_host_state - .navigation_owner_mut() .commit_loaded_page_replacement_without_renderer_owner_for_testing( permit, BrowserNavigationHistoryPageSnapshot::new(url, title), diff --git a/moli-protocol/src/conn/browser_target_termination.rs b/moli-protocol/src/conn/browser_target_termination.rs index 04d1183857..9264178edb 100644 --- a/moli-protocol/src/conn/browser_target_termination.rs +++ b/moli-protocol/src/conn/browser_target_termination.rs @@ -629,11 +629,7 @@ impl CdpConnection { // There is deliberately no await, frontend flush, or callback between // this authoritative commit and the matching physical projection. - let mut termination = match conn - .browser_host_state - .navigation_owner_mut() - .commit_target_termination(permit) - { + let mut termination = match conn.browser_host_state.commit_target_termination(permit) { Ok(termination) => termination, Err(error) => { tracing::warn!( diff --git a/moli-protocol/src/conn/resource_runtime_support.rs b/moli-protocol/src/conn/resource_runtime_support.rs index 1c28070eb3..9b97bd1456 100644 --- a/moli-protocol/src/conn/resource_runtime_support.rs +++ b/moli-protocol/src/conn/resource_runtime_support.rs @@ -11,7 +11,6 @@ use super::{ impl CdpConnection { pub(crate) fn invalidate_resource_runtime(&mut self) { self.browser_host_state - .navigation_owner_mut() .reset_active_resource_runtime_without_loaded_page(); } @@ -28,7 +27,6 @@ impl CdpConnection { self.apply_active_engine_fetch_overrides(); let storage = self.resource_storage_handles(); self.browser_host_state - .navigation_owner_mut() .ensure_active_resource_runtime_ready(storage.into_navigation_storage()) .map_err(|error| format!("failed to initialize resource runtime: {error}"))?; self.browser_host_state @@ -63,7 +61,6 @@ impl CdpConnection { self.apply_navigation_load_input_engine_fetch_overrides(load_inputs); let storage = load_inputs.resource_storage_handles(); self.browser_host_state - .navigation_owner_mut() .ensure_active_resource_runtime_ready(storage.into_navigation_storage()) .map_err(|error| format!("failed to initialize resource runtime: {error}"))?; self.browser_host_state @@ -113,15 +110,15 @@ impl CdpConnection { let tls_verify_host = load_inputs .tls_verify_host_override .unwrap_or(policy.base_tls_verify_host()); - self.browser_host_state - .navigation_owner_mut() - .configure_active_fetch(moli_core::browser_host::BrowserPageFetchConfiguration { + self.browser_host_state.configure_active_fetch( + moli_core::browser_host::BrowserPageFetchConfiguration { browser_identity, http_proxy, http_no_proxy, tls_verify_host, bypass_service_worker: load_inputs.bypass_service_worker, - }); + }, + ); } pub(crate) fn build_registered_browser_resource_runtime_for_navigation_load_inputs( @@ -170,7 +167,6 @@ impl CdpConnection { self.apply_active_engine_fetch_overrides(); let storage = self.resource_storage_handles(); self.browser_host_state - .navigation_owner_mut() .ensure_active_cookie_store(storage.into_navigation_storage()) .map_err(|error| format!("failed to initialize loader: {error}")) } @@ -238,7 +234,6 @@ impl CdpConnection { let request_client = if self.navigation_load_inputs_use_primary_engine(&load_inputs) { self.apply_navigation_load_input_engine_fetch_overrides(&load_inputs); self.browser_host_state - .navigation_owner_mut() .rebuild_active_resource_request_client(storage.into_navigation_storage()) .map_err(|error| format!("failed to rebuild resource runtime: {error}"))? } else { diff --git a/moli-protocol/src/conn/runtime_load.rs b/moli-protocol/src/conn/runtime_load.rs index dad550c003..1a6dc147c5 100644 --- a/moli-protocol/src/conn/runtime_load.rs +++ b/moli-protocol/src/conn/runtime_load.rs @@ -3061,7 +3061,6 @@ impl CdpConnection { } let resource_storage = load_inputs.resource_storage_handles(); self.browser_host_state - .navigation_owner_mut() .ensure_active_resource_runtime_ready(resource_storage.into_navigation_storage()) .ok()?; self.browser_host_state diff --git a/moli-protocol/src/conn/settings/engine.rs b/moli-protocol/src/conn/settings/engine.rs index 3fac5a670c..492b3d0911 100644 --- a/moli-protocol/src/conn/settings/engine.rs +++ b/moli-protocol/src/conn/settings/engine.rs @@ -30,15 +30,15 @@ impl CdpConnection { .browser_context .as_ref() .is_some_and(|bc| bc.network_policy.bypass_service_worker()); - self.browser_host_state - .navigation_owner_mut() - .configure_active_fetch(moli_core::browser_host::BrowserPageFetchConfiguration { + self.browser_host_state.configure_active_fetch( + moli_core::browser_host::BrowserPageFetchConfiguration { browser_identity, http_proxy, http_no_proxy, tls_verify_host, bypass_service_worker, - }); + }, + ); } pub async fn set_tls_verify_host_async(&mut self, enabled: bool) { diff --git a/moli-protocol/src/conn/state/tests.rs b/moli-protocol/src/conn/state/tests.rs index 7252b871eb..ef9c62f300 100644 --- a/moli-protocol/src/conn/state/tests.rs +++ b/moli-protocol/src/conn/state/tests.rs @@ -1430,7 +1430,6 @@ fn commit_initial_document_materialization_without_projection_for_invariant_test .prepare_initial_document_page_materialization(owner) .expect("current initial Document should prepare materialization"); conn.browser_host_state - .navigation_owner_mut() .commit_page_residence_transition_without_renderer_owner_for_testing(permit) .expect("exact test transition should commit"); } diff --git a/moli-protocol/src/conn/tests/mod.rs b/moli-protocol/src/conn/tests/mod.rs index aab050ffbc..2eddf5ebe5 100644 --- a/moli-protocol/src/conn/tests/mod.rs +++ b/moli-protocol/src/conn/tests/mod.rs @@ -220,7 +220,6 @@ async fn browser_host_renderer_page_lifetime_outlives_protocol_adapter_state() { .prepare_target_termination(request) .expect("retained Browser Target should still prepare termination"); let mut termination = browser_host_state - .navigation_owner_mut() .commit_target_termination(permit) .expect("retained Browser Target should still commit termination"); let retired_owner = termination