From 87b4918d34f795d9952e4454b936af791e5a2264 Mon Sep 17 00:00:00 2001 From: David Langley Date: Wed, 27 Aug 2025 13:41:39 +0100 Subject: [PATCH] Make BaseDialog's div keyboard focusable and fix test. (#30631) * Make BaseDialog's div keyboard focusable and fix test. * Less weird test * Update snapshots * More snapshots --- src/components/views/dialogs/BaseDialog.tsx | 3 +++ test/unit-tests/__snapshots__/Terms-test.tsx.snap | 1 + .../__snapshots__/NewRecoveryMethodDialog-test.tsx.snap | 2 ++ .../structures/__snapshots__/MatrixChat-test.tsx.snap | 2 ++ .../components/views/dialogs/BaseDialog-test.tsx | 7 ++++++- .../dialogs/__snapshots__/ChangelogDialog-test.tsx.snap | 1 + .../__snapshots__/ConfirmRejectInviteDialog-test.tsx.snap | 1 + .../__snapshots__/ConfirmUserActionDialog-test.tsx.snap | 1 + .../dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap | 1 + .../views/dialogs/__snapshots__/ExportDialog-test.tsx.snap | 1 + .../dialogs/__snapshots__/FeedbackDialog-test.tsx.snap | 1 + .../views/dialogs/__snapshots__/LogoutDialog-test.tsx.snap | 3 +++ .../ManageRestrictedJoinRuleDialog-test.tsx.snap | 2 ++ .../ManualDeviceKeyVerificationDialog-test.tsx.snap | 1 + .../__snapshots__/MessageEditHistoryDialog-test.tsx.snap | 2 ++ .../dialogs/__snapshots__/ReportRoomDialog-test.tsx.snap | 1 + .../dialogs/__snapshots__/ServerPickerDialog-test.tsx.snap | 1 + .../views/dialogs/__snapshots__/ShareDialog-test.tsx.snap | 6 ++++++ .../dialogs/__snapshots__/UnpinAllDialog-test.tsx.snap | 1 + .../__snapshots__/UntrustedDeviceDialog-test.tsx.snap | 2 ++ .../__snapshots__/CreateSecretStorageDialog-test.tsx.snap | 3 +++ .../__snapshots__/ExportE2eKeysDialog-test.tsx.snap | 1 + .../__snapshots__/ImportE2eKeysDialog-test.tsx.snap | 1 + .../__snapshots__/RestoreKeyBackupDialog-test.tsx.snap | 7 +++++++ .../__snapshots__/SecurityRoomSettingsTab-test.tsx.snap | 2 ++ .../__snapshots__/AddExistingToSpaceDialog-test.tsx.snap | 1 + 26 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/BaseDialog.tsx b/src/components/views/dialogs/BaseDialog.tsx index 56f6d0c528..a946a44e91 100644 --- a/src/components/views/dialogs/BaseDialog.tsx +++ b/src/components/views/dialogs/BaseDialog.tsx @@ -145,6 +145,9 @@ export default class BaseDialog extends React.Component { const lockProps: Record = { "onKeyDown": this.onKeyDown, "role": "dialog", + // Allow the dialog to be keyboard focusable + // So the escape key handling works in more cases (say you select the header) + "tabIndex": -1, // This should point to a node describing the dialog. // If we were about to completely follow this recommendation we'd need to // make all the components relying on BaseDialog to be aware of it. diff --git a/test/unit-tests/__snapshots__/Terms-test.tsx.snap b/test/unit-tests/__snapshots__/Terms-test.tsx.snap index a35963cd51..7bd269d3ea 100644 --- a/test/unit-tests/__snapshots__/Terms-test.tsx.snap +++ b/test/unit-tests/__snapshots__/Terms-test.tsx.snap @@ -7,6 +7,7 @@ exports[`dialogTermsInteractionCallback should render a dialog with the expected class="" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
when key backup is disabled 1`] = ` class="mx_KeyBackupFailedDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
when key backup is enabled 1`] = ` class="mx_KeyBackupFailedDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
with an existing session onAction() room actions leave_r class="mx_QuestionDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
with an existing session onAction() room actions leave_r class="mx_QuestionDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
{ it("calls onFinished when Escape is pressed", async () => { const onFinished = jest.fn(); - render(); + const { container } = render(); + // Autolock's autofocus in the empty dialog is focusing on the close button and bringing up the tooltip + // So we either need to call escape twice(one for the tooltip and one for the dialog) or focus + // on the dialog first. + const dialog = container.querySelector('[role="dialog"]') as HTMLElement; + dialog?.focus(); await userEvent.keyboard("{Escape}"); expect(onFinished).toHaveBeenCalled(); }); diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/ChangelogDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/ChangelogDialog-test.tsx.snap index b38ccbc804..2801837059 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/ChangelogDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/ChangelogDialog-test.tsx.snap @@ -13,6 +13,7 @@ exports[` should fetch github proxy url for each repo with ol class="mx_QuestionDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >