m: Cache document in web frontend (#66)

This commit is contained in:
John Nunley 2023-01-14 05:48:44 +00:00 committed by GitHub
parent 125ad070c2
commit 33a4c3741b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 11 deletions

View file

@ -93,7 +93,7 @@ make_dispatch! {
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
CG((), cg::CGImpl), CG((), cg::CGImpl),
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
Web((), web::WebImpl), Web(web::WebDisplayImpl, web::WebImpl),
#[cfg(target_os = "redox")] #[cfg(target_os = "redox")]
Orbital((), orbital::OrbitalImpl), Orbital((), orbital::OrbitalImpl),
} }
@ -134,7 +134,7 @@ impl Context {
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
RawDisplayHandle::AppKit(_) => ContextDispatch::CG(()), RawDisplayHandle::AppKit(_) => ContextDispatch::CG(()),
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
RawDisplayHandle::Web(_) => ContextDispatch::Web(()), RawDisplayHandle::Web(_) => ContextDispatch::Web(web::WebDisplayImpl::new()?),
#[cfg(target_os = "redox")] #[cfg(target_os = "redox")]
RawDisplayHandle::Orbital(_) => ContextDispatch::Orbital(()), RawDisplayHandle::Orbital(_) => ContextDispatch::Orbital(()),
unimplemented_display_handle => { unimplemented_display_handle => {
@ -212,8 +212,8 @@ impl Surface {
SurfaceDispatch::CG(unsafe { cg::CGImpl::new(appkit_handle)? }) SurfaceDispatch::CG(unsafe { cg::CGImpl::new(appkit_handle)? })
} }
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
(ContextDispatch::Web(()), RawWindowHandle::Web(web_handle)) => { (ContextDispatch::Web(context), RawWindowHandle::Web(web_handle)) => {
SurfaceDispatch::Web(web::WebImpl::new(web_handle)?) SurfaceDispatch::Web(web::WebImpl::new(context, web_handle)?)
} }
#[cfg(target_os = "redox")] #[cfg(target_os = "redox")]
(ContextDispatch::Orbital(()), RawWindowHandle::Orbital(orbital_handle)) => { (ContextDispatch::Orbital(()), RawWindowHandle::Orbital(orbital_handle)) => {

View file

@ -7,14 +7,16 @@ use web_sys::ImageData;
use crate::SoftBufferError; use crate::SoftBufferError;
pub struct WebImpl { /// Display implementation for the web platform.
canvas: HtmlCanvasElement, ///
ctx: CanvasRenderingContext2d, /// This just caches the document to prevent having to query it every time.
pub struct WebDisplayImpl {
document: web_sys::Document,
} }
impl WebImpl { impl WebDisplayImpl {
pub fn new(handle: WebWindowHandle) -> Result<Self, SoftBufferError> { pub(super) fn new() -> Result<Self, SoftBufferError> {
let canvas: HtmlCanvasElement = web_sys::window() let document = web_sys::window()
.ok_or_else(|| { .ok_or_else(|| {
SoftBufferError::PlatformError( SoftBufferError::PlatformError(
Some("`window` is not present in this runtime".into()), Some("`window` is not present in this runtime".into()),
@ -27,7 +29,21 @@ impl WebImpl {
Some("`document` is not present in this runtime".into()), Some("`document` is not present in this runtime".into()),
None, None,
) )
})? })?;
Ok(Self { document })
}
}
pub struct WebImpl {
canvas: HtmlCanvasElement,
ctx: CanvasRenderingContext2d,
}
impl WebImpl {
pub fn new(display: &WebDisplayImpl, handle: WebWindowHandle) -> Result<Self, SoftBufferError> {
let canvas: HtmlCanvasElement = display
.document
.query_selector(&format!("canvas[data-raw-handle=\"{}\"]", handle.id)) .query_selector(&format!("canvas[data-raw-handle=\"{}\"]", handle.id))
// `querySelector` only throws an error if the selector is invalid. // `querySelector` only throws an error if the selector is invalid.
.unwrap() .unwrap()