basics.any.js (4368B)
1 test(function() { 2 assert_throws_js( 3 TypeError, 4 () => BroadcastChannel(""), 5 "Calling BroadcastChannel constructor without 'new' must throw" 6 ); 7 }, "BroadcastChannel constructor called as normal function"); 8 9 async_test(t => { 10 let c1 = new BroadcastChannel('eventType'); 11 let c2 = new BroadcastChannel('eventType'); 12 13 c2.onmessage = t.step_func(e => { 14 assert_true(e instanceof MessageEvent); 15 assert_equals(e.target, c2); 16 assert_equals(e.type, 'message'); 17 assert_equals(e.origin, location.origin, 'origin'); 18 assert_equals(e.data, 'hello world'); 19 assert_equals(e.source, null, 'source'); 20 t.done(); 21 }); 22 c1.postMessage('hello world'); 23 }, 'postMessage results in correct event'); 24 25 async_test(t => { 26 let c1 = new BroadcastChannel('order'); 27 let c2 = new BroadcastChannel('order'); 28 let c3 = new BroadcastChannel('order'); 29 30 let events = []; 31 let doneCount = 0; 32 let handler = t.step_func(e => { 33 events.push(e); 34 if (e.data == 'done') { 35 doneCount++; 36 if (doneCount == 2) { 37 assert_equals(events.length, 6); 38 assert_equals(events[0].target, c2, 'target for event 0'); 39 assert_equals(events[0].data, 'from c1'); 40 assert_equals(events[1].target, c3, 'target for event 1'); 41 assert_equals(events[1].data, 'from c1'); 42 assert_equals(events[2].target, c1, 'target for event 2'); 43 assert_equals(events[2].data, 'from c3'); 44 assert_equals(events[3].target, c2, 'target for event 3'); 45 assert_equals(events[3].data, 'from c3'); 46 assert_equals(events[4].target, c1, 'target for event 4'); 47 assert_equals(events[4].data, 'done'); 48 assert_equals(events[5].target, c3, 'target for event 5'); 49 assert_equals(events[5].data, 'done'); 50 t.done(); 51 } 52 } 53 }); 54 c1.onmessage = handler; 55 c2.onmessage = handler; 56 c3.onmessage = handler; 57 58 c1.postMessage('from c1'); 59 c3.postMessage('from c3'); 60 c2.postMessage('done'); 61 }, 'messages are delivered in port creation order'); 62 63 async_test(t => { 64 let c1 = new BroadcastChannel('closed'); 65 let c2 = new BroadcastChannel('closed'); 66 let c3 = new BroadcastChannel('closed'); 67 68 c2.onmessage = t.unreached_func(); 69 c2.close(); 70 c3.onmessage = t.step_func(() => t.done()); 71 c1.postMessage('test'); 72 }, 'messages aren\'t delivered to a closed port'); 73 74 async_test(t => { 75 let c1 = new BroadcastChannel('closed'); 76 let c2 = new BroadcastChannel('closed'); 77 let c3 = new BroadcastChannel('closed'); 78 79 c2.onmessage = t.unreached_func(); 80 c3.onmessage = t.step_func(() => t.done()); 81 c1.postMessage('test'); 82 c2.close(); 83 }, 'messages aren\'t delivered to a port closed after calling postMessage.'); 84 85 async_test(t => { 86 let c1 = new BroadcastChannel('create-in-onmessage'); 87 let c2 = new BroadcastChannel('create-in-onmessage'); 88 89 c2.onmessage = t.step_func(e => { 90 assert_equals(e.data, 'first'); 91 c2.close(); 92 let c3 = new BroadcastChannel('create-in-onmessage'); 93 c3.onmessage = t.step_func(event => { 94 assert_equals(event.data, 'done'); 95 t.done(); 96 }); 97 c1.postMessage('done'); 98 }); 99 c1.postMessage('first'); 100 c2.postMessage('second'); 101 }, 'closing and creating channels during message delivery works correctly'); 102 103 async_test(t => { 104 let c1 = new BroadcastChannel('close-in-onmessage'); 105 let c2 = new BroadcastChannel('close-in-onmessage'); 106 let c3 = new BroadcastChannel('close-in-onmessage'); 107 let events = []; 108 c1.onmessage = e => events.push('c1: ' + e.data); 109 c2.onmessage = e => events.push('c2: ' + e.data); 110 c3.onmessage = e => events.push('c3: ' + e.data); 111 112 // c2 closes itself when it receives the first message 113 c2.addEventListener('message', e => { 114 c2.close(); 115 }); 116 117 c3.addEventListener('message', t.step_func(e => { 118 if (e.data == 'done') { 119 assert_array_equals(events, [ 120 'c2: first', 121 'c3: first', 122 'c3: done']); 123 t.done(); 124 } 125 })); 126 c1.postMessage('first'); 127 c1.postMessage('done'); 128 }, 'Closing a channel in onmessage prevents already queued tasks from firing onmessage events');