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 |