| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <meta charset="utf-8"> | 2 <meta charset="utf-8"> |
| 3 <title>NavigationPreloadManager.getState</title> | 3 <title>NavigationPreloadManager.getState</title> |
| 4 <script src="../../resources/testharness.js"></script> | 4 <script src="../../resources/testharness.js"></script> |
| 5 <script src="../../resources/testharnessreport.js"></script> | 5 <script src="../../resources/testharnessreport.js"></script> |
| 6 <script src="../resources/test-helpers.js"></script> | 6 <script src="../resources/test-helpers.js"></script> |
| 7 <body> | 7 <body> |
| 8 <script> | 8 <script> |
| 9 function post_and_wait_for_reply(worker, message) { | 9 function post_and_wait_for_reply(worker, message) { |
| 10 return new Promise(resolve => { | 10 return new Promise(resolve => { |
| 11 navigator.serviceWorker.onmessage = e => { resolve(e.data); }; | 11 navigator.serviceWorker.onmessage = e => { resolve(e.data); }; |
| 12 worker.postMessage(message); | 12 worker.postMessage(message); |
| 13 }); | 13 }); |
| 14 } | 14 } |
| 15 | 15 |
| 16 function expect_state(state, enabled, header, desc) { |
| 17 assert_equals(Object.keys(state).length, 2, desc + ': # of keys'); |
| 18 assert_equals(state.enabled, enabled, desc + ': enabled'); |
| 19 assert_equals(state.headerValue, header, desc + ': header'); |
| 20 } |
| 21 |
| 16 promise_test(t => { | 22 promise_test(t => { |
| 17 const scope = '../resources/getState'; | 23 const scope = '../resources/get-state'; |
| 18 const script = '../resources/empty-worker.js'; | 24 const script = '../resources/empty-worker.js'; |
| 19 var registration; | 25 var np; |
| 20 | 26 |
| 21 return service_worker_unregister_and_register(t, script, scope) | 27 return service_worker_unregister_and_register(t, script, scope) |
| 22 .then(r => { | 28 .then(r => { |
| 23 registration = r; | 29 np = r.navigationPreload; |
| 24 add_completion_callback(() => registration.unregister()); | 30 add_completion_callback(() => r.unregister()); |
| 25 return registration.navigationPreload.getState(); | 31 return np.getState(); |
| 26 }) | 32 }) |
| 27 .then(state => { | 33 .then(state => { |
| 28 assert_equals(state.enabled, false, | 34 expect_state(state, false, 'true', 'default state'); |
| 29 '.enabled should be false by default'); | 35 return np.enable(); |
| 30 return registration.navigationPreload.enable(); | |
| 31 }) | 36 }) |
| 32 .then(() => registration.navigationPreload.getState()) | 37 .then(result => { |
| 38 assert_equals(result, undefined, |
| 39 'enable() should resolve to undefined'); |
| 40 return np.getState(); |
| 41 }) |
| 33 .then(state => { | 42 .then(state => { |
| 34 assert_equals(state.enabled, true, | 43 expect_state(state, true, 'true', 'state after enable()'); |
| 35 '.enabled should be true after enable()'); | 44 return np.disable(); |
| 36 return registration.navigationPreload.disable(); | |
| 37 }) | 45 }) |
| 38 .then(() => registration.navigationPreload.getState()) | 46 .then(result => { |
| 47 assert_equals(result, undefined, |
| 48 'disable() should resolve to undefined'); |
| 49 return np.getState(); |
| 50 }) |
| 39 .then(state => { | 51 .then(state => { |
| 40 assert_equals(state.enabled, false, | 52 expect_state(state, false, 'true', 'state after disable()'); |
| 41 '.enabled should be false after disable()'); | 53 return np.setHeaderValue('dreams that cannot be'); |
| 54 }) |
| 55 .then(result => { |
| 56 assert_equals(result, undefined, |
| 57 'setHeaderValue() should resolve to undefined'); |
| 58 return np.getState(); |
| 59 }) |
| 60 .then(state => { |
| 61 expect_state(state, false, 'dreams that cannot be', |
| 62 'state after setHeaderValue()'); |
| 63 return np.setHeaderValue('').then(() => np.getState()); |
| 64 }) |
| 65 .then(state => { |
| 66 expect_state(state, false, '', 'after setHeaderValue to empty string'); |
| 67 return np.setHeaderValue(null).then(() => np.getState()); |
| 68 }) |
| 69 .then(state => { |
| 70 expect_state(state, false, 'null', '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(() => np.enable().then(() => np.getState())) |
| 95 .then(state => { |
| 96 expect_state(state, true, 'null', 'enable() should not change header'); |
| 42 }); | 97 }); |
| 43 }, 'getState'); | 98 }, 'getState'); |
| 44 | 99 |
| 45 // This test sends commands to a worker to call enable()/disable()/getState(). | 100 // This test sends commands to a worker to call enable()/disable()/getState(). |
| 46 // It checks the results from the worker and verifies that they match the | 101 // It checks the results from the worker and verifies that they match the |
| 47 // navigation preload state accessible from the page. | 102 // navigation preload state accessible from the page. |
| 48 promise_test(t => { | 103 promise_test(t => { |
| 49 const scope = 'resources/getState-worker'; | 104 const scope = 'resources/get-state-worker'; |
| 50 const script = 'resources/get-state-worker.js'; | 105 const script = 'resources/get-state-worker.js'; |
| 51 var worker; | 106 var worker; |
| 52 var registration; | 107 var registration; |
| 53 | 108 |
| 54 return service_worker_unregister_and_register(t, script, scope) | 109 return service_worker_unregister_and_register(t, script, scope) |
| 55 .then(r => { | 110 .then(r => { |
| 56 registration = r; | 111 registration = r; |
| 57 add_completion_callback(() => registration.unregister()); | 112 add_completion_callback(() => registration.unregister()); |
| 58 worker = registration.installing; | 113 worker = registration.installing; |
| 59 // Call getState(). | 114 // Call getState(). |
| 60 return post_and_wait_for_reply(worker, 'getState'); | 115 return post_and_wait_for_reply(worker, 'getState'); |
| 61 }) | 116 }) |
| 62 .then(data => { | 117 .then(data => { |
| 63 return Promise.all([data, registration.navigationPreload.getState()]); | 118 return Promise.all([data, registration.navigationPreload.getState()]); |
| 64 }) | 119 }) |
| 65 .then(states => { | 120 .then(states => { |
| 66 assert_equals(states[0].enabled, false, | 121 expect_state(states[0], false, 'true', |
| 67 '.enabled should be false by default (from worker)'); | 122 'default state (from worker)'); |
| 68 assert_equals(states[1].enabled, false, | 123 expect_state(states[1], false, 'true', |
| 69 '.enabled should be false by default (from page)'); | 124 'default state (from page)'); |
| 70 // Call enable() and then getState(). | 125 // Call enable() and then getState(). |
| 71 return post_and_wait_for_reply(worker, 'enable'); | 126 return post_and_wait_for_reply(worker, 'enable'); |
| 72 }) | 127 }) |
| 73 .then(data => { | 128 .then(data => { |
| 74 assert_equals(data, undefined, 'enable() should resolve to undefined'); | 129 assert_equals(data, undefined, 'enable() should resolve to undefined'); |
| 75 return Promise.all([ | 130 return Promise.all([ |
| 76 post_and_wait_for_reply(worker, 'getState'), | 131 post_and_wait_for_reply(worker, 'getState'), |
| 77 registration.navigationPreload.getState() | 132 registration.navigationPreload.getState() |
| 78 ]); | 133 ]); |
| 79 }) | 134 }) |
| 80 .then(states => { | 135 .then(states => { |
| 81 assert_equals(states[0].enabled, true, | 136 expect_state(states[0], true, 'true', |
| 82 '.enabled should be true after enable() (from worker)'); | 137 'state after enable() (from worker)'); |
| 83 assert_equals(states[1].enabled, true, | 138 expect_state(states[1], true, 'true', |
| 84 '.enabled should be true after enable() (from page)'); | 139 'state after enable() (from page)'); |
| 85 // Call disable() and then getState(). | 140 // Call disable() and then getState(). |
| 86 return post_and_wait_for_reply(worker, 'disable'); | 141 return post_and_wait_for_reply(worker, 'disable'); |
| 87 }) | 142 }) |
| 88 .then(data => { | 143 .then(data => { |
| 89 assert_equals(data, undefined, | 144 assert_equals(data, undefined, |
| 90 '.disable() should resolve to undefined'); | 145 '.disable() should resolve to undefined'); |
| 91 return Promise.all([ | 146 return Promise.all([ |
| 92 post_and_wait_for_reply(worker, 'getState'), | 147 post_and_wait_for_reply(worker, 'getState'), |
| 93 registration.navigationPreload.getState() | 148 registration.navigationPreload.getState() |
| 94 ]); | 149 ]); |
| 95 }) | 150 }) |
| 96 .then(states => { | 151 .then(states => { |
| 97 assert_equals(states[0].enabled, false, | 152 expect_state(states[0], false, 'true', |
| 98 '.enabled should be false after disable() (from worker)'); | 153 'state after disable() (from worker)'); |
| 99 assert_equals(states[1].enabled, false, | 154 expect_state(states[1], false, 'true', |
| 100 '.enabled should be false after disable() (from page)'); | 155 'state after disable() (from page)'); |
| 156 return post_and_wait_for_reply(worker, 'setHeaderValue'); |
| 157 }) |
| 158 .then(data => { |
| 159 assert_equals(data, undefined, |
| 160 '.setHeaderValue() should resolve to undefined'); |
| 161 return Promise.all([ |
| 162 post_and_wait_for_reply(worker, 'getState'), |
| 163 registration.navigationPreload.getState()]); |
| 164 }) |
| 165 .then(states => { |
| 166 expect_state(states[0], false, 'insightful', |
| 167 'state after setHeaderValue() (from worker)'); |
| 168 expect_state(states[1], false, 'insightful', |
| 169 'state after setHeaderValue() (from page)'); |
| 101 }); | 170 }); |
| 102 }, 'getState from a worker'); | 171 }, 'getState from a worker'); |
| 103 </script> | 172 </script> |
| 104 </body> | 173 </body> |
| OLD | NEW |