Index: content/test/data/blob_storage/blob_creation_and_slicing.html |
diff --git a/content/test/data/blob_storage/blob_creation_and_slicing.html b/content/test/data/blob_storage/blob_creation_and_slicing.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e3f36c0b19c9e7286e3afe824f24aa05bf24b2f6 |
--- /dev/null |
+++ b/content/test/data/blob_storage/blob_creation_and_slicing.html |
@@ -0,0 +1,134 @@ |
+<html> |
+ <head> |
+ <title>Blob Creation & Slicing</title> |
+ <script type="text/javascript" src="common.js"></script> |
+ <script type="text/javascript"> |
+// We create < 3000 bytes of data, as that is the max for the browsertest. |
+var MAX_BYTES = 3000; |
+ |
+// Number of blobs constructed with raw data. |
+var NUM_RAW_BLOBS = 100; |
+// Number of blobs we create by slicing the raw data blobs. |
+var NUM_SLICES = 100; |
+// Number of blobs we create by sandwiching sliced blobs in between new data. |
+var NUM_SANDWICHES = 100; |
+var totalSize = 0; |
+ |
+var generatePsuedoRandomUint8Array = function(length) { |
+ var array = new Uint8Array(length); |
+ for (let i = 0; i < length; ++i) { |
+ array[i] = (17 + 23 * i) & 0xFF; |
+ } |
+ return array; |
+} |
+ |
+var test = function() { |
+ var blobs = []; |
+ |
+ // This should cause us to go straight to file. |
+ var savedToDiskDataSize = 190; |
+ var savedToDiskData = generatePsuedoRandomUint8Array(savedToDiskDataSize); |
+ |
+ // This should require multiple shared memory segments. |
+ var sharedMemoryDataSize = 15; |
+ var sharedMemoryData = generatePsuedoRandomUint8Array(sharedMemoryDataSize); |
+ |
+ var sandwichDataSize = 7; |
+ |
+ // This should fit in IPC. |
+ var ipcDataSize = 2; |
+ var ipcData = generatePsuedoRandomUint8Array(ipcDataSize); |
+ |
+ var expectedBlobData = []; |
+ for (let i = 0; i < NUM_RAW_BLOBS; ++i) { |
+ let data = []; |
+ if (i % 5 == 0) { |
+ data.push(sharedMemoryData); |
+ } else if (i % 13 == 0) { |
+ data.push(savedToDiskData); |
+ } else { |
+ data.push(ipcData); |
+ } |
+ expectedBlobData.push(data[data.length - 1]); |
+ let blob = new Blob(data, { content_type: "text/plain" }); |
+ blobs.push(blob); |
+ totalSize += blob.size; |
+ } |
+ |
+ for (let i = 0; i < NUM_SLICES; ++i) { |
+ let origSize; |
+ let origData; |
+ let rawIndex = i % NUM_RAW_BLOBS; |
+ if (rawIndex % 5 == 0) { |
+ origSize = sharedMemoryDataSize; |
+ origData = sharedMemoryData; |
+ } else if (rawIndex % 13 == 0) { |
+ origSize = savedToDiskDataSize; |
+ origData = savedToDiskData; |
+ } else { |
+ origSize = ipcDataSize; |
+ origData = ipcData; |
+ } |
+ let blob; |
+ let expectedData; |
+ if (i % 2 == 0) { |
+ blob = blobs[i].slice(origSize / 2); |
+ expectedData = origData.slice(origSize / 2); |
+ } else { |
+ blob = blobs[i].slice(0, origSize / 2); |
+ expectedData = origData.slice(0, origSize / 2); |
+ } |
+ expectedBlobData.push(expectedData); |
+ blobs.push(blob); |
+ } |
+ |
+ var getBytes = function(string) { |
+ var bytes = []; |
+ for (let i = 0; i < string.length; ++i) { |
+ bytes.push(string.charCodeAt(i)); |
+ } |
+ return bytes; |
+ } |
+ |
+ for (let i = 0; i < NUM_SANDWICHES; ++i) { |
+ let sliceIndex = NUM_RAW_BLOBS + (i % NUM_SLICES); |
+ let slicedDataSize = expectedBlobData[sliceIndex].length; |
+ blobs.push(new Blob(['pre', blobs[sliceIndex], 'post'], { content_type: "text/plain" })); |
+ totalSize += sandwichDataSize; |
+ |
+ let expectedData = new Uint8Array(sandwichDataSize + slicedDataSize); |
+ expectedData.set(getBytes("pre"), 0); |
+ expectedData.set(expectedBlobData[sliceIndex], 3); |
+ expectedData.set(getBytes("post"), 3 + slicedDataSize); |
+ expectedBlobData.push(expectedData); |
+ } |
+ shouldBeTrue("totalSize <= MAX_BYTES"); |
+ |
+ var numRead = 0; |
+ for (let i = 0; i < blobs.length; i++) { |
+ (function(index, d) { |
+ var reader = new FileReader(); |
+ reader.onloadend = function(e) { |
+ if (reader.error) { |
+ fail('Error when reading blob ' + index + ': ' + reader.error); |
+ return; |
+ } |
+ numRead++; |
+ debug('Finished reading blob ' + index); |
+ shouldBe('event.target.result.byteLength', d.length + ''); |
+ shouldBe('new Uint8Array(event.target.result)', |
+ '[' + d + ']'); |
+ if (numRead >= blobs.length) { |
+ done('Done!'); |
+ } |
+ } |
+ return reader; |
+ })(i, expectedBlobData[i]).readAsArrayBuffer(blobs[i]); |
+ } |
+}; |
+ </script> |
+ </head> |
+ <body onLoad="test()"> |
+ <div id="status">Starting...<br/></div> |
+ </body> |
+</html> |