| Index: content/browser/indexed_db/indexed_db_factory_impl.cc
|
| diff --git a/content/browser/indexed_db/indexed_db_factory_impl.cc b/content/browser/indexed_db/indexed_db_factory_impl.cc
|
| index b8a553642a56f9d7861bae6025756eee0c78b383..9726ec2d9e3defe18aece5959ffe5d67957e6575 100644
|
| --- a/content/browser/indexed_db/indexed_db_factory_impl.cc
|
| +++ b/content/browser/indexed_db/indexed_db_factory_impl.cc
|
| @@ -173,6 +173,7 @@ void IndexedDBFactoryImpl::GetDatabaseNames(
|
| scoped_refptr<IndexedDBCallbacks> callbacks,
|
| const Origin& origin,
|
| const base::FilePath& data_directory,
|
| + const IndexedDBDataFormatVersion& client_data_format_version,
|
| scoped_refptr<net::URLRequestContextGetter> request_context_getter) {
|
| IDB_TRACE("IndexedDBFactoryImpl::GetDatabaseNames");
|
| // TODO(dgrogan): Plumb data_loss back to script eventually?
|
| @@ -181,8 +182,8 @@ void IndexedDBFactoryImpl::GetDatabaseNames(
|
| leveldb::Status s;
|
| // TODO(cmumford): Handle this error
|
| scoped_refptr<IndexedDBBackingStore> backing_store =
|
| - OpenBackingStore(origin, data_directory, request_context_getter,
|
| - &data_loss_info, &disk_full, &s);
|
| + OpenBackingStore(origin, data_directory, client_data_format_version,
|
| + request_context_getter, &data_loss_info, &disk_full, &s);
|
| if (!backing_store.get()) {
|
| callbacks->OnError(
|
| IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError,
|
| @@ -214,6 +215,7 @@ void IndexedDBFactoryImpl::DeleteDatabase(
|
| scoped_refptr<IndexedDBCallbacks> callbacks,
|
| const Origin& origin,
|
| const base::FilePath& data_directory,
|
| + const IndexedDBDataFormatVersion& client_data_format_version,
|
| bool force_close) {
|
| IDB_TRACE("IndexedDBFactoryImpl::DeleteDatabase");
|
| IndexedDBDatabase::Identifier unique_identifier(origin, name);
|
| @@ -230,8 +232,8 @@ void IndexedDBFactoryImpl::DeleteDatabase(
|
| bool disk_full = false;
|
| leveldb::Status s;
|
| scoped_refptr<IndexedDBBackingStore> backing_store =
|
| - OpenBackingStore(origin, data_directory, request_context_getter,
|
| - &data_loss_info, &disk_full, &s);
|
| + OpenBackingStore(origin, data_directory, client_data_format_version,
|
| + request_context_getter, &data_loss_info, &disk_full, &s);
|
| if (!backing_store.get()) {
|
| IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError,
|
| ASCIIToUTF16(
|
| @@ -352,19 +354,21 @@ scoped_refptr<IndexedDBBackingStore>
|
| IndexedDBFactoryImpl::OpenBackingStoreHelper(
|
| const Origin& origin,
|
| const base::FilePath& data_directory,
|
| + const IndexedDBDataFormatVersion& data_format_version,
|
| scoped_refptr<net::URLRequestContextGetter> request_context_getter,
|
| IndexedDBDataLossInfo* data_loss_info,
|
| bool* disk_full,
|
| bool first_time,
|
| leveldb::Status* status) {
|
| return IndexedDBBackingStore::Open(
|
| - this, origin, data_directory, request_context_getter, data_loss_info,
|
| - disk_full, context_->TaskRunner(), first_time, status);
|
| + this, origin, data_directory, data_format_version, request_context_getter,
|
| + data_loss_info, disk_full, context_->TaskRunner(), first_time, status);
|
| }
|
|
|
| scoped_refptr<IndexedDBBackingStore> IndexedDBFactoryImpl::OpenBackingStore(
|
| const Origin& origin,
|
| const base::FilePath& data_directory,
|
| + const IndexedDBDataFormatVersion& data_format_version,
|
| scoped_refptr<net::URLRequestContextGetter> request_context_getter,
|
| IndexedDBDataLossInfo* data_loss_info,
|
| bool* disk_full,
|
| @@ -373,21 +377,26 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBFactoryImpl::OpenBackingStore(
|
|
|
| const auto& it2 = backing_store_map_.find(origin);
|
| if (it2 != backing_store_map_.end()) {
|
| - it2->second->close_timer()->Stop();
|
| - return it2->second;
|
| + scoped_refptr<IndexedDBBackingStore> backing_store = it2->second;
|
| + if (backing_store->data_format_version() != data_format_version) {
|
| + LOG(ERROR) << "IndexedDB backing store already open with a different "
|
| + "data format version.";
|
| + }
|
| + backing_store->close_timer()->Stop();
|
| + return backing_store;
|
| }
|
|
|
| scoped_refptr<IndexedDBBackingStore> backing_store;
|
| bool first_time = false;
|
| if (open_in_memory) {
|
| backing_store = IndexedDBBackingStore::OpenInMemory(
|
| - origin, context_->TaskRunner(), status);
|
| + origin, data_format_version, context_->TaskRunner(), status);
|
| } else {
|
| first_time = !backends_opened_since_boot_.count(origin);
|
|
|
| - backing_store =
|
| - OpenBackingStoreHelper(origin, data_directory, request_context_getter,
|
| - data_loss_info, disk_full, first_time, status);
|
| + backing_store = OpenBackingStoreHelper(
|
| + origin, data_directory, data_format_version, request_context_getter,
|
| + data_loss_info, disk_full, first_time, status);
|
| }
|
|
|
| if (backing_store.get()) {
|
| @@ -413,7 +422,8 @@ void IndexedDBFactoryImpl::Open(
|
| std::unique_ptr<IndexedDBPendingConnection> connection,
|
| scoped_refptr<net::URLRequestContextGetter> request_context_getter,
|
| const Origin& origin,
|
| - const base::FilePath& data_directory) {
|
| + const base::FilePath& data_directory,
|
| + const IndexedDBDataFormatVersion& client_data_format_version) {
|
| IDB_TRACE("IndexedDBFactoryImpl::Open");
|
| scoped_refptr<IndexedDBDatabase> database;
|
| IndexedDBDatabase::Identifier unique_identifier(origin, name);
|
| @@ -423,9 +433,9 @@ void IndexedDBFactoryImpl::Open(
|
| bool was_open = (it != database_map_.end());
|
| if (!was_open) {
|
| leveldb::Status s;
|
| - scoped_refptr<IndexedDBBackingStore> backing_store =
|
| - OpenBackingStore(origin, data_directory, request_context_getter,
|
| - &data_loss_info, &disk_full, &s);
|
| + scoped_refptr<IndexedDBBackingStore> backing_store = OpenBackingStore(
|
| + origin, data_directory, client_data_format_version,
|
| + request_context_getter, &data_loss_info, &disk_full, &s);
|
| if (!backing_store.get()) {
|
| if (disk_full) {
|
| connection->callbacks->OnError(IndexedDBDatabaseError(
|
|
|