[Exposed=(Window,Worker)]
interface IDBRequest : EventTarget {
  readonly attribute any                                        result;
  readonly attribute DOMException?                              error;
  readonly attribute (IDBObjectStore or IDBIndex or IDBCursor)? source;
  readonly attribute IDBTransaction?                            transaction;
  readonly attribute IDBRequestReadyState                       readyState;

  // Event handlers:
  attribute EventHandler onsuccess;
  attribute EventHandler onerror;
};

enum IDBRequestReadyState {
  "pending",
  "done"
};

[Exposed=(Window,Worker)]
interface IDBOpenDBRequest : IDBRequest {
  // Event handlers:
  attribute EventHandler onblocked;
  attribute EventHandler onupgradeneeded;
};

[Exposed=(Window,Worker),
 Constructor(DOMString type, optional IDBVersionChangeEventInit eventInitDict)]
interface IDBVersionChangeEvent : Event {
  readonly attribute unsigned long long  oldVersion;
  readonly attribute unsigned long long? newVersion;
};

dictionary IDBVersionChangeEventInit : EventInit {
  unsigned long long  oldVersion = 0;
  unsigned long long? newVersion = null;
};

partial interface WindowOrWorkerGlobalScope {
  [SameObject] readonly attribute IDBFactory indexedDB;
};

[Exposed=(Window,Worker)]
interface IDBFactory {
  IDBOpenDBRequest open(DOMString name,
                        optional [EnforceRange] unsigned long long version);
  IDBOpenDBRequest deleteDatabase(DOMString name);

  short cmp(any first, any second);
};

[Exposed=(Window,Worker)]
interface IDBDatabase : EventTarget {
  readonly attribute DOMString          name;
  readonly attribute unsigned long long version;
  readonly attribute DOMStringList      objectStoreNames;

  IDBTransaction transaction((DOMString or sequence<DOMString>) storeNames,
                             optional IDBTransactionMode mode = "readonly");
  void           close();

  IDBObjectStore createObjectStore(DOMString name,
                                   optional IDBObjectStoreParameters options);
  void           deleteObjectStore(DOMString name);

  // Event handlers:
  attribute EventHandler onabort;
  attribute EventHandler onclose;
  attribute EventHandler onerror;
  attribute EventHandler onversionchange;
};

dictionary IDBObjectStoreParameters {
  (DOMString or sequence<DOMString>)? keyPath = null;
  boolean                             autoIncrement = false;
};

[Exposed=(Window,Worker)]
interface IDBObjectStore {
           attribute DOMString      name;
  readonly attribute any            keyPath;
  readonly attribute DOMStringList  indexNames;
  readonly attribute IDBTransaction transaction;
  readonly attribute boolean        autoIncrement;

  IDBRequest put(any value, optional any key);
  IDBRequest add(any value, optional any key);
  IDBRequest delete(any query);
  IDBRequest clear();
  IDBRequest get(any query);
  IDBRequest getKey(any query);
  IDBRequest getAll(optional any query,
                    [EnforceRange] optional unsigned long count);
  IDBRequest getAllKeys(optional any query,
                        [EnforceRange] optional unsigned long count);
  IDBRequest count(optional any query);

  IDBRequest openCursor(optional any query,
                        optional IDBCursorDirection direction = "next");
  IDBRequest openKeyCursor(optional any query,
                           optional IDBCursorDirection direction = "next");

  IDBIndex   index(DOMString name);

  IDBIndex   createIndex(DOMString name,
                         (DOMString or sequence<DOMString>) keyPath,
                         optional IDBIndexParameters options);
  void       deleteIndex(DOMString indexName);
};

dictionary IDBIndexParameters {
  boolean unique = false;
  boolean multiEntry = false;
};

[Exposed=(Window,Worker)]
interface IDBIndex {
           attribute DOMString      name;
  readonly attribute IDBObjectStore objectStore;
  readonly attribute any            keyPath;
  readonly attribute boolean        multiEntry;
  readonly attribute boolean        unique;

  IDBRequest get(any query);
  IDBRequest getKey(any query);
  IDBRequest getAll(optional any query,
                    [EnforceRange] optional unsigned long count);
  IDBRequest getAllKeys(optional any query,
                        [EnforceRange] optional unsigned long count);
  IDBRequest count(optional any query);

  IDBRequest openCursor(optional any query,
                        optional IDBCursorDirection direction = "next");
  IDBRequest openKeyCursor(optional any query,
                           optional IDBCursorDirection direction = "next");
};

[Exposed=(Window,Worker)]
interface IDBKeyRange {
  readonly attribute any     lower;
  readonly attribute any     upper;
  readonly attribute boolean lowerOpen;
  readonly attribute boolean upperOpen;

  // Static construction methods:
  static IDBKeyRange only(any value);
  static IDBKeyRange lowerBound(any lower, optional boolean open = false);
  static IDBKeyRange upperBound(any upper, optional boolean open = false);
  static IDBKeyRange bound(any lower,
                           any upper,
                           optional boolean lowerOpen = false,
                           optional boolean upperOpen = false);

  boolean _includes(any key);
};

[Exposed=(Window,Worker)]
interface IDBCursor {
  readonly attribute (IDBObjectStore or IDBIndex) source;
  readonly attribute IDBCursorDirection           direction;
  readonly attribute any                          key;
  readonly attribute any                          primaryKey;

  void advance([EnforceRange] unsigned long count);
  void continue(optional any key);
  void continuePrimaryKey(any key, any primaryKey);

  IDBRequest update(any value);
  IDBRequest delete();
};

enum IDBCursorDirection {
  "next",
  "nextunique",
  "prev",
  "prevunique"
};

[Exposed=(Window,Worker)]
interface IDBCursorWithValue : IDBCursor {
  readonly attribute any value;
};

[Exposed=(Window,Worker)]
interface IDBTransaction : EventTarget {
  readonly attribute DOMStringList      objectStoreNames;
  readonly attribute IDBTransactionMode mode;
  readonly attribute IDBDatabase        db;
  readonly attribute DOMException       error;

  IDBObjectStore objectStore(DOMString name);
  void           abort();

  // Event handlers:
  attribute EventHandler onabort;
  attribute EventHandler oncomplete;
  attribute EventHandler onerror;
};

enum IDBTransactionMode {
  "readonly",
  "readwrite",
  "versionchange"
};
