<!DOCTYPE html>
<title>Service Worker: Interfaces</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
'use strict';

promise_test(async (t) => {
  const srcs = ['dom', 'html', 'service-workers'];
  const [dom, html, serviceWorkerIdl] = await Promise.all(
    srcs.map(i => fetch(`/interfaces/${i}.idl`).then(r => r.text())));

  var idlArray = new IdlArray();
  idlArray.add_idls(serviceWorkerIdl, { only: [
    'ServiceWorkerGlobalScope',
    'Client',
    'WindowClient',
    'Clients',
    'ServiceWorker',
    'ServiceWorkerState',
    'ServiceWorkerUpdateViaCache',
    'ServiceWorkerRegistration',
    'EventTarget',
    'NavigationPreloadManager',
    'Cache',
    'CacheStorage',
  ]});
  idlArray.add_dependency_idls(dom);
  idlArray.add_dependency_idls(html);
  idlArray.add_objects({
    ServiceWorkerContainer: ['navigator.serviceWorker']
  });
  var scope = 'resources/scope/interfaces-and-attributes';

  return service_worker_unregister_and_register(
      t, 'resources/empty-worker.js', scope)
    .then(function(registration) {
        t.add_cleanup(function() {
            return registration.unregister();
          });

        window.registrationInstance = registration;
        idlArray.add_objects({
            ServiceWorkerRegistration: ['window.registrationInstance'],
            ServiceWorker: ['window.registrationInstance.installing']
          });
        idlArray.test();
      });
}, 'test setup (worker registration)');

promise_test(t => {
  const url = encodeURI(`data:text/html,<!DOCTYPE html>
  <script>
    parent.postMessage({ isDefined: 'serviceWorker' in navigator }, '*');
  </` + `script>`);
  var p = new Promise((resolve, reject) => {
    window.addEventListener('message', event => {
      resolve(event.data.isDefined);
    });
  });
  with_iframe(url);
  return p.then(isDefined => {
    assert_false(isDefined, 'navigator.serviceWorker should not be defined in iframe');
  });
}, 'navigator.serviceWorker is not available in a data: iframe');
</script>
