chromium/third_party/blink/perf_tests/owp_storage/resources/blob-shared.js

let totalBytes = 0;
let errors = [];

function showManualInput() {
  document.body.innerHTML =
  `
  <h4><b>Manual Input:</b></h4>
  <form>
    Blob size: <input type="text" id="blob_size"><br>
    Number of blobs: <input type="text" id="num_blobs"><br>
    <input type="button" value="Start Benchmark" onclick="getParams();" />
  </form>
  <h4><b>Benchmark Output:</b></h4>
  `;
}

function recordError(message) {
  console.log(message);
  errors.push(message);

  let error = document.createElement('div');
  error.textContent = message;
  document.body.appendChild(error);
}

function createBlob(size) {
  let blob = new Blob([new Uint8Array(size)],
                      {type: 'application/octet-string'});
  totalBytes += size;
  return blob;
}

function readBlobAsync(blob) {
  const reader = new FileReader();
  return new Promise(resolve => {
    reader.onerror = recordError;
    reader.onloadend = e => { resolve(reader); };
    reader.readAsArrayBuffer(blob);
  });
}

async function createAndRead(size) {
  let blob = new Blob([new Uint8Array(size)],
                      {type: 'application/octet-string'});
  const reader = await readBlobAsync(blob);
  if (reader.error)
    recordError(`Error reading blob: ${reader.error}`);
  else if (reader.result.byteLength != size)
    recordError('Error reading blob: Blob size does not match.');
}

let readBlobAsArrayBuffer = (blob, callback) => {
  const reader = new FileReader();
  reader.onerror = recordError;
  reader.onloadend = () => {
    if (reader.error) {
      recordError(`Error reading blob: ${reader.error}`);
    } else {
      callback(reader.result);
    }
  };
  reader.readAsArrayBuffer(blob);
}

async function createBlobAndImmediatelyRead(numBlobs, size) {
  let start = performance.now();
  errors = [];

  logToDocumentBody(`Creating and reading ${numBlobs} blobs...`);
  for (let i = 0; i < numBlobs; i++)
    await createAndRead(size);
  logToDocumentBody('Finished.');

  if (errors.length)
    logToDocumentBody('Errors on page: ' + errors.join(', '));
}

async function createBlobsAndReadInParallel(numBlobs, size) {
  errors = [];

  logToDocumentBody(`Creating and reading ${numBlobs} blobs...`);
  await new Promise(resolve => {
    let totalSizeRead = 0;
    let blobsRead = 0;
    let blobReadCallback = array => {
      blobsRead += 1;
      totalSizeRead += array.byteLength;
      if (blobsRead == numBlobs) {
        if (totalSizeRead != numBlobs * size) {
          recordError(`Error reading blob, total sizes don't match ${totalSizeRead} vs ${numBlobs * size}`);
        }
        logToDocumentBody('Done reading all blobs.');
        resolve();
      }
    }

    for (let i = 0; i < numBlobs; i++) {
      let blob = createBlob(size);
      readBlobAsArrayBuffer(blob, blobReadCallback);
    }
  });

  if (errors.length) {
    let errorStr = errors.join(', ');
    logToDocumentBody('Errors on page: ' + errorStr);
    reportError(errorStr);
  }
}