test_blob_sliced_from_parent_process.js (4326B)
1 "use strict"; 2 3 const { XPCShellContentUtils } = ChromeUtils.importESModule( 4 "resource://testing-common/XPCShellContentUtils.sys.mjs" 5 ); 6 7 XPCShellContentUtils.init(this); 8 9 function childFrameScript() { 10 /* eslint-env mozilla/frame-script */ 11 const messageName = "test:blob-slice-test"; 12 const blobData = ["So", " ", "many", " ", "blobs!"]; 13 const blobText = blobData.join(""); 14 const blobType = "text/plain"; 15 16 const sliceText = "an"; 17 18 function info(msg) { 19 sendAsyncMessage(messageName, { op: "info", msg }); 20 } 21 22 function ok(condition, name, diag) { 23 sendAsyncMessage(messageName, { op: "ok", condition, name, diag }); 24 } 25 26 function is(a, b, name) { 27 let pass = a == b; 28 let diag = pass ? "" : "got " + a + ", expected " + b; 29 ok(pass, name, diag); 30 } 31 32 function finish(result) { 33 sendAsyncMessage(messageName, { op: "done", result }); 34 } 35 36 function grabAndContinue(arg) { 37 testGenerator.next(arg); 38 } 39 40 function* testSteps() { 41 addMessageListener(messageName, grabAndContinue); 42 let message = yield undefined; 43 44 let blob = message.data; 45 46 ok(Blob.isInstance(blob), "Received a Blob"); 47 is(blob.size, blobText.length, "Blob has correct length"); 48 is(blob.type, blobType, "Blob has correct type"); 49 50 info("Reading blob"); 51 52 let reader = new FileReader(); 53 reader.addEventListener("load", grabAndContinue); 54 reader.readAsText(blob); 55 56 yield undefined; 57 58 is(reader.result, blobText, "Blob has correct data"); 59 60 let firstSliceStart = blobData[0].length + blobData[1].length; 61 let firstSliceEnd = firstSliceStart + blobData[2].length; 62 63 let slice = blob.slice(firstSliceStart, firstSliceEnd, blobType); 64 65 ok(Blob.isInstance(slice), "Slice returned a Blob"); 66 is(slice.size, blobData[2].length, "Slice has correct length"); 67 is(slice.type, blobType, "Slice has correct type"); 68 69 info("Reading slice"); 70 71 reader = new FileReader(); 72 reader.addEventListener("load", grabAndContinue); 73 reader.readAsText(slice); 74 75 yield undefined; 76 77 is(reader.result, blobData[2], "Slice has correct data"); 78 79 let secondSliceStart = blobData[2].indexOf("a"); 80 let secondSliceEnd = secondSliceStart + sliceText.length; 81 82 slice = slice.slice(secondSliceStart, secondSliceEnd, blobType); 83 84 ok(Blob.isInstance(slice), "Second slice returned a Blob"); 85 is(slice.size, sliceText.length, "Second slice has correct length"); 86 is(slice.type, blobType, "Second slice has correct type"); 87 88 info("Sending second slice"); 89 finish(slice); 90 } 91 92 let testGenerator = testSteps(); 93 testGenerator.next(); 94 } 95 96 add_task(async function test() { 97 let page = await XPCShellContentUtils.loadContentPage( 98 "data:text/html,<!DOCTYPE HTML><html><body></body></html>", 99 { 100 remote: true, 101 } 102 ); 103 104 page.loadFrameScript(childFrameScript); 105 106 const messageName = "test:blob-slice-test"; 107 const blobData = ["So", " ", "many", " ", "blobs!"]; 108 const blobType = "text/plain"; 109 110 const sliceText = "an"; 111 112 await new Promise(resolve => { 113 function grabAndContinue(arg) { 114 testGenerator.next(arg); 115 } 116 117 function* testSteps() { 118 let slice = yield undefined; 119 120 ok(Blob.isInstance(slice), "Received a Blob"); 121 equal(slice.size, sliceText.length, "Slice has correct size"); 122 equal(slice.type, blobType, "Slice has correct type"); 123 124 let reader = new FileReader(); 125 reader.onload = grabAndContinue; 126 reader.readAsText(slice); 127 yield undefined; 128 129 equal(reader.result, sliceText, "Slice has correct data"); 130 resolve(); 131 } 132 133 let testGenerator = testSteps(); 134 testGenerator.next(); 135 136 let mm = page.browser.messageManager; 137 mm.addMessageListener(messageName, function (message) { 138 let data = message.data; 139 switch (data.op) { 140 case "info": { 141 info(data.msg); 142 break; 143 } 144 145 case "ok": { 146 ok(data.condition, data.name + " - " + data.diag); 147 break; 148 } 149 150 case "done": { 151 testGenerator.next(data.result); 152 break; 153 } 154 155 default: { 156 ok(false, "Unknown op: " + data.op); 157 resolve(); 158 } 159 } 160 }); 161 162 let blob = new Blob(blobData, { type: blobType }); 163 mm.sendAsyncMessage(messageName, blob); 164 }); 165 166 await page.close(); 167 });