<!DOCTYPE html>
<html>
<head>
<title>subscribe() is rejected when the service worker is not active yet</title>
<link rel="manifest" href="resources/push_manifest.json">
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../serviceworker/resources/test-helpers.js"></script>
</head>
<body>
<script>
async_test(function(test) {
    var workerUrl = 'resources/empty_worker.js';
    var workerScope = 'resources/scope/' + location.pathname;
    var swRegistration;
    service_worker_unregister_and_register(test, workerUrl, workerScope)
        .then(function(serviceWorkerRegistration) {
            swRegistration = serviceWorkerRegistration;
            assert_not_equals(swRegistration.installing, null, 'The worker should be installing');
            assert_equals(swRegistration.active, null, 'The worker should not be active yet');
            // If running manually, grant permission when prompted.
            if (window.testRunner)
                testRunner.setPermission('push-messaging', 'granted', location.origin, location.origin);
            return swRegistration.pushManager.subscribe();
        })
        .then(function(pushRegistration) {
            assert_unreached('subscribe() must not succeed without an active service worker');
        }, function(e) {
            assert_equals(e.name, 'AbortError');
            assert_equals(e.message, 'Failed to execute \'subscribe\' on \'PushManager\': Subscription failed - no active Service Worker');
            return service_worker_unregister_and_done(test, workerScope);
        })
        .catch(unreached_rejection(test));
}, 'subscribe() is rejected when the service worker is not active yet');
</script>
</body>
</html>
