<!DOCTYPE html>
<title>Service Worker: Indexed DB</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
function readDB() {
  return new Promise(function(resolve, reject) {
      var openRequest = indexedDB.open('db');

      openRequest.onerror = reject;
      openRequest.onsuccess = function() {
          var db = openRequest.result;
          var tx = db.transaction('store');
          var store = tx.objectStore('store');
          var getRequest = store.get('key');

          getRequest.onerror = function() {
              db.close();
              reject(getRequest.error);
            };
          getRequest.onsuccess = function() {
              db.close();
              resolve(getRequest.result);
            };
        };
    });
}

function send(worker, action) {
  return new Promise(function(resolve, reject) {
      var messageChannel = new MessageChannel();
      messageChannel.port1.onmessage = function(event) {
          if (event.data.type === 'error') {
            reject(event.data.reason);
          }

          resolve();
        };

      worker.postMessage(
        {action: action, port: messageChannel.port2},
        [messageChannel.port2]);
    });
}

promise_test(function(t) {
    var scope = 'resources/blank.html';

    return service_worker_unregister_and_register(
        t, 'resources/indexeddb-worker.js', scope)
      .then(function(registration) {
          var worker = registration.installing;

          promise_test(function() {
              return registration.unregister();
            }, 'clean up: registration');

          return send(worker, 'create')
            .then(function() {
                promise_test(function() {
                  return new Promise(function(resolve, reject) {
                        var delete_request = indexedDB.deleteDatabase('db');

                        delete_request.onsuccess = resolve;
                        delete_request.onerror = reject;
                      });
                    }, 'clean up: database');
              })
            .then(readDB)
            .then(function(value) {
                assert_equals(
                  value, 'value',
                  'The get() result should match what the worker put().');
              });
        });
  }, 'Verify Indexed DB operation in a Service Worker');
</script>
