Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 <html> | |
| 2 <head> | |
| 3 <title>Blob Creation & Slicing</title> | |
| 4 <script type="text/javascript" src="common.js"></script> | |
| 5 <script type="text/javascript"> | |
| 6 // We create < 2000 bytes of data, as that is the max for the browsertest. | |
|
pwnall
2016/12/01 23:28:49
2000 or 3000?
dmurph
2016/12/02 01:11:33
Done.
| |
| 7 var maxBytes = 3000; | |
| 8 | |
| 9 // Number of blobs constructed with raw data. | |
| 10 var numRawBlobs = 100; | |
| 11 // Number of blobs we create by slicing the raw data blobs. | |
| 12 var numSlices = 100; | |
| 13 // Number of blobs we create by sandwiching sliced blobs in between new data. | |
| 14 var numSandwiches = 100; | |
| 15 var totalSize = 0; | |
| 16 | |
| 17 var fillPsueodoRandom = function(array) { | |
| 18 for (let i = 0; i < array.length; ++i) { | |
| 19 array[i] = (17 + 23 * i) & 0xFF; | |
| 20 } | |
| 21 } | |
| 22 | |
| 23 var test = function() { | |
| 24 var blobs = []; | |
| 25 | |
| 26 // This should cause us to go straight to file. | |
| 27 var savedToDiskDataSize = 190; | |
| 28 var savedToDiskData = new Uint8Array(savedToDiskDataSize); | |
|
pwnall
2016/12/01 23:28:49
How about moving the array allocation into the hel
dmurph
2016/12/02 01:11:34
Done.
| |
| 29 fillPsueodoRandom(savedToDiskData); | |
| 30 | |
| 31 // This should require multiple shared memory segments. | |
| 32 var sharedMemoryDataSize = 15; | |
| 33 var sharedMemoryData = new Uint8Array(sharedMemoryDataSize); | |
| 34 fillPsueodoRandom(sharedMemoryData); | |
| 35 | |
| 36 var sandwichDataSize = 7; | |
| 37 | |
| 38 // This should fit in IPC. | |
| 39 var ipcDataSize = 2; | |
| 40 var ipcData = new Uint8Array(2); | |
| 41 fillPsueodoRandom(ipcData); | |
| 42 | |
| 43 for (let i = 0; i < numRawBlobs; ++i) { | |
| 44 var data = []; | |
| 45 if (i % 5 == 0) { | |
| 46 data.push(sharedMemoryData); | |
| 47 } else if (i % 13 == 0) { | |
| 48 data.push(savedToDiskData); | |
| 49 } else { | |
| 50 data.push(ipcData); | |
| 51 } | |
| 52 let blob = new Blob(data, { content_type: "text/plain" }); | |
| 53 blobs.push(blob); | |
| 54 totalSize += blob.size; | |
| 55 } | |
| 56 | |
| 57 for (let i = 0; i < numSlices; ++i) { | |
| 58 var origSize; | |
| 59 var rawIndex = i % numRawBlobs; | |
| 60 if (rawIndex % 5 == 0) { | |
| 61 origSize = sharedMemoryDataSize; | |
| 62 } else if (rawIndex % 13 == 0) { | |
| 63 origSize = savedToDiskDataSize; | |
| 64 } else { | |
| 65 origSize = ipcDataSize; | |
| 66 } | |
| 67 let blob; | |
| 68 if (i % 2 == 0) { | |
| 69 blob = blobs[i].slice(origSize / 2); | |
| 70 } else { | |
| 71 blob = blobs[i].slice(0, origSize / 2); | |
| 72 } | |
| 73 blobs.push(blob); | |
| 74 } | |
| 75 | |
| 76 for (let i = 0; i < numSandwiches; ++i) { | |
| 77 var sliceIndex = numRawBlobs + (i % numSlices); | |
| 78 blobs.push(new Blob(['pre', blobs[sliceIndex], 'post'], { content_type: "tex t/plain" })); | |
| 79 totalSize += sandwichDataSize; | |
| 80 } | |
| 81 shouldBeTrue("totalSize <= maxBytes"); | |
| 82 | |
| 83 var getBytes = function(string) { | |
| 84 var bytes = []; | |
| 85 for (let i = 0; i < string.length; ++i) { | |
| 86 bytes.push(string.charCodeAt(i)); | |
| 87 } | |
| 88 return bytes; | |
| 89 } | |
| 90 | |
| 91 var numRead = 0; | |
| 92 for (let i = 0; i < blobs.length; i++) { | |
| 93 var genReader = function(index, d) { | |
| 94 var reader = new FileReader(); | |
| 95 reader.onloadend = function(e) { | |
| 96 if (reader.error) { | |
| 97 fail('Error when reading blob ' + index + ': ' + reader.error); | |
| 98 return; | |
| 99 } | |
| 100 numRead++; | |
| 101 debug('Finished reading blob ' + index); | |
| 102 shouldBe('event.target.result.byteLength', d.length + ''); | |
| 103 shouldBe('new Uint8Array(event.target.result)', | |
| 104 '[' + d + ']'); | |
| 105 if (numRead >= blobs.length) { | |
| 106 done('Done!'); | |
| 107 } | |
| 108 } | |
| 109 return reader; | |
| 110 } | |
| 111 | |
| 112 var rawIndex = i % numRawBlobs; | |
| 113 var sliceIndex = i % numSlices; | |
| 114 | |
| 115 var origData; | |
|
pwnall
2016/12/01 23:28:49
The logic here seems to duplicate some of the logi
dmurph
2016/12/02 01:11:34
Done.
| |
| 116 var origSize; | |
| 117 if (rawIndex % 5 == 0) { | |
| 118 origSize = sharedMemoryDataSize; | |
| 119 origData = sharedMemoryData; | |
| 120 } else if (rawIndex % 13 == 0) { | |
| 121 origSize = savedToDiskDataSize; | |
| 122 origData = savedToDiskData; | |
| 123 } else { | |
| 124 origSize = ipcDataSize; | |
| 125 origData = ipcData; | |
| 126 } | |
| 127 | |
| 128 var slicedData; | |
| 129 var slicedDataSize; | |
| 130 if (sliceIndex % 2 == 0) { | |
| 131 slicedData = origData.slice(origSize / 2); | |
| 132 } else { | |
| 133 slicedData = origData.slice(0, origSize / 2); | |
| 134 } | |
| 135 slicedDataSize = slicedData.length; | |
| 136 | |
| 137 var sandwichedDataSize = sandwichDataSize + slicedDataSize; | |
| 138 var sandwichedData = new Uint8Array(sandwichedDataSize); | |
| 139 sandwichedData.set(getBytes("pre"), 0); | |
| 140 sandwichedData.set(slicedData, 3); | |
| 141 sandwichedData.set(getBytes("post"), 3 + slicedDataSize); | |
| 142 | |
| 143 var data; | |
| 144 if (i < numRawBlobs) { | |
|
pwnall
2016/12/01 23:28:49
If you follow my suggestion above, this whole bloc
dmurph
2016/12/02 01:11:34
Done.
| |
| 145 data = origData; | |
| 146 } else if (i < numRawBlobs + numSlices) { | |
| 147 data = slicedData; | |
| 148 } else { | |
| 149 data = sandwichedData; | |
| 150 } | |
| 151 genReader(i, data).readAsArrayBuffer(blobs[i]); | |
| 152 } | |
| 153 }; | |
| 154 </script> | |
| 155 </head> | |
| 156 <body onLoad="test()"> | |
| 157 <div id="status">Starting...<br/></div> | |
| 158 </body> | |
| 159 </html> | |
| OLD | NEW |