81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2023 Google Inc.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import {ARIAQueryHandler} from './AriaQueryHandler.js';
|
|
import {CSSQueryHandler} from './CSSQueryHandler.js';
|
|
import {customQueryHandlers} from './CustomQueryHandler.js';
|
|
import {PierceQueryHandler} from './PierceQueryHandler.js';
|
|
import {PQueryHandler} from './PQueryHandler.js';
|
|
import {parsePSelectors} from './PSelectorParser.js';
|
|
import type {QueryHandler} from './QueryHandler.js';
|
|
import {PollingOptions} from './QueryHandler.js';
|
|
import {TextQueryHandler} from './TextQueryHandler.js';
|
|
import {XPathQueryHandler} from './XPathQueryHandler.js';
|
|
|
|
const BUILTIN_QUERY_HANDLERS = {
|
|
aria: ARIAQueryHandler,
|
|
pierce: PierceQueryHandler,
|
|
xpath: XPathQueryHandler,
|
|
text: TextQueryHandler,
|
|
} as const;
|
|
|
|
const QUERY_SEPARATORS = ['=', '/'];
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
export function getQueryHandlerAndSelector(selector: string): {
|
|
updatedSelector: string;
|
|
polling: PollingOptions;
|
|
QueryHandler: typeof QueryHandler;
|
|
} {
|
|
for (const handlerMap of [
|
|
customQueryHandlers.names().map(name => {
|
|
return [name, customQueryHandlers.get(name)!] as const;
|
|
}),
|
|
Object.entries(BUILTIN_QUERY_HANDLERS),
|
|
]) {
|
|
for (const [name, QueryHandler] of handlerMap) {
|
|
for (const separator of QUERY_SEPARATORS) {
|
|
const prefix = `${name}${separator}`;
|
|
if (selector.startsWith(prefix)) {
|
|
selector = selector.slice(prefix.length);
|
|
return {
|
|
updatedSelector: selector,
|
|
polling:
|
|
name === 'aria' ? PollingOptions.RAF : PollingOptions.MUTATION,
|
|
QueryHandler,
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
try {
|
|
const [pSelector, isPureCSS, hasPseudoClasses, hasAria] =
|
|
parsePSelectors(selector);
|
|
if (isPureCSS) {
|
|
return {
|
|
updatedSelector: selector,
|
|
polling: hasPseudoClasses
|
|
? PollingOptions.RAF
|
|
: PollingOptions.MUTATION,
|
|
QueryHandler: CSSQueryHandler,
|
|
};
|
|
}
|
|
return {
|
|
updatedSelector: JSON.stringify(pSelector),
|
|
polling: hasAria ? PollingOptions.RAF : PollingOptions.MUTATION,
|
|
QueryHandler: PQueryHandler,
|
|
};
|
|
} catch {
|
|
return {
|
|
updatedSelector: selector,
|
|
polling: PollingOptions.MUTATION,
|
|
QueryHandler: CSSQueryHandler,
|
|
};
|
|
}
|
|
}
|