Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PM-13184] Filter out specific-nodes within TreeWalker query #11415

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 48 additions & 3 deletions apps/browser/src/autofill/services/dom-query.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,27 @@
export class DomQueryService implements DomQueryServiceInterface {
private pageContainsShadowDom: boolean;
private useTreeWalkerStrategyFlagSet = true;
private ignoredTreeWalkerNodes = new Set([
"svg",
"script",
"noscript",
"head",
"style",
"link",
"meta",
"title",
"base",
"img",
"picture",
"video",
"audio",
"object",
"source",
"track",
"param",
"map",
"area",
]);

constructor() {
void this.init();
Expand All @@ -21,22 +42,36 @@
* @param treeWalkerFilter - The filter callback to use for the treeWalker query
* @param mutationObserver - The MutationObserver to use for observing shadow roots
* @param forceDeepQueryAttempt - Whether to force a deep query attempt
* @param ignoredTreeWalkerNodesOverride - An optional set of node names to ignore when using the treeWalker strategy
*/
query<T>(
root: Document | ShadowRoot | Element,
queryString: string,
treeWalkerFilter: CallableFunction,
mutationObserver?: MutationObserver,
forceDeepQueryAttempt?: boolean,
ignoredTreeWalkerNodesOverride?: Set<string>,
): T[] {
const ignoredTreeWalkerNodes = ignoredTreeWalkerNodesOverride || this.ignoredTreeWalkerNodes;

if (!forceDeepQueryAttempt && this.pageContainsShadowDomElements()) {
return this.queryAllTreeWalkerNodes<T>(root, treeWalkerFilter, mutationObserver);
return this.queryAllTreeWalkerNodes<T>(
root,
treeWalkerFilter,
ignoredTreeWalkerNodes,
mutationObserver,
);
}

try {
return this.deepQueryElements<T>(root, queryString, mutationObserver);
} catch {
return this.queryAllTreeWalkerNodes<T>(root, treeWalkerFilter, mutationObserver);
return this.queryAllTreeWalkerNodes<T>(

Check warning on line 69 in apps/browser/src/autofill/services/dom-query.service.ts

View check run for this annotation

Codecov / codecov/patch

apps/browser/src/autofill/services/dom-query.service.ts#L69

Added line #L69 was not covered by tests
root,
treeWalkerFilter,
ignoredTreeWalkerNodes,
mutationObserver,
);
}
}

Expand Down Expand Up @@ -207,11 +242,13 @@
* and returns a collection of nodes.
* @param rootNode
* @param filterCallback
* @param ignoredTreeWalkerNodes
* @param mutationObserver
*/
private queryAllTreeWalkerNodes<T>(
rootNode: Node,
filterCallback: CallableFunction,
ignoredTreeWalkerNodes: Set<string>,
mutationObserver?: MutationObserver,
): T[] {
const treeWalkerQueryResults: T[] = [];
Expand All @@ -220,6 +257,7 @@
rootNode,
treeWalkerQueryResults,
filterCallback,
ignoredTreeWalkerNodes,
mutationObserver,
);

Expand All @@ -233,15 +271,21 @@
* @param rootNode
* @param treeWalkerQueryResults
* @param filterCallback
* @param ignoredTreeWalkerNodes
* @param mutationObserver
*/
private buildTreeWalkerNodesQueryResults<T>(
rootNode: Node,
treeWalkerQueryResults: T[],
filterCallback: CallableFunction,
ignoredTreeWalkerNodes: Set<string>,
mutationObserver?: MutationObserver,
) {
const treeWalker = document?.createTreeWalker(rootNode, NodeFilter.SHOW_ELEMENT);
const treeWalker = document?.createTreeWalker(rootNode, NodeFilter.SHOW_ELEMENT, (node) =>
ignoredTreeWalkerNodes.has(node.nodeName?.toLowerCase())
? NodeFilter.FILTER_REJECT
: NodeFilter.FILTER_ACCEPT,
);
let currentNode = treeWalker?.currentNode;

while (currentNode) {
Expand All @@ -263,6 +307,7 @@
nodeShadowRoot,
treeWalkerQueryResults,
filterCallback,
ignoredTreeWalkerNodes,
mutationObserver,
);
}
Expand Down
Loading