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,53 +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 ( node ) {
16
- const vNode = getNodeFromTree ( node ) ;
17
- const nodeRect = vNode . boundingClientRect ;
18
- const clientRects = [ ] ;
19
- const overflowHiddenNodes = getOverflowHiddenAncestors ( vNode ) ;
14
+ const getVisibleChildTextRects = ( node , options = { } ) => {
15
+ const {
16
+ checkTextRectOutsideNodeBoundingRect = false ,
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 ) ;
20
25
21
- node . childNodes . forEach ( textNode => {
22
- if ( textNode . nodeType !== 3 || sanitize ( textNode . nodeValue ) === '' ) {
23
- return ;
24
- }
25
-
26
- const contentRects = getContentRects ( textNode ) ;
27
- if ( isOutsideNodeBounds ( contentRects , nodeRect ) && ! cache . get ( 'ruleId' ) ) {
28
- return ;
29
- }
30
-
31
- clientRects . push ( ...filterHiddenRects ( contentRects , overflowHiddenNodes ) ) ;
32
- } ) ;
26
+ node . childNodes . forEach ( textNode => {
27
+ if ( textNode . nodeType !== 3 || sanitize ( textNode . nodeValue ) === '' ) {
28
+ return ;
29
+ }
33
30
34
- // a11y-engine-domforge change
31
+ const contentRects = getContentRects ( textNode ) ;
35
32
if (
36
- clientRects . length <= 0 &&
37
- cache . get ( 'ruleId' ) &&
38
- cache . get ( 'ruleId' ) === 'resize-2x-zoom'
33
+ includeOutsideBounds &&
34
+ isOutsideNodeBounds (
35
+ contentRects ,
36
+ nodeRect ,
37
+ checkTextRectOutsideNodeBoundingRect
38
+ ) &&
39
+ ( ! cache . get ( 'ruleId' ) || cache . get ( 'ruleId' ) === 'reflow-4x-zoom-scroll' )
39
40
) {
40
- return [ ] ;
41
+ return ;
41
42
}
42
- /**
43
- * if all text rects are larger than the bounds of the node,
44
- * or goes outside of the bounds of the node, we need to use
45
- * the nodes bounding rect so we stay within the bounds of the
46
- * element.
47
- *
48
- * @see https://github.com/dequelabs/axe-core/issues/2178
49
- * @see https://github.com/dequelabs/axe-core/issues/2483
50
- * @see https://github.com/dequelabs/axe-core/issues/2681
51
- *
52
- * also need to resize the nodeRect to fit within the bounds of any overflow: hidden ancestors.
53
- *
54
- * @see https://github.com/dequelabs/axe-core/issues/4253
55
- */
56
- return clientRects . length
57
- ? clientRects
58
- : 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 [ ] ;
59
59
}
60
- ) ;
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
+ } ;
61
78
export default getVisibleChildTextRects ;
62
79
63
80
function getContentRects ( node ) {
@@ -72,10 +89,20 @@ function getContentRects(node) {
72
89
* when determining the rect stack we will also use the midpoint
73
90
* of the text rect to determine out of bounds
74
91
*/
75
- function isOutsideNodeBounds ( rects , nodeRect ) {
92
+ function isOutsideNodeBounds (
93
+ rects ,
94
+ nodeRect ,
95
+ checkTextRectOutsideNodeBoundingRect = false
96
+ ) {
76
97
return rects . some ( rect => {
77
98
const centerPoint = getRectCenter ( rect ) ;
78
- return ! isPointInRect ( centerPoint , nodeRect ) ;
99
+ if ( checkTextRectOutsideNodeBoundingRect ) {
100
+ return (
101
+ ! isPointInRect ( centerPoint , nodeRect ) || rect . right > nodeRect . right
102
+ ) ;
103
+ } else {
104
+ return ! isPointInRect ( centerPoint , nodeRect ) ;
105
+ }
79
106
} ) ;
80
107
}
81
108
0 commit comments