Change IDBObjectStore.createIndex to take an IDL dictionary
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 May 2016 20:04:58 +0000 (20:04 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 May 2016 20:04:58 +0000 (20:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=157520

Reviewed by Chris Dumez.

Source/WebCore:

* Modules/indexeddb/IDBDatabase.cpp:
(WebCore::IDBDatabase::createObjectStore): Use IDBKeyPath::Type instead of
IndexedDB::KeyPathType.
* Modules/indexeddb/IDBKeyPath.cpp:
(WebCore::IDBKeyPath::IDBKeyPath): Ditto.
(WebCore::IDBKeyPath::isValid): Ditto.
(WebCore::IDBKeyPath::operator==): Ditto.
(WebCore::IDBKeyPath::encode): Ditto.
(WebCore::IDBKeyPath::decode): Ditto.

* Modules/indexeddb/IDBKeyPath.h: Use pragma once. Make constructors non-explicit so
we can just pass a string or vector and have it turn into an IDBKeyPath. Added an enum
class named Type here and use it instead of IndexedDB::KeyPathType.

* Modules/indexeddb/IDBObjectStore.cpp:
(WebCore::IDBObjectStore::openCursor): Remove unneeded local variable.
(WebCore::IDBObjectStore::get): Ditto.
(WebCore::IDBObjectStore::doDelete): Ditto.
(WebCore::IDBObjectStore::createIndex): Changed argument type to take IndexParameters
instead of two seaparate booleans. Also updated to use IDBKeyPath::Type.

* Modules/indexeddb/IDBObjectStore.h: Removed include of IndexedDB, using a forward
decalration instead. Marked the class final. Added an IndexParameters struct and used
it for the argument to createIndex.

* Modules/indexeddb/IDBObjectStore.idl: Stopped using Custom for put, add, and
createIndex functions. Stopped using Dictionary for createIndex, using IDBIndexParameters
instead as in the specification. Added IDBIndexParameters dictionary definition.

* Modules/indexeddb/IndexedDB.h: Use pragma once. Removed KeyPathType.

* bindings/js/IDBBindingUtilities.cpp:
(WebCore::injectIDBKeyIntoScriptValue): Use IDBKeyPath::Type instead of
IndexedDB::KeyPathType.
(WebCore::maybeCreateIDBKeyFromScriptValueAndKeyPath): Ditto.
(WebCore::canInjectIDBKeyIntoScriptValue): Ditto.
(WebCore::createKeyPathArray): Ditto.
(WebCore::toJS): Ditto.
* bindings/js/JSIDBObjectStoreCustom.cpp:
(WebCore::putOrAdd): Deleted.
(WebCore::JSIDBObjectStore::putFunction): Deleted.
(WebCore::JSIDBObjectStore::add): Deleted.
(WebCore::JSIDBObjectStore::createIndex): Deleted.

* bindings/scripts/CodeGeneratorJS.pm:
(GenerateParametersCheckExpression): Fixed code that generates a type check for
wrappers to only check types is knows how to check: wrappers and arrays, including
typed arrays. This prevents it from trying to check dictionaries.

* inspector/InspectorIndexedDBAgent.cpp: Use IDBKeyPath::Type instead of
IndexedDB::KeyPathType.

LayoutTests:

* storage/indexeddb/deleteIndex-bug110792-expected.txt: Updated result.
Test is still marked as flaky, but this is the proper expectation now.
Discovered this when I accidentally reset results for the whole directory.
* storage/indexeddb/deleteIndex-bug110792-private-expected.txt: Ditto.

* storage/indexeddb/index-basics-expected.txt: Updated to expect the simpler
type error that is generated by the bindings code as opposed to the hand written
binding. If we want to make this fancier like this for all bindings we can do
that the future in the bindings script.
* storage/indexeddb/index-basics-private-expected.txt: Ditto.
* storage/indexeddb/index-basics-workers-expected.txt: Ditto.

* storage/indexeddb/keypath-basics-expected.txt: Updated for the change that
expects null and undefined the be legal key paths. See below.
* storage/indexeddb/keypath-basics-private-expected.txt: Ditto.

* storage/indexeddb/modern/create-index-failures-expected.txt: Removed
expected results that require that we forbid null for the name and key path.
See below.
* storage/indexeddb/modern/create-index-failures-private-expected.txt: Ditto.

* storage/indexeddb/modern/resources/create-index-failures.js: Removed the test
that expects failure when null is passed for the name and key path. In both
cases, the Web IDL and IDB specifications call for the null value to be converted
to the string "null", not an exception.

* storage/indexeddb/resources/keypath-basics.js:
(prepareDatabase): Added tests for both undefined and null. Both are legal values for
the key path argument to createIndex. The Web IDL and IDB specifications call for
them to be converted to the strings "undefined" and "null", not to trigger exceptions.
(testInvalidKeyPaths): Removed tests that expect exceptions when calling createIndex
with undefined and null.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@200699 268f45cc-cd09-0410-ab3c-d52691b4dbfc

24 files changed:
LayoutTests/ChangeLog
LayoutTests/storage/indexeddb/deleteIndex-bug110792-expected.txt
LayoutTests/storage/indexeddb/deleteIndex-bug110792-private-expected.txt
LayoutTests/storage/indexeddb/index-basics-expected.txt
LayoutTests/storage/indexeddb/index-basics-private-expected.txt
LayoutTests/storage/indexeddb/index-basics-workers-expected.txt
LayoutTests/storage/indexeddb/keypath-basics-expected.txt
LayoutTests/storage/indexeddb/keypath-basics-private-expected.txt
LayoutTests/storage/indexeddb/modern/create-index-failures-expected.txt
LayoutTests/storage/indexeddb/modern/create-index-failures-private-expected.txt
LayoutTests/storage/indexeddb/modern/resources/create-index-failures.js
LayoutTests/storage/indexeddb/resources/keypath-basics.js
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBDatabase.cpp
Source/WebCore/Modules/indexeddb/IDBKeyPath.cpp
Source/WebCore/Modules/indexeddb/IDBKeyPath.h
Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp
Source/WebCore/Modules/indexeddb/IDBObjectStore.h
Source/WebCore/Modules/indexeddb/IDBObjectStore.idl
Source/WebCore/Modules/indexeddb/IndexedDB.h
Source/WebCore/bindings/js/IDBBindingUtilities.cpp
Source/WebCore/bindings/js/JSIDBObjectStoreCustom.cpp
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/inspector/InspectorIndexedDBAgent.cpp

index 498bfc0..478bd18 100644 (file)
@@ -1,3 +1,43 @@
+2016-05-11  Darin Adler  <darin@apple.com>
+
+        Change IDBObjectStore.createIndex to take an IDL dictionary
+        https://bugs.webkit.org/show_bug.cgi?id=157520
+
+        Reviewed by Chris Dumez.
+
+        * storage/indexeddb/deleteIndex-bug110792-expected.txt: Updated result.
+        Test is still marked as flaky, but this is the proper expectation now.
+        Discovered this when I accidentally reset results for the whole directory.
+        * storage/indexeddb/deleteIndex-bug110792-private-expected.txt: Ditto.
+
+        * storage/indexeddb/index-basics-expected.txt: Updated to expect the simpler
+        type error that is generated by the bindings code as opposed to the hand written
+        binding. If we want to make this fancier like this for all bindings we can do
+        that the future in the bindings script.
+        * storage/indexeddb/index-basics-private-expected.txt: Ditto.
+        * storage/indexeddb/index-basics-workers-expected.txt: Ditto.
+
+        * storage/indexeddb/keypath-basics-expected.txt: Updated for the change that
+        expects null and undefined the be legal key paths. See below.
+        * storage/indexeddb/keypath-basics-private-expected.txt: Ditto.
+
+        * storage/indexeddb/modern/create-index-failures-expected.txt: Removed
+        expected results that require that we forbid null for the name and key path.
+        See below.
+        * storage/indexeddb/modern/create-index-failures-private-expected.txt: Ditto.
+
+        * storage/indexeddb/modern/resources/create-index-failures.js: Removed the test
+        that expects failure when null is passed for the name and key path. In both
+        cases, the Web IDL and IDB specifications call for the null value to be converted
+        to the string "null", not an exception.
+
+        * storage/indexeddb/resources/keypath-basics.js:
+        (prepareDatabase): Added tests for both undefined and null. Both are legal values for
+        the key path argument to createIndex. The Web IDL and IDB specifications call for
+        them to be converted to the strings "undefined" and "null", not to trigger exceptions.
+        (testInvalidKeyPaths): Removed tests that expect exceptions when calling createIndex
+        with undefined and null.
+
 2016-05-11  Ryan Haddad  <ryanhaddad@apple.com>
 
         Rebaseline inspector/dom/getAccessibilityPropertiesForNode.html after r200677
index f7f3527..029459a 100644 (file)
@@ -5,7 +5,6 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
 
-dbname = "deleteIndex-bug110792.html"
 indexedDB.deleteDatabase(dbname)
 indexedDB.open(dbname, 1)
 
@@ -27,7 +26,7 @@ Expecting exception from store.index('index')
 PASS Exception was thrown.
 PASS code is DOMException.NOT_FOUND_ERR
 PASS ename is 'NotFoundError'
-Exception message: NotFoundError: DOM IDBDatabase Exception 8
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The specified index was not found.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index f7f3527..029459a 100644 (file)
@@ -5,7 +5,6 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
 
-dbname = "deleteIndex-bug110792.html"
 indexedDB.deleteDatabase(dbname)
 indexedDB.open(dbname, 1)
 
@@ -27,7 +26,7 @@ Expecting exception from store.index('index')
 PASS Exception was thrown.
 PASS code is DOMException.NOT_FOUND_ERR
 PASS ename is 'NotFoundError'
-Exception message: NotFoundError: DOM IDBDatabase Exception 8
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The specified index was not found.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 8ca03f0..8022699 100644 (file)
@@ -18,10 +18,10 @@ PASS indexObject2.unique is false
 PASS indexObject3.unique is true
 Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', true)
 PASS Exception was thrown.
-PASS store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+PASS store.createIndex('failureIndex', 'zzz', true) threw TypeError: Type error
 Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', 'string')
 PASS Exception was thrown.
-PASS store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+PASS store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Type error
 PASS 'name' in indexObject is true
 PASS indexObject.name is "indexName"
 PASS 'objectStore' in indexObject is true
index 8ca03f0..8022699 100644 (file)
@@ -18,10 +18,10 @@ PASS indexObject2.unique is false
 PASS indexObject3.unique is true
 Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', true)
 PASS Exception was thrown.
-PASS store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+PASS store.createIndex('failureIndex', 'zzz', true) threw TypeError: Type error
 Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', 'string')
 PASS Exception was thrown.
-PASS store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+PASS store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Type error
 PASS 'name' in indexObject is true
 PASS indexObject.name is "indexName"
 PASS 'objectStore' in indexObject is true
index 0712cea..ab9b565 100644 (file)
@@ -19,10 +19,10 @@ PASS [Worker] indexObject2.unique is false
 PASS [Worker] indexObject3.unique is true
 [Worker] Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', true)
 PASS [Worker] Exception was thrown.
-PASS [Worker] store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+PASS [Worker] store.createIndex('failureIndex', 'zzz', true) threw TypeError: Type error
 [Worker] Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', 'string')
 PASS [Worker] Exception was thrown.
-PASS [Worker] store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+PASS [Worker] store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Type error
 PASS [Worker] 'name' in indexObject is true
 PASS [Worker] indexObject.name is "indexName"
 PASS [Worker] 'objectStore' in indexObject is true
index c317b2e..16bc706 100644 (file)
@@ -135,6 +135,16 @@ PASS store.keyPath is '_\u200D'
 index = store.createIndex('name', '_\u200D')
 PASS index.keyPath is '_\u200D'
 Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: 'undefined'})
