1
- import { getNodeFromTree , memoize } from '../../core/utils' ;
1
+ import { getNodeFromTree } from '../../core/utils' ;
2
2
import { sanitize } from '../text' ;
3
3
import { getIntersectionRect , getRectCenter , isPointInRect } from '../math' ;
4
4
import getOverflowHiddenAncestors from './get-overflow-hidden-ancestors' ;
@@ -11,74 +11,70 @@ import cache from '../../core/base/cache';
11
11
* @instance
12
12
* @param {Element } node
13
13
*/
14
- const getVisibleChildTextRects = memoize (
15
- function getVisibleChildTextRectsMemoized (
16
- node ,
14
+ const getVisibleChildTextRects = ( node , options = { } ) => {
15
+ const {
17
16
checkTextRectOutsideNodeBoundingRect = false ,
18
- checkIsOutsideNodeBounds = true ,
19
- includeOverflowHiddenRect = false
20
- ) {
21
- const vNode = getNodeFromTree ( node ) ;
22
- const nodeRect = vNode . boundingClientRect ;
23
- const clientRects = [ ] ;
24
- const overflowHiddenNodes = getOverflowHiddenAncestors ( vNode ) ;
25
-
26
- node . childNodes . forEach ( textNode => {
27
- if ( textNode . nodeType !== 3 || sanitize ( textNode . nodeValue ) === '' ) {
28
- return ;
29
- }
30
-
31
- const contentRects = getContentRects ( textNode ) ;
32
- if ( checkIsOutsideNodeBounds ) {
33
- if (
34
- isOutsideNodeBounds (
35
- contentRects ,
36
- nodeRect ,
37
- checkTextRectOutsideNodeBoundingRect
38
- ) &&
39
- ! cache . get ( 'ruleId' )
40
- ) {
41
- return ;
42
- }
43
- }
17
+ includeOutsideBounds = true ,
18
+ includeOverflowHidden = false ,
19
+ checkNoVisibleRectsIdentified = false
20
+ } = options ;
21
+ const vNode = getNodeFromTree ( node ) ;
22
+ const nodeRect = vNode . boundingClientRect ;
23
+ const clientRects = [ ] ;
24
+ const overflowHiddenNodes = getOverflowHiddenAncestors ( vNode ) ;
44
25
45
- if ( includeOverflowHiddenRect ) {
46
- clientRects . push ( ...filterHiddenRects ( contentRects , [ ] ) ) ;
47
- } else {
48
- clientRects . push (
49
- ...filterHiddenRects ( contentRects , overflowHiddenNodes )
50
- ) ;
51
- }
52
- } ) ;
26
+ node . childNodes . forEach ( textNode => {
27
+ if ( textNode . nodeType !== 3 || sanitize ( textNode . nodeValue ) === '' ) {
28
+ return ;
29
+ }
53
30
54
- // a11y-engine-domforge change
31
+ const contentRects = getContentRects ( textNode ) ;
55
32
if (
56
- clientRects . length <= 0 &&
57
- cache . get ( 'ruleId' ) &&
58
- cache . get ( 'ruleId' ) === 'resize-2x-zoom' &&
59
- checkIsOutsideNodeBounds
33
+ includeOutsideBounds &&
34
+ isOutsideNodeBounds (
35
+ contentRects ,
36
+ nodeRect ,
37
+ checkTextRectOutsideNodeBoundingRect
38
+ ) &&
39
+ ! cache . get ( 'ruleId' )
60
40
) {
61
- return [ ] ;
41
+ return ;
62
42
}
63
- /**
64
- * if all text rects are larger than the bounds of the node,
65
- * or goes outside of the bounds of the node, we need to use
66
- * the nodes bounding rect so we stay within the bounds of the
67
- * element.
68
- *
69
- * @see https://github.com/dequelabs/axe-core/issues/2178
70
- * @see https://github.com/dequelabs/axe-core/issues/2483
71
- * @see https://github.com/dequelabs/axe-core/issues/2681
72
- *
73
- * also need to resize the nodeRect to fit within the bounds of any overflow: hidden ancestors.
74
- *
75
- * @see https://github.com/dequelabs/axe-core/issues/4253
76
- */
77
- return clientRects . length
78
- ? clientRects
79
- : filterHiddenRects ( [ nodeRect ] , overflowHiddenNodes ) ;
43
+
44
+ clientRects . push (
45
+ ...filterHiddenRects (
46
+ contentRects ,
47
+ includeOverflowHidden ? [ ] : overflowHiddenNodes
48
+ )
49
+ ) ;
50
+ } ) ;
51
+
52
+ // a11y-engine-domforge change
53
+ if (
54
+ clientRects . length <= 0 &&
55
+ ( ( cache . get ( 'ruleId' ) && cache . get ( 'ruleId' ) === 'resize-2x-zoom' ) ||
56
+ checkNoVisibleRectsIdentified )
57
+ ) {
58
+ return [ ] ;
80
59
}
81
- ) ;
60
+ /**
61
+ * if all text rects are larger than the bounds of the node,
62
+ * or goes outside of the bounds of the node, we need to use
63
+ * the nodes bounding rect so we stay within the bounds of the
64
+ * element.
65
+ *
66
+ * @see https://github.com/dequelabs/axe-core/issues/2178
67
+ * @see https://github.com/dequelabs/axe-core/issues/2483
68
+ * @see https://github.com/dequelabs/axe-core/issues/2681
69
+ *
70
+ * also need to resize the nodeRect to fit within the bounds of any overflow: hidden ancestors.
71
+ *
72
+ * @see https://github.com/dequelabs/axe-core/issues/4253
73
+ */
74
+ return clientRects . length
75
+ ? clientRects
76
+ : filterHiddenRects ( [ nodeRect ] , overflowHiddenNodes ) ;
77
+ } ;
82
78
export default getVisibleChildTextRects ;
83
79
84
80
function getContentRects ( node ) {
@@ -101,7 +97,9 @@ function isOutsideNodeBounds(
101
97
return rects . some ( rect => {
102
98
const centerPoint = getRectCenter ( rect ) ;
103
99
if ( checkTextRectOutsideNodeBoundingRect ) {
104
- ! isPointInRect ( centerPoint , nodeRect ) || rect . right > nodeRect . right ;
100
+ return (
101
+ ! isPointInRect ( centerPoint , nodeRect ) || rect . right > nodeRect . right
102
+ ) ;
105
103
} else {
106
104
return ! isPointInRect ( centerPoint , nodeRect ) ;
107
105
}
0 commit comments