From 2cbd7ae489cf04457f7c399c3ed6457696acd4fd Mon Sep 17 00:00:00 2001 From: Muffin Date: Fri, 16 Feb 2024 21:34:10 -0600 Subject: [PATCH] Prevent interacting with other elements when prompt() reimpl. is open --- src-renderer-webpack/editor/prompt/prompt.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src-renderer-webpack/editor/prompt/prompt.js b/src-renderer-webpack/editor/prompt/prompt.js index 4f0e2913..ceae7c23 100644 --- a/src-renderer-webpack/editor/prompt/prompt.js +++ b/src-renderer-webpack/editor/prompt/prompt.js @@ -19,6 +19,13 @@ const _prompt = (message, defaultValue) => new Promise((resolve) => { // https://stackoverflow.com/questions/58818299/css-variables-not-working-in-dialogbackdrop // https://issues.chromium.org/issues/40569411 + const interactiveElements = Array.from(document.querySelectorAll('a, button, input, select, textarea, [tabindex]')); + const oldInteractiveElementState = new WeakMap(); + for (const el of interactiveElements) { + oldInteractiveElementState.set(el, el.tabIndex); + el.tabIndex = -1; + } + const outer = document.createElement('div'); outer.className = styles.outer; @@ -56,6 +63,9 @@ const _prompt = (message, defaultValue) => new Promise((resolve) => { buttonRow.append(okButton); const finish = (value) => { + for (const el of interactiveElements) { + el.tabIndex = oldInteractiveElementState.get(el); + } document.removeEventListener('keydown', globalOnKeyDown); outer.remove(); resolve(value);