diff --git a/CHANGELOG.md b/CHANGELOG.md index 00adeab746..f12cad7773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Unreleased` header. # Unreleased +- On Web, fix context menu not being disabled by `with_prevent_default(true)`. + # 0.29.5 - On macOS, remove spurious error logging when handling `Fn`. diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index 09a5cc8b6b..2b5ddf5a78 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -649,6 +649,8 @@ impl EventLoopWindowTarget { canvas.on_animation_frame(move || runner.request_redraw(RootWindowId(id))); canvas.on_touch_end(); + + canvas.on_context_menu(prevent_default); } pub fn available_monitors(&self) -> VecDequeIter { diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index cc7e4b054e..908a2c0423 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -5,7 +5,8 @@ use std::sync::{Arc, Mutex}; use smol_str::SmolStr; use wasm_bindgen::{closure::Closure, JsCast}; use web_sys::{ - CssStyleDeclaration, Document, Event, FocusEvent, HtmlCanvasElement, KeyboardEvent, WheelEvent, + CssStyleDeclaration, Document, Event, FocusEvent, HtmlCanvasElement, KeyboardEvent, + PointerEvent, WheelEvent, }; use crate::dpi::{LogicalPosition, PhysicalPosition, PhysicalSize}; @@ -42,6 +43,7 @@ pub struct Canvas { on_intersect: Option, animation_frame_handler: AnimationFrameHandler, on_touch_end: Option>, + on_context_menu: Option>, } pub struct Common { @@ -152,6 +154,7 @@ impl Canvas { on_intersect: None, animation_frame_handler: AnimationFrameHandler::new(window), on_touch_end: None, + on_context_menu: None, }) } @@ -446,6 +449,17 @@ impl Canvas { self.on_touch_end = Some(self.common.add_transient_event("touchend", |_| {})); } + pub(crate) fn on_context_menu(&mut self, prevent_default: bool) { + self.on_context_menu = Some(self.common.add_event( + "contextmenu", + move |event: PointerEvent| { + if prevent_default { + event.prevent_default(); + } + }, + )); + } + pub fn request_fullscreen(&self) { self.common.fullscreen_handler.request_fullscreen() } @@ -524,6 +538,7 @@ impl Canvas { self.animation_frame_handler.cancel(); self.on_touch_end = None; self.common.fullscreen_handler.cancel(); + self.on_context_menu = None; } }