<!DOCTYPE html>
<!-- This is in chromium/ because the equivalent version available in Web
  Platform Tests also asserts the presence of the Client's `type` attribute.
  This less precise version (and its resources) should be maintained only to
  preserve test coverage until the attribute is implemented. See
  https://crbug.com/705685 -->
<title>Service Worker: Clients.get with window and worker clients</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../resources/test-helpers.js"></script>
<script>
var scope = 'resources/clients-get-client-types';
var frame_url = scope + '-frame.html';
var shared_worker_url = scope + '-shared-worker.js';
var client_ids = [];
var frame;
promise_test(function(t) {
    return service_worker_unregister_and_register(
        t, 'resources/clients-get-worker.js', scope)
      .then(function(registration) {
          add_completion_callback(function() { registration.unregister(); });
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() {
          return with_iframe(frame_url);
        })
      .then(function(f) {
          frame = f;
          add_completion_callback(function() { frame.remove(); });
          frame.focus();
          return wait_for_clientId();
        })
      .then(function(client_id) {
          client_ids.push(client_id);
          return new Promise(function(resolve) {
              var w = new SharedWorker(shared_worker_url);
              w.port.onmessage = function(e) {
                resolve(e.data.clientId);
              };
            });
        })
      .then(function(client_id) {
          client_ids.push(client_id);
          var channel = new MessageChannel();
          var saw_message = new Promise(function(resolve) {
              channel.port1.onmessage = resolve;
            });
          frame.contentWindow.navigator.serviceWorker.controller.postMessage(
              {port: channel.port2, clientIds: client_ids}, [channel.port2]);
          return saw_message;
        })
      .then(function(e) {
          assert_equals(e.data.length, 2);
          assert_array_equals(e.data[0], expected[0]);
          assert_array_equals(e.data[1], expected[1]);
        });
  }, 'Test Clients.get() with window and worker clients');

function wait_for_clientId() {
  return new Promise(function(resolve) {
      function get_client_id(e) {
        window.removeEventListener('message', get_client_id);
        resolve(e.data.clientId);
      }
      window.addEventListener('message', get_client_id, false);
    });
}

var expected = [
    /* visibilityState, focused, url, frameType */
    ['visible', true, normalizeURL(scope) + '-frame.html', 'nested'],
    [undefined, undefined, normalizeURL(scope) + '-shared-worker.js', 'none']
];
</script>
