use waterui_core::{AnyView, Environment, Metadata, Retain, view::Hook};
use waterui_graphics::gpu_surface::GpuSurface;
use crate::{CefRuntime, CefRuntimeConfiguration};
fn ensure_runtime(env: &mut Environment) -> CefRuntime {
let runtime = env.get::<CefRuntime>().cloned().unwrap_or_else(|| {
let runtime = CefRuntime::initialize(CefRuntimeConfiguration::packaged());
env.insert(runtime.clone());
runtime
});
runtime.start_message_pump();
runtime
}
#[cfg(feature = "webview")]
pub fn install(env: &mut Environment) {
use waterui_webview::{WebView, WebViewController, web_surface_semantics};
use crate::CefWebViewHandle;
assert!(
env.get::<Hook<WebView>>().is_none(),
"a WebView realization is already installed; an application selects exactly one browser engine"
);
let runtime = ensure_runtime(env);
if env.get::<WebViewController>().is_none() {
env.insert(runtime.webview_controller());
}
env.insert_hook::<WebView, AnyView>(|env, webview| {
let page = webview
.handle()
.downcast_ref::<CefWebViewHandle>()
.expect(
"the CEF WebView realization was handed a page from another engine; \
the WebViewController in this environment is not CEF's",
)
.page()
.clone();
let surface = GpuSurface::new(crate::gpu_view_with_input(page));
AnyView::new(Metadata::new(
web_surface_semantics(env, surface),
Retain::new(webview),
))
});
}
#[cfg(feature = "chromium")]
pub fn install_chromium(env: &mut Environment) {
use waterui_chromium::{ChromiumController, ChromiumView, PageMode};
use waterui_webview::web_surface_semantics;
use crate::CefPageHandle;
assert!(
env.get::<Hook<ChromiumView>>().is_none(),
"a ChromiumView realization is already installed; an application selects exactly one Chromium runtime"
);
let runtime = ensure_runtime(env);
if env.get::<ChromiumController>().is_none() {
env.insert(runtime.chromium_controller());
}
env.insert_hook::<ChromiumView, AnyView>(|env, chromium| {
assert_eq!(
chromium.page().mode(),
PageMode::Visible,
"a headless Chromium page cannot be rendered as a ChromiumView"
);
let page = chromium
.page()
.handle()
.downcast_ref::<CefPageHandle>()
.expect(
"the Chromium realization was handed a page from another runtime; \
the ChromiumController in this environment is not CEF's",
)
.clone();
let surface = GpuSurface::new(crate::gpu_view_with_input(page));
AnyView::new(Metadata::new(
web_surface_semantics(env, surface),
Retain::new(chromium),
))
});
}