UNPKG

@luminati-io/webdriverio8

Version:

Next-gen browser and mobile automation test framework for Node.js

271 lines 24 kB
/* eslint-disable brace-style */ /* eslint-disable camelcase */ /* istanbul ignore file */ /** * original source: https://github.com/Georgegriff/query-selector-shadow-dom * Copyright by https://github.com/Georgegriff */ export default function querySelectorAllDeep(findMany, s, r) { function normalizeSelector(sel) { // save unmatched text, if any function saveUnmatched() { if (unmatched) { // whitespace needed after combinator? if (tokens.length > 0 && /^[~+>]$/.test(tokens[tokens.length - 1])) { tokens.push(' '); } // save unmatched text tokens.push(unmatched); } } const tokens = [], state = [0], not_escaped_pattern = /(?:[^\\]|(?:^|[^\\])(?:\\\\)+)$/, whitespace_pattern = /^\s+$/, state_patterns = [ /\s+|\/\*|["'>~+[(]/g, // general /\s+|\/\*|["'[\]()]/g, // [..] set /\s+|\/\*|["'[\]()]/g, // (..) set null, // string literal (placeholder) /\*\//g, // comment ]; let match, unmatched, regex, next_match_idx = 0, prev_match_idx; sel = sel.trim(); // eslint-disable-next-line no-constant-condition while (true) { unmatched = ''; regex = state_patterns[state[state.length - 1]]; regex.lastIndex = next_match_idx; match = regex.exec(sel); // matched text to process? if (match) { prev_match_idx = next_match_idx; next_match_idx = regex.lastIndex; // collect the previous string chunk not matched before this token if (prev_match_idx < next_match_idx - match[0].length) { unmatched = sel.substring(prev_match_idx, next_match_idx - match[0].length); } // general, [ ] pair, ( ) pair? if (state[state.length - 1] < 3) { saveUnmatched(); // starting a [ ] pair? if (match[0] === '[') { state.push(1); } // starting a ( ) pair? else if (match[0] === '(') { state.push(2); } // starting a string literal? else if (/^["']$/.test(match[0])) { state.push(3); state_patterns[3] = new RegExp(match[0], 'g'); } // starting a comment? else if (match[0] === '/*') { state.push(4); } // ending a [ ] or ( ) pair? else if (/^[\])]$/.test(match[0]) && state.length > 0) { state.pop(); } // handling whitespace or a combinator? else if (/^(?:\s+|[~+>])$/.test(match[0])) { // need to insert whitespace before? if (tokens.length > 0 && !whitespace_pattern.test(tokens[tokens.length - 1]) && state[state.length - 1] === 0) { // add normalized whitespace tokens.push(' '); } // case-insensitive attribute selector CSS L4 if (state[state.length - 1] === 1 && tokens.length === 5 && tokens[2].charAt(tokens[2].length - 1) === '=') { tokens[4] = ' ' + tokens[4]; } // whitespace token we can skip? if (whitespace_pattern.test(match[0])) { continue; } } // save matched text tokens.push(match[0]); } // otherwise, string literal or comment else { // save unmatched text tokens[tokens.length - 1] += unmatched; // unescaped terminator to string literal or comment? if (not_escaped_pattern.test(tokens[tokens.length - 1])) { // comment terminator? if (state[state.length - 1] === 4) { // ok to drop comment? if (tokens.length < 2 || whitespace_pattern.test(tokens[tokens.length - 2])) { tokens.pop(); } // otherwise, turn comment into whitespace else { tokens[tokens.length - 1] = ' '; } // handled already match[0] = ''; } state.pop(); } // append matched text to existing token tokens[tokens.length - 1] += match[0]; } } // otherwise, end of processing (no more matches) else { unmatched = sel.substr(next_match_idx); saveUnmatched(); break; } } return tokens.join('').trim(); } function _querySelectorDeep(selector, root, allElements = null) { selector = normalizeSelector(selector); const lightElement = root.querySelector(selector); // @ts-expect-error createShadowRoot does not exist in head if (document.head.createShadowRoot || document.head.attachShadow) { // no need to do any special if selector matches something specific in light-dom if (!findMany && lightElement) { return lightElement; } // split on commas because those are a logical divide in the operation const selectionsToMake = splitByCharacterUnlessQuoted(selector, ','); return selectionsToMake.reduce((acc, minimalSelector) => { // if not finding many just reduce the first match if (!findMany && acc) { return acc; } // do best to support complex selectors and split the query const splitSelector = splitByCharacterUnlessQuoted(minimalSelector //remove white space at start of selector .replace(/^\s+/g, '') .replace(/\s*([>+~]+)\s*/g, '$1'), ' ') // filter out entry white selectors .filter((entry) => !!entry) // convert "a > b" to ["a", "b"] .map((entry) => splitByCharacterUnlessQuoted(entry, '>')); const possibleElementsIndex = splitSelector.length - 1; const lastSplitPart = splitSelector[possibleElementsIndex][splitSelector[possibleElementsIndex].length - 1]; const possibleElements = collectAllElementsDeep(lastSplitPart, root, allElements); const findElements = findMatchingElement(splitSelector, possibleElementsIndex, root); if (findMany) { acc = acc.concat(possibleElements.filter(findElements)); return acc; } acc = possibleElements.find(findElements); return acc || null; }, findMany ? [] : null); } return !findMany ? lightElement : root.querySelectorAll(selector); } function findMatchingElement(splitSelector, possibleElementsIndex, root) { return (element) => { let position = possibleElementsIndex; let parent = element; let foundElement = false; while (parent && !isDocumentNode(parent)) { let foundMatch = true; if (splitSelector[position].length === 1) { foundMatch = parent.matches(splitSelector[position]); } else { // selector is in the format "a > b" // make sure a few parents match in order const reversedParts = ([]).concat(splitSelector[position]).reverse(); let newParent = parent; for (const part of reversedParts) { if (!newParent || !newParent.matches(part)) { foundMatch = false; break; } newParent = findParentOrHost(newParent, root); } } if (foundMatch && position === 0) { foundElement = true; break; } if (foundMatch) { position--; } parent = findParentOrHost(parent, root); } return foundElement; }; } function splitByCharacterUnlessQuoted(selector, character) { return selector.match(/\\?.|^$/g).reduce((p, c) => { if (c === '"' && !p.sQuote) { p.quote ^= 1; p.a[p.a.length - 1] += c; } else if (c === '\'' && !p.quote) { p.sQuote ^= 1; p.a[p.a.length - 1] += c; } else if (!p.quote && !p.sQuote && c === character) { p.a.push(''); } else { p.a[p.a.length - 1] += c; } return p; }, { a: [''] }).a; } /** * Checks if the node is a document node or not. * @param {Node} node * @returns {node is Document | DocumentFragment} */ function isDocumentNode(node) { return node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.DOCUMENT_NODE; } function findParentOrHost(element, root) { const parentNode = element.parentNode; // @ts-expect-error return (parentNode && parentNode.host && parentNode.nodeType === 11) // @ts-expect-error ? parentNode.host : parentNode === root ? null : parentNode; } /** * Finds all elements on the page, inclusive of those within shadow roots. * @param {string=} selector Simple selector to filter the elements by. e.g. 'a', 'div.main' * @return {!Array<string>} List of anchor hrefs. * @author ebidel@ (Eric Bidelman) * License Apache-2.0 */ function collectAllElementsDeep(selector = null, root, cachedElements = null) { let allElements = []; if (cachedElements) { allElements = cachedElements; } else { const findAllElements = function (nodes) { for (let i = 0; i < nodes.length; i++) { const el = nodes[i]; allElements.push(el); // If the element has a shadow root, dig deeper. if (el.shadowRoot) { findAllElements(el.shadowRoot.querySelectorAll('*')); } } }; if (root.shadowRoot) { findAllElements(root.shadowRoot?.querySelectorAll('*')); } findAllElements(root.querySelectorAll('*')); } return selector ? allElements.filter(el => el.matches(selector)) : allElements; } return _querySelectorDeep(s, r || document); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnlTZWxlY3RvclNoYWRvd0RvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90aGlyZFBhcnR5L3F1ZXJ5U2VsZWN0b3JTaGFkb3dEb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0NBQWdDO0FBQ2hDLDhCQUE4QjtBQUM5QiwwQkFBMEI7QUFDMUI7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxvQkFBb0IsQ0FBRSxRQUFpQixFQUFFLENBQVMsRUFBRSxDQUFxQjtJQUM3RixTQUFTLGlCQUFpQixDQUFFLEdBQVc7UUFDbkMsOEJBQThCO1FBQzlCLFNBQVMsYUFBYTtZQUNsQixJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNaLHNDQUFzQztnQkFDdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDcEIsQ0FBQztnQkFFRCxzQkFBc0I7Z0JBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBYSxFQUFFLEVBQ3ZCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNYLG1CQUFtQixHQUFHLGlDQUFpQyxFQUN2RCxrQkFBa0IsR0FBRyxPQUFPLEVBQzVCLGNBQWMsR0FBRztZQUNiLHFCQUFxQixFQUFFLFVBQVU7WUFDakMscUJBQXFCLEVBQUUsV0FBVztZQUNsQyxxQkFBcUIsRUFBRSxXQUFXO1lBQ2xDLElBQUksRUFBRSwrQkFBK0I7WUFDckMsT0FBTyxFQUFFLFVBQVU7U0FDVixDQUFBO1FBQ2pCLElBQUksS0FBSyxFQUNMLFNBQWlCLEVBQ2pCLEtBQWEsRUFDYixj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