1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Redistribution and use in source and binary forms, with or without 3 // modification, are permitted provided that the following conditions are 4 // met: 5 // 6 // * Redistributions of source code must retain the above copyright 7 // notice, this list of conditions and the following disclaimer. 8 // * Redistributions in binary form must reproduce the above 9 // copyright notice, this list of conditions and the following 10 // disclaimer in the documentation and/or other materials provided 11 // with the distribution. 12 // * Neither the name of Google Inc. nor the names of its 13 // contributors may be used to endorse or promote products derived 14 // from this software without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 // Test the Worker API of d8. This test only makes sense with d8. A Worker 29 // spawns a new OS thread and isolate, and runs it concurrently with the 30 // current running thread. 31 32 var workerScript = 33 `postMessage('Starting worker'); 34 // Set a global variable; should not be visible outside of the worker's 35 // context. 36 foo = 100; 37 var c = 0; 38 onmessage = function(m) { 39 switch (c++) { 40 case 0: 41 if (m !== undefined) throw new Error('undefined'); 42 break; 43 case 1: 44 if (m !== null) throw new Error('null'); 45 break; 46 case 2: 47 if (m !== true) throw new Error('true'); 48 break; 49 case 3: 50 if (m !== false) throw new Error('false'); 51 break; 52 case 4: 53 if (m !== 100) throw new Error('Number'); 54 break; 55 case 5: 56 if (m !== 'hi') throw new Error('String'); 57 break; 58 case 6: 59 if (JSON.stringify(m) !== '[4,true,\"bye\"]') { 60 throw new Error('Array'); 61 } 62 break; 63 case 7: 64 if (JSON.stringify(m) !== \"{'a':1,'b':2.5,'c':'three'}\") 65 throw new Error('Object'); 66 break; 67 case 8: 68 var ab = m; 69 var t = new Uint32Array(ab); 70 if (ab.byteLength !== 16) 71 throw new Error('ArrayBuffer clone byteLength'); 72 for (var i = 0; i < 4; ++i) 73 if (t[i] !== i) 74 throw new Error('ArrayBuffer clone value ' + i); 75 break; 76 case 9: 77 var ab = m; 78 var t = new Uint32Array(ab); 79 if (ab.byteLength !== 32) 80 throw new Error('ArrayBuffer transfer byteLength'); 81 for (var i = 0; i < 8; ++i) 82 if (t[i] !== i) 83 throw new Error('ArrayBuffer transfer value ' + i); 84 break; 85 } 86 if (c == 10) { 87 postMessage('DONE'); 88 } 89 };`; 90 91 92 if (this.Worker) { 93 function createArrayBuffer(byteLength) { 94 var ab = new ArrayBuffer(byteLength); 95 var t = new Uint32Array(ab); 96 for (var i = 0; i < byteLength / 4; ++i) 97 t[i] = i; 98 return ab; 99 } 100 101 var w = new Worker(workerScript); 102 103 assertEquals("Starting worker", w.getMessage()); 104 105 w.postMessage(undefined); 106 w.postMessage(null); 107 w.postMessage(true); 108 w.postMessage(false); 109 w.postMessage(100); 110 w.postMessage("hi"); 111 w.postMessage([4, true, "bye"]); 112 w.postMessage({a: 1, b: 2.5, c: "three"}); 113 114 // Clone ArrayBuffer 115 var ab1 = createArrayBuffer(16); 116 w.postMessage(ab1); 117 assertEquals(16, ab1.byteLength); // ArrayBuffer should not be neutered. 118 119 // Transfer ArrayBuffer 120 var ab2 = createArrayBuffer(32); 121 w.postMessage(ab2, [ab2]); 122 assertEquals(0, ab2.byteLength); // ArrayBuffer should be neutered. 123 124 assertEquals("undefined", typeof foo); 125 126 // Read a message from the worker. 127 assertEquals("DONE", w.getMessage()); 128 129 w.terminate(); 130 131 132 // Make sure that the main thread doesn't block forever in getMessage() if 133 // the worker dies without posting a message. 134 var w2 = new Worker(''); 135 var msg = w2.getMessage(); 136 assertEquals(undefined, msg); 137 } 138