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.
|
||||
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(
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue