codetether-browser 0.1.0

Browser automation runtime for CodeTether
Documentation
//! HTML extraction for native browser pages.

use crate::browser::{BrowserError, BrowserOutput, output::HtmlContent, request::ScopeRequest};

/// Return HTML for the current page or selected element.
///
/// # Errors
///
/// Returns [`BrowserError`] when the session is not started.
pub(in crate::browser::session::native) async fn html(
    session: &super::super::super::BrowserSession,
    request: ScopeRequest,
) -> Result<BrowserOutput, BrowserError> {
    let mut native = session.inner.native.lock().await;
    let slot = native
        .as_mut()
        .ok_or(BrowserError::SessionNotStarted)?
        .current_mut()?;
    let mut page = slot.page();
    let html = match request.selector {
        Some(selector) => super::super::eval::string(
            &mut page,
            &format!("document.querySelector({}).outerHTML", quote(&selector)),
        )?,
        None => page.session.html.clone(),
    };
    slot.replace(page);
    Ok(BrowserOutput::Html(HtmlContent { html }))
}

fn quote(value: &str) -> String {
    serde_json::to_string(value).unwrap_or_else(|_| "\"\"".into())
}