Skip to content

Commit 9fd3353

Browse files
committed
feat: get truly deepest element
1 parent b45ec17 commit 9fd3353

File tree

1 file changed

+49
-53
lines changed

1 file changed

+49
-53
lines changed

src/helpers/clientSelectorGenerator.ts

Lines changed: 49 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4080,67 +4080,63 @@ class ClientSelectorGenerator {
40804080
}
40814081

40824082
private getDeepestElementFromPoint(
4083-
elements: HTMLElement[],
4084-
x: number,
4085-
y: number
4086-
): HTMLElement | null {
4087-
if (!elements.length) return null;
4088-
4089-
const visited = new Set<HTMLElement>();
4090-
return this.findDeepestElementRecursive(elements, x, y, visited);
4091-
}
4092-
4093-
private findDeepestElementRecursive(
4094-
elements: HTMLElement[],
4095-
x: number,
4096-
y: number,
4097-
visited: Set<HTMLElement>
4098-
): HTMLElement | null {
4099-
if (!elements.length) return null;
4100-
4101-
for (const element of elements) {
4102-
if (visited.has(element)) continue;
4103-
visited.add(element);
4104-
4105-
if (element.shadowRoot) {
4106-
let shadowElements = element.shadowRoot.elementsFromPoint(
4107-
x,
4108-
y
4109-
) as HTMLElement[];
4110-
4111-
if (shadowElements.length > 0) {
4112-
let deepestShadowElement = shadowElements[0];
4113-
4114-
if (deepestShadowElement.shadowRoot) {
4115-
const evenDeeperElement = this.findDeepestElementRecursive(
4116-
[deepestShadowElement],
4117-
x,
4118-
y,
4119-
visited
4120-
);
4121-
if (evenDeeperElement) {
4122-
return evenDeeperElement;
4123-
}
4124-
}
4083+
elements: HTMLElement[],
4084+
x: number,
4085+
y: number
4086+
): HTMLElement | null {
4087+
if (!elements.length) return null;
4088+
4089+
const visited = new Set<HTMLElement>();
4090+
return this.findTrulyDeepestElement(elements, x, y, visited);
4091+
}
41254092

4126-
return deepestShadowElement;
4093+
private findTrulyDeepestElement(
4094+
elements: HTMLElement[],
4095+
x: number,
4096+
y: number,
4097+
visited: Set<HTMLElement>
4098+
): HTMLElement | null {
4099+
let deepestElement: HTMLElement | null = null;
4100+
let maxDepth = -1;
4101+
4102+
for (const element of elements) {
4103+
if (visited.has(element)) continue;
4104+
visited.add(element);
4105+
4106+
if (element.shadowRoot) {
4107+
const shadowElements = element.shadowRoot.elementsFromPoint(x, y) as HTMLElement[];
4108+
const deeper = this.findTrulyDeepestElement(shadowElements, x, y, visited);
4109+
if (deeper) {
4110+
const depth = this.getElementDepth(deeper);
4111+
if (depth > maxDepth) {
4112+
maxDepth = depth;
4113+
deepestElement = deeper;
41274114
}
41284115
}
41294116
}
41304117

4131-
return elements[0];
4118+
const depth = this.getElementDepth(element);
4119+
if (depth > maxDepth) {
4120+
maxDepth = depth;
4121+
deepestElement = element;
4122+
}
41324123
}
41334124

4134-
private getElementDepth(element: HTMLElement): number {
4135-
let depth = 0;
4136-
let current = element;
4137-
while (current && current !== this.lastAnalyzedDocument?.body) {
4138-
depth++;
4139-
current = current.parentElement as HTMLElement;
4140-
if (depth > 50) break;
4141-
}
4142-
return depth;
4125+
return deepestElement;
4126+
}
4127+
4128+
private getElementDepth(element: HTMLElement): number {
4129+
let depth = 0;
4130+
let current: HTMLElement | null = element;
4131+
4132+
while (current && current !== this.lastAnalyzedDocument?.body) {
4133+
depth++;
4134+
current = current.parentElement || (current.getRootNode() as ShadowRoot).host as HTMLElement | null;
4135+
if (depth > 50) break;
41434136
}
4137+
return depth;
4138+
}
4139+
41444140

41454141
/**
41464142
* Clean up when component unmounts or mode changes

0 commit comments

Comments
 (0)