From 7dc28604d78479207db3317e80082a89415dd414 Mon Sep 17 00:00:00 2001 From: "Francois (fge)" Date: Thu, 15 Jul 2021 14:36:33 +0000 Subject: [PATCH] [FIX] web: traceback generated by hotkeys This commit fixes the erroneous tracebacks generated by keyup events in the hotkey overlay. (alt + key) TASK-2591069 - BUG 3 --- .../static/src/core/hotkeys/hotkey_service.js | 2 +- .../core/hotkeys/hotkey_service_tests.js | 86 +++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/core/hotkeys/hotkey_service.js b/addons/web/static/src/core/hotkeys/hotkey_service.js index 79d7a87cb31..7411f4fc091 100644 --- a/addons/web/static/src/core/hotkeys/hotkey_service.js +++ b/addons/web/static/src/core/hotkeys/hotkey_service.js @@ -88,7 +88,7 @@ export const hotkeyService = { _originalEvent: event, }; dispatch(infos); - removeHotkeyOverlays(); + removeHotkeyOverlays(event); } /** diff --git a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js index 1dfbd7147a4..efedd7b8271 100644 --- a/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js +++ b/addons/web/static/tests/core/hotkeys/hotkey_service_tests.js @@ -175,6 +175,92 @@ QUnit.test("non-MacOS usability", async (assert) => { removeHotkey(); }); +QUnit.test("the overlay of hotkeys is correctly displayed", async (assert) => { + assert.expect(7); + + const displayHotkeysOverlay = () => + window.dispatchEvent(new KeyboardEvent("keydown", { key: "alt", altKey: true })); + + class MyComponent extends Component { + onClick(ev) { + assert.step(`click ${ev.target.dataset.hotkey}`); + } + } + MyComponent.template = xml` +
+
+ `; + const comp = await mount(MyComponent, { env, target }); + const getOverlays = () => + [...comp.el.querySelectorAll(".o_web_hotkey_overlay")].map((el) => el.innerText); + + displayHotkeysOverlay(); + assert.deepEqual(getOverlays(), ["B", "C"], "should display the overlay"); + + // apply an existent hotkey + triggerHotkey(`alt+b`); + await nextTick(); + assert.verifySteps(["click b"]); + assert.deepEqual(getOverlays(), [], "shouldn't display the overlay"); + + displayHotkeysOverlay(); + assert.deepEqual(getOverlays(), ["B", "C"], "should display the overlay"); + + // apply a non-existent hotkey + triggerHotkey(`alt+x`); + await nextTick(); + assert.deepEqual(getOverlays(), [], "shouldn't display the overlay"); + assert.verifySteps([]); +}); + +QUnit.test("the overlay of hotkeys is correctly displayed on MacOs", async (assert) => { + assert.expect(7); + + patchWithCleanup(browser, { + navigator: { + userAgent: browser.navigator.userAgent.replace(/\([^)]*\)/, "(MacOs)"), + }, + }); + + const displayHotkeysOverlay = () => + window.dispatchEvent(new KeyboardEvent("keydown", { key: "control", ctrlKey: true })); + + class MyComponent extends Component { + onClick(ev) { + assert.step(`click ${ev.target.dataset.hotkey}`); + } + } + MyComponent.template = xml` +
+
+ `; + const comp = await mount(MyComponent, { env, target }); + const getOverlays = () => + [...comp.el.querySelectorAll(".o_web_hotkey_overlay")].map((el) => el.innerText); + + displayHotkeysOverlay(); + assert.deepEqual(getOverlays(), ["B", "C"], "should display the overlay"); + + // apply an existent hotkey + triggerHotkey(`alt+b`); + await nextTick(); + assert.verifySteps(["click b"]); + assert.deepEqual(getOverlays(), [], "shouldn't display the overlay"); + + displayHotkeysOverlay(); + assert.deepEqual(getOverlays(), ["B", "C"], "should display the overlay"); + + // apply a non-existent hotkey + triggerHotkey(`alt+x`); + await nextTick(); + assert.deepEqual(getOverlays(), [], "shouldn't display the overlay"); + assert.verifySteps([]); +}); + QUnit.test("MacOS usability", async (assert) => { assert.expect(6);