Suppress errors when disabling the focus trap
authorAlexander Ebert <ebert@woltlab.com>
Sun, 15 May 2022 11:04:54 +0000 (13:04 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sun, 15 May 2022 11:04:54 +0000 (13:04 +0200)
ts/WoltLabSuite/Core/Ui/Dialog.ts
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Dialog.js

index a0ac4c163baa306278441fd1b7d1b68f3f4deb70..e2b42ce8140f18d0f063ff63b621151099a42efe 100644 (file)
@@ -783,7 +783,18 @@ const UiDialog = {
       throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
     }
 
-    data.focusTrap.deactivate();
+    try {
+      data.focusTrap.deactivate();
+    } catch (e) {
+      // Suppress error messages if the focus could not be returned
+      // to the source element because it is no longer available or
+      // unknown.
+      const ignoreMessage =
+        "Your focus-trap must have at least one container with at least one tabbable node in it at all times";
+      if (e.message !== ignoreMessage) {
+        throw e;
+      }
+    }
 
     data.dialog.setAttribute("aria-hidden", "true");
 
index 4e574134c1e6747fc9e646acc9f8f927b6777586..8983a81c085d02d7b5208ee8eb0eb6ccfc316faa 100644 (file)
@@ -644,7 +644,18 @@ define(["require", "exports", "tslib", "../Core", "../Dom/Change/Listener", "./S
             if (data === undefined) {
                 throw new Error("Expected a valid dialog id, '" + id + "' does not match any active dialog.");
             }
-            data.focusTrap.deactivate();
+            try {
+                data.focusTrap.deactivate();
+            }
+            catch (e) {
+                // Suppress error messages if the focus could not be returned
+                // to the source element because it is no longer available or
+                // unknown.
+                const ignoreMessage = "Your focus-trap must have at least one container with at least one tabbable node in it at all times";
+                if (e.message !== ignoreMessage) {
+                    throw e;
+                }
+            }
             data.dialog.setAttribute("aria-hidden", "true");
             // Move the keyboard focus away from a now hidden element.
             const activeElement = document.activeElement;