web: Do not show context menu when right click event is consumed

This commit is contained in:
Kamil Jarosz 2024-07-07 02:58:53 +02:00 committed by TÖRÖK Attila
parent 0c9f461227
commit 6685c987ac
2 changed files with 37 additions and 3 deletions

View File

@ -145,6 +145,10 @@ export class RufflePlayer extends HTMLElement {
// Set to true when a contextmenu event is seen. // Set to true when a contextmenu event is seen.
private contextMenuSupported = false; private contextMenuSupported = false;
// When set to `true`, the next context menu event will
// not show the context menu.
private _suppressContextMenu = false;
// The effective config loaded upon `.load()`. // The effective config loaded upon `.load()`.
private loadedConfig?: URLLoadOptions | DataLoadOptions; private loadedConfig?: URLLoadOptions | DataLoadOptions;
@ -1572,10 +1576,15 @@ export class RufflePlayer extends HTMLElement {
event.pointerType !== "mouse" && event.pointerType !== "mouse" &&
this.pointerMoveMaxDistance < maxAllowedDistance this.pointerMoveMaxDistance < maxAllowedDistance
) { ) {
// TODO Implement handling right clicks for mobile.
this.showContextMenu(event); this.showContextMenu(event);
} }
} }
protected suppressContextMenu(): void {
this._suppressContextMenu = true;
}
private showContextMenu(event: MouseEvent | PointerEvent): void { private showContextMenu(event: MouseEvent | PointerEvent): void {
if (this.panicked) { if (this.panicked) {
return; return;
@ -1583,10 +1592,18 @@ export class RufflePlayer extends HTMLElement {
event.preventDefault(); event.preventDefault();
if (this._suppressContextMenu) {
this._suppressContextMenu = false;
return;
}
if (this.shadow.querySelectorAll(".modal:not(.hidden)").length !== 0) { if (this.shadow.querySelectorAll(".modal:not(.hidden)").length !== 0) {
return; return;
} }
// TODO Currently when opening context menu,
// mouse up event is fired on mouse up,
// but should be on context menu close.
if (event.type === "contextmenu") { if (event.type === "contextmenu") {
this.contextMenuSupported = true; this.contextMenuSupported = true;
document.documentElement.addEventListener( document.documentElement.addEventListener(

View File

@ -183,6 +183,9 @@ extern "C" {
#[wasm_bindgen(method, js_name = "displayClipboardModal")] #[wasm_bindgen(method, js_name = "displayClipboardModal")]
fn display_clipboard_modal(this: &JavascriptPlayer, access_denied: bool); fn display_clipboard_modal(this: &JavascriptPlayer, access_denied: bool);
#[wasm_bindgen(method, js_name = "suppressContextMenu")]
fn suppress_context_menu(this: &JavascriptPlayer);
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -556,11 +559,13 @@ impl RuffleHandle {
)); ));
// Create mouse down handler. // Create mouse down handler.
let js_player_callback = js_player.clone();
instance.mouse_down_callback = Some(JsCallback::register( instance.mouse_down_callback = Some(JsCallback::register(
&player.canvas, &player.canvas,
"pointerdown", "pointerdown",
false, false,
move |js_event: PointerEvent| { move |js_event: PointerEvent| {
let js_player_callback = js_player_callback.clone();
let _ = ruffle.with_instance(move |instance| { let _ = ruffle.with_instance(move |instance| {
if let Some(target) = js_event.current_target() { if let Some(target) = js_event.current_target() {
let _ = target let _ = target
@ -580,9 +585,21 @@ impl RuffleHandle {
// TODO The index should be provided by the browser, not calculated. // TODO The index should be provided by the browser, not calculated.
index: None, index: None,
}; };
let _ = instance.with_core_mut(|core| { let handled = instance
core.handle_event(event); .with_core_mut(|core| core.handle_event(event))
}); .unwrap_or_default();
if handled
&& matches!(
event,
PlayerEvent::MouseDown {
button: MouseButton::Right,
..
}
)
{
js_player_callback.suppress_context_menu();
}
js_event.prevent_default(); js_event.prevent_default();
}); });