<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
<script src="/common/namespaces.js"></script>
<script src="common.sub.js"></script>
<script>

function makeOversizedCanvas() {

  return new Promise(resolve => {
    let canvas = document.createElement('canvas');
    canvas.setAttribute('width', '100000000');
    canvas.setAttribute('height', '100000000');
    resolve(canvas);
  });
}

function makeOversizedOffscreenCanvas() {
  return new Promise(resolve =>{
    let canvas = new OffscreenCanvas(100000000, 100000000);
    resolve(canvas);
  });
}

function makeInvalidBlob() {
  return new Promise(resolve => {
    resolve(new Blob()); // Blob with no data cannot be decoded.
  });
}

function makeBrokenImage() {
  return new Promise((resolve, reject) => {
    const image = new Image();
    image.src = "data:,x";
    image.onload = reject;
    image.onerror = () => resolve(image);
  });
}

function makeAvailableButBrokenImage(path) {
  return new Promise((resolve, reject) => {
    const image = new Image();
    image.src = path;
    image.onload = () => resolve(image);
    image.onerror = reject;
  });
}

testCases = [
  {
    description: 'createImageBitmap with a <sourceType> source and sw set to 0',
    promiseTestFunction:
      (source, t) => {
        return promise_rejects(t, new RangeError(),
            createImageBitmap(source, 0, 0, 0, 10));
      }
  },
  {
    description: 'createImageBitmap with a <sourceType> source and sh set to 0',
    promiseTestFunction:
      (source, t) => {
        return promise_rejects(t, new RangeError(),
            createImageBitmap(source, 0, 0, 10, 0));
      }
  },
  {
    // This case is not explicitly documented in the specification for
    // createImageBitmap, but it is expected that internal failures cause
    // InvalidStateError.
    //
    // Note: https://bugs.chromium.org/p/chromium/issues/detail?id=799025
    description: 'createImageBitmap with a <sourceType> source and oversized ' +
        '(unallocatable) crop region',
    promiseTestFunction:
      (source, t) => {
        return promise_rejects(t, new DOMException('', 'InvalidStateError'),
            createImageBitmap(source, 0, 0, 100000000, 100000000));
      }
  },
];

// Generate the test matrix for each sourceType + testCase combo.
imageSourceTypes.forEach(imageSourceType => {
  testCases.forEach(testCase => {
    let description = testCase.description.replace('<sourceType>',
        imageSourceType.name);
    promise_test( t => {
      return imageSourceType.factory().then(source => {
        return testCase.promiseTestFunction(source, t);
      });
    }, description);
  });
});

promise_test( t => {
  return promise_rejects(t, new TypeError(), createImageBitmap(undefined));
}, "createImageBitmap with undefined image source.");

promise_test( t => {
  return promise_rejects(t, new TypeError(), createImageBitmap(null));
}, "createImageBitmap with null image source.");

promise_test( t => {
  var context = document.createElement("canvas").getContext("2d");
  return promise_rejects(t, new TypeError(), createImageBitmap(context));
}, "createImageBitmap with CanvasRenderingContext2D image source.");

promise_test( t => {
  var context = document.createElement("canvas").getContext("webgl");
  return promise_rejects(t, new TypeError(), createImageBitmap(context));
}, "createImageBitmap with WebGLRenderingContext image source.");

promise_test( t => {
  var buffer = new Uint8Array();
  return promise_rejects(t, new TypeError(), createImageBitmap(buffer));
}, "createImageBitmap with Uint8Array image source.");

promise_test( t => {
  var buffer = new ArrayBuffer(8);
  return promise_rejects(t, new TypeError(), createImageBitmap(buffer));
}, "createImageBitmap with ArrayBuffer image source.");

promise_test( t => {
  return promise_rejects(t, "InvalidStateError",
    createImageBitmap(new Image()));
}, "createImageBitmap with empty image source.");

promise_test( t => {
  return promise_rejects(t, "InvalidStateError",
    createImageBitmap(document.createElement('video')));
}, "createImageBitmap with empty video source.");

promise_test( t => {
  return makeOversizedCanvas().then(canvas => {
    return promise_rejects(t, "InvalidStateError",
        createImageBitmap(canvas));
  });
}, "createImageBitmap with an oversized canvas source.");

promise_test( t => {
  return makeOversizedOffscreenCanvas().then(offscreenCanvas => {
    return promise_rejects(t, "InvalidStateError",
        createImageBitmap(offscreenCanvas));
  });
}, "createImageBitmap with an invalid OffscreenCanvas source.");

promise_test( t => {
  return makeInvalidBlob().then(blob => {
    return promise_rejects(t, "InvalidStateError",
        createImageBitmap(blob));
  });
}, "createImageBitmap with an undecodable blob source.");

promise_test( t => {
  return makeBrokenImage().then(image => {
    return promise_rejects(t, "InvalidStateError",
        createImageBitmap(image));
  });
}, "createImageBitmap with a broken image source.");

promise_test( t => {
  return makeAvailableButBrokenImage("/images/broken.png").then(image => {
    return promise_rejects(t, "InvalidStateError",
        createImageBitmap(image));
  });
}, "createImageBitmap with an available but undecodable image source.");

promise_test( t => {
  return makeAvailableButBrokenImage("/images/red-zeroheight.svg").then(image => {
    return promise_rejects(t, "InvalidStateError",
        createImageBitmap(image));
  });
}, "createImageBitmap with an available but zero height image source.");

promise_test( t => {
  return makeAvailableButBrokenImage("/images/red-zerowidth.svg").then(image => {
    return promise_rejects(t, "InvalidStateError",
        createImageBitmap(image));
  });
}, "createImageBitmap with an available but zero width image source.");

promise_test( t => {
  return makeImageBitmap().then(bitmap => {
    bitmap.close()
    return promise_rejects(t, "InvalidStateError", createImageBitmap(bitmap));
  });
}, "createImageBitmap with a closed ImageBitmap.");
</script>
