UNPKG

1.9 kBJavaScriptView Raw
1export function findTooltip(selectorOrElement, { targetSelector, multiple = false } = {}) {
2 if (!selectorOrElement) { // In case of passing null, undefined, etc
3 selectorOrElement = '.ember-tooltip, .ember-popover';
4 }
5
6 /* We querySelect tooltips from body instead of using ember-test-helper's
7 find() method because tooltips and popovers are often rendered as
8 children of <body> instead of children of the targetElement */
9
10 const { body } = document;
11 let tooltips = typeof selectorOrElement === 'string' ? body.querySelectorAll(selectorOrElement) : [selectorOrElement];
12
13 tooltips = [].slice.call(tooltips).map((tooltip) => getActualTooltip(tooltip, targetSelector)).filter((el) => el);
14
15 if (tooltips.length > 1) {
16 console.warn(`ember-tooltips/test-support/dom/find-tooltip: Multiple tooltips were found. Consider passing a selector '.specific-tooltip-class'`);
17 }
18
19 if (multiple) {
20 return tooltips;
21 }
22
23 let tooltip = tooltips[0];
24
25 if (tooltip && !tooltip.classList.contains('ember-tooltip') && !tooltip.classList.contains('ember-popover')) {
26 throw new Error(`getTooltipFromBody(): returned an element that is not a tooltip`);
27 }
28
29 return tooltip;
30}
31
32export default findTooltip;
33
34function getActualTooltip(tooltip, targetSelector) {
35 if (tooltip && tooltip.classList.contains('ember-tooltip-base')) {
36 /* If what we find is the actually the tooltip component's element, we can
37 * look up the intended tooltip by the element referenced by its target
38 * element's aria-describedby attribute.
39 */
40 const target = tooltip.closest('.ember-tooltip-target, .ember-popover-target');
41
42 // If a targetSelector is specified, filter by it
43 if (!target || (targetSelector && !target.matches(targetSelector))) {
44 return null;
45 }
46
47 tooltip = document.body.querySelector(`#${target.getAttribute('aria-describedby')}`);
48 }
49
50 return tooltip;
51}