Incorrect handling of the return focus
authorAlexander Ebert <ebert@woltlab.com>
Sat, 14 May 2022 12:30:38 +0000 (14:30 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sat, 14 May 2022 12:30:38 +0000 (14:30 +0200)
Related https://www.woltlab.com/community/thread/295562-inhalte-k%C3%B6nnen-doppelt-gemeldet-werden/

ts/WoltLabSuite/Core/Ui/Dialog.ts
ts/WoltLabSuite/Core/Ui/Mobile.ts
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Dialog.js
wcfsetup/install/files/js/WoltLabSuite/Core/Ui/Mobile.js

index ee349cd6a66c1c55bf09396f3fabdcab6caeb406..2be8a133bc3e7b186741ff0e43c881efcbe5a79e 100644 (file)
@@ -783,7 +783,20 @@ 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) {
+      // The focus trap is unable to return the focus if
+      // the origin is no longer focusable. This can happen
+      // when the source is removed or is not longer visible,
+      // the latter typically caused by collapsing menus
+      // on mobile devices.
+      const ignoreErrorMessage =
+        "Your focus-trap must have at least one container with at least one tabbable node in it at all times";
+      if (e.message !== ignoreErrorMessage) {
+        throw e;
+      }
+    }
 
     data.dialog.setAttribute("aria-hidden", "true");
 
index 40c05c5c13c453dce54fa95786348a093ca252de..89c363d0ac3d763220747f3929f4de0b9a761bb6 100644 (file)
@@ -266,6 +266,7 @@ function toggleMobileNavigation(message: HTMLElement, quickOptions: HTMLElement,
 
       return false;
     },
+    setReturnFocus: quickOptions,
   });
   _focusTrap.activate();
 }
index 65c330e1fd59715162849525e63f9c6f338e9644..a3d6bb78c36142bf1a6b6958357f9e1e40105bc1 100644 (file)
@@ -644,7 +644,20 @@ 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) {
+                // The focus trap is unable to return the focus if
+                // the origin is no longer focusable. This can happen
+                // when the source is removed or is not longer visible,
+                // the latter typically caused by collapsing menus
+                // on mobile devices.
+                const ignoreErrorMessage = "Your focus-trap must have at least one container with at least one tabbable node in it at all times";
+                if (e.message !== ignoreErrorMessage) {
+                    throw e;
+                }
+            }
             data.dialog.setAttribute("aria-hidden", "true");
             // Move the keyboard focus away from a now hidden element.
             const activeElement = document.activeElement;
index 0631e43394089ee934c68372efc2be42065cf24e..ade8133efc461a40ba0bd2c69e88daecf7d1ca70 100644 (file)
@@ -232,6 +232,7 @@ define(["require", "exports", "tslib", "focus-trap", "../Core", "../Dom/Change/L
                 toggleMobileNavigation(message, quickOptions, navigation);
                 return false;
             },
+            setReturnFocus: quickOptions,
         });
         _focusTrap.activate();
     }