<!DOCTYPE html>
<title>Service Worker: Clients.get</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
var scope = 'resources/clients-get-frame.html';
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(scope + '#1');
        })
      .then(function(frame1) {
          add_completion_callback(function() { frame1.remove(); });
          frame1.focus();
          return wait_for_clientId();
        })
      .then(function(client_id) {
          client_ids.push(client_id);
          return with_iframe(scope + '#2');
        })
      .then(function(frame2) {
          frame = frame2;
          add_completion_callback(function() { frame2.remove(); });
          return wait_for_clientId();
        })
      .then(function(client_id) {
          client_ids.push(client_id, 'invalid-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, 3);
          assert_array_equals(e.data[0], expected[0]);
          assert_array_equals(e.data[1], expected[1]);
          assert_equals(e.data[2], expected[2]);
        });
  }, 'Test Clients.get()');

function wait_for_clientId() {
  return new Promise(function(resolve, reject) {
      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) + '#1', 'nested'],
    ['visible', false, normalizeURL(scope) + '#2', 'nested'],
    undefined
];
</script>
