<!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"
      },
      {
        createDetector: () => { return new TextDetector(); },
        detectorType: "TextDetector"
      }
    ];

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_dom(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_dom(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_dom(t, "SecurityError", detector.detect(video));
  }, crossOriginTest.detectorType
  + " should reject cross-origin HTMLVideoElements with a SecurityError.");

}

</script>