+PASS store.keyPath is 'undefined'
+index = store.createIndex('name', undefined)
+PASS index.keyPath is 'undefined'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: 'null'})
+PASS store.keyPath is 'null'
+index = store.createIndex('name', null)
+PASS index.keyPath is 'null'
+Deleted all object stores.
 
 testInvalidKeyPaths():
 Deleted all object stores.
@@ -157,16 +167,6 @@ Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The a
 Deleted all object stores.
 
 Key paths which are never valid:
-Expecting exception from db.createObjectStore('name').createIndex('name', null)
-PASS Exception was thrown.
-PASS code is DOMException.SYNTAX_ERR
-Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
-Deleted all object stores.
-Expecting exception from db.createObjectStore('name').createIndex('name', undefined)
-PASS Exception was thrown.
-PASS code is DOMException.SYNTAX_ERR
-Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
-Deleted all object stores.
 Expecting exception from db.createObjectStore('name', {keyPath: ' '})
 PASS Exception was thrown.
 PASS code is DOMException.SYNTAX_ERR
index c317b2e..16bc706 100644 (file)
@@ -135,6 +135,16 @@ PASS store.keyPath is '_\u200D'
 index = store.createIndex('name', '_\u200D')
 PASS index.keyPath is '_\u200D'
 Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: 'undefined'})
+PASS store.keyPath is 'undefined'
+index = store.createIndex('name', undefined)
+PASS index.keyPath is 'undefined'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: 'null'})
+PASS store.keyPath is 'null'
+index = store.createIndex('name', null)
+PASS index.keyPath is 'null'
+Deleted all object stores.
 
 testInvalidKeyPaths():
 Deleted all object stores.
@@ -157,16 +167,6 @@ Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The a
 Deleted all object stores.
 
 Key paths which are never valid:
