Title: [122179] trunk
Revision
122179
Author
[email protected]
Date
2012-07-09 18:39:55 -0700 (Mon, 09 Jul 2012)

Log Message

IndexedDB: deleteDatabase fails if transaction running in other database
https://bugs.webkit.org/show_bug.cgi?id=90822

Reviewed by Tony Chang.

Source/WebCore:

The IDBLevelDBBackingStore was preventing a deleteDatabase() from running
if any other database was running a transaction. Fix by just creating a scratch
LevelDBTransaction for the delete steps.

Test: storage/indexeddb/deletedatabase-transaction.html

* Modules/indexeddb/IDBLevelDBBackingStore.cpp:
(WebCore::IDBLevelDBBackingStore::deleteDatabase): Use a LevelDBTransaction
directly.

LayoutTests:

* storage/indexeddb/deletedatabase-transaction-expected.txt: Added.
* storage/indexeddb/deletedatabase-transaction.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (122178 => 122179)


--- trunk/LayoutTests/ChangeLog	2012-07-10 01:37:36 UTC (rev 122178)
+++ trunk/LayoutTests/ChangeLog	2012-07-10 01:39:55 UTC (rev 122179)
@@ -1,3 +1,13 @@
+2012-07-09  Joshua Bell  <[email protected]>
+
+        IndexedDB: deleteDatabase fails if transaction running in other database
+        https://bugs.webkit.org/show_bug.cgi?id=90822
+
+        Reviewed by Tony Chang.
+
+        * storage/indexeddb/deletedatabase-transaction-expected.txt: Added.
+        * storage/indexeddb/deletedatabase-transaction.html: Added.
+
 2012-07-09  Pete Williamson  <[email protected]>
 
         Add some new unit tests to test the favicon changing dynamically

Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-transaction-expected.txt (0 => 122179)


--- trunk/LayoutTests/storage/indexeddb/deletedatabase-transaction-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-transaction-expected.txt	2012-07-10 01:39:55 UTC (rev 122179)
@@ -0,0 +1,28 @@
+Ensure deleteDatabase() can run concurrently with transactions in other databases
+
+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;
+
+dbname1 = 'deletedatabase-transaction'
+dbname2 = 'deletedatabase-transaction2'
+
+Prepare database:
+indexedDB.deleteDatabase(dbname1)
+request = indexedDB.open(dbname1)
+db = request.result
+db.setVersion('1')
+db.createObjectStore('store')
+
+Start a transaction against the first database:
+trans = db.transaction('store', 'readonly')
+trans.objectStore('store').get(0)
+
+Delete a different database:
+indexedDB.deleteDatabase(dbname2)
+PASS success event was fired at delete request
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-transaction.html (0 => 122179)


--- trunk/LayoutTests/storage/indexeddb/deletedatabase-transaction.html	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-transaction.html	2012-07-10 01:39:55 UTC (rev 122179)
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<script src=""
+<script src=""
+<script>
+description("Ensure deleteDatabase() can run concurrently with transactions in other databases");
+function test()
+{
+    removeVendorPrefixes();
+
+    evalAndLog("dbname1 = 'deletedatabase-transaction'");
+    evalAndLog("dbname2 = 'deletedatabase-transaction2'");
+    debug("");
+    debug("Prepare database:");
+
+    request = evalAndLog("indexedDB.deleteDatabase(dbname1)");
+    request._onsuccess_ = function() {
+        request = evalAndLog("request = indexedDB.open(dbname1)");
+        request._onsuccess_ = function() {
+            evalAndLog("db = request.result");
+            request = evalAndLog("db.setVersion('1')");
+            request._onsuccess_ = function () {
+                trans = request.result;
+                evalAndLog("db.createObjectStore('store')");
+                trans._oncomplete_ = startTransaction;
+            };
+        };
+    };
+}
+
+function startTransaction() {
+    debug("");
+    debug("Start a transaction against the first database:");
+    evalAndLog("trans = db.transaction('store', 'readonly')");
+    evalAndLog("trans.objectStore('store').get(0)");
+
+    debug("");
+    debug("Delete a different database:");
+    request = evalAndLog("indexedDB.deleteDatabase(dbname2)");
+    request._onblocked_ = unexpectedBlockedCallback;
+    request._onerror_ = unexpectedErrorCallback;
+    request._onsuccess_ = function() {
+        testPassed("success event was fired at delete request");
+    };
+
+    trans._oncomplete_ = finishJSTest;
+}
+
+test();
+</script>
+<script src=""

Modified: trunk/Source/WebCore/ChangeLog (122178 => 122179)


--- trunk/Source/WebCore/ChangeLog	2012-07-10 01:37:36 UTC (rev 122178)
+++ trunk/Source/WebCore/ChangeLog	2012-07-10 01:39:55 UTC (rev 122179)
@@ -1,3 +1,20 @@
+2012-07-09  Joshua Bell  <[email protected]>
+
+        IndexedDB: deleteDatabase fails if transaction running in other database
+        https://bugs.webkit.org/show_bug.cgi?id=90822
+
+        Reviewed by Tony Chang.
+
+        The IDBLevelDBBackingStore was preventing a deleteDatabase() from running
+        if any other database was running a transaction. Fix by just creating a scratch
+        LevelDBTransaction for the delete steps.
+
+        Test: storage/indexeddb/deletedatabase-transaction.html
+
+        * Modules/indexeddb/IDBLevelDBBackingStore.cpp:
+        (WebCore::IDBLevelDBBackingStore::deleteDatabase): Use a LevelDBTransaction
+        directly.
+
 2012-07-09  Pete Williamson  <[email protected]>
 
         Changed the behavior of iconURLs to always recalculate the list.

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp (122178 => 122179)


--- trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp	2012-07-10 01:37:36 UTC (rev 122178)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp	2012-07-10 01:39:55 UTC (rev 122179)
@@ -298,12 +298,8 @@
 
 bool IDBLevelDBBackingStore::deleteDatabase(const String& name)
 {
-    if (m_currentTransaction)
-        return false;
+    RefPtr<LevelDBTransaction> transaction = LevelDBTransaction::create(m_db.get());
 
-    RefPtr<IDBLevelDBBackingStore::Transaction> transaction = IDBLevelDBBackingStore::Transaction::create(this);
-    transaction->begin();
-
     int64_t databaseId;
     String version;
     if (!getIDBDatabaseMetaData(name, version, databaseId)) {
@@ -313,13 +309,13 @@
 
     const Vector<char> startKey = DatabaseMetaDataKey::encode(databaseId, DatabaseMetaDataKey::kOriginName);
     const Vector<char> stopKey = DatabaseMetaDataKey::encode(databaseId + 1, DatabaseMetaDataKey::kOriginName);
-    if (!deleteRange(m_currentTransaction.get(), startKey, stopKey)) {
+    if (!deleteRange(transaction.get(), startKey, stopKey)) {
         transaction->rollback();
         return false;
     }
 
     const Vector<char> key = DatabaseNameKey::encode(m_identifier, name);
-    m_currentTransaction->remove(key);
+    transaction->remove(key);
 
     return transaction->commit();
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to