OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <meta charset="utf-8"> | |
3 <title>NavigationPreloadManager.getState</title> | |
4 <script src="../../resources/testharness.js"></script> | |
5 <script src="../../resources/testharnessreport.js"></script> | |
6 <script src="../resources/test-helpers.js"></script> | |
7 <script src="resources/helpers.js"></script> | |
8 <body> | |
9 <script> | |
10 function post_and_wait_for_reply(worker, message) { | |
11 return new Promise(resolve => { | |
12 navigator.serviceWorker.onmessage = e => { resolve(e.data); }; | |
13 worker.postMessage(message); | |
14 }); | |
15 } | |
16 | |
17 promise_test(t => { | |
18 const scope = '../resources/get-state'; | |
19 const script = '../resources/empty-worker.js'; | |
20 var np; | |
21 | |
22 return service_worker_unregister_and_register(t, script, scope) | |
23 .then(r => { | |
24 np = r.navigationPreload; | |
25 add_completion_callback(() => r.unregister()); | |
26 return wait_for_state(t, r.installing, 'activated'); | |
27 }) | |
28 .then(() => np.getState()) | |
29 .then(state => { | |
30 expect_navigation_preload_state(state, false, 'true', 'default state'); | |
31 return np.enable(); | |
32 }) | |
33 .then(result => { | |
34 assert_equals(result, undefined, | |
35 'enable() should resolve to undefined'); | |
36 return np.getState(); | |
37 }) | |
38 .then(state => { | |
39 expect_navigation_preload_state(state, true, 'true', | |
40 'state after enable()'); | |
41 return np.disable(); | |
42 }) | |
43 .then(result => { | |
44 assert_equals(result, undefined, | |
45 'disable() should resolve to undefined'); | |
46 return np.getState(); | |
47 }) | |
48 .then(state => { | |
49 expect_navigation_preload_state(state, false, 'true', | |
50 'state after disable()'); | |
51 return np.setHeaderValue('dreams that cannot be'); | |
52 }) | |
53 .then(result => { | |
54 assert_equals(result, undefined, | |
55 'setHeaderValue() should resolve to undefined'); | |
56 return np.getState(); | |
57 }) | |
58 .then(state => { | |
59 expect_navigation_preload_state(state, false, 'dreams that cannot be', | |
60 'state after setHeaderValue()'); | |
61 return np.setHeaderValue('').then(() => np.getState()); | |
62 }) | |
63 .then(state => { | |
64 expect_navigation_preload_state(state, false, '', | |
65 'after setHeaderValue to empty string'); | |
66 return np.setHeaderValue(null).then(() => np.getState()); | |
67 }) | |
68 .then(state => { | |
69 expect_navigation_preload_state(state, false, 'null', | |
70 'after setHeaderValue to null'); | |
71 return promise_rejects(t, | |
72 new TypeError, | |
73 np.setHeaderValue('what\uDC00\uD800this'), | |
74 'setHeaderValue() should throw if passed surrogates'); | |
75 }) | |
76 .then(() => { | |
77 return promise_rejects(t, | |
78 new TypeError, | |
79 np.setHeaderValue('zer\0o'), | |
80 'setHeaderValue() should throw if passed \\0'); | |
81 }) | |
82 .then(() => { | |
83 return promise_rejects(t, | |
84 new TypeError, | |
85 np.setHeaderValue('\rcarriage'), | |
86 'setHeaderValue() should throw if passed \\r'); | |
87 }) | |
88 .then(() => { | |
89 return promise_rejects(t, | |
90 new TypeError, | |
91 np.setHeaderValue('newline\n'), | |
92 'setHeaderValue() should throw if passed \\n'); | |
93 }) | |
94 .then(() => { | |
95 return promise_rejects(t, | |
96 new TypeError, | |
97 np.setHeaderValue(), | |
98 'setHeaderValue() should throw if passed undefined'); | |
99 }) | |
100 .then(() => np.enable().then(() => np.getState())) | |
101 .then(state => { | |
102 expect_navigation_preload_state(state, true, 'null', | |
103 'enable() should not change header'); | |
104 }); | |
105 }, 'getState'); | |
106 | |
107 // This test sends commands to a worker to call enable()/disable()/getState(). | |
108 // It checks the results from the worker and verifies that they match the | |
109 // navigation preload state accessible from the page. | |
110 promise_test(t => { | |
111 const scope = 'resources/get-state-worker'; | |
112 const script = 'resources/get-state-worker.js'; | |
113 var worker; | |
114 var registration; | |
115 | |
116 return service_worker_unregister_and_register(t, script, scope) | |
117 .then(r => { | |
118 registration = r; | |
119 add_completion_callback(() => registration.unregister()); | |
120 worker = registration.installing; | |
121 return wait_for_state(t, worker, 'activated'); | |
122 }) | |
123 .then(() => { | |
124 // Call getState(). | |
125 return post_and_wait_for_reply(worker, 'getState'); | |
126 }) | |
127 .then(data => { | |
128 return Promise.all([data, registration.navigationPreload.getState()]); | |
129 }) | |
130 .then(states => { | |
131 expect_navigation_preload_state(states[0], false, 'true', | |
132 'default state (from worker)'); | |
133 expect_navigation_preload_state(states[1], false, 'true', | |
134 'default state (from page)'); | |
135 // Call enable() and then getState(). | |
136 return post_and_wait_for_reply(worker, 'enable'); | |
137 }) | |
138 .then(data => { | |
139 assert_equals(data, undefined, 'enable() should resolve to undefined'); | |
140 return Promise.all([ | |
141 post_and_wait_for_reply(worker, 'getState'), | |
142 registration.navigationPreload.getState() | |
143 ]); | |
144 }) | |
145 .then(states => { | |
146 expect_navigation_preload_state(states[0], true, 'true', | |
147 'state after enable() (from worker)'); | |
148 expect_navigation_preload_state(states[1], true, 'true', | |
149 'state after enable() (from page)'); | |
150 // Call disable() and then getState(). | |
151 return post_and_wait_for_reply(worker, 'disable'); | |
152 }) | |
153 .then(data => { | |
154 assert_equals(data, undefined, | |
155 '.disable() should resolve to undefined'); | |
156 return Promise.all([ | |
157 post_and_wait_for_reply(worker, 'getState'), | |
158 registration.navigationPreload.getState() | |
159 ]); | |
160 }) | |
161 .then(states => { | |
162 expect_navigation_preload_state(states[0], false, 'true', | |
163 'state after disable() (from worker)'); | |
164 expect_navigation_preload_state(states[1], false, 'true', | |
165 'state after disable() (from page)'); | |
166 return post_and_wait_for_reply(worker, 'setHeaderValue'); | |
167 }) | |
168 .then(data => { | |
169 assert_equals(data, undefined, | |
170 '.setHeaderValue() should resolve to undefined'); | |
171 return Promise.all([ | |
172 post_and_wait_for_reply(worker, 'getState'), | |
173 registration.navigationPreload.getState()]); | |
174 }) | |
175 .then(states => { | |
176 expect_navigation_preload_state( | |
177 states[0], false, 'insightful', | |
178 'state after setHeaderValue() (from worker)'); | |
179 expect_navigation_preload_state( | |
180 states[1], false, 'insightful', | |
181 'state after setHeaderValue() (from page)'); | |
182 }); | |
183 }, 'getState from a worker'); | |
184 | |
185 // This tests navigation preload API when there is no active worker. It calls | |
186 // the API from the main page and then from the worker itself. | |
187 promise_test(t => { | |
188 const scope = 'resources/wait-for-activate-worker'; | |
189 const script = 'resources/wait-for-activate-worker.js'; | |
190 var registration; | |
191 var np; | |
192 return service_worker_unregister_and_register(t, script, scope) | |
193 .then(r => { | |
194 registration = r; | |
195 np = registration.navigationPreload; | |
196 add_completion_callback(() => registration.unregister()); | |
197 return Promise.all([ | |
198 promise_rejects( | |
199 t, 'InvalidStateError', np.enable(), | |
200 'enable should reject if there is no active worker'), | |
201 promise_rejects( | |
202 t, 'InvalidStateError', np.disable(), | |
203 'disable should reject if there is no active worker'), | |
204 promise_rejects( | |
205 t, 'InvalidStateError', np.setHeaderValue('umm'), | |
206 'setHeaderValue should reject if there is no active worker')]); | |
207 }) | |
208 .then(() => np.getState()) | |
209 .then(state => { | |
210 expect_navigation_preload_state(state, false, 'true', | |
211 'state before activation'); | |
212 return post_and_wait_for_reply(registration.installing, 'ping'); | |
213 }) | |
214 .then(result => assert_equals(result, 'PASS')); | |
215 }, 'no active worker'); | |
216 </script> | |
217 </body> | |
OLD | NEW |