#![cfg_attr(docsrs, feature(doc_cfg))]
use std::sync::Arc;
use anyrender_vello::VelloWindowRenderer as WindowRenderer;
use apace_dom::{DocumentConfig, UserAgentStylesheet};
use apace_html::HtmlDocument;
use apace_shell::{
ApaceApplication, ApaceShellProxy, Config, EventLoop, WindowConfig, create_default_event_loop,
};
use apace_traits::net::NetProvider;
#[doc(inline)]
pub use apace_dom as dom;
#[doc(inline)]
pub use apace_html as html;
#[cfg(feature = "net")]
#[doc(inline)]
pub use apace_net as net;
#[doc(inline)]
pub use apace_paint as paint;
#[doc(inline)]
pub use apace_shell as shell;
#[doc(inline)]
pub use apace_traits as traits;
#[cfg(feature = "net")]
#[cfg(not(target_arch = "wasm32"))]
pub fn launch_url(url: &str) {
#[cfg(feature = "tracing")]
tracing::info!("Launching {url}");
let url = url.to_owned();
let url = url::Url::parse(&url).expect("Invalid url");
let rt = tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap();
let _guard = rt.enter();
let event_loop = create_default_event_loop();
let (proxy, reciever) = ApaceShellProxy::new(event_loop.create_proxy());
let net_provider = create_net_provider(proxy.clone());
let application = ApaceApplication::new(proxy, reciever);
let (url, bytes) = rt
.block_on(net_provider.fetch_async(apace_traits::net::Request::get(url)))
.unwrap();
let html = std::str::from_utf8(bytes.as_ref()).unwrap();
launch_internal(
html,
Config {
stylesheets: Vec::new(),
base_url: Some(url),
},
event_loop,
application,
net_provider,
)
}
pub fn launch_static_html(html: &str) {
launch_static_html_cfg(html, Config::default())
}
pub fn launch_static_html_cfg(html: &str, cfg: Config) {
#[cfg(feature = "net")]
#[cfg(not(target_arch = "wasm32"))]
let rt = tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap();
#[cfg(feature = "net")]
#[cfg(not(target_arch = "wasm32"))]
let _guard = rt.enter();
let event_loop = create_default_event_loop();
let (proxy, reciever) = ApaceShellProxy::new(event_loop.create_proxy());
let net_provider = create_net_provider(proxy.clone());
let application = ApaceApplication::new(proxy, reciever);
launch_internal(html, cfg, event_loop, application, net_provider)
}
fn launch_internal(
html: &str,
cfg: Config,
event_loop: EventLoop,
mut application: ApaceApplication<WindowRenderer>,
net_provider: Arc<dyn NetProvider>,
) {
let doc = HtmlDocument::from_html(
html,
DocumentConfig {
base_url: cfg.base_url,
ua_stylesheets: std::iter::once(UserAgentStylesheet::default_sheet())
.chain(
cfg.stylesheets
.iter()
.map(|css| UserAgentStylesheet::parse(css)),
)
.collect(),
net_provider: Some(net_provider),
..Default::default()
},
);
let renderer = WindowRenderer::new();
let window = WindowConfig::new(Box::new(doc) as _, renderer);
application.add_window(window);
event_loop.run_app(application).unwrap()
}
#[cfg(feature = "net")]
type EnabledNetProvider = apace_net::Provider;
#[cfg(not(feature = "net"))]
type EnabledNetProvider = apace_traits::net::DummyNetProvider;
fn create_net_provider(proxy: ApaceShellProxy) -> Arc<EnabledNetProvider> {
#[cfg(feature = "net")]
let net_provider = Arc::new(apace_net::Provider::new(Some(Arc::new(proxy))));
#[cfg(not(feature = "net"))]
let net_provider = {
use apace_traits::net::DummyNetProvider;
let _ = event_loop;
Arc::new(DummyNetProvider::default())
};
net_provider
}