From 685a906b939451977fe3edb6e6646a921ff450af Mon Sep 17 00:00:00 2001 From: Stefan Cameron Date: Wed, 20 Apr 2022 18:01:18 -0500 Subject: [PATCH] Shadow DOM support (v5.3.0) (#570) * chore(dev): declarative shadow root test fixtures - new development shadow-root-utils - refactor setupFixture to render using new utils - refactor current shadow dom tests to use declarative root - debug page renders shadow root fixtures correctly * feat: separate radio light/shadow dom groups * feat: detect display across shadow boundaries * feat: scan through shadow boundary - iterate down dom instead of query when getShadowRoot is provided - new candidate list/tree format with scoped lists * chore(types): added getShadowDom to types * fix: type of getShadowRoot option * test: add test to locate tabbable host * feat: slot elements are not focusable/tabbable * chore: added some jsdocs * refactor: modernize syntax - as requested in PR * Prepare for 5.3.0-beta.0 * 5.3.0-beta.0 * Adjusting code after #604 and comments * Disable shadow DOM for isFocusable/isTabbable if getShadowRoot not given This goes along with disabling it for `tabbable()` and `focusable()` when the option isn't given. * Clarify getShadowRoot must be set to enable shadow DOM support * Add support for `getShadowRoot: true` Note this is the equivalent of `getShadowRoot: () => false` which simply enables shadow DOM support for all open shadows. * Prepare for v5.3.0-beta.1 * 5.3.0-beta.1 * Add prepublishOnly script for manual publishing * fix(index.js) The tabIndex of audio, video and details was left to the default if set to some NaN (#610) * fix(index.js) The tabIndex of contentEditable elements was assumed to be zero in any case, not only in the case it was not specifically set. * Simplified and optimized 'getTabIndex'. * Made better use of short-circuit evaluation in 'isNodeMatchingSelectorTabbable', reducing the chances to call the computationally expensive 'isNodeMatchingSelectorFocusable'. * (Re)Added 'isScope' parameter to 'getTabIndex'. This parameter wasn't present in the master branch, so I lost it in the rebase process. * Added tests for a `contenteditable` with negative tab index. * Fixed bug, now the getTabIndex can return 0 not only when the tabindex is not explicitly set, but also when is set to a value that gives NaN when parsed as integer (which would have been resulted in the default browser tabIndex, as if the tabindex wasn't set at all). Also added test for the case an element has a tab index that can't be turned into an integer. * Added changeset, added entry in CHANGELOG.md and wrote more tests. * Be consistent with asterisks * Sync package.json/yarn.lock with beta-530 base branch Co-authored-by: Stefan Cameron * [#632] Add test for radios in a form (#638) Can't repro the issue, but might as well keep the test since we seem to like fieldsets but not forms for some reason. * Add changeset for shadow root support Co-authored-by: Ido Rosenthal Co-authored-by: DaviDevMod <98312056+DaviDevMod@users.noreply.github.com> --- .changeset/happy-zebras-attend.md | 5 + .changeset/shadow-root.md | 7 + CHANGELOG.md | 9 + README.md | 23 +- cypress/plugins/index.js | 2 + index.d.ts | 1 + package.json | 5 +- src/index.js | 305 ++++++++++++--- test/debug.js | 36 +- test/e2e/e2e.helpers.js | 28 +- test/e2e/focusable.e2e.js | 30 +- test/e2e/isFocusable.e2e.js | 38 +- test/e2e/isTabbable.e2e.js | 34 +- test/e2e/shadow-dom.e2e.js | 541 ++++++++++++++++++++++++++ test/e2e/tabbable.e2e.js | 35 +- test/fixtures/basic.html | 8 + test/fixtures/displayed.html | 13 +- test/fixtures/index.js | 12 + test/fixtures/radio.html | 18 +- test/fixtures/shadow-dom-display.html | 36 ++ test/fixtures/shadow-dom-query.html | 164 ++++++++ test/fixtures/shadow-dom-radio.html | 16 + test/fixtures/shadow-dom.html | 14 +- test/shadow-root-utils.js | 76 ++++ 24 files changed, 1319 insertions(+), 137 deletions(-) create mode 100644 .changeset/happy-zebras-attend.md create mode 100644 .changeset/shadow-root.md create mode 100644 test/e2e/shadow-dom.e2e.js create mode 100644 test/fixtures/shadow-dom-display.html create mode 100644 test/fixtures/shadow-dom-query.html create mode 100644 test/fixtures/shadow-dom-radio.html create mode 100644 test/shadow-root-utils.js diff --git a/.changeset/happy-zebras-attend.md b/.changeset/happy-zebras-attend.md new file mode 100644 index 00000000..43e1e08b --- /dev/null +++ b/.changeset/happy-zebras-attend.md @@ -0,0 +1,5 @@ +--- +'tabbable': patch +--- + +Fixed a bug in `getTabIndex`: the tab index of `