<!DOCTYPE html>
<title>Service Worker: Clients.get across origins</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
var host_info = get_host_info();

var scope = 'resources/clients-get-frame.html';
var other_origin_iframe = host_info['HTTPS_REMOTE_ORIGIN'] + base_path() +
                          'resources/clients-get-cross-origin-frame.html';
// The ID of a client from the same origin as us.
var my_origin_client_id;
// This test asserts the behavior of the Client API in cases where the client
// belongs to a foreign origin. It does this by creating an iframe with a
// foreign origin which connects to a server worker in the current origin.
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);
        })
      // Create a same-origin client and use it to populate |my_origin_client_id|.
      .then(function(frame1) {
          add_completion_callback(function() { frame1.remove(); });
          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);
          });
        })
      // Create a cross-origin client. We'll communicate with this client to
      // test the cross-origin service worker's behavior.
      .then(function(client_id) {
          my_origin_client_id = client_id;
          return with_iframe(other_origin_iframe);
        })
      // Post the 'getClientId' message to the cross-origin client. The client
      // will then ask its service worker to look up |my_origin_client_id| via
      // Clients#get. Since this client ID is for a different origin, we expect
      // the client to not be found.
      .then(function(frame2) {
          add_completion_callback(function() { frame2.remove(); });

          frame2.contentWindow.postMessage(
            {clientId: my_origin_client_id, type: 'getClientId'},
            host_info['HTTPS_REMOTE_ORIGIN']
          );

          return new Promise(function(resolve) {
              window.addEventListener('message', function(e) {
                  if (e.data && e.data.type === 'clientId') {
                    resolve(e.data.value);
                  }
                });
            });
        })
      .then(function(client_id) {
          assert_equals(client_id, undefined, 'iframe client ID');
        });
  }, 'Test Clients.get() cross origin');
</script>