-Expecting exception from db.createObjectStore('name').createIndex('name', null)
-PASS Exception was thrown.
-PASS code is DOMException.SYNTAX_ERR
-Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
-Deleted all object stores.
-Expecting exception from db.createObjectStore('name').createIndex('name', undefined)
-PASS Exception was thrown.
-PASS code is DOMException.SYNTAX_ERR
-Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
-Deleted all object stores.
 Expecting exception from db.createObjectStore('name', {keyPath: ' '})
 PASS Exception was thrown.
 PASS code is DOMException.SYNTAX_ERR
index 6c70cd6..9090dff 100644 (file)
@@ -8,8 +8,6 @@ indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.
 indexedDB.deleteDatabase(dbname)
 indexedDB.open(dbname)
 Initial upgrade needed: Old version - 0 New version - 1
-Failed to create index with null name
-Failed to create index with invalid key path
 Failed to create index on a deleted object store
 Failed to create multi-entry index with an array key path
 Failed to create index that already exists
index 6c70cd6..9090dff 100644 (file)
@@ -8,8 +8,6 @@ indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.
 indexedDB.deleteDatabase(dbname)
 indexedDB.open(dbname)
 Initial upgrade needed: Old version - 0 New version - 1
-Failed to create index with null name
-Failed to create index with invalid key path
 Failed to create index on a deleted object store
 Failed to create multi-entry index with an array key path
 Failed to create index that already exists
index 0099c50..3156da4 100644 (file)
@@ -23,18 +23,6 @@ function prepareDatabase(event)
     database = event.target.result;
     var objectStore = database.createObjectStore("TestObjectStore");
 
-    try {
-        objectStore.createIndex(null, "foo");
-    } catch(e) {
-        debug("Failed to create index with null name");
-    }
-    
-    try {
-        objectStore.createIndex("TestIndex1", null);
-    } catch(e) {
-        debug("Failed to create index with invalid key path");
-    }
-    
     database.deleteObjectStore("TestObjectStore");
     try {
         objectStore.createIndex("TestIndex2", "foo");
index cc036aa..d6817f8 100644 (file)
@@ -43,7 +43,7 @@ function prepareDatabase()
         { keyPath: "'_\\u0300'" }, // DIGIT ZERO (Nd)
         { keyPath: "'_\\u203F'" }, // UNDERTIE (Pc)
         { keyPath: "'_\\u200C'" }, // ZWNJ
-        { keyPath: "'_\\u200D'" }  // ZWJ
+        { keyPath: "'_\\u200D'" },  // ZWJ
     ];
 
     testKeyPaths.forEach(function (testCase) {
@@ -57,6 +57,18 @@ function prepareDatabase()
         deleteAllObjectStores(db);
     });
 
+    evalAndLog("store = db.createObjectStore('name', {keyPath: 'undefined'})");
+    shouldBe("store.keyPath", "'undefined'");
+    evalAndLog("index = store.createIndex('name', undefined)");
+    shouldBe("index.keyPath", "'undefined'");
+    deleteAllObjectStores(db);
+
+    evalAndLog("store = db.createObjectStore('name', {keyPath: 'null'})");
+    shouldBe("store.keyPath", "'null'");
+    evalAndLog("index = store.createIndex('name', null)");
+    shouldBe("index.keyPath", "'null'");
+    deleteAllObjectStores(db);
+
     testInvalidKeyPaths();
 }
 
@@ -77,11 +89,6 @@ function testInvalidKeyPaths()
     debug("");
     debug("Key paths which are never valid:");
 
-    evalAndExpectException("db.createObjectStore('name').createIndex('name', null)", "DOMException.SYNTAX_ERR");
-    deleteAllObjectStores(db);
-    evalAndExpectException("db.createObjectStore('name').createIndex('name', undefined)", "DOMException.SYNTAX_ERR");
-    deleteAllObjectStores(db);
-    
     testKeyPaths = [
         "' '",
         "'foo '",
index a6a75b6..dba379a 100644 (file)
@@ -1,3 +1,62 @@
+2016-05-11  Darin Adler  <darin@apple.com>
+
+        Change IDBObjectStore.createIndex to take an IDL dictionary
+        https://bugs.webkit.org/show_bug.cgi?id=157520
+
+        Reviewed by Chris Dumez.
+
+        * Modules/indexeddb/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::createObjectStore): Use IDBKeyPath::Type instead of
+        IndexedDB::KeyPathType.
+        * Modules/indexeddb/IDBKeyPath.cpp:
+        (WebCore::IDBKeyPath::IDBKeyPath): Ditto.
+        (WebCore::IDBKeyPath::isValid): Ditto.
+        (WebCore::IDBKeyPath::operator==): Ditto.
+        (WebCore::IDBKeyPath::encode): Ditto.
+        (WebCore::IDBKeyPath::decode): Ditto.
+
+        * Modules/indexeddb/IDBKeyPath.h: Use pragma once. Make constructors non-explicit so
+        we can just pass a string or vector and have it turn into an IDBKeyPath. Added an enum
+        class named Type here and use it instead of IndexedDB::KeyPathType.
+
+        * Modules/indexeddb/IDBObjectStore.cpp:
+        (WebCore::IDBObjectStore::openCursor): Remove unneeded local variable.
+        (WebCore::IDBObjectStore::get): Ditto.
+        (WebCore::IDBObjectStore::doDelete): Ditto.
+        (WebCore::IDBObjectStore::createIndex): Changed argument type to take IndexParameters
+        instead of two seaparate booleans. Also updated to use IDBKeyPath::Type.
+
+        * Modules/indexeddb/IDBObjectStore.h: Removed include of IndexedDB, using a forward
+        decalration instead. Marked the class final. Added an IndexParameters struct and used
+        it for the argument to createIndex.
+
+        * Modules/indexeddb/IDBObjectStore.idl: Stopped using Custom for put, add, and
+        createIndex functions. Stopped using Dictionary for createIndex, using IDBIndexParameters
+        instead as in the specification. Added IDBIndexParameters dictionary definition.
+
+        * Modules/indexeddb/IndexedDB.h: Use pragma once. Removed KeyPathType.
+
+        * bindings/js/IDBBindingUtilities.cpp:
+        (WebCore::injectIDBKeyIntoScriptValue): Use IDBKeyPath::Type instead of
+        IndexedDB::KeyPathType.
+        (WebCore::maybeCreateIDBKeyFromScriptValueAndKeyPath): Ditto.
+        (WebCore::canInjectIDBKeyIntoScriptValue): Ditto.
+        (WebCore::createKeyPathArray): Ditto.
+        (WebCore::toJS): Ditto.
+        * bindings/js/JSIDBObjectStoreCustom.cpp:
+        (WebCore::putOrAdd): Deleted.
+        (WebCore::JSIDBObjectStore::putFunction): Deleted.
+        (WebCore::JSIDBObjectStore::add): Deleted.
+        (WebCore::JSIDBObjectStore::createIndex): Deleted.
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateParametersCheckExpression): Fixed code that generates a type check for
+        wrappers to only check types is knows how to check: wrappers and arrays, including
+        typed arrays. This prevents it from trying to check dictionaries.
+
+        * inspector/InspectorIndexedDBAgent.cpp: Use IDBKeyPath::Type instead of
+        IndexedDB::KeyPathType.
+
 2016-05-11  Brady Eidson  <beidson@apple.com>
 
         Modern IDB: WebWorker support.
