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

<meta http-equiv="Content-Security-Policy" content="img-src 'none'">

<body>

<script>
  function wait_for_error_from_frame(frame, test) {
    window.addEventListener('message', test.step_func(e => {
      if (e.source != frame.contentWindow)
        return;
      assert_equals(e.data, "error");
      frame.remove();
      test.done();
    }));
  }

  async_test(t => {
    var i = document.createElement('iframe');
    document.body.appendChild(i);

    var img = document.createElement('img');
    img.onerror = t.step_func_done(_ => i.remove());
    img.onload = t.unreached_func();
    i.contentDocument.body.appendChild(img);
    img.src = "{{location[server]}}/images/red-16x16.png";
  }, "<iframe>'s about:blank inherits policy.");

  async_test(t => {
    var i = document.createElement('iframe');
    i.srcdoc = `
      <img src='{{location[server]}}/images/red-16x16.png'
        onload='window.top.postMessage("load", "*");'
        onerror='window.top.postMessage("error", "*");'
      >
    `;

    wait_for_error_from_frame(i, t);

    document.body.appendChild(i);
  }, "<iframe srcdoc>'s inherits policy.");

  async_test(t => {
    var i = document.createElement('iframe');
    var b = new Blob(
      [`
        <img src='{{location[server]}}/images/red-16x16.png'
          onload='window.top.postMessage("load", "*");'
          onerror='window.top.postMessage("error", "*");'
        >
      `], {type:"text/html"});
    i.src = URL.createObjectURL(b);

    wait_for_error_from_frame(i, t);

    document.body.appendChild(i);
  }, "<iframe src='blob:...'>'s inherits policy.");

  async_test(t => {
    var i = document.createElement('iframe');
    i.src = `data:text/html,<img src='{{location[server]}}/images/red-16x16.png'
      onload='window.top.postMessage("load", "*");'
      onerror='window.top.postMessage("error", "*");'
    >`;

    wait_for_error_from_frame(i, t);

    document.body.appendChild(i);
  }, "<iframe src='data:...'>'s inherits policy.");

  async_test(t => {
    var i = document.createElement('iframe');
    i.src = `javascript:"<img src='{{location[server]}}/images/red-16x16.png'
      onload='window.top.postMessage(\\"load\\", \\"*\\");'
      onerror='window.top.postMessage(\\"error\\", \\"*\\");'
    >"`;

    wait_for_error_from_frame(i, t);

    document.body.appendChild(i);
  }, "<iframe src='javascript:...'>'s inherits policy.");

  async_test(t => {
    var i = document.createElement('iframe');
    var b = new Blob(
      [`
        <img src='{{location[server]}}/images/red-16x16.png'
          onload='window.top.postMessage("load", "*");'
          onerror='window.top.postMessage("error", "*");'
        >
      `], {type:"text/html"});
    i.src = URL.createObjectURL(b);
    i.sandbox = 'allow-scripts';

    wait_for_error_from_frame(i, t);

    document.body.appendChild(i);
  }, "<iframe sandbox src='blob:...'>'s inherits policy. (opaque origin sandbox)");

</script>
