@@ -2,6 +2,10 @@ import { AccessibilityState, StyleSheet } from 'react-native';
2
2
import { ReactTestInstance } from 'react-test-renderer' ;
3
3
import { getHostSiblings } from './component-tree' ;
4
4
5
+ type IsInaccessibleOptions = {
6
+ cache ?: WeakMap < ReactTestInstance , boolean > ;
7
+ } ;
8
+
5
9
export type AccessibilityStateKey = keyof AccessibilityState ;
6
10
7
11
export const accessibilityStateKeys : AccessibilityStateKey [ ] = [
@@ -12,14 +16,24 @@ export const accessibilityStateKeys: AccessibilityStateKey[] = [
12
16
'expanded' ,
13
17
] ;
14
18
15
- export function isInaccessible ( element : ReactTestInstance | null ) : boolean {
19
+ export function isInaccessible (
20
+ element : ReactTestInstance | null ,
21
+ { cache } : IsInaccessibleOptions = { }
22
+ ) : boolean {
16
23
if ( element == null ) {
17
24
return true ;
18
25
}
19
26
20
27
let current : ReactTestInstance | null = element ;
21
28
while ( current ) {
22
- if ( isSubtreeInaccessible ( current ) ) {
29
+ let isCurrentSubtreeInaccessible = cache ?. get ( current ) ;
30
+
31
+ if ( isCurrentSubtreeInaccessible === undefined ) {
32
+ isCurrentSubtreeInaccessible = isSubtreeInaccessible ( current ) ;
33
+ cache ?. set ( current , isCurrentSubtreeInaccessible ) ;
34
+ }
35
+
36
+ if ( isCurrentSubtreeInaccessible ) {
23
37
return true ;
24
38
}
25
39
@@ -29,7 +43,9 @@ export function isInaccessible(element: ReactTestInstance | null): boolean {
29
43
return false ;
30
44
}
31
45
32
- function isSubtreeInaccessible ( element : ReactTestInstance | null ) : boolean {
46
+ export function isSubtreeInaccessible (
47
+ element : ReactTestInstance | null
48
+ ) : boolean {
33
49
if ( element == null ) {
34
50
return true ;
35
51
}
@@ -46,7 +62,7 @@ function isSubtreeInaccessible(element: ReactTestInstance | null): boolean {
46
62
return true ;
47
63
}
48
64
49
- // Note that `opacity: 0` is not threated as inassessible on iOS
65
+ // Note that `opacity: 0` is not treated as inaccessible on iOS
50
66
const flatStyle = StyleSheet . flatten ( element . props . style ) ?? { } ;
51
67
if ( flatStyle . display === 'none' ) return true ;
52
68
0 commit comments