use std::sync::Arc;
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct FrameEvent {
pub browser_id: i32,
pub frame_id: String,
pub is_main: bool,
pub kind: FrameEventKind,
}
#[derive(Clone, Debug)]
#[non_exhaustive]
pub enum FrameEventKind {
Created,
Attached,
Detached,
Destroyed,
NavigationStarted { url: url::Url },
DocumentCommitted { url: url::Url },
NavigationFailed { url: url::Url },
AddressChanged { url: url::Url },
MainFrameChanged,
LoadingStateChanged { is_loading: bool },
RendererTerminated,
}
pub type FrameEventHandler = dyn Fn(FrameEvent) + Send + Sync + 'static;
pub(crate) fn emit_frame_event(
handler: &Option<Arc<FrameEventHandler>>,
browser: Option<&mut cef::Browser>,
frame: Option<&mut cef::Frame>,
kind: FrameEventKind,
) {
use cef::{ImplBrowser, ImplFrame};
if let (Some(handler), Some(browser)) = (handler, browser) {
handler(FrameEvent {
browser_id: browser.identifier(),
frame_id: frame
.as_ref()
.map(|frame| cef::CefString::from(&frame.identifier()).to_string())
.unwrap_or_default(),
is_main: frame.is_some_and(|frame| frame.is_main() != 0),
kind,
});
}
}