<!DOCTYPE HTML>
<html>
<head>
<title>Example with a service worker</title>
<script src="../testharness.js"></script>
<script src="../testharnessreport.js"></script>
</head>
<body>
<h1>Service Worker Tests</h1>
<p>Demonstrates running <tt>testharness</tt> based tests inside a service worker.
<p>The test harness should time out due to one of the tests inside the worker timing out.
<p>This test assumes that the browser supports <a href="http://www.w3.org/TR/service-workers/">ServiceWorkers</a>.
<div id="log"></div>

<script>
test(
    function(t) {
        assert_true("serviceWorker" in navigator,
                    "navigator.serviceWorker exists");
    },
    "Browser supports ServiceWorker");

promise_test(
    function() {
        // Since the service worker registration could be in an indeterminate
        // state (due to, for example, a previous test run failing), we start by
        // unregstering our service worker and then registering it again.
        var scope = "/service-worker-scope";
        var worker_url = "apisample-worker.js";

        return navigator.serviceWorker.register(worker_url, {scope: scope})
            .then(
                function(registration) {
                    return registration.unregister();
                })
            .then(
                function() {
                    return navigator.serviceWorker.register(worker_url, {scope: scope});
                })
            .then(
                function(registration) {
                    add_completion_callback(
                        function() {
                            registration.unregister();
                        });

                    return new Promise(
                        function(resolve) {
                            registration.addEventListener("updatefound",
                                function() {
                                    resolve(registration.installing);
                                });
                        });
                })
            .then(
                function(worker) {
                    fetch_tests_from_worker(worker);
                });
    },
    "Register ServiceWorker");
</script>
</body>
