From f022f6ed0d716b4f4fd78478450f02ebfcf12a02 Mon Sep 17 00:00:00 2001 From: dvd233 <111864431+dvd233@users.noreply.github.com> Date: Fri, 11 Sep 2026 02:56:25 +0800 Subject: [PATCH 1/2] fix: scope ariaHideOutside to target document --- .../src/overlays/ariaHideOutside.ts | 2 +- .../test/overlays/ariaHideOutside.test.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/react-aria/src/overlays/ariaHideOutside.ts b/packages/react-aria/src/overlays/ariaHideOutside.ts index 66cc828ad2c..543e51127be 100644 --- a/packages/react-aria/src/overlays/ariaHideOutside.ts +++ b/packages/react-aria/src/overlays/ariaHideOutside.ts @@ -50,7 +50,7 @@ let observerStack: Array = []; export function ariaHideOutside(targets: Element[], options?: AriaHideOutsideOptions | Element) { let windowObj = getOwnerWindow(targets?.[0]); let opts = options instanceof windowObj.Element ? {root: options} : options; - let root = opts?.root ?? document.body; + let root = opts?.root ?? windowObj.document.body; let shouldUseInert = opts?.shouldUseInert && supportsInert; let visibleNodes = new Set(targets); let hiddenNodes = new Set(); diff --git a/packages/react-aria/test/overlays/ariaHideOutside.test.js b/packages/react-aria/test/overlays/ariaHideOutside.test.js index 737d8b8d4d9..abb692dbc39 100644 --- a/packages/react-aria/test/overlays/ariaHideOutside.test.js +++ b/packages/react-aria/test/overlays/ariaHideOutside.test.js @@ -49,6 +49,25 @@ describe('ariaHideOutside', function () { expect(() => getByRole('button')).not.toThrow(); }); + it('should use the target document as the default root', function () { + let iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + let iframeDocument = iframe.contentWindow.document; + iframeDocument.body.innerHTML = '
'; + let target = iframeDocument.getElementById('target'); + let outside = iframeDocument.getElementById('outside'); + + let revert = ariaHideOutside([target]); + + expect(outside).toHaveAttribute('aria-hidden', 'true'); + expect(target).not.toHaveAttribute('aria-hidden'); + expect(document.body).not.toHaveAttribute('aria-hidden'); + + revert(); + expect(outside).not.toHaveAttribute('aria-hidden'); + iframe.remove(); + }); + it('should hide everything except multiple elements', function () { let {getByRole, getAllByRole, queryByRole, queryAllByRole} = render( <> From f10b654ab2dd553f998d02df61160ecb21ca6b8b Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Wed, 16 Sep 2026 15:54:29 -0700 Subject: [PATCH 2/2] update test --- packages/react-aria/test/overlays/ariaHideOutside.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/react-aria/test/overlays/ariaHideOutside.test.js b/packages/react-aria/test/overlays/ariaHideOutside.test.js index abb692dbc39..abac6d02d90 100644 --- a/packages/react-aria/test/overlays/ariaHideOutside.test.js +++ b/packages/react-aria/test/overlays/ariaHideOutside.test.js @@ -51,7 +51,9 @@ describe('ariaHideOutside', function () { it('should use the target document as the default root', function () { let iframe = document.createElement('iframe'); + let iframeSibling = document.createElement('div'); document.body.appendChild(iframe); + document.body.appendChild(iframeSibling); let iframeDocument = iframe.contentWindow.document; iframeDocument.body.innerHTML = '
'; let target = iframeDocument.getElementById('target'); @@ -61,11 +63,14 @@ describe('ariaHideOutside', function () { expect(outside).toHaveAttribute('aria-hidden', 'true'); expect(target).not.toHaveAttribute('aria-hidden'); + expect(iframe).not.toHaveAttribute('aria-hidden'); + expect(iframeSibling).not.toHaveAttribute('aria-hidden'); expect(document.body).not.toHaveAttribute('aria-hidden'); revert(); expect(outside).not.toHaveAttribute('aria-hidden'); iframe.remove(); + iframeSibling.remove(); }); it('should hide everything except multiple elements', function () {