<!DOCTYPE html>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>

// cross-origin resources
const IMAGE_URL =
    "https://{{domains[www1]}}:{{ports[https][0]}}/images/green.png";
const VIDEO_URL =
    "https://{{domains[www1]}}:{{ports[https][0]}}/media/white.webm";

const crossOriginTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        detectorType: "FaceDetector"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        detectorType: "BarcodeDetector"
      }
    ];

for (let crossOriginTest of crossOriginTests) {

  // Verifies that Detector rejects a cross-origin HTMLImageElement.
  promise_test(async t => {
    const img = new Image();
    const imgWatcher = new EventWatcher(t, img, ["load", "error"]);
    img.src = IMAGE_URL;
    await imgWatcher.wait_for("load");
    const detector = crossOriginTest.createDetector();
    promise_rejects(t, "SecurityError", detector.detect(img));
  }, crossOriginTest.detectorType
  + " should reject cross-origin HTMLImageElements with a SecurityError.");

  // Verifies that Detector rejects a cross-origin ImageBitmap.
  promise_test(async t => {
    const img = new Image();
    const imgWatcher = new EventWatcher(t, img, ["load", "error"]);
    img.src = IMAGE_URL;
    await imgWatcher.wait_for("load");
    const imgBitmap = await createImageBitmap(img);
    const detector = crossOriginTest.createDetector();
    promise_rejects(t, "SecurityError", detector.detect(imgBitmap));
  }, crossOriginTest.detectorType
  + " should reject cross-origin ImageBitmaps with a SecurityError.");

  // Verifies that Detector rejects a cross-origin HTMLVideoElement.
  promise_test(async t => {
    const video = document.createElement('video');
    const videoWatcher = new EventWatcher(t, video, ["loadeddata", "error"]);
    video.src = VIDEO_URL;
    await videoWatcher.wait_for("loadeddata");
    const detector = crossOriginTest.createDetector();
    promise_rejects(t, "SecurityError", detector.detect(video));
  }, crossOriginTest.detectorType
  + " should reject cross-origin HTMLVideoElements with a SecurityError.");

}

</script>