diff --git a/examples/js-binding-listener.rs b/examples/js-binding-listener.rs new file mode 100644 index 00000000..2aaa06a0 --- /dev/null +++ b/examples/js-binding-listener.rs @@ -0,0 +1,50 @@ +use chromiumoxide::browser::{Browser, BrowserConfig}; +use chromiumoxide_cdp::cdp::js_protocol::runtime::{AddBindingParams, EventBindingCalled}; +use futures::StreamExt; +use std::sync::Arc; +use tokio::sync::Mutex; + +#[tokio::main] +async fn main() -> Result<(), Box> { + tracing_subscriber::fmt::init(); + + let (mut browser, mut handler) = + Browser::launch(BrowserConfig::builder().with_head().build()?).await?; + + let handle = async_std::task::spawn(async move { + while let Some(h) = handler.next().await { + match h { + Ok(_) => continue, + Err(_) => break, + } + } + }); + + let page = browser.new_page("about:blank").await?; + + let mut listener = page.event_listener::().await?; + + let value_from_js: Arc> = Arc::new(Mutex::new("".to_string())); + let value_from_js_clone = Arc::clone(&value_from_js); + + tokio::spawn(async move { + while let Some(event) = listener.next().await { + if event.name == "testFunc1" { + let mut locked_value = value_from_js_clone.lock().await; + *locked_value = event.payload.clone(); + } + } + }); + + page.execute(AddBindingParams::new("testFunc1")).await?; + + page.evaluate("window.testFunc1('30');").await?; + + let value = value_from_js.lock().await; + assert_eq!(*value, "30"); + + browser.close().await?; + handle.await; + + Ok(()) +}