web: Do not show context menu when right click event is consumed
This commit is contained in:
parent
0c9f461227
commit
6685c987ac
|
@ -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(
|
||||||
|
|
|
@ -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();
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue