m: Cache document in web frontend (#66)
This commit is contained in:
parent
125ad070c2
commit
33a4c3741b
2 changed files with 27 additions and 11 deletions
|
|
@ -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)) => {
|
||||||
|
|
|
||||||
30
src/web.rs
30
src/web.rs
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue