diff --git a/src/handler/mod.rs b/src/handler/mod.rs index c781de4..9c27690 100644 --- a/src/handler/mod.rs +++ b/src/handler/mod.rs @@ -431,13 +431,13 @@ impl Handler { .unwrap_or_else(|| self.default_browser_context.clone()); let target = Target::new( event.target_info, - TargetConfig::new( - self.config.ignore_https_errors, - self.config.request_timeout, - self.config.viewport.clone(), - self.config.request_intercept, - self.config.cache_enabled, - ), + TargetConfig { + ignore_https_errors: self.config.ignore_https_errors, + request_timeout: self.config.request_timeout, + viewport: self.config.viewport.clone(), + request_intercept: self.config.request_intercept, + cache_enabled: self.config.cache_enabled, + }, browser_ctx, ); self.target_ids.push(target.target_id().clone()); diff --git a/src/handler/page.rs b/src/handler/page.rs index 45cb88d..294317d 100644 --- a/src/handler/page.rs +++ b/src/handler/page.rs @@ -46,11 +46,12 @@ pub struct PageHandle { } impl PageHandle { - pub fn new(target_id: TargetId, session_id: SessionId) -> Self { + pub fn new(target_id: TargetId, session_id: SessionId, opener_id: Option) -> Self { let (commands, rx) = channel(1); let page = PageInner { target_id, session_id, + opener_id, sender: commands, }; Self { @@ -68,6 +69,7 @@ impl PageHandle { pub(crate) struct PageInner { target_id: TargetId, session_id: SessionId, + opener_id: Option, sender: Sender, } @@ -106,6 +108,11 @@ impl PageInner { &self.session_id } + /// The identifier of this page's target's opener target + pub fn opener_id(&self) -> &Option { + &self.opener_id + } + pub(crate) fn sender(&self) -> &Sender { &self.sender } diff --git a/src/handler/target.rs b/src/handler/target.rs index cfba904..c96da4c 100644 --- a/src/handler/target.rs +++ b/src/handler/target.rs @@ -18,6 +18,7 @@ use chromiumoxide_cdp::cdp::events::CdpEvent; use chromiumoxide_cdp::cdp::CdpEventMessage; use chromiumoxide_types::{Command, Method, Request, Response}; +use crate::auth::Credentials; use crate::cdp::browser_protocol::target::CloseTargetParams; use crate::cmd::CommandChain; use crate::cmd::CommandMessage; @@ -161,7 +162,8 @@ impl Target { fn create_page(&mut self) { if self.page.is_none() { if let Some(session) = self.session_id.clone() { - let handle = PageHandle::new(self.target_id().clone(), session); + let handle = + PageHandle::new(self.target_id().clone(), session, self.opener_id().cloned()); self.page = Some(handle); } } @@ -186,7 +188,7 @@ impl Target { } /// Get the target that opened this target. Top-level targets return `None`. - pub fn opener(&self) -> Option<&TargetId> { + pub fn opener_id(&self) -> Option<&TargetId> { self.info.opener_id.as_ref() } @@ -513,6 +515,9 @@ impl Target { let _ = tx.send(None); } } + TargetMessage::Authenticate(credentials) => { + self.network_manager.authenticate(credentials); + } } } } @@ -599,24 +604,6 @@ pub struct TargetConfig { pub cache_enabled: bool, } -impl TargetConfig { - pub fn new( - ignore_https_errors: bool, - request_timeout: Duration, - viewport: Option, - request_intercept: bool, - cache_enabled: bool, - ) -> Self { - Self { - ignore_https_errors, - request_timeout, - viewport, - request_intercept, - cache_enabled, - } - } -} - impl Default for TargetConfig { fn default() -> Self { Self { @@ -793,4 +780,5 @@ pub enum TargetMessage { AddEventListener(EventListenerRequest), /// Get the `ExecutionContext` if available GetExecutionContext(GetExecutionContext), + Authenticate(Credentials), } diff --git a/src/page.rs b/src/page.rs index 44e8719..79abb6c 100644 --- a/src/page.rs +++ b/src/page.rs @@ -26,6 +26,7 @@ use chromiumoxide_cdp::cdp::js_protocol::runtime::{ use chromiumoxide_cdp::cdp::{browser_protocol, IntoEventKind}; use chromiumoxide_types::*; +use crate::auth::Credentials; use crate::element::Element; use crate::error::{CdpError, Result}; use crate::handler::commandfuture::CommandFuture; @@ -325,6 +326,11 @@ impl Page { self.inner.session_id() } + /// The identifier of the `Session` target of this page is attached to + pub fn opener_id(&self) -> &Option { + self.inner.opener_id() + } + /// Returns the name of the frame pub async fn frame_name(&self, frame_id: FrameId) -> Result> { let (tx, rx) = oneshot_channel(); @@ -339,6 +345,16 @@ impl Page { Ok(rx.await?) } + pub async fn authenticate(&self, credentials: Credentials) -> Result<()> { + self.inner + .sender() + .clone() + .send(TargetMessage::Authenticate(credentials)) + .await?; + + Ok(()) + } + /// Returns the current url of the page pub async fn url(&self) -> Result> { let (tx, rx) = oneshot_channel();