@@ -4,6 +4,26 @@ import { describe, expect, it } from 'vitest'
44import type { WakeLockSentinel } from '.'
55import { useWakeLock } from '.'
66
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+
727describe ( 'useWakeLock' , ( ) => {
828 it ( 'isActive not changed if not supported' , async ( ) => {
929 const { isActive, request, release } = useWakeLock ( { navigator : { } as Navigator } )
@@ -20,28 +40,13 @@ describe('useWakeLock', () => {
2040 } )
2141
2242 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 ( )
4146
4247 expect ( isActive . value ) . toBeFalsy ( )
4348
44- await request ( 'screen' )
49+ await forceRequest ( 'screen' )
4550
4651 expect ( isActive . value ) . toBeTruthy ( )
4752
@@ -51,23 +56,8 @@ describe('useWakeLock', () => {
5156 } )
5257
5358 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+
7161 const { isActive, request } = useWakeLock ( )
7262
7363 expect ( isActive . value ) . toBeFalsy ( )
@@ -83,4 +73,76 @@ describe('useWakeLock', () => {
8373
8474 expect ( isActive . value ) . toBeTruthy ( )
8575 } )
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+ } )
86148} )
0 commit comments