IndexedDB: Support Array-type key paths
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBObjectStore.cpp
index 5ae2646..04eba50 100644 (file)
@@ -214,11 +214,20 @@ PassRefPtr<IDBIndex> IDBObjectStore::createIndex(const String& name, const Strin
     return createIndex(name, IDBKeyPath(keyPath), options, ec);
 }
 
+PassRefPtr<IDBIndex> IDBObjectStore::createIndex(const String& name, PassRefPtr<DOMStringList> keyPath, const Dictionary& options, ExceptionCode& ec)
+{
+    // FIXME: Binding code for DOMString[] should not match null. http://webkit.org/b/84217
+    if (!keyPath)
+        return createIndex(name, IDBKeyPath("null"), options, ec);
+    return createIndex(name, IDBKeyPath(*keyPath), options, ec);
+}
+
+
 PassRefPtr<IDBIndex> IDBObjectStore::createIndex(const String& name, const IDBKeyPath& keyPath, const Dictionary& options, ExceptionCode& ec)
 {
     IDB_TRACE("IDBObjectStore::createIndex");
     if (!keyPath.isValid()) {
-        ec = IDBDatabaseException::NON_TRANSIENT_ERR;
+        ec = SYNTAX_ERR;
         return 0;
     }
 
@@ -228,7 +237,10 @@ PassRefPtr<IDBIndex> IDBObjectStore::createIndex(const String& name, const IDBKe
     bool multiEntry = false;
     options.get("multiEntry", multiEntry);
 
-    // FIXME: When Array-type keyPaths are supported, throw exception if keyPath is Array and multiEntry is true.
+    if (keyPath.type() == IDBKeyPath::ArrayType && multiEntry) {
+        ec = NOT_SUPPORTED_ERR;
+        return 0;
+    }
 
     RefPtr<IDBIndexBackendInterface> indexBackend = m_backend->createIndex(name, keyPath, unique, multiEntry, m_transaction->backend(), ec);
     ASSERT(!indexBackend != !ec); // If we didn't get an index, we should have gotten an exception code. And vice versa.