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

test(function() {
    var EVENT_HANDLER = 'object';
    verify_interface(
      'ServiceWorkerContainer', navigator.serviceWorker,
      {
        register: 'function',
        getRegistration: 'function',
        oncontrollerchange: EVENT_HANDLER,
        onmessage: EVENT_HANDLER,
        onmessageerror: EVENT_HANDLER
      });
  }, 'Interfaces and attributes of ServiceWorkerContainer');

async_test(function(t) {
    var EVENT_HANDLER = 'object';
    var scope = 'resources/scope/interfaces-and-attributes';

    service_worker_unregister_and_register(
        t, 'resources/empty-worker.js', scope)
      .then(function(registration) {
          verify_interface(
            'ServiceWorkerRegistration', registration,
            {
              installing: 'object',
              waiting: 'object',
              active: 'object',
              scope: 'string',
              unregister: 'function',
              onupdatefound: EVENT_HANDLER
            });
          verify_interface(
            'ServiceWorker', registration.installing,
            {
              scriptURL: 'string',
              state: 'string',
              onstatechange: EVENT_HANDLER
            });
          return registration.unregister();
        })
      .then(function() {
          t.done();
        })
      .catch(unreached_rejection(t));
  }, 'Interfaces and attributes of ServiceWorker');

service_worker_test(
  'resources/interfaces-worker.sub.js',
  'Interfaces and attributes in ServiceWorkerGlobalScope');

</script>
