@@ -4,6 +4,26 @@ import { describe, expect, it } from 'vitest'
4
4
import type { WakeLockSentinel } from '.'
5
5
import { useWakeLock } from '.'
6
6
7
+ class MockWakeLockSentinel extends EventTarget {
8
+ released = false
9
+ release ( ) {
10
+ this . released = true
11
+ return Promise . resolve ( )
12
+ }
13
+ }
14
+ function defineWakeLockAPI ( ) {
15
+ const sentinel = new MockWakeLockSentinel ( )
16
+ Object . defineProperty ( navigator , 'wakeLock' , {
17
+ value : { request : async ( ) => sentinel as WakeLockSentinel } ,
18
+ writable : true ,
19
+ } )
20
+ return sentinel
21
+ }
22
+
23
+ class MockDocument extends EventTarget {
24
+ visibilityState = 'hidden'
25
+ }
26
+
7
27
describe ( 'useWakeLock' , ( ) => {
8
28
it ( 'isActive not changed if not supported' , async ( ) => {
9
29
const { isActive, request, release } = useWakeLock ( { navigator : { } as Navigator } )
@@ -20,28 +40,13 @@ describe('useWakeLock', () => {
20
40
} )
21
41
22
42
it ( 'isActive changed if supported' , async ( ) => {
23
- const createWakeLock = ( ) => {
24
- let _released = false
25
- return {
26
- get released ( ) {
27
- return _released
28
- } ,
29
- release : ( ) => {
30
- _released = true
31
- return Promise . resolve ( )
32
- } ,
33
- } as WakeLockSentinel
34
- }
35
-
36
- Object . defineProperty ( navigator , 'wakeLock' , {
37
- value : { request : ( ) => createWakeLock ( ) } ,
38
- writable : true ,
39
- } )
40
- const { isActive, request, release } = useWakeLock ( )
43
+ defineWakeLockAPI ( )
44
+
45
+ const { isActive, forceRequest, release } = useWakeLock ( )
41
46
42
47
expect ( isActive . value ) . toBeFalsy ( )
43
48
44
- await request ( 'screen' )
49
+ await forceRequest ( 'screen' )
45
50
46
51
expect ( isActive . value ) . toBeTruthy ( )
47
52
@@ -51,23 +56,8 @@ describe('useWakeLock', () => {
51
56
} )
52
57
53
58
it ( 'isActive changed if show other tabs or minimize window' , async ( ) => {
54
- const createWakeLock = ( ) => {
55
- let _released = false
56
- return {
57
- get released ( ) {
58
- return _released
59
- } ,
60
- release : ( ) => {
61
- _released = true
62
- return Promise . resolve ( )
63
- } ,
64
- } as WakeLockSentinel
65
- }
66
-
67
- Object . defineProperty ( navigator , 'wakeLock' , {
68
- value : { request : ( ) => createWakeLock ( ) } ,
69
- writable : true ,
70
- } )
59
+ defineWakeLockAPI ( )
60
+
71
61
const { isActive, request } = useWakeLock ( )
72
62
73
63
expect ( isActive . value ) . toBeFalsy ( )
@@ -83,4 +73,76 @@ describe('useWakeLock', () => {
83
73
84
74
expect ( isActive . value ) . toBeTruthy ( )
85
75
} )
76
+
77
+ it ( 'it should delay requesting if document is hidden' , async ( ) => {
78
+ defineWakeLockAPI ( )
79
+ const mockDocument = new MockDocument ( )
80
+
81
+ const { isActive, request } = useWakeLock ( { document : mockDocument as Document } )
82
+
83
+ await request ( 'screen' )
84
+
85
+ expect ( isActive . value ) . toBeFalsy ( )
86
+
87
+ mockDocument . visibilityState = 'visible'
88
+ mockDocument . dispatchEvent ( new Event ( 'visibilitychange' ) )
89
+
90
+ await nextTick ( )
91
+ await nextTick ( )
92
+
93
+ expect ( isActive . value ) . toBeTruthy ( )
94
+ } )
95
+
96
+ it ( 'it should cancel requesting if released is called before document become visible' , async ( ) => {
97
+ defineWakeLockAPI ( )
98
+ const mockDocument = new MockDocument ( )
99
+
100
+ const { isActive, request, release } = useWakeLock ( { document : mockDocument as Document } )
101
+
102
+ await request ( 'screen' )
103
+
104
+ expect ( isActive . value ) . toBeFalsy ( )
105
+
106
+ await release ( )
107
+
108
+ expect ( isActive . value ) . toBeFalsy ( )
109
+
110
+ mockDocument . visibilityState = 'visible'
111
+ mockDocument . dispatchEvent ( new Event ( 'visibilitychange' ) )
112
+
113
+ await nextTick ( )
114
+ await nextTick ( )
115
+
116
+ expect ( isActive . value ) . toBeFalsy ( )
117
+ } )
118
+
119
+ it ( 'it should be inactive if wake lock is released for some reasons' , async ( ) => {
120
+ const sentinel = defineWakeLockAPI ( )
121
+ const mockDocument = new MockDocument ( )
122
+ mockDocument . visibilityState = 'visible'
123
+
124
+ const { isActive, request } = useWakeLock ( { document : mockDocument as Document } )
125
+
126
+ await request ( 'screen' )
127
+
128
+ expect ( isActive . value ) . toBeTruthy ( )
129
+
130
+ mockDocument . visibilityState = 'hidden'
131
+ mockDocument . dispatchEvent ( new Event ( 'visibilitychange' ) )
132
+ sentinel . dispatchEvent ( new Event ( 'release' ) )
133
+
134
+ await nextTick ( )
135
+ await nextTick ( )
136
+
137
+ expect ( isActive . value ) . toBeFalsy ( )
138
+
139
+ mockDocument . visibilityState = 'visible'
140
+ mockDocument . dispatchEvent ( new Event ( 'visibilitychange' ) )
141
+ await request ( 'screen' )
142
+
143
+ await nextTick ( )
144
+ await nextTick ( )
145
+
146
+ expect ( isActive . value ) . toBeTruthy ( )
147
+ } )
86
148
} )
0 commit comments