mirror of
https://github.com/lexmount/moli.git
synced 2026-10-03 00:00:44 +00:00
refactor(browser): seal mutable host state access
This commit is contained in:
@@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user