<!--
  Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/
-->
<html>
  <head>
    <title>Indexed Database Property Test</title>

    <script type="text/javascript"
            src="/tests/SimpleTest/SimpleTest.js">
    </script>

    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>

    <script type="text/javascript;version=1.7">
      function testSteps()
      {
        const databaseName = window.location.pathname;
        const databaseVersion = 1;
        const objectStoreName = "foo";
        const mutableFileName = "bar";
        const mutableFileKey = 42;

        info("opening database");

        let request = indexedDB.open(databaseName, databaseVersion);
        request.onerror = errorHandler;
        request.onupgradeneeded = grabEventAndContinueHandler;
        request.onsuccess = unexpectedSuccessHandler;
        let event = yield undefined;

        info("creating object store");

        let db = event.target.result;
        db.onerror = errorHandler;
        db.onversionchange = function(event) {
          is(event.oldVersion, databaseVersion, "got correct oldVersion");
          is(event.newVersion, null, "got correct newVersion");
          db.close();
        };

        let objectStore = db.createObjectStore(objectStoreName,
                                               { autoIncrement: true });

        request.onupgradeneeded = unexpectedSuccessHandler;
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        info("creating mutable file");

        request = db.createMutableFile(mutableFileName);
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        let mutableFile = event.target.result;

        verifyMutableFile(mutableFile, getFile(mutableFileName, "", ""));
        yield undefined;

        objectStore = db.transaction([objectStoreName], "readwrite")
                        .objectStore(objectStoreName);

        info("adding mutable file");

        request = objectStore.add(mutableFile, mutableFileKey);
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        info("getting mutable file");

        request = objectStore.get(mutableFileKey);
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        verifyMutableFile(event.target.result,
                          getFile(mutableFileName, "", ""));
        yield undefined;

        info("opening database");

        request = indexedDB.open(databaseName, databaseVersion);
        request.onerror = errorHandler;
        request.onupgradeneeded = unexpectedSuccessHandler;
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        let db2 = event.target.result;
        db2.onerror = errorHandler;
        db2.onversionchange = function(event) {
          is(event.oldVersion, databaseVersion, "got correct oldVersion");
          is(event.newVersion, null, "got correct newVersion");
          db2.close();
        };

        objectStore = db2.transaction([objectStoreName], "readwrite")
                         .objectStore(objectStoreName);

        info("adding mutable file");

        request = objectStore.add(mutableFile);
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        info("getting mutable file");

        request = objectStore.get(event.target.result);
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        verifyMutableFile(event.target.result,
                          getFile(mutableFileName, "", ""));
        yield undefined;

        info("setting file handle pref");

        SpecialPowers.pushPrefEnv({ set: [["dom.fileHandle.enabled", false]] },
                                  continueToNextStep);
        yield undefined;

        info("opening database");

        request = indexedDB.open(databaseName, databaseVersion);
        request.onerror = errorHandler;
        request.onupgradeneeded = unexpectedSuccessHandler;
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        let db3 = event.target.result;
        db3.onerror = errorHandler;
        db3.onversionchange = function(event) {
          is(event.oldVersion, databaseVersion, "got correct oldVersion");
          is(event.newVersion, null, "got correct newVersion");
          db3.close();
        };

        info("creating mutable file");

        try {
          db3.createMutableFile(mutableFileName);
          ok(false, "Should have thrown!");
        }
        catch (e) {
          ok(e instanceof DOMException, "Got exception.");
          is(e.name, "InvalidStateError", "Good error.");
          is(e.code, DOMException.INVALID_STATE_ERR, "Good error code.");
        }

        objectStore = db3.transaction([objectStoreName], "readwrite")
                         .objectStore(objectStoreName);

        info("adding mutable file");

        try {
          objectStore.add(mutableFile);
          ok(false, "Should have thrown!");
        }
        catch (e) {
          ok(e instanceof DOMException, "Got exception.");
          is(e.name, "DataCloneError", "Good error.");
          is(e.code, DOMException.DATA_CLONE_ERR, "Good error code.");
        }

        info("getting mutable file");

        request = objectStore.get(mutableFileKey);
        request.onsuccess = grabEventAndContinueHandler;
        event = yield undefined;

        try {
          let result = request.result;
          ok(false, "Should have thrown!");
        }
        catch (e) {
          ok(e instanceof DOMException, "Got exception.");
          is(e.name, "InvalidStateError", "Good error.");
          is(e.code, DOMException.INVALID_STATE_ERR, "Good error code.");
        }

        info("deleting database");

        request = indexedDB.deleteDatabase(databaseName);
        request.onerror = errorHandler;
        request.onsuccess = grabEventAndContinueHandler;

        event = yield undefined;

        info("resetting file handle pref");

        SpecialPowers.popPrefEnv(continueToNextStep);
        yield undefined;

        finishTest();
        yield undefined;
      }
    </script>

    <script type="text/javascript;version=1.7" src="helpers.js"></script>
    <script type="text/javascript;version=1.7" src="file.js"></script>

  </head>

  <body onload="runTest();"></body>

</html>