index 8b3d4b2..29b4784 100644 (file)
@@ -131,7 +131,7 @@ RefPtr<WebCore::IDBObjectStore> IDBDatabase::createObjectStore(const String& nam
     }
 
     if (autoIncrement && !keyPath.isNull()) {
-        if ((keyPath.type() == IndexedDB::KeyPathType::String && keyPath.string().isEmpty()) || keyPath.type() == IndexedDB::KeyPathType::Array) {
+        if ((keyPath.type() == IDBKeyPath::Type::String && keyPath.string().isEmpty()) || keyPath.type() == IDBKeyPath::Type::Array) {
             ec.code = IDBDatabaseException::InvalidAccessError;
             ec.message = ASCIILiteral("Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.");
             return nullptr;
index 3eb771b..41e3965 100644 (file)
@@ -192,14 +192,14 @@ void IDBParseKeyPath(const String& keyPath, Vector<String>& elements, IDBKeyPath
 }
 
 IDBKeyPath::IDBKeyPath(const String& string)
-    : m_type(IndexedDB::KeyPathType::String)
+    : m_type(Type::String)
     , m_string(string)
 {
     ASSERT(!m_string.isNull());
 }
 
 IDBKeyPath::IDBKeyPath(const Vector<String>& array)
-    : m_type(IndexedDB::KeyPathType::Array)
+    : m_type(Type::Array)
     , m_array(array)
 {
 #ifndef NDEBUG
@@ -211,13 +211,11 @@ IDBKeyPath::IDBKeyPath(const Vector<String>& array)
 bool IDBKeyPath::isValid() const
 {
     switch (m_type) {
-    case IndexedDB::KeyPathType::Null:
+    case Type::Null:
         return false;
-
-    case IndexedDB::KeyPathType::String:
+    case Type::String:
         return IDBIsValidKeyPath(m_string);
-
-    case IndexedDB::KeyPathType::Array:
+    case Type::Array:
         if (m_array.isEmpty())
             return false;
         for (auto& key : m_array) {
@@ -236,11 +234,11 @@ bool IDBKeyPath::operator==(const IDBKeyPath& other) const
         return false;
 
     switch (m_type) {
-    case IndexedDB::KeyPathType::Null:
+    case Type::Null:
         return true;
-    case IndexedDB::KeyPathType::String:
+    case Type::String:
         return m_string == other.m_string;
-    case IndexedDB::KeyPathType::Array:
+    case Type::Array:
         return m_array == other.m_array;
     }
     ASSERT_NOT_REACHED();
@@ -252,11 +250,9 @@ IDBKeyPath IDBKeyPath::isolatedCopy() const
     IDBKeyPath result;
     result.m_type = m_type;
     result.m_string = m_string.isolatedCopy();
-
     result.m_array.reserveInitialCapacity(m_array.size());
     for (auto& key : m_array)
         result.m_array.uncheckedAppend(key.isolatedCopy());
-
     return result;
 }
 
@@ -264,44 +260,41 @@ void IDBKeyPath::encode(KeyedEncoder& encoder) const
 {
     encoder.encodeEnum("type", m_type);
     switch (m_type) {
-    case IndexedDB::KeyPathType::Null:
-        break;
-    case IndexedDB::KeyPathType::String:
+    case Type::Null:
+        return;
+    case Type::String:
         encoder.encodeString("string", m_string);
-        break;
-    case IndexedDB::KeyPathType::Array:
+        return;
+    case Type::Array:
         encoder.encodeObjects("array", m_array.begin(), m_array.end(), [](WebCore::KeyedEncoder& encoder, const String& string) {
             encoder.encodeString("string", string);
         });
-        break;
-    default:
-        ASSERT_NOT_REACHED();
+        return;
     };
+    ASSERT_NOT_REACHED();
 }
 
 bool IDBKeyPath::decode(KeyedDecoder& decoder, IDBKeyPath& result)
 {
-    auto enumFunction = [](IndexedDB::KeyPathType value) {
-        return value == IndexedDB::KeyPathType::Null || value == IndexedDB::KeyPathType::String || value == IndexedDB::KeyPathType::Array;
-    };
-
-    if (!decoder.decodeEnum("type", result.m_type, enumFunction))
+    bool succeeded = decoder.decodeEnum("type", result.m_type, [](Type value) {
+        return value == Type::Null || value == Type::String || value == Type::Array;
+    });
+    if (!succeeded)
         return false;
 
-    if (result.m_type == IndexedDB::KeyPathType::Null)
+    switch (result.m_type) {
+    case Type::Null:
         return true;
-
-    if (result.m_type == IndexedDB::KeyPathType::String)
+    case Type::String:
         return decoder.decodeString("string", result.m_string);
-
-    ASSERT(result.m_type == IndexedDB::KeyPathType::Array);
-
-    auto arrayFunction = [](KeyedDecoder& decoder, String& result) {
-        return decoder.decodeString("string", result);
-    };
-
-    result.m_array.clear();
-    return decoder.decodeObjects("array", result.m_array, arrayFunction);
+    case Type::Array:
+        result.m_array.clear();
+        return decoder.decodeObjects("array", result.m_array, [](KeyedDecoder& decoder, String& result) {
+            return decoder.decodeString("string", result);
+        });
+    }
+    ASSERT_NOT_REACHED();
+    return false;
 }
 
 } // namespace WebCore
index 127ac74..64ad864 100644 (file)
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef IDBKeyPath_h
-#define IDBKeyPath_h
+#pragma once
 
 #if ENABLE(INDEXED_DATABASE)
 
-#include "IndexedDB.h"
 #include <wtf/Vector.h>
 #include <wtf/text/WTFString.h>
 
@@ -49,24 +47,25 @@ void IDBParseKeyPath(const String&, Vector<String>&, IDBKeyPathParseError&);
 class IDBKeyPath {
 public:
     IDBKeyPath() { }
-    WEBCORE_EXPORT explicit IDBKeyPath(const String&);
-    WEBCORE_EXPORT explicit IDBKeyPath(const Vector<String>& array);
+    WEBCORE_EXPORT IDBKeyPath(const String&);
+    WEBCORE_EXPORT IDBKeyPath(const Vector<String>& array);
 
-    IndexedDB::KeyPathType type() const { return m_type; }
+    enum class Type { Null, String, Array };
+    Type type() const { return m_type; }
 
     const Vector<String>& array() const
     {
-        ASSERT(m_type == IndexedDB::KeyPathType::Array);
+        ASSERT(m_type == Type::Array);
         return m_array;
     }
 
     const String& string() const
     {
-        ASSERT(m_type == IndexedDB::KeyPathType::String);
+        ASSERT(m_type == Type::String);
         return m_string;
     }
 
-    bool isNull() const { return m_type == IndexedDB::KeyPathType::Null; }
+    bool isNull() const { return m_type == Type::Null; }
     bool isValid() const;
     bool operator==(const IDBKeyPath& other) const;
 
@@ -79,23 +78,22 @@ public:
     WEBCORE_EXPORT static bool decode(KeyedDecoder&, IDBKeyPath&);
 
 private:
-    IndexedDB::KeyPathType m_type { IndexedDB::KeyPathType::Null };
+    Type m_type { Type::Null };
     String m_string;
     Vector<String> m_array;
 };
 
-template<class Encoder>
-void IDBKeyPath::encode(Encoder& encoder) const
+template<class Encoder> void IDBKeyPath::encode(Encoder& encoder) const
 {
     encoder.encodeEnum(m_type);
 
     switch (m_type) {
-    case IndexedDB::KeyPathType::Null:
+    case Type::Null:
         break;
-    case IndexedDB::KeyPathType::String:
+    case Type::String:
         encoder << m_string;
         break;
-    case IndexedDB::KeyPathType::Array:
+    case Type::Array:
         encoder << m_array;
         break;
     default:
@@ -103,19 +101,18 @@ void IDBKeyPath::encode(Encoder& encoder) const
     }
 }
 
-template<class Decoder>
-bool IDBKeyPath::decode(Decoder& decoder, IDBKeyPath& keyPath)
+template<class Decoder> bool IDBKeyPath::decode(Decoder& decoder, IDBKeyPath& keyPath)
 {
-    IndexedDB::KeyPathType type;
+    Type type;
     if (!decoder.decodeEnum(type))
         return false;
 
     switch (type) {
-    case IndexedDB::KeyPathType::Null:
+    case Type::Null:
         keyPath = IDBKeyPath();
         return true;
 
-    case IndexedDB::KeyPathType::String: {
+    case Type::String: {
         String string;
         if (!decoder.decode(string))
             return false;
@@ -123,7 +120,7 @@ bool IDBKeyPath::decode(Decoder& decoder, IDBKeyPath& keyPath)
         keyPath = IDBKeyPath(string);
         return true;
     }
-    case IndexedDB::KeyPathType::Array: {
+    case Type::Array: {
         Vector<String> array;
         if (!decoder.decode(array))
             return false;
@@ -139,5 +136,3 @@ bool IDBKeyPath::decode(Decoder& decoder, IDBKeyPath& keyPath)
 } // namespace WebCore
 
 #endif
-
-#endif // IDBKeyPath_h
index c53a169..2dab0dd 100644 (file)
@@ -146,8 +146,7 @@ RefPtr<IDBRequest> IDBObjectStore::openCursor(ScriptExecutionContext& context, I
         return nullptr;
 
     auto info = IDBCursorInfo::objectStoreCursor(m_transaction.get(), m_info.identifier(), range, direction);
-    Ref<IDBRequest> request = m_transaction->requestOpenCursor(context, *this, info);
-    return WTFMove(request);
+    return m_transaction->requestOpenCursor(context, *this, info);
 }
 
 RefPtr<IDBRequest> IDBObjectStore::openCursor(ScriptExecutionContext& context, JSValue key, const String& direction, ExceptionCodeWithMessage& ec)
@@ -185,8 +184,7 @@ RefPtr<IDBRequest> IDBObjectStore::get(ScriptExecutionContext& context, JSValue
         return nullptr;
     }
 
-    Ref<IDBRequest> request = m_transaction->requestGetRecord(context, *this, idbKey.get());
-    return WTFMove(request);
+    return m_transaction->requestGetRecord(context, *this, idbKey.get());
 }
 
 RefPtr<IDBRequest> IDBObjectStore::get(ScriptExecutionContext& context, IDBKeyRange* keyRange, ExceptionCodeWithMessage& ec)
@@ -211,8 +209,7 @@ RefPtr<IDBRequest> IDBObjectStore::get(ScriptExecutionContext& context, IDBKeyRa
         return nullptr;
     }
 
-    Ref<IDBRequest> request = m_transaction->requestGetRecord(context, *this, keyRangeData);
-    return WTFMove(request);
+    return m_transaction->requestGetRecord(context, *this, keyRangeData);
 }
 
 RefPtr<IDBRequest> IDBObjectStore::add(ExecState& execState, JSValue value, JSValue key, ExceptionCodeWithMessage& ec)
@@ -382,8 +379,7 @@ RefPtr<IDBRequest> IDBObjectStore::doDelete(ScriptExecutionContext& context, IDB
         return nullptr;
     }
 
-    Ref<IDBRequest> request = m_transaction->requestDeleteRecord(context, *this, keyRangeData);
-    return WTFMove(request);
+    return m_transaction->requestDeleteRecord(context, *this, keyRangeData);
 }
 
 RefPtr<IDBRequest> IDBObjectStore::deleteFunction(ScriptExecutionContext& context, JSValue key, ExceptionCodeWithMessage& ec)
@@ -435,7 +431,7 @@ RefPtr<IDBRequest> IDBObjectStore::clear(ScriptExecutionContext& context, Except
     return adoptRef(request.leakRef());
 }
 
-RefPtr<IDBIndex> IDBObjectStore::createIndex(ScriptExecutionContext&, const String& name, const IDBKeyPath& keyPath, bool unique, bool multiEntry, ExceptionCodeWithMessage& ec)
+RefPtr<IDBIndex> IDBObjectStore::createIndex(ScriptExecutionContext&, const String& name, const IDBKeyPath& keyPath, const IndexParameters& parameters, ExceptionCodeWithMessage& ec)
 {
     LOG(IndexedDB, "IDBObjectStore::createIndex %s", name.utf8().data());
     ASSERT(currentThread() == m_transaction->database().originThreadID());
@@ -474,14 +470,14 @@ RefPtr<IDBIndex> IDBObjectStore::createIndex(ScriptExecutionContext&, const Stri
         return nullptr;
     }
 
-    if (keyPath.type() == IndexedDB::KeyPathType::Array && multiEntry) {
+    if (keyPath.type() == IDBKeyPath::Type::Array && parameters.multiEntry) {
         ec.code = IDBDatabaseException::InvalidAccessError;
         ec.message = ASCIILiteral("Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument was an array and the multiEntry option is true.");
         return nullptr;
     }
 
     // Install the new Index into the ObjectStore's info.
-    IDBIndexInfo info = m_info.createNewIndex(name, keyPath, unique, multiEntry);
+    IDBIndexInfo info = m_info.createNewIndex(name, keyPath, parameters.unique, parameters.multiEntry);
     m_transaction->database().didCreateIndexInfo(info);
 
     // Create the actual IDBObjectStore from the transaction, which also schedules the operation server side.
index 5c315d1..5f46e2f 100644 (file)
@@ -29,7 +29,6 @@
 
 #include "ActiveDOMObject.h"
 #include "IDBObjectStoreInfo.h"
-#include "IndexedDB.h"
 #include <wtf/HashSet.h>
 
 namespace JSC {
@@ -50,7 +49,11 @@ class IDBTransaction;
 struct ExceptionCodeWithMessage;
 struct IDBKeyRangeData;
 
-class IDBObjectStore : public RefCounted<IDBObjectStore>, public ActiveDOMObject {
+namespace IndexedDB {
+enum class ObjectStoreOverwriteMode;
+}
+
+class IDBObjectStore final : public RefCounted<IDBObjectStore>, public ActiveDOMObject {
 public:
     static Ref<IDBObjectStore> create(ScriptExecutionContext&, const IDBObjectStoreInfo&, IDBTransaction&);
 
@@ -62,6 +65,11 @@ public:
     RefPtr<IDBTransaction> transaction();
     bool autoIncrement() const;
 
+    struct IndexParameters {
+        bool unique;
+        bool multiEntry;
+    };
+
     RefPtr<IDBRequest> openCursor(ScriptExecutionContext&, IDBKeyRange*, const String& direction, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> openCursor(ScriptExecutionContext&, JSC::JSValue key, const String& direction, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> get(ScriptExecutionContext&, JSC::JSValue key, ExceptionCodeWithMessage&);
@@ -71,7 +79,7 @@ public:
     RefPtr<IDBRequest> deleteFunction(ScriptExecutionContext&, IDBKeyRange*, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> deleteFunction(ScriptExecutionContext&, JSC::JSValue key, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> clear(ScriptExecutionContext&, ExceptionCodeWithMessage&);
-    RefPtr<IDBIndex> createIndex(ScriptExecutionContext&, const String& name, const IDBKeyPath&, bool unique, bool multiEntry, ExceptionCodeWithMessage&);
+    RefPtr<IDBIndex> createIndex(ScriptExecutionContext&, const String& name, const IDBKeyPath&, const IndexParameters&, ExceptionCodeWithMessage&);
     RefPtr<IDBIndex> index(const String& name, ExceptionCodeWithMessage&);
     void deleteIndex(const String& name, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> count(ScriptExecutionContext&, IDBKeyRange*, ExceptionCodeWithMessage&);
@@ -85,8 +93,7 @@ public:
 
     const IDBObjectStoreInfo& info() const { return m_info; }
 
-    // FIXME: After removing LegacyIDB and folding abstract/implementation classes together,
-    // this will no longer be necessary.
+    // FIXME: After removing LegacyIDB and folding abstract/implementation classes together, this will no longer be necessary.
     IDBTransaction& modernTransaction() { return m_transaction.get(); }
 
     void rollbackInfoForVersionChangeAbort();
@@ -96,19 +103,14 @@ public:
 private:
     IDBObjectStore(ScriptExecutionContext&, const IDBObjectStoreInfo&, IDBTransaction&);
 
-    enum class InlineKeyCheck {
-        Perform,
-        DoNotPerform,
-    };
-
+    enum class InlineKeyCheck { Perform, DoNotPerform };
     RefPtr<IDBRequest> putOrAdd(JSC::ExecState&, JSC::JSValue, RefPtr<IDBKey>, IndexedDB::ObjectStoreOverwriteMode, InlineKeyCheck, ExceptionCodeWithMessage&);
-    RefPtr<WebCore::IDBRequest> doCount(ScriptExecutionContext&, const IDBKeyRangeData&, ExceptionCodeWithMessage&);
+    RefPtr<IDBRequest> doCount(ScriptExecutionContext&, const IDBKeyRangeData&, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> doDelete(ScriptExecutionContext&, IDBKeyRange*, ExceptionCodeWithMessage&);
 
-    // ActiveDOMObject
-    const char* activeDOMObjectName() const;
-    bool canSuspendForDocumentSuspension() const;
-    bool hasPendingActivity() const;
+    const char* activeDOMObjectName() const final;
+    bool canSuspendForDocumentSuspension() const final;
+    bool hasPendingActivity() const final;
 
     IDBObjectStoreInfo m_info;
     IDBObjectStoreInfo m_originalInfo;
index 1759747..65c2ebf 100644 (file)
@@ -26,9 +26,9 @@
 [
     Conditional=INDEXED_DATABASE,
     EnabledAtRuntime=IndexedDB,
-    SkipVTableValidation,
-    JSCustomMarkFunction,
     GenerateIsReachable=Impl,
+    JSCustomMarkFunction,
+    SkipVTableValidation,
 ] interface IDBObjectStore {
     readonly attribute DOMString? name;
     [ImplementationReturnType=IDBKeyPath] readonly attribute any keyPath;
@@ -36,8 +36,8 @@
     readonly attribute IDBTransaction transaction;
     readonly attribute boolean autoIncrement;
 
-    [CallWith=ScriptExecutionContext, Custom, ImplementedAs=putFunction, RaisesExceptionWithMessage] IDBRequest put(any value, optional any key);
-    [CallWith=ScriptExecutionContext, Custom, RaisesExceptionWithMessage] IDBRequest add(any value, optional any key);
+    [CallWith=ScriptState, RaisesExceptionWithMessage] IDBRequest put(any value, optional any key);
+    [CallWith=ScriptState, RaisesExceptionWithMessage] IDBRequest add(any value, optional any key);
     [CallWith=ScriptExecutionContext, ImplementedAs=deleteFunction, RaisesExceptionWithMessage] IDBRequest delete(IDBKeyRange? keyRange);
     [CallWith=ScriptExecutionContext, ImplementedAs=deleteFunction, RaisesExceptionWithMessage] IDBRequest delete(any key);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest get(IDBKeyRange? key);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest clear();
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest openCursor(optional IDBKeyRange? range = null, optional DOMString direction = "next");
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest openCursor(any key, optional DOMString direction = "next");
-    [CallWith=ScriptExecutionContext, Custom, RaisesExceptionWithMessage] IDBIndex createIndex(DOMString name, sequence<DOMString> keyPath, optional Dictionary options);
-    [CallWith=ScriptExecutionContext, Custom, RaisesExceptionWithMessage] IDBIndex createIndex(DOMString name, DOMString keyPath, optional Dictionary options);
+    [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBIndex createIndex(DOMString name, sequence<DOMString> keyPath, optional IDBIndexParameters options);
+    [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBIndex createIndex(DOMString name, DOMString keyPath, optional IDBIndexParameters options);
     [RaisesExceptionWithMessage] IDBIndex index(DOMString name);
     [RaisesExceptionWithMessage] void deleteIndex(DOMString name);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(optional IDBKeyRange? range = null);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(any key);
 };
+
+dictionary IDBIndexParameters {
+    boolean unique = false;
+    boolean multiEntry = false;
+};
index 99c7250..5d4f03c 100644 (file)
@@ -23,8 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef IndexedDB_h
-#define IndexedDB_h
+#pragma once
 
 #if ENABLE(INDEXED_DATABASE)
 
@@ -71,12 +70,6 @@ enum class VersionNullness {
     NonNull,
 };
 
-enum class KeyPathType {
-    Null,
-    String,
-    Array,
-};
-
 enum class ObjectStoreOverwriteMode {
     Overwrite,
     OverwriteForCursor,
@@ -110,5 +103,3 @@ enum class RequestType {
 } // namespace WebCore
 
 #endif // ENABLED(INDEXED_DATABASE)
-
-#endif // IndexedDB_h
index c8de1bb..f0cf1d7 100644 (file)
@@ -170,7 +170,7 @@ IDBKeyPath idbKeyPathFromValue(ExecState& exec, JSValue keyPathValue)
     if (isJSArray(keyPathValue))
         keyPath = IDBKeyPath(toNativeArray<String>(&exec, keyPathValue));
     else
-        keyPath = IDBKeyPath(keyPathValue.toString(&exec)->value(&exec));
+        keyPath = IDBKeyPath(keyPathValue.toWTFString(&exec));
     return keyPath;
 }
 
@@ -240,7 +240,7 @@ bool injectIDBKeyIntoScriptValue(ExecState& exec, const IDBKeyData& keyData, JSV
 {
     LOG(IndexedDB, "injectIDBKeyIntoScriptValue");
 
-    ASSERT(keyPath.type() == IndexedDB::KeyPathType::String);
+    ASSERT(keyPath.type() == IDBKeyPath::Type::String);
 
     Vector<String> keyPathElements;
     IDBKeyPathParseError error;
@@ -269,7 +269,7 @@ RefPtr<IDBKey> maybeCreateIDBKeyFromScriptValueAndKeyPath(ExecState& exec, const
 {
     ASSERT(!keyPath.isNull());
 
-    if (keyPath.type() == IndexedDB::KeyPathType::Array) {
+    if (keyPath.type() == IDBKeyPath::Type::Array) {
         const Vector<String>& array = keyPath.array();
         Vector<RefPtr<IDBKey>> result;
         result.reserveInitialCapacity(array.size());
@@ -282,7 +282,7 @@ RefPtr<IDBKey> maybeCreateIDBKeyFromScriptValueAndKeyPath(ExecState& exec, const
         return IDBKey::createArray(WTFMove(result));
     }
 
-    ASSERT(keyPath.type() == IndexedDB::KeyPathType::String);
+    ASSERT(keyPath.type() == IDBKeyPath::Type::String);
     return internalCreateIDBKeyFromScriptValueAndKeyPath(&exec, value, keyPath.string());
 }
 
@@ -290,7 +290,7 @@ bool canInjectIDBKeyIntoScriptValue(ExecState& execState, const JSValue& scriptV
 {
     LOG(StorageAPI, "canInjectIDBKeyIntoScriptValue");
 
-    ASSERT(keyPath.type() == IndexedDB::KeyPathType::String);
+    ASSERT(keyPath.type() == IDBKeyPath::Type::String);
     Vector<String> keyPathElements;
     IDBKeyPathParseError error;
     IDBParseKeyPath(keyPath.string(), keyPathElements, error);
@@ -367,7 +367,7 @@ static Vector<IDBKeyData> createKeyPathArray(ExecState& exec, JSValue value, con
     Vector<IDBKeyData> keys;
 
     switch (info.keyPath().type()) {
-    case IndexedDB::KeyPathType::Array:
+    case IDBKeyPath::Type::Array:
         for (auto& entry : info.keyPath().array()) {
             auto key = internalCreateIDBKeyFromScriptValueAndKeyPath(&exec, value, entry);
             if (!key)
@@ -375,7 +375,7 @@ static Vector<IDBKeyData> createKeyPathArray(ExecState& exec, JSValue value, con
             keys.append(key.get());
         }
         break;
-    case IndexedDB::KeyPathType::String: {
+    case IDBKeyPath::Type::String: {
         auto idbKey = internalCreateIDBKeyFromScriptValueAndKeyPath(&exec, value, info.keyPath().string());
         if (!idbKey)
             return { };
@@ -388,7 +388,7 @@ static Vector<IDBKeyData> createKeyPathArray(ExecState& exec, JSValue value, con
 
         break;
     }
-    case IndexedDB::KeyPathType::Null:
+    case IDBKeyPath::Type::Null:
         RELEASE_ASSERT_NOT_REACHED();
     }
 
@@ -408,11 +408,11 @@ void generateIndexKeyForValue(ExecState& exec, const IDBIndexInfo& info, JSValue
 JSValue toJS(ExecState& state, JSDOMGlobalObject& globalObject, const IDBKeyPath& value)
 {
     switch (value.type()) {
-    case IndexedDB::KeyPathType::Null:
+    case IDBKeyPath::Type::Null:
         return jsNull();
-    case IndexedDB::KeyPathType::String:
+    case IDBKeyPath::Type::String:
         return jsStringWithCache(&state, value.string());
-    case IndexedDB::KeyPathType::Array:
+    case IDBKeyPath::Type::Array:
         auto keyPaths = DOMStringList::create();
         for (auto& path : value.array())
             keyPaths->append(path);
index d95e42a..bfe6101 100644 (file)
 
 #include "JSIDBObjectStore.h"
 
-#include "IDBBindingUtilities.h"
-#include "IDBDatabaseException.h"
-#include "IDBKeyPath.h"
-#include "IDBObjectStore.h"
-#include "JSDOMBinding.h"
-#include "JSIDBIndex.h"
-#include "JSIDBRequest.h"
-#include <runtime/Error.h>
-#include <runtime/JSString.h>
-
 using namespace JSC;
 
 namespace WebCore {
@@ -50,97 +40,6 @@ void JSIDBObjectStore::visitAdditionalChildren(SlotVisitor& visitor)
     static_cast<IDBObjectStore&>(wrapped()).visitReferencedIndexes(visitor);
 }
 
-static JSValue putOrAdd(JSC::ExecState& state, bool overwrite)
-{
-    JSValue thisValue = state.thisValue();
-    JSIDBObjectStore* castedThis = jsDynamicCast<JSIDBObjectStore*>(thisValue);
-    if (UNLIKELY(!castedThis))
-        return JSValue::decode(throwThisTypeError(state, "IDBObjectStore", "put"));
-
-    ASSERT_GC_OBJECT_INHERITS(castedThis, JSIDBObjectStore::info());
-    auto& wrapped = castedThis->wrapped();
-
-    size_t argsCount = state.argumentCount();
-    if (UNLIKELY(argsCount < 1))
-        return JSValue::decode(throwVMError(&state, createNotEnoughArgumentsError(&state)));
-
-    ExceptionCodeWithMessage ec;
-    auto value = state.uncheckedArgument(0);
-    auto key = state.argument(1);
-    JSValue result;
-    if (overwrite)
-        result = toJS(&state, castedThis->globalObject(), wrapped.put(state, value, key, ec).get());
-    else
-        result = toJS(&state, castedThis->globalObject(), wrapped.add(state, value, key, ec).get());
-
-    setDOMException(&state, ec);
-    return result;
-}
-
-JSValue JSIDBObjectStore::putFunction(JSC::ExecState& state)
-{
-    return putOrAdd(state, true);
-}
-
-JSValue JSIDBObjectStore::add(JSC::ExecState& state)
-{
-    return putOrAdd(state, false);
-}
-
-JSValue JSIDBObjectStore::createIndex(ExecState& state)
-{
-    ScriptExecutionContext* context = jsCast<JSDOMGlobalObject*>(state.lexicalGlobalObject())->scriptExecutionContext();
-    if (!context)
-        return state.vm().throwException(&state, createReferenceError(&state, "IDBObjectStore script &stateution context is unavailable"));
-
-    if (state.argumentCount() < 2)
-        return state.vm().throwException(&state, createNotEnoughArgumentsError(&state));
-
-    String name;
-    JSValue nameValue = state.argument(0);
-    if (!nameValue.isUndefinedOrNull())
-        name = nameValue.toString(&state)->value(&state);
-
-    if (state.hadException())
-        return jsUndefined();
-
-    IDBKeyPath keyPath;
-    JSValue keyPathValue = state.argument(1);
-    if (!keyPathValue.isUndefinedOrNull())
-        keyPath = idbKeyPathFromValue(state, keyPathValue);
-    else {
-        ExceptionCodeWithMessage ec;
-        ec.code = IDBDatabaseException::SyntaxError;
-        ec.message = ASCIILiteral("Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.");
-        setDOMException(&state, ec);
-        return jsUndefined();
-    }
-
-    if (state.hadException())
-        return jsUndefined();
-
-    JSValue optionsValue = state.argument(2);
-    if (!optionsValue.isUndefinedOrNull() && !optionsValue.isObject())
-        return throwTypeError(&state, "Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.");
-
-    bool unique = false;
-    bool multiEntry = false;
-    if (!optionsValue.isUndefinedOrNull()) {
-        unique = optionsValue.get(&state, Identifier::fromString(&state, "unique")).toBoolean(&state);
-        if (state.hadException())
-            return jsUndefined();
-
-        multiEntry = optionsValue.get(&state, Identifier::fromString(&state, "multiEntry")).toBoolean(&state);
-        if (state.hadException())
-            return jsUndefined();
-    }
-
-    ExceptionCodeWithMessage ec;
-    JSValue result = toJS(&state, globalObject(), wrapped().createIndex(*context, name, keyPath, unique, multiEntry, ec).get());
-    setDOMException(&state, ec);
-    return result;
-}
-
 }
 
 #endif
index 0bc9246..e15ae94 100644 (file)
@@ -1661,7 +1661,6 @@ sub GenerateParametersCheckExpression
         my $value = "arg$parameterIndex";
         my $type = $parameter->type;
 
-        # Only DOMString or wrapper types are checked.
         # For DOMString with StrictTypeChecking only Null, Undefined and Object
         # are accepted for compatibility. Otherwise, no restrictions are made to
         # match the non-overloaded behavior.
@@ -1679,12 +1678,11 @@ sub GenerateParametersCheckExpression
                 push(@andExpression, "(${value}.isNull() || ${value}.isObject())");
             }
             $usedArguments{$parameterIndex} = 1;
-        } elsif (!IsNativeType($type)) {
+        } elsif ($codeGenerator->GetArrayOrSequenceType($type) || $codeGenerator->IsTypedArrayType($type) || $codeGenerator->IsWrapperType($type)) {
             my $condition = "";
             $condition .= "${value}.isUndefined() || " if $parameter->isOptional;
 
-            # FIXME: WebIDL says that undefined is also acceptable for nullable parameters and
-            # should be converted to null:
+            # FIXME: WebIDL says that undefined is also acceptable for nullable parameters and should be converted to null:
             # http://heycam.github.io/webidl/#es-nullable-type
             $condition .= "${value}.isNull() || " if $parameter->isNullable;
 
@@ -3701,13 +3699,7 @@ sub GenerateParametersCheck
             }
             $value = "WTFMove($name)";
         } elsif ($parameter->isVariadic) {
-            my $nativeElementType;
-            if ($type eq "DOMString") {
-                $nativeElementType = "String";
-            } else {
-                $nativeElementType = GetNativeType($interface, $type);
-            }
-
+            my $nativeElementType = GetNativeType($interface, $type);
             if (!IsNativeType($type)) {
                 push(@$outputArray, "    Vector<$nativeElementType> $name;\n");
                 push(@$outputArray, "    for (unsigned i = $argumentIndex, count = state->argumentCount(); i < count; ++i) {\n");
@@ -3717,7 +3709,6 @@ sub GenerateParametersCheck
                 push(@$outputArray, "    }\n")
             } else {
                 push(@$outputArray, "    Vector<$nativeElementType> $name = toNativeArguments<$nativeElementType>(state, $argumentIndex);\n");
-                # Check if the type conversion succeeded.
                 push(@$outputArray, "    if (UNLIKELY(state->hadException()))\n");
                 push(@$outputArray, "        return JSValue::encode(jsUndefined());\n");
             }
index af00cd6..4415432 100644 (file)
@@ -169,19 +169,19 @@ static RefPtr<KeyPath> keyPathFromIDBKeyPath(const IDBKeyPath& idbKeyPath)
 {
     RefPtr<KeyPath> keyPath;
     switch (idbKeyPath.type()) {
-    case IndexedDB::KeyPathType::Null:
+    case IDBKeyPath::Type::Null:
         keyPath = KeyPath::create()
             .setType(KeyPath::Type::Null)
             .release();
         break;
-    case IndexedDB::KeyPathType::String:
+    case IDBKeyPath::Type::String:
         keyPath = KeyPath::create()
             .setType(KeyPath::Type::String)
             .release();
         keyPath->setString(idbKeyPath.string());
 
         break;
-    case IndexedDB::KeyPathType::Array: {
+    case IDBKeyPath::Type::Array: {
         auto array = Inspector::Protocol::Array<String>::create();
         for (auto& string : idbKeyPath.array())
             array->addItem(string);