test_blob_sliced_from_child_process.js (3981B)
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 "use strict"; 12 13 const messageName = "test:blob-slice-test"; 14 const blobData = ["So", " ", "many", " ", "blobs!"]; 15 const blobType = "text/plain"; 16 17 let blob = new Blob(blobData, { type: blobType }); 18 19 let firstSliceStart = blobData[0].length + blobData[1].length; 20 let firstSliceEnd = firstSliceStart + blobData[2].length; 21 22 let slice = blob.slice(firstSliceStart, firstSliceEnd, blobType); 23 24 let secondSliceStart = blobData[2].indexOf("a"); 25 let secondSliceEnd = secondSliceStart + 2; 26 27 slice = slice.slice(secondSliceStart, secondSliceEnd, blobType); 28 29 sendAsyncMessage(messageName, { blob }); 30 sendAsyncMessage(messageName, { slice }); 31 } 32 33 add_task(async function test() { 34 let page = await XPCShellContentUtils.loadContentPage( 35 "data:text/html,<!DOCTYPE HTML><html><body></body></html>", 36 { 37 remote: true, 38 } 39 ); 40 41 page.loadFrameScript(childFrameScript); 42 43 const messageName = "test:blob-slice-test"; 44 const blobData = ["So", " ", "many", " ", "blobs!"]; 45 const blobText = blobData.join(""); 46 const blobType = "text/plain"; 47 48 const sliceText = "an"; 49 50 let receivedBlob = false; 51 let receivedSlice = false; 52 53 let resolveBlob, resolveSlice; 54 let blobPromise = new Promise(resolve => { 55 resolveBlob = resolve; 56 }); 57 let slicePromise = new Promise(resolve => { 58 resolveSlice = resolve; 59 }); 60 61 let mm = page.browser.messageManager; 62 mm.addMessageListener(messageName, function (message) { 63 if ("blob" in message.data) { 64 equal(receivedBlob, false, "Have not yet received Blob"); 65 equal(receivedSlice, false, "Have not yet received Slice"); 66 67 receivedBlob = true; 68 69 let blob = message.data.blob; 70 71 ok(Blob.isInstance(blob), "Received a Blob"); 72 equal(blob.size, blobText.length, "Blob has correct size"); 73 equal(blob.type, blobType, "Blob has correct type"); 74 75 let slice = blob.slice( 76 blobText.length - blobData[blobData.length - 1].length, 77 blob.size, 78 blobType 79 ); 80 81 ok(Blob.isInstance(slice), "Slice returned a Blob"); 82 equal( 83 slice.size, 84 blobData[blobData.length - 1].length, 85 "Slice has correct size" 86 ); 87 equal(slice.type, blobType, "Slice has correct type"); 88 89 let reader = new FileReader(); 90 reader.onload = function () { 91 equal( 92 reader.result, 93 blobData[blobData.length - 1], 94 "Slice has correct data" 95 ); 96 97 resolveBlob(); 98 }; 99 reader.readAsText(slice); 100 } else if ("slice" in message.data) { 101 equal(receivedBlob, true, "Already received Blob"); 102 equal(receivedSlice, false, "Have not yet received Slice"); 103 104 receivedSlice = true; 105 106 let slice = message.data.slice; 107 108 ok(Blob.isInstance(slice), "Received a Blob for slice"); 109 equal(slice.size, sliceText.length, "Slice has correct size"); 110 equal(slice.type, blobType, "Slice has correct type"); 111 112 let reader = new FileReader(); 113 reader.onload = function () { 114 equal(reader.result, sliceText, "Slice has correct data"); 115 116 let slice2 = slice.slice(1, 2, blobType); 117 118 ok(Blob.isInstance(slice2), "Slice returned a Blob"); 119 equal(slice2.size, 1, "Slice has correct size"); 120 equal(slice2.type, blobType, "Slice has correct type"); 121 122 let reader2 = new FileReader(); 123 reader2.onload = function () { 124 equal(reader2.result, sliceText[1], "Slice has correct data"); 125 126 resolveSlice(); 127 }; 128 reader2.readAsText(slice2); 129 }; 130 reader.readAsText(slice); 131 } else { 132 ok(false, "Received a bad message: " + JSON.stringify(message.data)); 133 } 134 }); 135 136 await blobPromise; 137 await slicePromise; 138 139 await page.close(); 140 });