<!DOCTYPE html>
<title>Service Worker: ServiceWorkerMessageEvent</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.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) {
          t.add_cleanup(function() {
              return service_worker_unregister(t, scope);
            });

          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;
          assert_equals(
              self.ServiceWorkerMessageEvent, undefined,
              'ServiceWorkerMessageEvent should not be defined.');
          return new Promise(function(resolve) {
              w.navigator.serviceWorker.onmessage = t.step_func(function(e) {
                  assert_true(
                      e instanceof w.MessageEvent,
                      'message events should use MessageEvent interface.');
                  assert_true(e.source instanceof w.ServiceWorker);
                  assert_equals(e.type, 'message');
                  assert_equals(e.source, worker,
                                'source should equal to the controller.');
                  assert_equals(e.ports.length, 0);
                  resolve();
                });
              worker.postMessage('PING');
            });
        });
  }, 'Test MessageEvent supplants ServiceWorkerMessageEvent.');

</script>
