Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: content/browser/indexed_db/indexed_db_database.cc

Issue 277583002: IndexedDB: Prevent store/index deletion from racing ahead of use (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: base::Closure copies const-refs, so this is better Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/indexed_db/indexed_db_database.h" 5 #include "content/browser/indexed_db/indexed_db_database.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <set> 8 #include <set>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 IndexedDBTransaction* transaction = GetTransaction(transaction_id); 270 IndexedDBTransaction* transaction = GetTransaction(transaction_id);
271 if (!transaction) 271 if (!transaction)
272 return; 272 return;
273 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 273 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE);
274 274
275 if (ContainsKey(metadata_.object_stores, object_store_id)) { 275 if (ContainsKey(metadata_.object_stores, object_store_id)) {
276 DLOG(ERROR) << "Invalid object_store_id"; 276 DLOG(ERROR) << "Invalid object_store_id";
277 return; 277 return;
278 } 278 }
279 279
280 // Store creation is done synchronously, as it may be followed by
281 // index creation (also sync) since preemptive OpenCursor/SetIndexKeys
282 // may follow.
280 IndexedDBObjectStoreMetadata object_store_metadata( 283 IndexedDBObjectStoreMetadata object_store_metadata(
281 name, 284 name,
282 object_store_id, 285 object_store_id,
283 key_path, 286 key_path,
284 auto_increment, 287 auto_increment,
285 IndexedDBDatabase::kMinimumIndexId); 288 IndexedDBDatabase::kMinimumIndexId);
286 289
287 transaction->ScheduleTask(
288 base::Bind(&IndexedDBDatabase::CreateObjectStoreOperation,
289 this,
290 object_store_metadata),
291 base::Bind(&IndexedDBDatabase::CreateObjectStoreAbortOperation,
292 this,
293 object_store_id));
294
295 AddObjectStore(object_store_metadata, object_store_id);
296 }
297
298 void IndexedDBDatabase::CreateObjectStoreOperation(
299 const IndexedDBObjectStoreMetadata& object_store_metadata,
300 IndexedDBTransaction* transaction) {
301 IDB_TRACE("IndexedDBDatabase::CreateObjectStoreOperation");
302 leveldb::Status s = 290 leveldb::Status s =
303 backing_store_->CreateObjectStore(transaction->BackingStoreTransaction(), 291 backing_store_->CreateObjectStore(transaction->BackingStoreTransaction(),
304 transaction->database()->id(), 292 transaction->database()->id(),
305 object_store_metadata.id, 293 object_store_metadata.id,
306 object_store_metadata.name, 294 object_store_metadata.name,
307 object_store_metadata.key_path, 295 object_store_metadata.key_path,
308 object_store_metadata.auto_increment); 296 object_store_metadata.auto_increment);
309 if (!s.ok()) { 297 if (!s.ok()) {
310 IndexedDBDatabaseError error( 298 IndexedDBDatabaseError error(
311 blink::WebIDBDatabaseExceptionUnknownError, 299 blink::WebIDBDatabaseExceptionUnknownError,
312 ASCIIToUTF16("Internal error creating object store '") + 300 ASCIIToUTF16("Internal error creating object store '") +
313 object_store_metadata.name + ASCIIToUTF16("'.")); 301 object_store_metadata.name + ASCIIToUTF16("'."));
314 transaction->Abort(error); 302 transaction->Abort(error);
315 if (s.IsCorruption()) 303 if (s.IsCorruption())
316 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), 304 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(),
317 error); 305 error);
318 return; 306 return;
319 } 307 }
308
309 AddObjectStore(object_store_metadata, object_store_id);
310 transaction->ScheduleAbortTask(
311 base::Bind(&IndexedDBDatabase::CreateObjectStoreAbortOperation,
312 this,
313 object_store_id));
320 } 314 }
321 315
322 void IndexedDBDatabase::DeleteObjectStore(int64 transaction_id, 316 void IndexedDBDatabase::DeleteObjectStore(int64 transaction_id,
323 int64 object_store_id) { 317 int64 object_store_id) {
324 IDB_TRACE("IndexedDBDatabase::DeleteObjectStore"); 318 IDB_TRACE("IndexedDBDatabase::DeleteObjectStore");
325 IndexedDBTransaction* transaction = GetTransaction(transaction_id); 319 IndexedDBTransaction* transaction = GetTransaction(transaction_id);
326 if (!transaction) 320 if (!transaction)
327 return; 321 return;
328 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 322 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE);
329 323
330 if (!ValidateObjectStoreId(object_store_id)) 324 if (!ValidateObjectStoreId(object_store_id))
331 return; 325 return;
332 326
333 const IndexedDBObjectStoreMetadata& object_store_metadata =
334 metadata_.object_stores[object_store_id];
335
336 transaction->ScheduleTask( 327 transaction->ScheduleTask(
337 base::Bind(&IndexedDBDatabase::DeleteObjectStoreOperation, 328 base::Bind(&IndexedDBDatabase::DeleteObjectStoreOperation,
338 this, 329 this,
339 object_store_metadata), 330 object_store_id));
340 base::Bind(&IndexedDBDatabase::DeleteObjectStoreAbortOperation,
341 this,
342 object_store_metadata));
343 RemoveObjectStore(object_store_id);
344 } 331 }
345 332
346 void IndexedDBDatabase::CreateIndex(int64 transaction_id, 333 void IndexedDBDatabase::CreateIndex(int64 transaction_id,
347 int64 object_store_id, 334 int64 object_store_id,
348 int64 index_id, 335 int64 index_id,
349 const base::string16& name, 336 const base::string16& name,
350 const IndexedDBKeyPath& key_path, 337 const IndexedDBKeyPath& key_path,
351 bool unique, 338 bool unique,
352 bool multi_entry) { 339 bool multi_entry) {
353 IDB_TRACE("IndexedDBDatabase::CreateIndex"); 340 IDB_TRACE("IndexedDBDatabase::CreateIndex");
354 IndexedDBTransaction* transaction = GetTransaction(transaction_id); 341 IndexedDBTransaction* transaction = GetTransaction(transaction_id);
355 if (!transaction) 342 if (!transaction)
356 return; 343 return;
357 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 344 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE);
358 345
359 if (!ValidateObjectStoreIdAndNewIndexId(object_store_id, index_id)) 346 if (!ValidateObjectStoreIdAndNewIndexId(object_store_id, index_id))
360 return; 347 return;
348
349 // Index creation is done synchronously since preemptive
350 // OpenCursor/SetIndexKeys may follow.
361 const IndexedDBIndexMetadata index_metadata( 351 const IndexedDBIndexMetadata index_metadata(
362 name, index_id, key_path, unique, multi_entry); 352 name, index_id, key_path, unique, multi_entry);
363 353
364 transaction->ScheduleTask(
365 base::Bind(&IndexedDBDatabase::CreateIndexOperation,
366 this,
367 object_store_id,
368 index_metadata),
369 base::Bind(&IndexedDBDatabase::CreateIndexAbortOperation,
370 this,
371 object_store_id,
372 index_id));
373
374 AddIndex(object_store_id, index_metadata, index_id);
375 }
376
377 void IndexedDBDatabase::CreateIndexOperation(
378 int64 object_store_id,
379 const IndexedDBIndexMetadata& index_metadata,
380 IndexedDBTransaction* transaction) {
381 IDB_TRACE("IndexedDBDatabase::CreateIndexOperation");
382 if (!backing_store_->CreateIndex(transaction->BackingStoreTransaction(), 354 if (!backing_store_->CreateIndex(transaction->BackingStoreTransaction(),
383 transaction->database()->id(), 355 transaction->database()->id(),
384 object_store_id, 356 object_store_id,
385 index_metadata.id, 357 index_metadata.id,
386 index_metadata.name, 358 index_metadata.name,
387 index_metadata.key_path, 359 index_metadata.key_path,
388 index_metadata.unique, 360 index_metadata.unique,
389 index_metadata.multi_entry).ok()) { 361 index_metadata.multi_entry).ok()) {
390 base::string16 error_string = 362 base::string16 error_string =
391 ASCIIToUTF16("Internal error creating index '") + 363 ASCIIToUTF16("Internal error creating index '") +
392 index_metadata.name + ASCIIToUTF16("'."); 364 index_metadata.name + ASCIIToUTF16("'.");
393 transaction->Abort(IndexedDBDatabaseError( 365 transaction->Abort(IndexedDBDatabaseError(
394 blink::WebIDBDatabaseExceptionUnknownError, error_string)); 366 blink::WebIDBDatabaseExceptionUnknownError, error_string));
395 return; 367 return;
396 } 368 }
369
370 AddIndex(object_store_id, index_metadata, index_id);
371 transaction->ScheduleAbortTask(
372 base::Bind(&IndexedDBDatabase::CreateIndexAbortOperation,
373 this,
374 object_store_id,
375 index_id));
397 } 376 }
398 377
399 void IndexedDBDatabase::CreateIndexAbortOperation( 378 void IndexedDBDatabase::CreateIndexAbortOperation(
400 int64 object_store_id, 379 int64 object_store_id,
401 int64 index_id, 380 int64 index_id,
402 IndexedDBTransaction* transaction) { 381 IndexedDBTransaction* transaction) {
403 IDB_TRACE("IndexedDBDatabase::CreateIndexAbortOperation"); 382 IDB_TRACE("IndexedDBDatabase::CreateIndexAbortOperation");
404 DCHECK(!transaction); 383 DCHECK(!transaction);
405 RemoveIndex(object_store_id, index_id); 384 RemoveIndex(object_store_id, index_id);
406 } 385 }
407 386
408 void IndexedDBDatabase::DeleteIndex(int64 transaction_id, 387 void IndexedDBDatabase::DeleteIndex(int64 transaction_id,
409 int64 object_store_id, 388 int64 object_store_id,
410 int64 index_id) { 389 int64 index_id) {
411 IDB_TRACE("IndexedDBDatabase::DeleteIndex"); 390 IDB_TRACE("IndexedDBDatabase::DeleteIndex");
412 IndexedDBTransaction* transaction = GetTransaction(transaction_id); 391 IndexedDBTransaction* transaction = GetTransaction(transaction_id);
413 if (!transaction) 392 if (!transaction)
414 return; 393 return;
415 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE); 394 DCHECK_EQ(transaction->mode(), indexed_db::TRANSACTION_VERSION_CHANGE);
416 395
417 if (!ValidateObjectStoreIdAndIndexId(object_store_id, index_id)) 396 if (!ValidateObjectStoreIdAndIndexId(object_store_id, index_id))
418 return; 397 return;
419 const IndexedDBIndexMetadata& index_metadata =
420 metadata_.object_stores[object_store_id].indexes[index_id];
421 398
422 transaction->ScheduleTask( 399 transaction->ScheduleTask(
423 base::Bind(&IndexedDBDatabase::DeleteIndexOperation, 400 base::Bind(&IndexedDBDatabase::DeleteIndexOperation,
424 this, 401 this,
425 object_store_id, 402 object_store_id,
426 index_metadata), 403 index_id));
427 base::Bind(&IndexedDBDatabase::DeleteIndexAbortOperation,
428 this,
429 object_store_id,
430 index_metadata));
431
432 RemoveIndex(object_store_id, index_id);
433 } 404 }
434 405
435 void IndexedDBDatabase::DeleteIndexOperation( 406 void IndexedDBDatabase::DeleteIndexOperation(
436 int64 object_store_id, 407 int64 object_store_id,
437 const IndexedDBIndexMetadata& index_metadata, 408 int64 index_id,
438 IndexedDBTransaction* transaction) { 409 IndexedDBTransaction* transaction) {
439 IDB_TRACE("IndexedDBDatabase::DeleteIndexOperation"); 410 IDB_TRACE("IndexedDBDatabase::DeleteIndexOperation");
411
412 const IndexedDBIndexMetadata index_metadata =
413 metadata_.object_stores[object_store_id].indexes[index_id];
414
440 leveldb::Status s = 415 leveldb::Status s =
441 backing_store_->DeleteIndex(transaction->BackingStoreTransaction(), 416 backing_store_->DeleteIndex(transaction->BackingStoreTransaction(),
442 transaction->database()->id(), 417 transaction->database()->id(),
443 object_store_id, 418 object_store_id,
444 index_metadata.id); 419 index_id);
445 if (!s.ok()) { 420 if (!s.ok()) {
446 base::string16 error_string = 421 base::string16 error_string =
447 ASCIIToUTF16("Internal error deleting index '") + 422 ASCIIToUTF16("Internal error deleting index '") +
448 index_metadata.name + ASCIIToUTF16("'."); 423 index_metadata.name + ASCIIToUTF16("'.");
449 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, 424 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError,
450 error_string); 425 error_string);
451 transaction->Abort(error); 426 transaction->Abort(error);
452 if (s.IsCorruption()) 427 if (s.IsCorruption())
453 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), 428 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(),
454 error); 429 error);
430 return;
jsbell 2014/05/19 22:07:08 Seems safer to early exit here; if the backing sto
455 } 431 }
432
433 RemoveIndex(object_store_id, index_id);
434 transaction->ScheduleAbortTask(
435 base::Bind(&IndexedDBDatabase::DeleteIndexAbortOperation,
436 this,
437 object_store_id,
438 index_metadata));
456 } 439 }
457 440
458 void IndexedDBDatabase::DeleteIndexAbortOperation( 441 void IndexedDBDatabase::DeleteIndexAbortOperation(
459 int64 object_store_id, 442 int64 object_store_id,
460 const IndexedDBIndexMetadata& index_metadata, 443 const IndexedDBIndexMetadata& index_metadata,
461 IndexedDBTransaction* transaction) { 444 IndexedDBTransaction* transaction) {
462 IDB_TRACE("IndexedDBDatabase::DeleteIndexAbortOperation"); 445 IDB_TRACE("IndexedDBDatabase::DeleteIndexAbortOperation");
463 DCHECK(!transaction); 446 DCHECK(!transaction);
464 AddIndex(object_store_id, index_metadata, IndexedDBIndexMetadata::kInvalidId); 447 AddIndex(object_store_id, index_metadata, IndexedDBIndexMetadata::kInvalidId);
465 } 448 }
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 if (s.IsCorruption()) { 1275 if (s.IsCorruption()) {
1293 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), 1276 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(),
1294 error); 1277 error);
1295 } 1278 }
1296 return; 1279 return;
1297 } 1280 }
1298 callbacks->OnSuccess(); 1281 callbacks->OnSuccess();
1299 } 1282 }
1300 1283
1301 void IndexedDBDatabase::DeleteObjectStoreOperation( 1284 void IndexedDBDatabase::DeleteObjectStoreOperation(
1302 const IndexedDBObjectStoreMetadata& object_store_metadata, 1285 int64 object_store_id,
1303 IndexedDBTransaction* transaction) { 1286 IndexedDBTransaction* transaction) {
1304 IDB_TRACE("IndexedDBDatabase::DeleteObjectStoreOperation"); 1287 IDB_TRACE("IndexedDBDatabase::DeleteObjectStoreOperation");
1288
1289 const IndexedDBObjectStoreMetadata object_store_metadata =
cmumford 2014/05/20 15:29:33 Can this be a const reference?
jsbell 2014/05/20 15:34:43 No, because metadata_ is mutated by RemoveObjectSt
1290 metadata_.object_stores[object_store_id];
1305 leveldb::Status s = 1291 leveldb::Status s =
1306 backing_store_->DeleteObjectStore(transaction->BackingStoreTransaction(), 1292 backing_store_->DeleteObjectStore(transaction->BackingStoreTransaction(),
1307 transaction->database()->id(), 1293 transaction->database()->id(),
1308 object_store_metadata.id); 1294 object_store_id);
1309 if (!s.ok()) { 1295 if (!s.ok()) {
1310 base::string16 error_string = 1296 base::string16 error_string =
1311 ASCIIToUTF16("Internal error deleting object store '") + 1297 ASCIIToUTF16("Internal error deleting object store '") +
1312 object_store_metadata.name + ASCIIToUTF16("'."); 1298 object_store_metadata.name + ASCIIToUTF16("'.");
1313 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, 1299 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError,
1314 error_string); 1300 error_string);
1315 transaction->Abort(error); 1301 transaction->Abort(error);
1316 if (s.IsCorruption()) 1302 if (s.IsCorruption())
1317 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), 1303 factory_->HandleBackingStoreCorruption(backing_store_->origin_url(),
1318 error); 1304 error);
1305 return;
jsbell 2014/05/19 22:07:08 Ditto.
1319 } 1306 }
1307
1308 RemoveObjectStore(object_store_id);
1309 transaction->ScheduleAbortTask(
1310 base::Bind(&IndexedDBDatabase::DeleteObjectStoreAbortOperation,
1311 this,
1312 object_store_metadata));
1320 } 1313 }
1321 1314
1322 void IndexedDBDatabase::VersionChangeOperation( 1315 void IndexedDBDatabase::VersionChangeOperation(
1323 int64 version, 1316 int64 version,
1324 scoped_refptr<IndexedDBCallbacks> callbacks, 1317 scoped_refptr<IndexedDBCallbacks> callbacks,
1325 scoped_ptr<IndexedDBConnection> connection, 1318 scoped_ptr<IndexedDBConnection> connection,
1326 IndexedDBTransaction* transaction) { 1319 IndexedDBTransaction* transaction) {
1327 IDB_TRACE("IndexedDBDatabase::VersionChangeOperation"); 1320 IDB_TRACE("IndexedDBDatabase::VersionChangeOperation");
1328 int64 old_version = metadata_.int_version; 1321 int64 old_version = metadata_.int_version;
1329 DCHECK_GT(version, old_version); 1322 DCHECK_GT(version, old_version);
1330 metadata_.int_version = version; 1323
1331 if (!backing_store_->UpdateIDBDatabaseIntVersion( 1324 if (!backing_store_->UpdateIDBDatabaseIntVersion(
1332 transaction->BackingStoreTransaction(), 1325 transaction->BackingStoreTransaction(), id(), version)) {
1333 id(),
1334 metadata_.int_version)) {
1335 IndexedDBDatabaseError error( 1326 IndexedDBDatabaseError error(
1336 blink::WebIDBDatabaseExceptionUnknownError, 1327 blink::WebIDBDatabaseExceptionUnknownError,
1337 ASCIIToUTF16( 1328 ASCIIToUTF16(
1338 "Internal error writing data to stable storage when " 1329 "Internal error writing data to stable storage when "
1339 "updating version.")); 1330 "updating version."));
1340 callbacks->OnError(error); 1331 callbacks->OnError(error);
1341 transaction->Abort(error); 1332 transaction->Abort(error);
1342 return; 1333 return;
1343 } 1334 }
1335
1336 transaction->ScheduleAbortTask(
1337 base::Bind(&IndexedDBDatabase::VersionChangeAbortOperation,
1338 this,
1339 metadata_.version,
1340 metadata_.int_version));
1341 metadata_.int_version = version;
1342 metadata_.version = kNoStringVersion;
1343
1344 DCHECK(!pending_second_half_open_); 1344 DCHECK(!pending_second_half_open_);
1345 pending_second_half_open_.reset( 1345 pending_second_half_open_.reset(
1346 new PendingSuccessCall(callbacks, connection.get(), version)); 1346 new PendingSuccessCall(callbacks, connection.get(), version));
1347 callbacks->OnUpgradeNeeded(old_version, connection.Pass(), metadata()); 1347 callbacks->OnUpgradeNeeded(old_version, connection.Pass(), metadata());
1348 } 1348 }
1349 1349
1350 void IndexedDBDatabase::TransactionFinished(IndexedDBTransaction* transaction, 1350 void IndexedDBDatabase::TransactionFinished(IndexedDBTransaction* transaction,
1351 bool committed) { 1351 bool committed) {
1352 DCHECK(transactions_.find(transaction->id()) != transactions_.end()); 1352 DCHECK(transactions_.find(transaction->id()) != transactions_.end());
1353 DCHECK_EQ(transactions_[transaction->id()], transaction); 1353 DCHECK_EQ(transactions_[transaction->id()], transaction);
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 scoped_ptr<IndexedDBConnection> connection, 1616 scoped_ptr<IndexedDBConnection> connection,
1617 int64 transaction_id, 1617 int64 transaction_id,
1618 int64 requested_version) { 1618 int64 requested_version) {
1619 1619
1620 std::vector<int64> object_store_ids; 1620 std::vector<int64> object_store_ids;
1621 CreateTransaction(transaction_id, 1621 CreateTransaction(transaction_id,
1622 connection.get(), 1622 connection.get(),
1623 object_store_ids, 1623 object_store_ids,
1624 indexed_db::TRANSACTION_VERSION_CHANGE); 1624 indexed_db::TRANSACTION_VERSION_CHANGE);
1625 1625
1626 transactions_[transaction_id] 1626 transactions_[transaction_id]->ScheduleTask(
1627 ->ScheduleTask(base::Bind(&IndexedDBDatabase::VersionChangeOperation, 1627 base::Bind(&IndexedDBDatabase::VersionChangeOperation,
1628 this, 1628 this,
1629 requested_version, 1629 requested_version,
1630 callbacks, 1630 callbacks,
1631 base::Passed(&connection)), 1631 base::Passed(&connection)));
1632 base::Bind(&IndexedDBDatabase::VersionChangeAbortOperation,
1633 this,
1634 metadata_.version,
1635 metadata_.int_version));
1636
1637 DCHECK(!pending_second_half_open_); 1632 DCHECK(!pending_second_half_open_);
1638 } 1633 }
1639 1634
1640 void IndexedDBDatabase::DeleteDatabase( 1635 void IndexedDBDatabase::DeleteDatabase(
1641 scoped_refptr<IndexedDBCallbacks> callbacks) { 1636 scoped_refptr<IndexedDBCallbacks> callbacks) {
1642 1637
1643 if (IsDeleteDatabaseBlocked()) { 1638 if (IsDeleteDatabaseBlocked()) {
1644 for (ConnectionSet::const_iterator it = connections_.begin(); 1639 for (ConnectionSet::const_iterator it = connections_.begin();
1645 it != connections_.end(); 1640 it != connections_.end();
1646 ++it) { 1641 ++it) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1766 const base::string16& previous_version, 1761 const base::string16& previous_version,
1767 int64 previous_int_version, 1762 int64 previous_int_version,
1768 IndexedDBTransaction* transaction) { 1763 IndexedDBTransaction* transaction) {
1769 IDB_TRACE("IndexedDBDatabase::VersionChangeAbortOperation"); 1764 IDB_TRACE("IndexedDBDatabase::VersionChangeAbortOperation");
1770 DCHECK(!transaction); 1765 DCHECK(!transaction);
1771 metadata_.version = previous_version; 1766 metadata_.version = previous_version;
1772 metadata_.int_version = previous_int_version; 1767 metadata_.int_version = previous_int_version;
1773 } 1768 }
1774 1769
1775 } // namespace content 1770 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698