diff --git a/.changeset/ten-beers-end.md b/.changeset/ten-beers-end.md new file mode 100644 index 000000000..0c2c9b376 --- /dev/null +++ b/.changeset/ten-beers-end.md @@ -0,0 +1,5 @@ +--- +'@lion/core': patch +--- + +Ordering aria elements according to dom structure in all browsers diff --git a/packages/form-core/src/utils/getAriaElementsInRightDomOrder.js b/packages/form-core/src/utils/getAriaElementsInRightDomOrder.js index 31d50d272..0524b3a00 100644 --- a/packages/form-core/src/utils/getAriaElementsInRightDomOrder.js +++ b/packages/form-core/src/utils/getAriaElementsInRightDomOrder.js @@ -1,5 +1,12 @@ +/* eslint-disable no-bitwise */ import { browserDetection } from '@lion/core'; +const moveDownConditions = [ + Node.DOCUMENT_POSITION_PRECEDING, + Node.DOCUMENT_POSITION_CONTAINS, + Node.DOCUMENT_POSITION_CONTAINS | Node.DOCUMENT_POSITION_PRECEDING, +]; + /** * @desc Let the order of adding ids to aria element by DOM order, so that the screen reader * respects visual order when reading: @@ -19,8 +26,9 @@ export function getAriaElementsInRightDomOrder(descriptionElements, { reverse } const putPrecedingSiblingsAndLocalParentsFirst = (a, b) => { // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition const pos = a.compareDocumentPosition(b); + // Unfortunately, for IE, we have to switch the order (?) - if (pos === Node.DOCUMENT_POSITION_PRECEDING || pos === Node.DOCUMENT_POSITION_CONTAINED_BY) { + if (moveDownConditions.includes(pos)) { return browserDetection.isIE11 ? -1 : 1; } return browserDetection.isIE11 ? 1 : -1; diff --git a/packages/form-core/test/utils/getAriaElementsInRightDomOrder.test.js b/packages/form-core/test/utils/getAriaElementsInRightDomOrder.test.js index 110d4ecc6..0607f36eb 100644 --- a/packages/form-core/test/utils/getAriaElementsInRightDomOrder.test.js +++ b/packages/form-core/test/utils/getAriaElementsInRightDomOrder.test.js @@ -12,6 +12,7 @@ describe('getAriaElementsInRightDomOrder', () => {
+
@@ -19,10 +20,10 @@ describe('getAriaElementsInRightDomOrder', () => { `); // eslint-disable-next-line no-unused-vars - const [a, _1, b, _2, bChild, _3, c, _4] = Array.from(el.querySelectorAll('div')); - const unorderedNodes = [bChild, c, a, b]; + const [a, _1, b, _2, bChild, child2, _3, c, _4] = Array.from(el.querySelectorAll('div')); + const unorderedNodes = [bChild, c, a, b, child2]; const result = getAriaElementsInRightDomOrder(unorderedNodes); - expect(result).to.eql([a, b, bChild, c]); + expect(result).to.eql([a, b, bChild, child2, c]); }); it('can order reversely', async () => {