Index: content/browser/indexed_db/indexed_db_database.cc |
diff --git a/content/browser/indexed_db/indexed_db_database.cc b/content/browser/indexed_db/indexed_db_database.cc |
index 1d9ccbbc5f273bfda9efabeb901453c50a71a0da..fa6036ea4ec459b9f9bbaf00fc699de734970124 100644 |
--- a/content/browser/indexed_db/indexed_db_database.cc |
+++ b/content/browser/indexed_db/indexed_db_database.cc |
@@ -277,6 +277,9 @@ void IndexedDBDatabase::CreateObjectStore(int64 transaction_id, |
return; |
} |
+ // Store creation is done synchronously, as it may be followed by |
+ // index creation (also sync) since preemptive OpenCursor/SetIndexKeys |
+ // may follow. |
IndexedDBObjectStoreMetadata object_store_metadata( |
name, |
object_store_id, |
@@ -284,21 +287,6 @@ void IndexedDBDatabase::CreateObjectStore(int64 transaction_id, |
auto_increment, |
IndexedDBDatabase::kMinimumIndexId); |
- transaction->ScheduleTask( |
- base::Bind(&IndexedDBDatabase::CreateObjectStoreOperation, |
- this, |
- object_store_metadata), |
- base::Bind(&IndexedDBDatabase::CreateObjectStoreAbortOperation, |
- this, |
- object_store_id)); |
- |
- AddObjectStore(object_store_metadata, object_store_id); |
-} |
- |
-void IndexedDBDatabase::CreateObjectStoreOperation( |
- const IndexedDBObjectStoreMetadata& object_store_metadata, |
- IndexedDBTransaction* transaction) { |
- IDB_TRACE("IndexedDBDatabase::CreateObjectStoreOperation"); |
leveldb::Status s = |
backing_store_->CreateObjectStore(transaction->BackingStoreTransaction(), |
transaction->database()->id(), |
@@ -317,6 +305,12 @@ void IndexedDBDatabase::CreateObjectStoreOperation( |
error); |
return; |
} |
+ |
+ AddObjectStore(object_store_metadata, object_store_id); |
+ transaction->ScheduleAbortTask( |
+ base::Bind(&IndexedDBDatabase::CreateObjectStoreAbortOperation, |
+ this, |
+ object_store_id)); |
} |
void IndexedDBDatabase::DeleteObjectStore(int64 transaction_id, |
@@ -336,11 +330,7 @@ void IndexedDBDatabase::DeleteObjectStore(int64 transaction_id, |
transaction->ScheduleTask( |
base::Bind(&IndexedDBDatabase::DeleteObjectStoreOperation, |
ericu
2014/05/14 01:08:00
This change makes the RemoveObjectStore call async
jsbell
2014/05/14 11:05:52
That's the key bit of the patch.
Currently, scrip
|
this, |
- object_store_metadata), |
- base::Bind(&IndexedDBDatabase::DeleteObjectStoreAbortOperation, |
- this, |
object_store_metadata)); |
- RemoveObjectStore(object_store_id); |
} |
void IndexedDBDatabase::CreateIndex(int64 transaction_id, |
@@ -358,27 +348,12 @@ void IndexedDBDatabase::CreateIndex(int64 transaction_id, |
if (!ValidateObjectStoreIdAndNewIndexId(object_store_id, index_id)) |
return; |
+ |
+ // Index creation is done synchronously since preemptive |
+ // OpenCursor/SetIndexKeys may follow. |
const IndexedDBIndexMetadata index_metadata( |
name, index_id, key_path, unique, multi_entry); |
- transaction->ScheduleTask( |
- base::Bind(&IndexedDBDatabase::CreateIndexOperation, |
- this, |
- object_store_id, |
- index_metadata), |
- base::Bind(&IndexedDBDatabase::CreateIndexAbortOperation, |
- this, |
- object_store_id, |
- index_id)); |
- |
- AddIndex(object_store_id, index_metadata, index_id); |
-} |
- |
-void IndexedDBDatabase::CreateIndexOperation( |
- int64 object_store_id, |
- const IndexedDBIndexMetadata& index_metadata, |
- IndexedDBTransaction* transaction) { |
- IDB_TRACE("IndexedDBDatabase::CreateIndexOperation"); |
if (!backing_store_->CreateIndex(transaction->BackingStoreTransaction(), |
transaction->database()->id(), |
object_store_id, |
@@ -394,6 +369,13 @@ void IndexedDBDatabase::CreateIndexOperation( |
blink::WebIDBDatabaseExceptionUnknownError, error_string)); |
return; |
} |
+ |
+ AddIndex(object_store_id, index_metadata, index_id); |
+ transaction->ScheduleAbortTask( |
+ base::Bind(&IndexedDBDatabase::CreateIndexAbortOperation, |
+ this, |
+ object_store_id, |
+ index_id)); |
} |
void IndexedDBDatabase::CreateIndexAbortOperation( |
@@ -423,13 +405,7 @@ void IndexedDBDatabase::DeleteIndex(int64 transaction_id, |
base::Bind(&IndexedDBDatabase::DeleteIndexOperation, |
this, |
object_store_id, |
- index_metadata), |
- base::Bind(&IndexedDBDatabase::DeleteIndexAbortOperation, |
- this, |
- object_store_id, |
index_metadata)); |
- |
- RemoveIndex(object_store_id, index_id); |
} |
void IndexedDBDatabase::DeleteIndexOperation( |
@@ -453,6 +429,13 @@ void IndexedDBDatabase::DeleteIndexOperation( |
factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), |
error); |
} |
+ |
+ RemoveIndex(object_store_id, index_metadata.id); |
+ transaction->ScheduleAbortTask( |
+ base::Bind(&IndexedDBDatabase::DeleteIndexAbortOperation, |
+ this, |
+ object_store_id, |
+ index_metadata)); |
} |
void IndexedDBDatabase::DeleteIndexAbortOperation( |
@@ -1317,6 +1300,12 @@ void IndexedDBDatabase::DeleteObjectStoreOperation( |
factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), |
error); |
} |
+ |
+ RemoveObjectStore(object_store_metadata.id); |
+ transaction->ScheduleAbortTask( |
+ base::Bind(&IndexedDBDatabase::DeleteObjectStoreAbortOperation, |
+ this, |
+ object_store_metadata)); |
} |
void IndexedDBDatabase::VersionChangeOperation( |
@@ -1327,11 +1316,9 @@ void IndexedDBDatabase::VersionChangeOperation( |
IDB_TRACE("IndexedDBDatabase::VersionChangeOperation"); |
int64 old_version = metadata_.int_version; |
DCHECK_GT(version, old_version); |
- metadata_.int_version = version; |
+ |
if (!backing_store_->UpdateIDBDatabaseIntVersion( |
- transaction->BackingStoreTransaction(), |
- id(), |
- metadata_.int_version)) { |
+ transaction->BackingStoreTransaction(), id(), version)) { |
IndexedDBDatabaseError error( |
blink::WebIDBDatabaseExceptionUnknownError, |
ASCIIToUTF16( |
@@ -1341,6 +1328,15 @@ void IndexedDBDatabase::VersionChangeOperation( |
transaction->Abort(error); |
return; |
} |
+ |
+ transaction->ScheduleAbortTask( |
+ base::Bind(&IndexedDBDatabase::VersionChangeAbortOperation, |
+ this, |
+ metadata_.version, |
+ metadata_.int_version)); |
+ metadata_.int_version = version; |
+ metadata_.version = kNoStringVersion; |
ericu
2014/05/14 01:08:00
Given that metadata_.version is obsolete, I don't
jsbell
2014/05/14 11:17:12
Intentional. It appeared to be missing, possibly a
|
+ |
DCHECK(!pending_second_half_open_); |
pending_second_half_open_.reset( |
new PendingSuccessCall(callbacks, connection.get(), version)); |
@@ -1623,17 +1619,12 @@ void IndexedDBDatabase::RunVersionChangeTransactionFinal( |
object_store_ids, |
indexed_db::TRANSACTION_VERSION_CHANGE); |
- transactions_[transaction_id] |
- ->ScheduleTask(base::Bind(&IndexedDBDatabase::VersionChangeOperation, |
- this, |
- requested_version, |
- callbacks, |
- base::Passed(&connection)), |
- base::Bind(&IndexedDBDatabase::VersionChangeAbortOperation, |
- this, |
- metadata_.version, |
- metadata_.int_version)); |
- |
+ transactions_[transaction_id]->ScheduleTask( |
+ base::Bind(&IndexedDBDatabase::VersionChangeOperation, |
+ this, |
+ requested_version, |
+ callbacks, |
+ base::Passed(&connection))); |
DCHECK(!pending_second_half_open_); |
} |