luhn-generator
Version:
A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm
48 lines (45 loc) • 1.49 kB
JavaScript
import getRootNode from './get-root-node';
import visuallyContains from './visually-contains';
import { isShadowRoot } from '../../core/utils';
/**
* Get elements from point across shadow dom boundaries
* @method shadowElementsFromPoint
* @memberof axe.commons.dom
* @instance
* @param {Number} nodeX X coordinates of point
* @param {Number} nodeY Y coordinates of point
* @param {Object} [root] Shadow root or document root
* @return {Array}
*/
function shadowElementsFromPoint(nodeX, nodeY, root = document, i = 0) {
if (i > 999) {
throw new Error('Infinite loop detected');
}
return (
// IE can return null when there are no elements
Array.from(root.elementsFromPoint(nodeX, nodeY) || [])
// As of Chrome 66, elementFromPoint will return elements from parent trees.
// We only want to touch each tree once, so we're filtering out nodes on other trees.
.filter(nodes => getRootNode(nodes) === root)
.reduce((stack, elm) => {
if (isShadowRoot(elm)) {
const shadowStack = shadowElementsFromPoint(
nodeX,
nodeY,
elm.shadowRoot,
i + 1
);
stack = stack.concat(shadowStack);
// filter host nodes which get included regardless of overlap
// TODO: refactor multiline overlap checking inside shadow dom
if (stack.length && visuallyContains(stack[0], elm)) {
stack.push(elm);
}
} else {
stack.push(elm);
}
return stack;
}, [])
);
}
export default shadowElementsFromPoint;