IndexedDB: Invalid keys yielded by key paths should raise exceptions, not error callbacks
authorjsbell@chromium.org <jsbell@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Jan 2012 22:58:56 +0000 (22:58 +0000)
committerjsbell@chromium.org <jsbell@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Jan 2012 22:58:56 +0000 (22:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=76075

Reviewed by Tony Chang.

Source/WebCore:

Tests: storage/indexeddb/objectstore-basics.html

* storage/IDBObjectStoreBackendImpl.cpp:
(WebCore::IDBObjectStoreBackendImpl::put):

LayoutTests:

* storage/indexeddb/mozilla/bad-keypath-expected.txt:
* storage/indexeddb/mozilla/bad-keypath.html:
* storage/indexeddb/objectstore-basics-expected.txt:
* storage/indexeddb/objectstore-basics.html:

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

LayoutTests/ChangeLog
LayoutTests/storage/indexeddb/mozilla/bad-keypath-expected.txt
LayoutTests/storage/indexeddb/mozilla/bad-keypath.html
LayoutTests/storage/indexeddb/objectstore-basics-expected.txt
LayoutTests/storage/indexeddb/objectstore-basics.html
Source/WebCore/ChangeLog
Source/WebCore/storage/IDBObjectStoreBackendImpl.cpp

index 0d3138d..583ef2e 100644 (file)
@@ -1,3 +1,15 @@
+2012-01-18  Joshua Bell  <jsbell@chromium.org>
+
+        IndexedDB: Invalid keys yielded by key paths should raise exceptions, not error callbacks
+        https://bugs.webkit.org/show_bug.cgi?id=76075
+
+        Reviewed by Tony Chang.
+
+        * storage/indexeddb/mozilla/bad-keypath-expected.txt:
+        * storage/indexeddb/mozilla/bad-keypath.html:
+        * storage/indexeddb/objectstore-basics-expected.txt:
+        * storage/indexeddb/objectstore-basics.html:
+
 2012-01-18  James Robinson  <jamesr@chromium.org>
 
         [chromium] Update chromium linux pixel baseline for svg test
index 71d1f13..a9867cb 100644 (file)
@@ -13,8 +13,9 @@ request = db.setVersion('1')
 Deleted all object stores.
 objectStore = db.createObjectStore('foo', { keyPath: 'keyPath' });
 request = objectStore.add({ keyPath: 'foo' });
-request = objectStore.add({});
-PASS event.target.errorCode is IDBDatabaseException.DATA_ERR
+Expecting exception from request = objectStore.add({});
+PASS Exception was thrown.
+PASS code is IDBDatabaseException.DATA_ERR
 PASS successfullyParsed is true
 
 TEST COMPLETE
index e3ec5af..2bb6cec 100644 (file)
@@ -54,14 +54,7 @@ function cleanDatabase()
 
 function addFirstSuccess()
 {
-    request = evalAndLog("request = objectStore.add({});");
-    request.onsuccess = unexpectedSuccessCallback;
-    request.onerror = addSecondExpectedError;
-}
-
-function addSecondExpectedError()
-{
-    shouldBe("event.target.errorCode", "IDBDatabaseException.DATA_ERR");
+    evalAndExpectException("request = objectStore.add({});", "IDBDatabaseException.DATA_ERR");
     done();
 }
 
index 11a90b0..ec04692 100644 (file)
@@ -135,6 +135,57 @@ Passing an invalid key into store.put().
 Expecting exception from store.put(null, {})
 PASS Exception was thrown.
 PASS code is webkitIDBDatabaseException.DATA_ERR
+
+testPreConditions():
+db.setVersion('precondition version')
+storeWithInLineKeys = db.createObjectStore('storeWithInLineKeys', {keyPath: 'key'})
+storeWithOutOfLineKeys = db.createObjectStore('storeWithOutIOfLineKeys')
+storeWithIndex = db.createObjectStore('storeWithIndex')
+index = storeWithIndex.createIndex('indexName', 'indexKey')
+
+IDBObjectStore.put()
+The object store uses in-line keys and the key parameter was provided.
+Expecting exception from storeWithInLineKeys.put({key: 1}, 'key')
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+Expecting exception from storeWithOutOfLineKeys.put({})
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The object store uses in-line keys and the result of evaluating the object store's key path yields a value and that value is not a valid key.
+Expecting exception from storeWithInLineKeys.put({key: null})
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The object store uses in-line keys but no key generator and the result of evaluating the object store's key path does not yield a value.
+Expecting exception from storeWithInLineKeys.put({})
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The key parameter was provided but does not contain a valid key.
+Expecting exception from storeWithOutOfLineKeys.put({}, null)
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+
+IDBObjectStore.add()
+The object store uses in-line keys and the key parameter was provided.
+Expecting exception from storeWithInLineKeys.add({key: 1}, 'key')
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+Expecting exception from storeWithOutOfLineKeys.add({})
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The object store uses in-line keys and the result of evaluating the object store's key path yields a value and that value is not a valid key.
+Expecting exception from storeWithInLineKeys.add({key: null})
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The object store uses in-line keys but no key generator and the result of evaluating the object store's key path does not yield a value.
+Expecting exception from storeWithInLineKeys.add({})
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
+The key parameter was provided but does not contain a valid key.
+Expecting exception from storeWithOutOfLineKeys.add({}, null)
+PASS Exception was thrown.
+PASS code is webkitIDBDatabaseException.DATA_ERR
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 232aa83..120aa60 100644 (file)
@@ -286,9 +286,67 @@ function removeSuccessButFalse()
     debug("Passing an invalid key into store.put().");
     evalAndExpectException("store.put(null, {})", "webkitIDBDatabaseException.DATA_ERR");
 
-    done();
+    testPreConditions();
 }
 
