Skip to content

[Security Solution][Detection Engine][A11y] Announce shared exception list creation to screen readers#267588

Merged
hannahbrooks merged 6 commits into
elastic:mainfrom
hannahbrooks:247067-create-exception-list-announcement
May 6, 2026
Merged

[Security Solution][Detection Engine][A11y] Announce shared exception list creation to screen readers#267588
hannahbrooks merged 6 commits into
elastic:mainfrom
hannahbrooks:247067-create-exception-list-announcement

Conversation

@hannahbrooks
Copy link
Copy Markdown
Contributor

@hannahbrooks hannahbrooks commented May 4, 2026

Fixes #247067

When a shared exception list is created, the user is navigated to the detail page with no screen reader announcement.

Fix: pass the list name as router state on navigation; on the detail page, derive a message from that state and render it in EuiScreenReaderLive with focusRegionOnTextChange. The focusRegionOnTextChange prop is required - the default aria-live toggle path fails silently in VoiceOver+Safari (noted in EUI source). The component is conditionally rendered to avoid stealing focus on page mounts where no list was just created.

2026-05-04 15 13 39

hannahbrooks and others added 4 commits May 4, 2026 14:31
After creating a shared exception list, the user is navigated to the
detail page. An EuiScreenReaderLive region with focusRegionOnTextChange
announces the success message via explicit focus movement, which is
reliable across all browsers and screen readers including VoiceOver+Safari.

The default EuiScreenReaderLive live-region technique fails silently in
VoiceOver+Safari due to an aria-hidden/aria-live incompatibility in EUI.
focusRegionOnTextChange uses explicit focus movement instead. The component
is rendered conditionally to prevent focus being stolen to an empty element
on every page mount.

Closes elastic#247067

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ation

Replace useState/useEffect pattern with direct derivation from router
state, and add the missing SHARED_EXCEPTION_LIST_CREATED_SUCCESSFULLY
translation function.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@hannahbrooks hannahbrooks self-assigned this May 4, 2026
@hannahbrooks hannahbrooks changed the title [Security] Announce shared exception list creation to screen readers [Security Solution][Detection Engine] Announce shared exception list creation to screen readers May 4, 2026
@hannahbrooks hannahbrooks marked this pull request as ready for review May 4, 2026 19:14
@hannahbrooks hannahbrooks requested a review from a team as a code owner May 4, 2026 19:14
@hannahbrooks hannahbrooks requested a review from rylnd May 4, 2026 19:14
@hannahbrooks hannahbrooks added release_note:skip Skip the PR/issue when compiling release notes backport:all-open Backport to all branches that could still receive a release Team:Detection Engine Security Solution Detection Engine Area labels May 4, 2026
@infra-vault-gh-plugin-prod
Copy link
Copy Markdown

Pinging @elastic/security-detection-engine (Team:Detection Engine)

@hannahbrooks hannahbrooks changed the title [Security Solution][Detection Engine] Announce shared exception list creation to screen readers [Security Solution][Detection Engine][A11y] Announce shared exception list creation to screen readers May 4, 2026
Copy link
Copy Markdown
Contributor

@rylnd rylnd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! 🚢

@hannahbrooks hannahbrooks enabled auto-merge (squash) May 6, 2026 13:21
@kibanamachine
Copy link
Copy Markdown
Contributor

💚 Build Succeeded

Metrics [docs]

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
securitySolution 12.0MB 12.0MB +393.0B

History

cc @hannahbrooks

@hannahbrooks hannahbrooks merged commit 687055e into elastic:main May 6, 2026
31 checks passed
@kibanamachine
Copy link
Copy Markdown
Contributor

Starting backport for target branches: 8.19, 9.3, 9.4

https://github.com/elastic/kibana/actions/runs/25441033611

@kibanamachine
Copy link
Copy Markdown
Contributor

💚 All backports created successfully

Status Branch Result
8.19
9.3
9.4

Note: Successful backport PRs will be merged automatically after passing CI.

Questions ?

Please refer to the Backport tool documentation

