From 4e8735c6bd833f42ae1e081349b96badaaadf27e Mon Sep 17 00:00:00 2001 From: daxpedda Date: Sun, 17 Dec 2023 23:48:58 +0100 Subject: [PATCH] Web: add support for more `RawWindowHandle` variants (#188) --- CHANGELOG.md | 5 +++-- src/web.rs | 31 +++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e300d0..8c350ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased -- MacOS: Fix double-free of `NSWindow`. +- On MacOS, Fix double-free of `NSWindow`. +- On Web, add support for more `RawWindowHandle` variants. # 0.4.0 @@ -25,7 +26,7 @@ * On X11, fix the length of the returned buffer when using the wire-transferred buffer. * On Web, fix incorrect starting coordinates when handling buffer damage. -* Or Redox, use `MAP_SHARED`; fixing behavior with latest Orbital. +* On Redox, use `MAP_SHARED`; fixing behavior with latest Orbital. * Error instead of segfault on macOS if size isn't set. * Add `OffscreenCanvas` support in web backend. * Add DRM/KMS backend, for running on tty without X/Wayland. diff --git a/src/web.rs b/src/web.rs index 0d04352..7b78fca 100644 --- a/src/web.rs +++ b/src/web.rs @@ -79,18 +79,29 @@ enum Canvas { impl WebImpl { pub(crate) fn new(display: &WebDisplayImpl, window: W) -> Result> { let raw = window.window_handle()?.as_raw(); - let handle = match raw { - RawWindowHandle::Web(handle) => handle, + let canvas: HtmlCanvasElement = match raw { + RawWindowHandle::Web(handle) => { + display + .document + .query_selector(&format!("canvas[data-raw-handle=\"{}\"]", handle.id)) + // `querySelector` only throws an error if the selector is invalid. + .unwrap() + .swbuf_err("No canvas found with the given id")? + // We already made sure this was a canvas in `querySelector`. + .unchecked_into() + } + RawWindowHandle::WebCanvas(handle) => { + let value: &JsValue = unsafe { handle.obj.cast().as_ref() }; + value.clone().unchecked_into() + } + RawWindowHandle::WebOffscreenCanvas(handle) => { + let value: &JsValue = unsafe { handle.obj.cast().as_ref() }; + let canvas: OffscreenCanvas = value.clone().unchecked_into(); + + return Self::from_offscreen_canvas(canvas, window).map_err(InitError::Failure); + } _ => return Err(InitError::Unsupported(window)), }; - let canvas: HtmlCanvasElement = display - .document - .query_selector(&format!("canvas[data-raw-handle=\"{}\"]", handle.id)) - // `querySelector` only throws an error if the selector is invalid. - .unwrap() - .swbuf_err("No canvas found with the given id")? - // We already made sure this was a canvas in `querySelector`. - .unchecked_into(); Self::from_canvas(canvas, window).map_err(InitError::Failure) }