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);