#![deny(missing_docs)]
use std::sync::Arc;
use std::thread;
use headless_chrome::{
protocol::{page::ScreenshotFormat, target::methods::CreateTarget},
Browser,
};
use url::Url;
mod error;
pub use crate::error::Error;
pub struct AdsbxBrowser {
#[allow(dead_code)]
pub browser: Browser,
pub tab: Arc<headless_chrome::Tab>,
initialized: bool,
show_track_labels: bool,
show_labels: bool,
}
impl AdsbxBrowser {
pub fn new(dimensions: (i32, i32)) -> std::result::Result<AdsbxBrowser, Error> {
let browser = Browser::default()?;
let (width, height) = dimensions;
let tab = browser.new_tab_with_options(CreateTarget {
url: "chrome://version",
width: Some(width),
height: Some(height),
browser_context_id: None,
enable_begin_frame_control: None,
})?;
Ok(AdsbxBrowser {
browser,
tab,
initialized: false,
show_track_labels: true,
show_labels: true,
})
}
pub fn show_track_labels(mut self, enabled: bool) -> Self {
self.show_track_labels = enabled;
self
}
pub fn show_labels(mut self, enabled: bool) -> Self {
self.show_labels = enabled;
self
}
pub fn screenshot(&mut self, url: &Url) -> Result<Screenshot, Error> {
let long_delay = std::time::Duration::from_millis(4000);
let short_delay = std::time::Duration::from_millis(100);
self.tab.navigate_to(url.as_str())?;
self.tab.wait_until_navigated()?;
thread::sleep(long_delay);
self.tab
.wait_for_element("#selected_infoblock")?
.call_js_fn("function() { this.remove(); }", false)?;
thread::sleep(short_delay);
if !self.initialized {
if self.show_track_labels {
self.tab.press_key("k")?;
thread::sleep(short_delay);
}
if self.show_labels {
self.tab.press_key("l")?;
thread::sleep(short_delay);
}
self.initialized = true;
}
#[allow(unused_must_use)]
if let Ok(close) = self.tab.wait_for_element("[Title=\"Close\"]") {
close.click();
thread::sleep(short_delay);
}
let viewport = self
.tab
.wait_for_element("#map_container")?
.get_box_model()?
.margin_viewport();
let image_data =
self.tab
.capture_screenshot(ScreenshotFormat::PNG, Some(viewport), true)?;
Ok(Screenshot { data: image_data })
}
}
pub struct Screenshot {
pub data: Vec<u8>,
}