<!DOCTYPE html>
<title>Service Worker: FetchEvent for css image</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js?pipe=sub"></script>
<script>
var SCOPE = 'resources/fetch-request-resources-iframe.https.html';
var SCRIPT = 'resources/fetch-request-resources-worker.js';
var host_info = get_host_info();
var LOCAL_URL =
  host_info['HTTPS_ORIGIN'] + base_path() + 'resources/dummy?test';
var REMOTE_URL =
  host_info['HTTPS_REMOTE_ORIGIN'] + base_path() + 'resources/dummy?test';

function css_image_test(expected_results, frame, url, type,
                        expected_mode, expected_credentials) {
  expected_results[url] = {
      url: url,
      mode: expected_mode,
      credentials: expected_credentials,
      message: 'CSSImage load (url:' + url + ' type:' + type + ')'
    };
  return frame.contentWindow.load_css_image(url, type);
}

function css_image_set_test(expected_results, frame, url, type,
                            expected_mode, expected_credentials) {
  expected_results[url] = {
      url: url,
      mode: expected_mode,
      credentials: expected_credentials,
      message: 'CSSImageSet load (url:' + url + ' type:' + type + ')'
    };
  return frame.contentWindow.load_css_image_set(url, type);
}

function create_message_promise(t, expected_results, frame,
                                worker, test_count, scope) {
  return new Promise(function(resolve) {
    var channel = new MessageChannel();
    channel.port1.onmessage = t.step_func(function(msg) {
      if (msg.data.ready) {
        resolve();
        return;
      }
      var result = msg.data;
      var expected = expected_results[result.url];
      if (!expected) {
        return;
      }
      assert_equals(
          result.mode, expected.mode,
          'mode of ' + expected.message +  ' must be ' +
          expected.mode + '.');
      assert_equals(
          result.credentials, expected.credentials,
          'credentials of ' + expected.message +  ' must be ' +
          expected.credentials + '.');
      --test_count;
      delete expected_results[result.url];
      if (test_count == 0) {
        frame.remove();
        service_worker_unregister_and_done(t, scope);
      }
    });
    worker.postMessage(
      {port: channel.port2}, [channel.port2]);
  });
}

async_test(function(t) {
    var scope = SCOPE + "?img=backgroundImage";
    var test_count = 2;
    var expected_results = {};
    var worker;
    var frame;
    service_worker_unregister_and_register(t, SCRIPT, scope)
      .then(function(registration) {
          worker = registration.installing;
          return wait_for_state(t, worker, 'activated');
        })
      .then(function() { return with_iframe(scope); })
      .then(function(f) {
          frame = f;
          return create_message_promise(t, expected_results, frame,
                                        worker, test_count, scope);
        })
      .then(function() {
        css_image_test(expected_results, frame, LOCAL_URL + Date.now(),
                       'backgroundImage', 'no-cors', 'include');
        css_image_test(expected_results, frame, REMOTE_URL + Date.now(),
                      'backgroundImage', 'no-cors', 'include');
      })
      .catch(unreached_rejection(t));
  }, 'Verify FetchEvent for css image (backgroundImage).');

async_test(function(t) {
    var scope = SCOPE + "?img=shapeOutside";
    var test_count = 2;
    var expected_results = {};
    var worker;
    var frame;
    service_worker_unregister_and_register(t, SCRIPT, scope)
      .then(function(registration) {
          worker = registration.installing;
          return wait_for_state(t, worker, 'activated');
        })
      .then(function() { return with_iframe(scope); })
      .then(function(f) {
          frame = f;
          return create_message_promise(t, expected_results, frame,
                                        worker, test_count, scope);
        })
      .then(function() {
         css_image_test(expected_results, frame, LOCAL_URL + Date.now(),
                        'shapeOutside', 'cors', 'same-origin');
         css_image_test(expected_results, frame, REMOTE_URL + Date.now(),
                        'shapeOutside', 'cors', 'same-origin');
      })
      .catch(unreached_rejection(t));
  }, 'Verify FetchEvent for css image (shapeOutside).');

async_test(function(t) {
    var scope = SCOPE + "?img_set=backgroundImage";
    var test_count = 2;
    var expected_results = {};
    var worker;
    var frame;
    service_worker_unregister_and_register(t, SCRIPT, scope)
      .then(function(registration) {
          worker = registration.installing;
          return wait_for_state(t, worker, 'activated');
        })
      .then(function() { return with_iframe(scope); })
      .then(function(f) {
          frame = f;
          return create_message_promise(t, expected_results, frame,
                                        worker, test_count, scope);
        })
      .then(function() {
         css_image_set_test(expected_results, frame, LOCAL_URL + Date.now(),
                           'backgroundImage', 'no-cors', 'include');
         css_image_set_test(expected_results, frame, REMOTE_URL + Date.now(),
                           'backgroundImage', 'no-cors', 'include');
      })
      .catch(unreached_rejection(t));
  }, 'Verify FetchEvent for css image-set (backgroundImage).');

async_test(function(t) {
    var scope = SCOPE + "?img_set=shapeOutside";
    var test_count = 2;
    var expected_results = {};
    var worker;
    var frame;
    service_worker_unregister_and_register(t, SCRIPT, scope)
      .then(function(registration) {
          worker = registration.installing;
          return wait_for_state(t, worker, 'activated');
        })
      .then(function() { return with_iframe(scope); })
      .then(function(f) {
          frame = f;
          return create_message_promise(t, expected_results, frame,
                                        worker, test_count, scope);
        })
      .then(function() {
         css_image_set_test(expected_results, frame, LOCAL_URL + Date.now(),
                            'shapeOutside', 'cors', 'same-origin');
         css_image_set_test(expected_results, frame, REMOTE_URL + Date.now(),
                           'shapeOutside', 'cors', 'same-origin');
      })
      .catch(unreached_rejection(t));
  }, 'Verify FetchEvent for css image-set (shapeOutside).');

</script>
