Title: [144075] trunk
Revision
144075
Author
jsb...@chromium.org
Date
2013-02-26 10:44:04 -0800 (Tue, 26 Feb 2013)

Log Message

IndexedDB: IDBObjectStore.index() doesn't report errors after deleteIndex()
https://bugs.webkit.org/show_bug.cgi?id=110792

Reviewed by Tony Chang.

Source/WebCore:

The object store's metadata wasn't updated if the index hadn't been accessed
by script and hence placed in the name->object map. Make sure the metadata
is always updated.

Test: storage/indexeddb/deleteIndex-bug110792.html

* Modules/indexeddb/IDBObjectStore.cpp:
(WebCore::IDBObjectStore::deleteIndex): Always update the object store's metadata.

LayoutTests:

Added regression test for bug.

* storage/indexeddb/deleteIndex-bug110792-expected.txt: Added.
* storage/indexeddb/deleteIndex-bug110792.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (144074 => 144075)


--- trunk/LayoutTests/ChangeLog	2013-02-26 18:43:24 UTC (rev 144074)
+++ trunk/LayoutTests/ChangeLog	2013-02-26 18:44:04 UTC (rev 144075)
@@ -1,3 +1,15 @@
+2013-02-26  Joshua Bell  <jsb...@chromium.org>
+
+        IndexedDB: IDBObjectStore.index() doesn't report errors after deleteIndex()
+        https://bugs.webkit.org/show_bug.cgi?id=110792
+
+        Reviewed by Tony Chang.
+
+        Added regression test for bug.
+
+        * storage/indexeddb/deleteIndex-bug110792-expected.txt: Added.
+        * storage/indexeddb/deleteIndex-bug110792.html: Added.
+
 2013-02-26  Sheriff Bot  <webkit.review....@gmail.com>
 
         Unreviewed, rolling out r144019.

Added: trunk/LayoutTests/storage/indexeddb/deleteIndex-bug110792-expected.txt (0 => 144075)


--- trunk/LayoutTests/storage/indexeddb/deleteIndex-bug110792-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteIndex-bug110792-expected.txt	2013-02-26 18:44:04 UTC (rev 144075)
@@ -0,0 +1,33 @@
+Ensure IndexedDB's IDBObjectStore.deleteIndex() works if IDBIndex object has not been fetched - regression test for bug 110792.
+
+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)
+
+onFirstUpgradeNeeded():
+db = event.target.result
+store = db.createObjectStore('store')
+store.createIndex('index', 'keyPath')
+
+closeAndReOpen():
+db.close()
+
+indexedDB.open(dbname, 2)
+
+onSecondUpgradeNeeded():
+db = event.target.result
+store = event.target.transaction.objectStore('store')
+store.deleteIndex('index')
+Expecting exception from store.index('index')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/storage/indexeddb/deleteIndex-bug110792.html (0 => 144075)


--- trunk/LayoutTests/storage/indexeddb/deleteIndex-bug110792.html	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteIndex-bug110792.html	2013-02-26 18:44:04 UTC (rev 144075)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<script src=""
+<script src=""
+<script>
+
+description("Ensure IndexedDB's IDBObjectStore.deleteIndex() works if IDBIndex object has not been fetched - regression test for bug 110792.");
+
+indexedDBTest(onFirstUpgradeNeeded, closeAndReOpen, {version: 1});
+
+function onFirstUpgradeNeeded(evt)
+{
+    preamble(evt);
+    evalAndLog("db = event.target.result");
+    evalAndLog("store = db.createObjectStore('store')");
+    evalAndLog("store.createIndex('index', 'keyPath')");
+}
+
+function closeAndReOpen()
+{
+    preamble();
+    evalAndLog("db.close()");
+    debug("");
+    request = evalAndLog("indexedDB.open(dbname, 2)");
+    request._onblocked_ = unexpectedBlockedCallback;
+    request._onerror_ = unexpectedErrorCallback;
+    request._onupgradeneeded_ = onSecondUpgradeNeeded;
+    request._onsuccess_ = finishJSTest;
+}
+
+function onSecondUpgradeNeeded(evt)
+{
+    preamble(evt);
+    evalAndLog("db = event.target.result");
+    evalAndLog("store = event.target.transaction.objectStore('store')");
+    // Do NOT add a call to store.index('index') here (e.g. to assert it exists)
+    // or the bug disappears.
+    evalAndLog("store.deleteIndex('index')");
+    evalAndExpectException("store.index('index')", "DOMException.NOT_FOUND_ERR", "'NotFoundError'");
+}
+
+</script>
+<script src=""

Modified: trunk/Source/WebCore/ChangeLog (144074 => 144075)


--- trunk/Source/WebCore/ChangeLog	2013-02-26 18:43:24 UTC (rev 144074)
+++ trunk/Source/WebCore/ChangeLog	2013-02-26 18:44:04 UTC (rev 144075)
@@ -1,3 +1,19 @@
+2013-02-26  Joshua Bell  <jsb...@chromium.org>
+
+        IndexedDB: IDBObjectStore.index() doesn't report errors after deleteIndex()
+        https://bugs.webkit.org/show_bug.cgi?id=110792
+
+        Reviewed by Tony Chang.
+
+        The object store's metadata wasn't updated if the index hadn't been accessed
+        by script and hence placed in the name->object map. Make sure the metadata
+        is always updated.
+
+        Test: storage/indexeddb/deleteIndex-bug110792.html
+
+        * Modules/indexeddb/IDBObjectStore.cpp:
+        (WebCore::IDBObjectStore::deleteIndex): Always update the object store's metadata.
+
 2013-02-26  Sheriff Bot  <webkit.review....@gmail.com>
 
         Unreviewed, rolling out r144019.

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp (144074 => 144075)


--- trunk/Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp	2013-02-26 18:43:24 UTC (rev 144074)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp	2013-02-26 18:44:04 UTC (rev 144075)
@@ -469,6 +469,7 @@
 
 void IDBObjectStore::deleteIndex(const String& name, ExceptionCode& ec)
 {
+    IDB_TRACE("IDBObjectStore::deleteIndex");
     if (!m_transaction->isVersionChange() || m_deleted) {
         ec = IDBDatabaseException::InvalidStateError;
         return;
@@ -485,9 +486,9 @@
 
     backendDB()->deleteIndex(m_transaction->id(), id(), indexId);
 
+    m_metadata.indexes.remove(indexId);
     IDBIndexMap::iterator it = m_indexMap.find(name);
     if (it != m_indexMap.end()) {
-        m_metadata.indexes.remove(it->value->id());
         it->value->markDeleted();
         m_indexMap.remove(name);
     }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to