use std::path::Path;
use std::sync::{Arc, Mutex};
use buffr_core::DownloadNoticeQueue;
use buffr_core::find::{FindResultSink, new_sink as new_find_sink};
use buffr_downloads::Downloads;
use buffr_engine::{Backend, BackendOpenOptions, BrowserEngine, NewTabHtmlProvider};
use crate::BlinkCdpEngine;
use crate::engine::HtmlProvider;
pub struct BlinkCdpBackend {
newtab_provider: Mutex<Option<HtmlProvider>>,
settings_provider: Mutex<Option<HtmlProvider>>,
}
impl BlinkCdpBackend {
pub fn new() -> Self {
BlinkCdpBackend {
newtab_provider: Mutex::new(None),
settings_provider: Mutex::new(None),
}
}
pub fn register_settings_handler(&self, provider: HtmlProvider) {
if let Ok(mut guard) = self.settings_provider.lock() {
*guard = Some(provider);
}
}
}
impl Default for BlinkCdpBackend {
fn default() -> Self {
BlinkCdpBackend::new()
}
}
impl Backend for BlinkCdpBackend {
fn id(&self) -> &str {
"blink-cdp"
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn initialize(&self, _cache_path: &str) -> Result<(), String> {
Ok(())
}
fn open_engine(
&self,
options: BackendOpenOptions<'_>,
) -> Result<Arc<dyn BrowserEngine>, String> {
let data_dir = options
.data_dir
.map(|p| p.to_path_buf())
.unwrap_or_else(|| {
std::path::PathBuf::from("/tmp/buffr/blink-cdp").join(options.engine_id.as_str())
});
let downloads: Option<Arc<Downloads>> = options
.downloads
.as_ref()
.and_then(|any| any.downcast_ref::<Arc<Downloads>>())
.cloned();
let notice_queue: Option<DownloadNoticeQueue> = options
.notice_queue
.as_ref()
.and_then(|any| any.downcast_ref::<DownloadNoticeQueue>())
.cloned();
let download_dir = options.download_dir.map(|p| p.to_path_buf());
let find_sink: FindResultSink = options
.find_sink
.as_ref()
.and_then(|any| any.downcast_ref::<FindResultSink>())
.cloned()
.unwrap_or_else(new_find_sink);
let engine = BlinkCdpEngine::new(
&data_dir,
download_dir.as_deref(),
downloads,
notice_queue,
Some(find_sink),
)
.map_err(|e| e.to_string())?;
if let Ok(guard) = self.newtab_provider.lock()
&& let Some(ref provider) = *guard
{
engine.set_newtab_html_provider(Arc::clone(provider));
}
if let Ok(guard) = self.settings_provider.lock()
&& let Some(ref provider) = *guard
{
engine.set_settings_html_provider(Arc::clone(provider));
}
Ok(Arc::new(engine) as Arc<dyn BrowserEngine>)
}
fn load_library(&self, _exe: &Path, _is_helper: bool) -> Result<(), String> {
Ok(())
}
fn register_new_tab_handler(&self, provider: NewTabHtmlProvider) {
if let Ok(mut guard) = self.newtab_provider.lock() {
*guard = Some(provider);
}
}
fn register_view_source_handler(&self) {
}
}