<!DOCTYPE html>
<title>Tests for cross-origin multipart image returned by service worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>

<script>
// This tests loading a multipart image via service worker. The service worker responds with
// an opaque or a non-opaque response. The content of opaque response should not be readable.

const script = 'resources/multipart-image-worker.js';
const scope = 'resources/multipart-image-iframe.html';
let frame;

function check_image_data(data) {
    assert_equals(data[0], 255);
    assert_equals(data[1], 0);
    assert_equals(data[2], 0);
    assert_equals(data[3], 255);
}

promise_test(t => {
    return service_worker_unregister_and_register(t, script, scope)
      .then(registration => {
          promise_test(() => {
              if (frame) {
                  frame.remove();
              }
              return registration.unregister();
            }, 'restore global state');

          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(() => with_iframe(scope))
      .then(f => {
          frame = f;
      });
  }, 'initialize global state');

promise_test(t => {
    return frame.contentWindow.load_multipart_image('same-origin-multipart-image')
      .then(img => frame.contentWindow.get_image_data(img))
      .then(img_data => {
          check_image_data(img_data.data);
      });
  }, 'same-origin multipart image via SW should be readable');

promise_test(t => {
    return frame.contentWindow.load_multipart_image('cross-origin-multipart-image-with-cors-approved')
      .then(img => frame.contentWindow.get_image_data(img))
      .then(img_data => {
          check_image_data(img_data.data);
      });
  }, 'cross-origin multipart image via SW with approved CORS should be readable');

promise_test(t => {
    return frame.contentWindow.load_multipart_image('cross-origin-multipart-image-with-no-cors')
      .then(img => {
        assert_throws('SecurityError', () => frame.contentWindow.get_image_data(img));
      });
  }, 'cross-origin multipart image with no-cors via SW should not be readable');

promise_test(t => {
    const promise = frame.contentWindow.load_multipart_image('cross-origin-multipart-image-with-cors-rejected');
    return promise_rejects(t, new DOMException('load failed', 'NetworkError'), promise);
  }, 'cross-origin multipart image via SW with rejected CORS should fail to load');
</script>