+function testPreConditions()
+{
+    debug("");
+    debug("testPreConditions():");
+    request = evalAndLog("db.setVersion('precondition version')");
+    request.onerror = unexpectedErrorCallback;
+    request.onsuccess = function() {
+        storeWithInLineKeys = evalAndLog("storeWithInLineKeys = db.createObjectStore('storeWithInLineKeys', {keyPath: 'key'})");
+        storeWithOutOfLineKeys = evalAndLog("storeWithOutOfLineKeys = db.createObjectStore('storeWithOutIOfLineKeys')");
+        storeWithIndex = evalAndLog("storeWithIndex = db.createObjectStore('storeWithIndex')");
+        index = evalAndLog("index = storeWithIndex.createIndex('indexName', 'indexKey')");
+
+        debug("");
+        debug("IDBObjectStore.put()");
+        debug("The object store uses in-line keys and the key parameter was provided.");
+        evalAndExpectException("storeWithInLineKeys.put({key: 1}, 'key')", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The object store uses out-of-line keys and has no key generator and the key parameter was not provided.");
+        evalAndExpectException("storeWithOutOfLineKeys.put({})", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The object store uses in-line keys and the result of evaluating the object store's key path yields a value and that value is not a valid key.");
+        evalAndExpectException("storeWithInLineKeys.put({key: null})", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The object store uses in-line keys but no key generator and the result of evaluating the object store's key path does not yield a value.");
+        evalAndExpectException("storeWithInLineKeys.put({})", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The key parameter was provided but does not contain a valid key.");
+        evalAndExpectException("storeWithOutOfLineKeys.put({}, null)", "webkitIDBDatabaseException.DATA_ERR");
+
+        // FIXME: Add precondition checks for put() with index key paths that yield invalid keys.
+        // https://bugs.webkit.org/show_bug.cgi?id=76487
+
+        debug("");
+        debug("IDBObjectStore.add()");
+        debug("The object store uses in-line keys and the key parameter was provided.");
+        evalAndExpectException("storeWithInLineKeys.add({key: 1}, 'key')", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The object store uses out-of-line keys and has no key generator and the key parameter was not provided.");
+        evalAndExpectException("storeWithOutOfLineKeys.add({})", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The object store uses in-line keys and the result of evaluating the object store's key path yields a value and that value is not a valid key.");
+        evalAndExpectException("storeWithInLineKeys.add({key: null})", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The object store uses in-line keys but no key generator and the result of evaluating the object store's key path does not yield a value.");
+        evalAndExpectException("storeWithInLineKeys.add({})", "webkitIDBDatabaseException.DATA_ERR");
+
+        debug("The key parameter was provided but does not contain a valid key.");
+        evalAndExpectException("storeWithOutOfLineKeys.add({}, null)", "webkitIDBDatabaseException.DATA_ERR");
+
+        // FIXME: Add precondition checks for add() with index key paths that yield invalid keys.
+        // https://bugs.webkit.org/show_bug.cgi?id=76487
+
+        done();
+    };
+}
+
+
+
 test();
 
 
index 3e7db9f..6d9061b 100644 (file)
@@ -1,3 +1,15 @@
+2012-01-18  Joshua Bell  <jsbell@chromium.org>
+
+        IndexedDB: Invalid keys yielded by key paths should raise exceptions, not error callbacks
+        https://bugs.webkit.org/show_bug.cgi?id=76075
+
+        Reviewed by Tony Chang.
+
+        Tests: storage/indexeddb/objectstore-basics.html
+
+        * storage/IDBObjectStoreBackendImpl.cpp:
+        (WebCore::IDBObjectStoreBackendImpl::put):
+
 2012-01-18  Dana Jansens  <danakj@chromium.org>
 
         [chromium] Fix compile error from bug #76211
index 08334c4..1d6cd41 100644 (file)
@@ -138,18 +138,29 @@ void IDBObjectStoreBackendImpl::put(PassRefPtr<SerializedScriptValue> prpValue,
 
     const bool autoIncrement = objectStore->autoIncrement();
     const bool hasKeyPath = !objectStore->m_keyPath.isNull();
-    if (!key && !autoIncrement && !hasKeyPath) {
-        ec = IDBDatabaseException::DATA_ERR;
-        return;
-    }
 
-    if (key && hasKeyPath && (putMode == AddOnly || putMode == AddOrUpdate)) {
-        ec = IDBDatabaseException::DATA_ERR;
-        return;
-    }
+    if (putMode != CursorUpdate) {
+        if (!key && !autoIncrement && !hasKeyPath) {
+            ec = IDBDatabaseException::DATA_ERR;
+            return;
+        }
+        if (hasKeyPath) {
+            if (key && key->valid()) {
+                ec = IDBDatabaseException::DATA_ERR;
+                return;
+            }
+            if (!autoIncrement) {
+                RefPtr<IDBKey> keyPathKey = fetchKeyFromKeyPath(value.get(), objectStore->m_keyPath);
+                if (!keyPathKey || !keyPathKey->valid()) {
+                    ec = IDBDatabaseException::DATA_ERR;
+                    return;
+                }
+            }
+        }
+        // FIXME: Add precondition checks for index key paths that yield invalid keys.
+        // https://bugs.webkit.org/show_bug.cgi?id=76487
+     }
 
-    // FIXME: This should throw a SERIAL_ERR on structured clone problems.
-    // FIXME: This should throw a DATA_ERR when the wrong key/keyPath data is supplied.
     if (!transaction->scheduleTask(createCallbackTask(&IDBObjectStoreBackendImpl::putInternal, objectStore, value, key, putMode, callbacks, transaction)))
         ec = IDBDatabaseException::TRANSACTION_INACTIVE_ERR;
 }