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