Skip to content

Commit bf5db31

Browse files
committed
support '>' in selectors that span shadow roots
1 parent ff4d86b commit bf5db31

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

src/querySelectorDeep.js

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,14 @@ function _querySelectorDeep(selector, findMany, root, allElements = null) {
4848
//remove white space at start of selector
4949
.replace(/^\s+/g, '')
5050
.replace(/\s*([>+~]+)\s*/g, '$1'), ' ')
51-
// filter out entry white selectors
52-
.filter((entry) => !!entry);
51+
// filter out entry white selectors
52+
.filter((entry) => !!entry)
53+
// convert "a > b" to ["a", "b"]
54+
.map((entry) => splitByCharacterUnlessQuoted(entry, '>'));
55+
5356
const possibleElementsIndex = splitSelector.length - 1;
54-
const possibleElements = collectAllElementsDeep(splitSelector[possibleElementsIndex], root, allElements);
57+
const lastSplitPart = splitSelector[possibleElementsIndex][splitSelector[possibleElementsIndex].length - 1]
58+
const possibleElements = collectAllElementsDeep(lastSplitPart, root, allElements);
5559
const findElements = findMatchingElement(splitSelector, possibleElementsIndex, root);
5660
if (findMany) {
5761
acc = acc.concat(possibleElements.filter(findElements));
@@ -79,7 +83,23 @@ function findMatchingElement(splitSelector, possibleElementsIndex, root) {
7983
let parent = element;
8084
let foundElement = false;
8185
while (parent && !isDocumentNode(parent)) {
82-
const foundMatch = parent.matches(splitSelector[position]);
86+
let foundMatch = true
87+
if (splitSelector[position].length === 1) {
88+
foundMatch = parent.matches(splitSelector[position]);
89+
} else {
90+
// selector is in the format "a > b"
91+
// make sure a few parents match in order
92+
const reversedParts = ([]).concat(splitSelector[position]).reverse()
93+
let newParent = parent
94+
for (const part of reversedParts) {
95+
if (!newParent || !newParent.matches(part)) {
96+
foundMatch = false
97+
break
98+
}
99+
newParent = findParentOrHost(newParent, root);
100+
}
101+
}
102+
83103
if (foundMatch && position === 0) {
84104
foundElement = true;
85105
break;

0 commit comments

Comments
 (0)