| Index: content/browser/dom_storage/local_storage_context_mojo.cc
|
| diff --git a/content/browser/dom_storage/local_storage_context_mojo.cc b/content/browser/dom_storage/local_storage_context_mojo.cc
|
| index 04d0108717e9ba6ad70926265cc8f3353b2ea082..241daeddff43a13c0a40d48c83b9f391f26d3ce6 100644
|
| --- a/content/browser/dom_storage/local_storage_context_mojo.cc
|
| +++ b/content/browser/dom_storage/local_storage_context_mojo.cc
|
| @@ -31,8 +31,6 @@ const char kOriginSeparator = '\x00';
|
| const char kDataPrefix[] = "_";
|
| const int64_t kMinSchemaVersion = 1;
|
| const int64_t kCurrentSchemaVersion = 1;
|
| -
|
| -void NoOpResult(leveldb::mojom::DatabaseError status) {}
|
| }
|
|
|
| LocalStorageContextMojo::LocalStorageContextMojo(
|
| @@ -79,9 +77,9 @@ void LocalStorageContextMojo::OpenLocalStorage(
|
|
|
| if (connection_state_ == CONNECTION_IN_PROGRESS) {
|
| // Queue this OpenLocalStorage call for when we have a level db pointer.
|
| - on_database_opened_callbacks_.push_back(base::Bind(
|
| + on_database_opened_callbacks_.push_back(base::BindOnce(
|
| &LocalStorageContextMojo::BindLocalStorage,
|
| - weak_ptr_factory_.GetWeakPtr(), origin, base::Passed(&request)));
|
| + weak_ptr_factory_.GetWeakPtr(), origin, std::move(request)));
|
| return;
|
| }
|
|
|
| @@ -102,6 +100,24 @@ void LocalStorageContextMojo::OnLevelDBWrapperHasNoBindings(
|
| level_db_wrappers_.erase(origin);
|
| }
|
|
|
| +std::vector<leveldb::mojom::BatchedOperationPtr>
|
| +LocalStorageContextMojo::OnLevelDBWrapperPrepareToCommit() {
|
| + std::vector<leveldb::mojom::BatchedOperationPtr> operations;
|
| +
|
| + // Write schema version if not already done so before.
|
| + if (!database_initialized_) {
|
| + leveldb::mojom::BatchedOperationPtr item =
|
| + leveldb::mojom::BatchedOperation::New();
|
| + item->key = leveldb::StdStringToUint8Vector(kVersionKey);
|
| + item->value = leveldb::StdStringToUint8Vector(
|
| + base::Int64ToString(kCurrentSchemaVersion));
|
| + operations.push_back(std::move(item));
|
| + database_initialized_ = true;
|
| + }
|
| +
|
| + return operations;
|
| +}
|
| +
|
| void LocalStorageContextMojo::OnUserServiceConnectionComplete() {
|
| CHECK_EQ(service_manager::mojom::ConnectResult::SUCCEEDED,
|
| file_service_connection_->GetResult());
|
| @@ -161,13 +177,8 @@ void LocalStorageContextMojo::OnGotDatabaseVersion(
|
| leveldb::mojom::DatabaseError status,
|
| const std::vector<uint8_t>& value) {
|
| if (status == leveldb::mojom::DatabaseError::NOT_FOUND) {
|
| - // New database, write current version and continue.
|
| - // TODO(mek): Delay writing version until first actual data gets committed.
|
| - database_->Put(leveldb::StdStringToUint8Vector(kVersionKey),
|
| - leveldb::StdStringToUint8Vector(
|
| - base::Int64ToString(kCurrentSchemaVersion)),
|
| - base::Bind(&NoOpResult));
|
| - // new database
|
| + // New database, nothing more to do. Current version will get written
|
| + // when first data is committed.
|
| } else if (status == leveldb::mojom::DatabaseError::OK) {
|
| // Existing database, check if version number matches current schema
|
| // version.
|
| @@ -178,6 +189,8 @@ void LocalStorageContextMojo::OnGotDatabaseVersion(
|
| // TODO(mek): delete and recreate database, rather than failing outright.
|
| database_ = nullptr;
|
| }
|
| +
|
| + database_initialized_ = true;
|
| } else {
|
| // Other read error. Possibly database corruption.
|
| // TODO(mek): delete and recreate database, rather than failing outright.
|
| @@ -188,7 +201,7 @@ void LocalStorageContextMojo::OnGotDatabaseVersion(
|
| // delayed bindings.
|
| connection_state_ = CONNECTION_FINISHED;
|
| for (size_t i = 0; i < on_database_opened_callbacks_.size(); ++i)
|
| - on_database_opened_callbacks_[i].Run();
|
| + std::move(on_database_opened_callbacks_[i]).Run();
|
| on_database_opened_callbacks_.clear();
|
| }
|
|
|
| @@ -214,7 +227,9 @@ void LocalStorageContextMojo::BindLocalStorage(
|
| base::TimeDelta::FromSeconds(kCommitDefaultDelaySecs), kMaxBytesPerHour,
|
| kMaxCommitsPerHour,
|
| base::Bind(&LocalStorageContextMojo::OnLevelDBWrapperHasNoBindings,
|
| - base::Unretained(this), origin));
|
| + base::Unretained(this), origin),
|
| + base::Bind(&LocalStorageContextMojo::OnLevelDBWrapperPrepareToCommit,
|
| + base::Unretained(this)));
|
| found = level_db_wrappers_.find(origin);
|
| }
|
|
|
|
|