use tracing::{debug, instrument};
use crate::error::ContextError;
use super::BrowserContext;
impl BrowserContext {
#[instrument(level = "debug", skip(self, script), fields(script_len = script.as_ref().len()))]
pub async fn add_init_script(&self, script: impl AsRef<str>) -> Result<(), ContextError> {
if self.is_closed() {
return Err(ContextError::Closed);
}
let script_content = script.as_ref().to_string();
debug!("Adding context-level init script");
{
let mut scripts = self.init_scripts.write().await;
scripts.push(script_content.clone());
}
let pages = self.pages.read().await;
for page in pages.iter() {
if !page.session_id.is_empty() {
use viewpoint_cdp::protocol::page::AddScriptToEvaluateOnNewDocumentParams;
let _ = self.connection()
.send_command::<_, viewpoint_cdp::protocol::page::AddScriptToEvaluateOnNewDocumentResult>(
"Page.addScriptToEvaluateOnNewDocument",
Some(AddScriptToEvaluateOnNewDocumentParams {
source: script_content.clone(),
world_name: None,
include_command_line_api: None,
run_immediately: None,
}),
Some(&page.session_id),
)
.await;
}
}
Ok(())
}
#[instrument(level = "debug", skip(self), fields(path = %path.as_ref().display()))]
pub async fn add_init_script_path(
&self,
path: impl AsRef<std::path::Path>,
) -> Result<(), ContextError> {
let content = tokio::fs::read_to_string(path.as_ref())
.await
.map_err(|e| ContextError::Internal(format!("Failed to read init script file: {e}")))?;
self.add_init_script(&content).await
}
pub async fn init_scripts(&self) -> Vec<String> {
self.init_scripts.read().await.clone()
}
pub(crate) async fn apply_init_scripts_to_session(
&self,
session_id: &str,
) -> Result<(), ContextError> {
let scripts = self.init_scripts.read().await;
for script in scripts.iter() {
use viewpoint_cdp::protocol::page::AddScriptToEvaluateOnNewDocumentParams;
self.connection()
.send_command::<_, viewpoint_cdp::protocol::page::AddScriptToEvaluateOnNewDocumentResult>(
"Page.addScriptToEvaluateOnNewDocument",
Some(AddScriptToEvaluateOnNewDocumentParams {
source: script.clone(),
world_name: None,
include_command_line_api: None,
run_immediately: None,
}),
Some(session_id),
)
.await?;
}
Ok(())
}
}