From c0c71d1de806fea916a90fc54ab73d291caf56bf Mon Sep 17 00:00:00 2001 From: daxpedda Date: Sun, 17 Dec 2023 23:24:05 +0100 Subject: [PATCH 1/2] Web: add support for more `RawWindowHandle` variants --- CHANGELOG.md | 1 + src/web.rs | 31 +++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e300d0d..84cfb466 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased - MacOS: Fix double-free of `NSWindow`. +- On Web, add support for more `RawWindowHandle` variants. # 0.4.0 diff --git a/src/web.rs b/src/web.rs index 0d043527..7b78fca4 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) } From cbfa926cfe362b4185efb52759d9fcd1ac7f77e1 Mon Sep 17 00:00:00 2001 From: daxpedda Date: Sun, 17 Dec 2023 23:24:57 +0100 Subject: [PATCH 2/2] Fix nits in changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84cfb466..8c350ee8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # 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 @@ -26,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.