extendable-message-event.https.html (8539B)
1 <!DOCTYPE html> 2 <title>ServiceWorkerGlobalScope: ExtendableMessageEvent</title> 3 <script src='/resources/testharness.js'></script> 4 <script src='/resources/testharnessreport.js'></script> 5 <script src='../resources/test-helpers.sub.js'></script> 6 <script src='./resources/extendable-message-event-utils.js'></script> 7 <script> 8 promise_test(function(t) { 9 var script = 'resources/extendable-message-event-worker.js'; 10 var scope = 'resources/scope/extendable-message-event-from-toplevel'; 11 var registration; 12 13 return service_worker_unregister_and_register(t, script, scope) 14 .then(function(r) { 15 registration = r; 16 add_completion_callback(function() { registration.unregister(); }); 17 return wait_for_state(t, registration.installing, 'activated'); 18 }) 19 .then(function() { 20 var saw_message = new Promise(function(resolve) { 21 navigator.serviceWorker.onmessage = 22 function(event) { resolve(event.data); } 23 }); 24 var channel = new MessageChannel; 25 registration.active.postMessage('', [channel.port1]); 26 return saw_message; 27 }) 28 .then(function(results) { 29 var expected = { 30 constructor: { name: 'ExtendableMessageEvent' }, 31 origin: location.origin, 32 lastEventId: '', 33 source: { 34 constructor: { name: 'WindowClient' }, 35 frameType: 'top-level', 36 url: location.href, 37 visibilityState: 'visible', 38 focused: true 39 }, 40 ports: [ { constructor: { name: 'MessagePort' } } ] 41 }; 42 ExtendableMessageEventUtils.assert_equals(results, expected); 43 }); 44 }, 'Post an extendable message from a top-level client'); 45 46 promise_test(function(t) { 47 var script = 'resources/extendable-message-event-worker.js'; 48 var scope = 'resources/scope/extendable-message-event-from-nested'; 49 var frame; 50 51 return service_worker_unregister_and_register(t, script, scope) 52 .then(function(registration) { 53 add_completion_callback(function() { registration.unregister(); }); 54 return wait_for_state(t, registration.installing, 'activated'); 55 }) 56 .then(function() { return with_iframe(scope); }) 57 .then(function(f) { 58 frame = f; 59 add_completion_callback(function() { frame.remove(); }); 60 var saw_message = new Promise(function(resolve) { 61 frame.contentWindow.navigator.serviceWorker.onmessage = 62 function(event) { resolve(event.data); } 63 }); 64 f.contentWindow.navigator.serviceWorker.controller.postMessage(''); 65 return saw_message; 66 }) 67 .then(function(results) { 68 var expected = { 69 constructor: { name: 'ExtendableMessageEvent' }, 70 origin: location.origin, 71 lastEventId: '', 72 source: { 73 constructor: { name: 'WindowClient' }, 74 url: frame.contentWindow.location.href, 75 frameType: 'nested', 76 visibilityState: 'visible', 77 focused: false 78 }, 79 ports: [] 80 }; 81 ExtendableMessageEventUtils.assert_equals(results, expected); 82 }); 83 }, 'Post an extendable message from a nested client'); 84 85 promise_test(function(t) { 86 var script = 'resources/extendable-message-event-loopback-worker.js'; 87 var scope = 'resources/scope/extendable-message-event-loopback'; 88 var registration; 89 90 return service_worker_unregister_and_register(t, script, scope) 91 .then(function(r) { 92 registration = r; 93 add_completion_callback(function() { registration.unregister(); }); 94 return wait_for_state(t, registration.installing, 'activated'); 95 }) 96 .then(function() { 97 var results = []; 98 var saw_message = new Promise(function(resolve) { 99 navigator.serviceWorker.onmessage = function(event) { 100 switch (event.data.type) { 101 case 'record': 102 results.push(event.data.results); 103 break; 104 case 'finish': 105 resolve(results); 106 break; 107 } 108 }; 109 }); 110 registration.active.postMessage({type: 'start'}); 111 return saw_message; 112 }) 113 .then(function(results) { 114 assert_equals(results.length, 2); 115 116 var expected_trial_1 = { 117 constructor: { name: 'ExtendableMessageEvent' }, 118 origin: location.origin, 119 lastEventId: '', 120 source: { 121 constructor: { name: 'ServiceWorker' }, 122 scriptURL: normalizeURL(script), 123 state: 'activated' 124 }, 125 ports: [] 126 }; 127 assert_equals(results[0].trial, 1); 128 ExtendableMessageEventUtils.assert_equals( 129 results[0].event, expected_trial_1 130 ); 131 132 var expected_trial_2 = { 133 constructor: { name: 'ExtendableMessageEvent' }, 134 origin: location.origin, 135 lastEventId: '', 136 source: { 137 constructor: { name: 'ServiceWorker' }, 138 scriptURL: normalizeURL(script), 139 state: 'activated' 140 }, 141 ports: [], 142 }; 143 assert_equals(results[1].trial, 2); 144 ExtendableMessageEventUtils.assert_equals( 145 results[1].event, expected_trial_2 146 ); 147 }); 148 }, 'Post loopback extendable messages'); 149 150 promise_test(function(t) { 151 var script1 = 'resources/extendable-message-event-ping-worker.js'; 152 var script2 = 'resources/extendable-message-event-pong-worker.js'; 153 var scope = 'resources/scope/extendable-message-event-pingpong'; 154 var registration; 155 156 return service_worker_unregister_and_register(t, script1, scope) 157 .then(function(r) { 158 registration = r; 159 add_completion_callback(function() { registration.unregister(); }); 160 return wait_for_state(t, registration.installing, 'activated'); 161 }) 162 .then(function() { 163 // A controlled frame is necessary for keeping a waiting worker. 164 return with_iframe(scope); 165 }) 166 .then(function(frame) { 167 add_completion_callback(function() { frame.remove(); }); 168 return navigator.serviceWorker.register(script2, {scope: scope}); 169 }) 170 .then(function(r) { 171 return wait_for_state(t, r.installing, 'installed'); 172 }) 173 .then(function() { 174 var results = []; 175 var saw_message = new Promise(function(resolve) { 176 navigator.serviceWorker.onmessage = function(event) { 177 switch (event.data.type) { 178 case 'record': 179 results.push(event.data.results); 180 break; 181 case 'finish': 182 resolve(results); 183 break; 184 } 185 }; 186 }); 187 registration.active.postMessage({type: 'start'}); 188 return saw_message; 189 }) 190 .then(function(results) { 191 assert_equals(results.length, 2); 192 193 var expected_ping = { 194 constructor: { name: 'ExtendableMessageEvent' }, 195 origin: location.origin, 196 lastEventId: '', 197 source: { 198 constructor: { name: 'ServiceWorker' }, 199 scriptURL: normalizeURL(script1), 200 state: 'activated' 201 }, 202 ports: [] 203 }; 204 assert_equals(results[0].pingOrPong, 'ping'); 205 ExtendableMessageEventUtils.assert_equals( 206 results[0].event, expected_ping 207 ); 208 209 var expected_pong = { 210 constructor: { name: 'ExtendableMessageEvent' }, 211 origin: location.origin, 212 lastEventId: '', 213 source: { 214 constructor: { name: 'ServiceWorker' }, 215 scriptURL: normalizeURL(script2), 216 state: 'installed' 217 }, 218 ports: [] 219 }; 220 assert_equals(results[1].pingOrPong, 'pong'); 221 ExtendableMessageEventUtils.assert_equals( 222 results[1].event, expected_pong 223 ); 224 }); 225 }, 'Post extendable messages among service workers'); 226 </script>