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.
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()`.
private loadedConfig?: URLLoadOptions | DataLoadOptions;
@ -1572,10 +1576,15 @@ export class RufflePlayer extends HTMLElement {
event.pointerType !== "mouse" &&
this.pointerMoveMaxDistance < maxAllowedDistance
) {
// TODO Implement handling right clicks for mobile.
this.showContextMenu(event);
}
}
protected suppressContextMenu(): void {
this._suppressContextMenu = true;
}
private showContextMenu(event: MouseEvent | PointerEvent): void {
if (this.panicked) {
return;
@ -1583,10 +1592,18 @@ export class RufflePlayer extends HTMLElement {
event.preventDefault();
if (this._suppressContextMenu) {
this._suppressContextMenu = false;
return;
}
if (this.shadow.querySelectorAll(".modal:not(.hidden)").length !== 0) {
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") {
this.contextMenuSupported = true;
document.documentElement.addEventListener(

View File

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