browsing 0.1.7

Browser automation: navigate, click, extract, screenshot. Standalone browser control via CDP.
Documentation
//! Browser client trait for browser abstraction
//!
//! This trait defines the interface for browser operations, enabling
//! mock implementations for testing and alternative browser backends.

use crate::actor::Page;
use crate::browser::cdp::CdpClient;
use crate::browser::views::{SessionInfo, TabInfo};
use crate::error::Result;
use async_trait::async_trait;
use std::sync::Arc;

/// Trait for browser client operations
///
/// This trait provides a unified interface for browser automation,
/// abstracting over concrete browser implementations.
#[async_trait]
pub trait BrowserClient: Send + Sync {
    /// Start the browser session
    async fn start(&mut self) -> Result<()>;

    /// Stop the browser session and clean up resources gracefully.
    /// Default does nothing (for mocks or external browsers we don't own).
    async fn stop(&mut self) -> Result<()> {
        Ok(())
    }

    /// Navigate to the specified URL
    async fn navigate(&mut self, url: &str) -> Result<()>;

    /// Get the current page URL
    async fn get_current_url(&self) -> Result<String>;

    /// Create a new tab with optional URL
    async fn create_tab(&mut self, url: Option<&str>) -> Result<String>;

    /// Switch to a different tab by target ID
    async fn switch_to_tab(&mut self, target_id: &str) -> Result<()>;

    /// Close a tab by target ID
    async fn close_tab(&mut self, target_id: &str) -> Result<()>;

    /// Get all open tabs
    async fn get_tabs(&self) -> Result<Vec<TabInfo>>;

    /// Get target ID from short tab ID (last 4 characters)
    async fn get_target_id_from_tab_id(&self, tab_id: &str) -> Result<String>;

    /// Get a Page actor for the current session
    fn get_page(&self) -> Result<Page>;

    /// Take a screenshot of the current page
    async fn take_screenshot(&self, path: Option<&str>, full_page: bool) -> Result<Vec<u8>>;

    /// Get the current page title
    #[deprecated(since = "0.1.2", note = "Use get_session_info() instead")]
    async fn get_current_page_title(&self) -> Result<String>;

    /// Get the CDP client for the current session
    fn get_cdp_client(&self) -> Result<Arc<CdpClient>>;

    /// Get a cookie manager for the current browser context
    fn cookie_manager(&self) -> Result<crate::browser::cookies::CookieManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::cookies::CookieManager::new(client))
    }

    /// Get a console log manager for the current browser context
    fn console_manager(&self) -> Result<crate::browser::console::ConsoleManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::console::ConsoleManager::new(client))
    }

    /// Get a storage manager for the current browser context
    fn storage_manager(&self) -> crate::browser::storage::StorageManager {
        crate::browser::storage::StorageManager::new()
    }

    /// Get a viewport manager for the current browser context
    fn viewport_manager(&self) -> crate::error::Result<crate::browser::viewport::ViewportManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::viewport::ViewportManager::new(client))
    }

    /// Get a PDF manager for the current browser context
    fn pdf_manager(&self) -> crate::error::Result<crate::browser::pdf::PdfManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::pdf::PdfManager::new(client))
    }

    /// Get a download manager for the current browser context
    fn download_manager(&self) -> crate::error::Result<crate::browser::download::DownloadManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::download::DownloadManager::new(client))
    }

    /// Get an auth manager for the current browser context
    fn auth_manager(&self) -> crate::error::Result<crate::browser::auth::AuthManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::auth::AuthManager::new(client))
    }

    /// Get a performance manager for the current browser context
    fn performance_manager(&self) -> crate::error::Result<crate::browser::performance::PerformanceManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::performance::PerformanceManager::new(client))
    }

    /// Get a HAR manager for the current browser context
    fn har_manager(&self) -> crate::error::Result<crate::browser::har::HarManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::har::HarManager::new(client))
    }

    /// Get a coverage manager for the current browser context
    fn coverage_manager(&self) -> crate::error::Result<crate::browser::coverage::CoverageManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::coverage::CoverageManager::new(client))
    }

    /// Get a network interceptor for the current browser context
    fn network_interceptor(&self) -> crate::error::Result<crate::browser::interceptor::NetworkInterceptor> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::interceptor::NetworkInterceptor::new(client))
    }

    /// Get a dialog manager for the current browser context
    fn dialog_manager(&self) -> crate::error::Result<crate::browser::dialog::DialogManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::dialog::DialogManager::new(client))
    }

    /// Get a file chooser manager for the current browser context
    fn filechooser_manager(&self) -> crate::error::Result<crate::browser::filechooser::FileChooserManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::filechooser::FileChooserManager::new(client))
    }

    /// Get a permissions manager for the current browser context
    fn permissions_manager(&self) -> crate::error::Result<crate::browser::permissions::PermissionsManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::permissions::PermissionsManager::new(client))
    }

    /// Get a tracing manager for the current browser context
    fn tracing_manager(&self) -> crate::error::Result<crate::browser::tracing::TracingManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::tracing::TracingManager::new(client))
    }

    /// Send a raw CDP command directly (power-user access to unwrapped CDP features)
    async fn raw_cdp_command(&self, method: &str, params: serde_json::Value) -> crate::error::Result<serde_json::Value> {
        let client = self.get_cdp_client()?;
        client.send_command(method, params).await
    }

    /// Get a touch manager for the current browser context
    fn touch_manager(&self) -> crate::error::Result<crate::browser::touch::TouchManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::touch::TouchManager::new(client))
    }

    /// Get a worker manager for the current browser context
    fn worker_manager(&self) -> crate::error::Result<crate::browser::worker::WorkerManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::worker::WorkerManager::new(client))
    }

    /// Get a service worker manager for the current browser context
    fn service_worker_manager(&self) -> crate::error::Result<crate::browser::serviceworker::ServiceWorkerManager> {
        let client = self.get_cdp_client()?;
        Ok(crate::browser::serviceworker::ServiceWorkerManager::new(client))
    }

    /// Get the session ID for the current target
    #[deprecated(since = "0.1.2", note = "Use get_session_info() instead")]
    fn get_session_id(&self) -> Result<String>;

    /// Get the current target ID
    #[deprecated(since = "0.1.2", note = "Use get_session_info() instead")]
    fn get_current_target_id(&self) -> Result<String>;

    /// Get streamlined session information (URL, title, target ID, session ID)
    async fn get_session_info(&self) -> Result<SessionInfo>;
}