@luminati-io/webdriverio8
Version:
Next-gen browser and mobile automation test framework for Node.js
271 lines • 24 kB
JavaScript
/* 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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