refactor(browser): seal mutable host state access

This commit is contained in:
ldm0
2026-08-28 19:47:32 +08:00
parent c028705bc7
commit 10f00a57a5
23 changed files with 555 additions and 117 deletions
+1
View File
@@ -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;
@@ -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<F>(
&self,
browser_context_id: &str,
projection: BrowserContextSelectionProjection,
create_replacement: F,
) -> Result<BrowserContextActivation, BrowserContextRegistryError>
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<BrowserContextDisposalReservation, BrowserContextRegistryError> {
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<BrowserTargetRegistration, BrowserTargetRegistryError> {
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<F>(
&self,
browser_context_id: &str,
target_id: &str,
creation_metadata: BrowserTargetCreationMetadata,
topology_projection: BrowserTargetTopologyProjection,
selection_projection: BrowserContextSelectionProjection,
create_replacement: F,
) -> Result<BrowserTargetRegistration, BrowserTargetRegistryError>
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<F>(
&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<BrowserTargetRegistration, BrowserTargetRegistryError>
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<F>(
&self,
browser_context_id: &str,
target_id: &str,
topology_projection: BrowserTargetTopologyProjection,
selection_projection: BrowserContextSelectionProjection,
create_replacement: F,
) -> Result<BrowserTargetActivation, BrowserTargetRegistryError>
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<Option<RendererPageLifetimeOwner>, 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<RendererPageLifetimeOwner>,
page_runtime_owner: &mut Option<BrowserPageRuntimeOwner>,
) -> Result<BrowserPageResidenceTransition, BrowserPageResidenceTransitionCommitError> {
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<BrowserPageResidenceTransition, BrowserPageResidenceTransitionCommitError> {
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<RendererPageLifetimeOwner>,
page_runtime_owner: &mut Option<BrowserPageRuntimeOwner>,
) -> Result<BrowserPageReplacement, BrowserPageReplacementCommitError> {
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<BrowserPageResidenceTransition, BrowserPageResidenceTransitionCommitError> {
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<BrowserPageReplacement, BrowserPageReplacementCommitError> {
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<BrowserNavigationTraceContext>,
) -> Option<BrowserDocumentNavigation> {
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<Vec<Arc<BrowserFactEnvelope>>, 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<BrowserTargetTermination, BrowserTargetTerminationCommitError> {
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<ResourceRequestClient> {
self.navigation_owner_mut()
.rebuild_active_resource_request_client(storage)
}
pub fn ensure_active_cookie_store(
&self,
storage: NavigationResourceStorageHandles,
) -> anyhow::Result<moli_cookie_jar::SharedBrowserCookieStore> {
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<PendingPageCommand> {
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<BrowserTargetEngineResidence, BrowserTargetEngineAdoptionError> {
self.navigation_owner_mut()
.adopt_registered_target_engine(owner, engine)
}
pub fn adopt_selected_target_engine_or_unbound(
&self,
projected_owner: Option<BrowserPageOwnerKey>,
engine: NavigationEngine,
) -> Result<Option<BrowserTargetEngineResidence>, 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<BrowserNavigationHistorySeed>,
) -> (usize, Vec<BrowserNavigationHistoryEntry>) {
self.navigation_owner_mut()
.navigation_history_snapshot(key, fallback_page_seed)
}
pub fn resolve_navigation_history_traversal(
&self,
key: &BrowserPageOwnerKey,
fallback_page_seed: Option<BrowserNavigationHistorySeed>,
destination: BrowserHistoryTraversalDestination,
) -> Result<BrowserHistoryTraversalResolution, BrowserHistoryTraversalResolutionError> {
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<BrowserNavigationHistorySeed>,
destination: BrowserHistoryTraversalDestination,
) -> Result<BrowserHistoryTraversalResolution, BrowserExactHistoryTraversalResolutionError>
{
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<BrowserNavigationHistorySeed>,
) -> 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<BrowserNavigationHistorySeed>,
) -> 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<bool> {
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<BrowserNavigationHistorySeed>,
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,
)
}
}
+1 -1
View File
@@ -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()
-1
View File
@@ -1552,7 +1552,6 @@ impl CdpConnection {
sender: moli_core::RendererOutputTransportSender,
) {
self.browser_host_state
.navigation_owner_mut()
.set_renderer_output_transport_sender(sender);
}
@@ -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();
@@ -42,7 +42,6 @@ impl CdpConnection {
browser_context_handle: &BrowserContextHandle,
) -> Result<BrowserContextDisposalReservation, BrowserContextRegistryError> {
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)
}
@@ -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) => {
@@ -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) => {
@@ -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) => {
@@ -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| {
@@ -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;
@@ -1110,7 +1110,6 @@ impl CdpConnection {
};
let published = match self
.browser_host_state
.navigation_owner_mut()
.record_document_lifecycle_facts(page, events)
{
Ok(published) => {
@@ -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
}
@@ -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"),
@@ -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!(
@@ -157,7 +157,6 @@ impl CdpConnection {
) -> Result<Option<BrowserTargetEngineResidence>, 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<BrowserTargetEngineResidence, BrowserTargetEngineAdoptionError> {
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,
@@ -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),
@@ -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!(
@@ -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 {
-1
View File
@@ -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
+4 -4
View File
@@ -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) {
-1
View File
@@ -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");
}
-1
View File
@@ -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