kibanamachine added a commit that referenced this pull request May 6, 2026
…eption list creation to screen readers (#267588) (#267989)

# Backport

This will backport the following commits from `main` to `9.4`:
- [[Security Solution][Detection Engine][A11y] Announce shared exception
list creation to screen readers
(#267588)](#267588)

<!--- Backport version: 9.6.6 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Hannah
Brooks","email":"hannah.brooks@elastic.co"},"sourceCommit":{"committedDate":"2026-05-06T14:19:12Z","message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30","branchLabelMapping":{"^v9.5.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","backport:all-open","Team:Detection
Engine","v9.5.0"],"title":"[Security Solution][Detection Engine][A11y]
Announce shared exception list creation to screen
readers","number":267588,"url":"https://github.com/elastic/kibana/pull/267588","mergeCommit":{"message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.5.0","branchLabelMappingKey":"^v9.5.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/267588","number":267588,"mergeCommit":{"message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30"}}]}]
BACKPORT-->

Co-authored-by: Hannah Brooks <hannah.brooks@elastic.co>
kibanamachine added a commit that referenced this pull request May 6, 2026
…eption list creation to screen readers (#267588) (#267988)

# Backport

This will backport the following commits from `main` to `9.3`:
- [[Security Solution][Detection Engine][A11y] Announce shared exception
list creation to screen readers
(#267588)](#267588)

<!--- Backport version: 9.6.6 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Hannah
Brooks","email":"hannah.brooks@elastic.co"},"sourceCommit":{"committedDate":"2026-05-06T14:19:12Z","message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30","branchLabelMapping":{"^v9.5.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","backport:all-open","Team:Detection
Engine","v9.5.0"],"title":"[Security Solution][Detection Engine][A11y]
Announce shared exception list creation to screen
readers","number":267588,"url":"https://github.com/elastic/kibana/pull/267588","mergeCommit":{"message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.5.0","branchLabelMappingKey":"^v9.5.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/267588","number":267588,"mergeCommit":{"message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30"}}]}]
BACKPORT-->

Co-authored-by: Hannah Brooks <hannah.brooks@elastic.co>
ersin-erdal pushed a commit to ersin-erdal/kibana that referenced this pull request May 6, 2026
… list creation to screen readers (elastic#267588)

Fixes elastic#247067

When a shared exception list is created, the user is navigated to the
detail page with no screen reader announcement.

**Fix:** pass the list name as router state on navigation; on the detail
page, derive a message from that state and render it in
`EuiScreenReaderLive` with `focusRegionOnTextChange`. The
`focusRegionOnTextChange` prop is required - the default aria-live
toggle path fails silently in VoiceOver+Safari (noted in EUI source).
The component is conditionally rendered to avoid stealing focus on page
mounts where no list was just created.
@kibanamachine kibanamachine added the backport missing Added to PRs automatically when the are determined to be missing a backport. label May 7, 2026
@kibanamachine
Copy link
Copy Markdown
Contributor

Looks like this PR has backport PRs but they still haven't been merged. Please merge them ASAP to keep the branches relatively in sync.
cc: @hannahbrooks

kibanamachine added a commit that referenced this pull request May 7, 2026
…ception list creation to screen readers (#267588) (#267987)

# Backport

This will backport the following commits from `main` to `8.19`:
- [[Security Solution][Detection Engine][A11y] Announce shared exception
list creation to screen readers
(#267588)](#267588)

<!--- Backport version: 9.6.6 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Hannah
Brooks","email":"hannah.brooks@elastic.co"},"sourceCommit":{"committedDate":"2026-05-06T14:19:12Z","message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30","branchLabelMapping":{"^v9.5.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","backport:all-open","Team:Detection
Engine","v9.5.0"],"title":"[Security Solution][Detection Engine][A11y]
Announce shared exception list creation to screen
readers","number":267588,"url":"https://github.com/elastic/kibana/pull/267588","mergeCommit":{"message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.5.0","branchLabelMappingKey":"^v9.5.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/267588","number":267588,"mergeCommit":{"message":"[Security
Solution][Detection Engine][A11y] Announce shared exception list
creation to screen readers (#267588)\n\nFixes #247067\n\nWhen a shared
exception list is created, the user is navigated to the\ndetail page
with no screen reader announcement.\n\n**Fix:** pass the list name as
router state on navigation; on the detail\npage, derive a message from
that state and render it in\n`EuiScreenReaderLive` with
`focusRegionOnTextChange`. The\n`focusRegionOnTextChange` prop is
required - the default aria-live\ntoggle path fails silently in
VoiceOver+Safari (noted in EUI source).\nThe component is conditionally
rendered to avoid stealing focus on page\nmounts where no list was just
created.","sha":"687055eeafe64a82a3eeb91e2cca4a6c78f25e30"}}]}]
BACKPORT-->

Co-authored-by: Hannah Brooks <hannah.brooks@elastic.co>
@kibanamachine kibanamachine added v8.19.16 and removed backport missing Added to PRs automatically when the are determined to be missing a backport. labels May 7, 2026
@hannahbrooks hannahbrooks deleted the 247067-create-exception-list-announcement branch May 12, 2026 18:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport:all-open Backport to all branches that could still receive a release release_note:skip Skip the PR/issue when compiling release notes Team:Detection Engine Security Solution Detection Engine Area v8.19.16 v9.3.5 v9.4.0 v9.5.0

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Security:Shared Exception Lists]Missing announcement about changes on the page after creating shared exception list

3 participants