1<!DOCTYPE html> 2<meta charset="utf-8"> 3<script src="/resources/testharness.js"></script> 4<script src="/resources/testharnessreport.js"></script> 5<script src="../resources/test-utils.js"></script> 6<script> 7'use strict'; 8 9promise_test(t => { 10 const orig = new TransformStream(); 11 const promise = new Promise(resolve => { 12 addEventListener('message', t.step_func(evt => { 13 const transferred = evt.data; 14 assert_equals(transferred.constructor, TransformStream, 15 'transferred should be a TransformStream in this realm'); 16 assert_true(transferred instanceof TransformStream, 17 'instanceof check should pass'); 18 19 // Perform a brand-check on |transferred|. 20 const readableGetter = Object.getOwnPropertyDescriptor( 21 TransformStream.prototype, 'readable').get; 22 assert_true(readableGetter.call(transferred) instanceof ReadableStream, 23 'brand check should pass and readable stream should result'); 24 const writableGetter = Object.getOwnPropertyDescriptor( 25 TransformStream.prototype, 'writable').get; 26 assert_true(writableGetter.call(transferred) instanceof WritableStream, 27 'brand check should pass and writable stream should result'); 28 resolve(); 29 }), {once: true}); 30 }); 31 postMessage(orig, '*', [orig]); 32 assert_true(orig.readable.locked, 'the readable side should be locked'); 33 assert_true(orig.writable.locked, 'the writable side should be locked'); 34 return promise; 35}, 'window.postMessage should be able to transfer a TransformStream'); 36 37test(() => { 38 const ts = new TransformStream(); 39 const writer = ts.writable.getWriter(); 40 assert_throws_dom('DataCloneError', () => postMessage(ts, '*', [ts]), 41 'postMessage should throw'); 42 assert_false(ts.readable.locked, 'readable side should not get locked'); 43}, 'a TransformStream with a locked writable should not be transferable'); 44 45test(() => { 46 const ts = new TransformStream(); 47 const reader = ts.readable.getReader(); 48 assert_throws_dom('DataCloneError', () => postMessage(ts, '*', [ts]), 49 'postMessage should throw'); 50 assert_false(ts.writable.locked, 'writable side should not get locked'); 51}, 'a TransformStream with a locked readable should not be transferable'); 52 53test(() => { 54 const ts = new TransformStream(); 55 const reader = ts.readable.getReader(); 56 const writer = ts.writable.getWriter(); 57 assert_throws_dom('DataCloneError', () => postMessage(ts, '*', [ts]), 58 'postMessage should throw'); 59}, 'a TransformStream with both sides locked should not be transferable'); 60 61promise_test(t => { 62 const source = new ReadableStream({ 63 start(controller) { 64 controller.enqueue('hello '); 65 controller.enqueue('there '); 66 controller.close(); 67 } 68 }); 69 let resolve; 70 const ready = new Promise(r => resolve = r); 71 let result = ''; 72 const sink = new WritableStream({ 73 write(chunk) { 74 if (result) { 75 resolve(); 76 } 77 result += chunk; 78 } 79 }); 80 const transform1 = new TransformStream({ 81 transform(chunk, controller) { 82 controller.enqueue(chunk.toUpperCase()); 83 } 84 }); 85 const transform2 = new TransformStream({ 86 transform(chunk, controller) { 87 controller.enqueue(chunk + chunk); 88 } 89 }); 90 const promise = new Promise(resolve => { 91 addEventListener('message', t.step_func(evt => { 92 const data = evt.data; 93 resolve(data.source 94 .pipeThrough(data.transform1) 95 .pipeThrough(data.transform2) 96 .pipeTo(data.sink)); 97 })); 98 }); 99 postMessage({source, sink, transform1, transform2}, '*', 100 [source, transform1, sink, transform2]); 101 return ready 102 .then(() => { 103 assert_equals(result, 'HELLO HELLO THERE THERE ', 104 'transforms should have been applied'); 105 }); 106}, 'piping through transferred transforms should work'); 107 108</script> 109