text: // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  window.indexedDB = window.indexedDB || window.webkitIndexedDB;
  window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
  window.IDBDatabaseException = window.IDBDatabaseException ||
    window.webkitIDBDatabaseException;
  
  function test() {
    prepareDatabase();
  }
  
  function prepareDatabase() {
    var databaseName = 'key-test-db';
    var deleteRequest = indexedDB.deleteDatabase(databaseName);
    deleteRequest.onerror = unexpectedErrorCallback;
    deleteRequest.onsuccess = function() {
      var openreq = indexedDB.open(databaseName);
      openreq.onerror = unexpectedErrorCallback;
      openreq.onsuccess = function() {
        db = openreq.result;
        shouldBe('db.version', '""');
        var verreq = db.setVersion('1');
        verreq.onerror = unexpectedErrorCallback;
        verreq.onsuccess = function() {
          var trans = verreq.result;
          db.createObjectStore('store');
          trans.oncomplete = testValidKeys;
        };
      };
    };
  }
  
  var valid_keys = [
    "-Infinity",
    "-Number.MAX_VALUE",
    "-1",
    "-Number.MIN_VALUE",
    "0",
    "Number.MIN_VALUE",
    "1",
    "Number.MAX_VALUE",
    "Infinity",
  
    "new Date(0)",
    "new Date(1000)",
    "new Date(1317399931023)",
  
    "''",
  
    "'\x00'",
    "'a'",
    "'aa'",
    "'b'",
    "'ba'",
  
    "'\xA2'", // U+00A2 CENT SIGN
    "'\u6C34'", // U+6C34 CJK UNIFIED IDEOGRAPH (water)
    "'\uD834\uDD1E'", // U+1D11E MUSICAL SYMBOL G-CLEF (UTF-16 surrogate pair)
    "'\uFFFD'", // U+FFFD REPLACEMENT CHARACTER
  
    "[]",
  
    "[-Infinity]",
    "[-Number.MAX_VALUE]",
    "[-1]",
    "[-Number.MIN_VALUE]",
    "[0]",
    "[Number.MIN_VALUE]",
    "[1]",
    "[Number.MAX_VALUE]",
    "[Infinity]",
  
    "[new Date(0)]",
    "[new Date(1000)]",
    "[new Date(1317399931023)]",
  
    "['']",
    "['\x00']",
    "['a']",
    "['aa']",
    "['b']",
    "['ba']",
  
    "['\xA2']", // U+00A2 CENT SIGN
    "['\u6C34']", // U+6C34 CJK UNIFIED IDEOGRAPH (water)
    "['\uD834\uDD1E']", // U+1D11E MUSICAL SYMBOL G-CLEF (UTF-16 surrogate pair)
    "['\uFFFD']", // U+FFFD REPLACEMENT CHARACTER
  
    "[[]]",
  
    "[[], []]",
    "[[], [], []]",
  
    "[[[]]]",
    "[[[[]]]]"
  ];
  
  
  var invalid_keys = [
    "void 0", // undefined
    "true",
    "false",
    "NaN",
    "null",
    "{}",
    "function () {}",
    "/regex/",
    "window",
    "window.document",
    "window.document.body",
    "(function() { var cyclic = []; cyclic.push(cyclic); return cyclic; }())"
  ];
  
  
  function testValidKeys() {
    var test_keys = valid_keys.slice(); // make a copy
    var count = 0, when_complete = testInvalidKeys;
    testNextKey();
  
    function testNextKey() {
      var key = test_keys.shift();
      if (!key) {
        when_complete();
        return;
      }
  
      key = eval("(" + key + ")");
      var value = 'value' + (count++);
      var trans = db.transaction('store', 'readwrite');
      var store = trans.objectStore('store');
      var putreq = store.put(value, key);
      putreq.onerror = unexpectedErrorCallback;
      putreq.onsuccess = function() {
        getreq = store.get(key);
        getreq.onerror = unexpectedErrorCallback;
        getreq.onsuccess = function() {
          shouldBeEqualToString('getreq.result', value);
        };
      };
      trans.oncomplete = testNextKey;
    }
  }
  
  function testInvalidKeys() {
  
    var trans = db.transaction('store', 'readwrite');
    var store = trans.objectStore('store');
  
    invalid_keys.forEach(
      function(key) {
        try {
          key = eval("(" + key + ")");
          var putreq = store.put('value', key);
          putreq.onerror = unexpectedErrorCallback;
          putreq.onsuccess = unexpectedSuccessCallback;
          return;
        } catch (e) {
          window.ex = e;
          shouldBe("ex.code", "IDBDatabaseException.DATA_ERR");
          shouldBe("ex.name", "'DataError'");
        }
      });
    testKeyOrdering();
  }
  
  function testKeyOrdering() {
  
    for (var i = 0; i < valid_keys.length - 1; ++i) {
      var key1 = valid_keys[i];
      var key2 = valid_keys[i + 1];
  
      shouldBe("indexedDB.cmp(" + key1 + "," +  key2 + ")", "-1");
      shouldBe("indexedDB.cmp(" + key2 + "," +  key1 + ")", "1");
      shouldBe("indexedDB.cmp(" + key1 + "," +  key1 + ")", "0");
      shouldBe("indexedDB.cmp(" + key2 + "," +  key2 + ")", "0");
    }
  
    done();
  }
  