<!DOCTYPE html>
<title>Service Worker: ServiceWorkerMessageEvent</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script>

promise_test(function(t) {
    var scope = 'resources/blank.html';
    var url = 'resources/postmessage-to-client-worker.js';
    return service_worker_unregister_and_register(t, url, scope)
      .then(function(r) {
          return wait_for_state(t, r.installing, 'activated');
        })
      .then(function() {
          return with_iframe(scope);
        })
      .then(function(frame) {
          var w = frame.contentWindow;
          var worker = w.navigator.serviceWorker.controller;
          // Test constructor with ServiceWorker object as source.
          var e = new ServiceWorkerMessageEvent('eventType', {source: worker});
          assert_equals(e.source, worker,
                        'Source should equal to the passing service worker');
          return new Promise(function(resolve) {
              w.navigator.serviceWorker.onmessage = t.step_func(function(e) {
                  assert_true(e instanceof w.ServiceWorkerMessageEvent);
                  assert_true(e.source instanceof w.ServiceWorker);
                  assert_equals(e.type, 'message');
                  assert_equals(e.source, worker,
                                'Source worker should equal to the controller');
                  assert_equals(e.ports.length, 0);
                  resolve();
              });
              worker.postMessage('PING');
          });
        })
      .then(function() {
          return service_worker_unregister_and_done(t, scope);
        });
  }, 'Test ServiceWorkerMessageEvent type.');

</script>
