Chromium Code Reviews| 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..818f270dade3ea60996c83c46abd2f1b3c061b51 |
| --- /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 maxBytes = 3000; |
| + |
| +// Number of blobs constructed with raw data. |
| +var numRawBlobs = 100; |
| +// Number of blobs we create by slicing the raw data blobs. |
| +var numSlices = 100; |
| +// Number of blobs we create by sandwiching sliced blobs in between new data. |
| +var numSandwiches = 100; |
|
kinuko
2016/12/02 08:52:32
should we / could we use CONSTANT_NAME style for c
dmurph
2016/12/02 21:53:07
Done.
|
| +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 < numRawBlobs; ++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 < numSlices; ++i) { |
| + let origSize; |
| + let origData; |
| + let rawIndex = i % numRawBlobs; |
| + 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 < numSandwiches; ++i) { |
| + let sliceIndex = numRawBlobs + (i % numSlices); |
| + 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 <= maxBytes"); |
| + |
| + 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> |