OLD | NEW |
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 <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 }; | 57 }; |
58 | 58 |
59 class IndexedDBDatabase::VersionChangeOperation | 59 class IndexedDBDatabase::VersionChangeOperation |
60 : public IndexedDBTransaction::Operation { | 60 : public IndexedDBTransaction::Operation { |
61 public: | 61 public: |
62 VersionChangeOperation( | 62 VersionChangeOperation( |
63 scoped_refptr<IndexedDBDatabase> database, | 63 scoped_refptr<IndexedDBDatabase> database, |
64 int64 transaction_id, | 64 int64 transaction_id, |
65 int64 version, | 65 int64 version, |
66 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, | 66 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, |
67 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks, | 67 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
68 WebKit::WebIDBCallbacks::DataLoss data_loss) | 68 WebKit::WebIDBCallbacks::DataLoss data_loss) |
69 : database_(database), | 69 : database_(database), |
70 transaction_id_(transaction_id), | 70 transaction_id_(transaction_id), |
71 version_(version), | 71 version_(version), |
72 callbacks_(callbacks), | 72 callbacks_(callbacks), |
73 database_callbacks_(database_callbacks), | 73 database_callbacks_(database_callbacks), |
74 data_loss_(data_loss) {} | 74 data_loss_(data_loss) {} |
75 virtual void Perform(IndexedDBTransaction* transaction) OVERRIDE; | 75 virtual void Perform(IndexedDBTransaction* transaction) OVERRIDE; |
76 | 76 |
77 private: | 77 private: |
78 scoped_refptr<IndexedDBDatabase> database_; | 78 scoped_refptr<IndexedDBDatabase> database_; |
79 int64 transaction_id_; | 79 int64 transaction_id_; |
80 int64 version_; | 80 int64 version_; |
81 scoped_refptr<IndexedDBCallbacksWrapper> callbacks_; | 81 scoped_refptr<IndexedDBCallbacksWrapper> callbacks_; |
82 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks_; | 82 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks_; |
83 WebKit::WebIDBCallbacks::DataLoss data_loss_; | 83 WebKit::WebIDBCallbacks::DataLoss data_loss_; |
84 }; | 84 }; |
85 | 85 |
86 class CreateObjectStoreAbortOperation : public IndexedDBTransaction::Operation { | 86 class CreateObjectStoreAbortOperation : public IndexedDBTransaction::Operation { |
87 public: | 87 public: |
88 CreateObjectStoreAbortOperation(scoped_refptr<IndexedDBDatabase> database, | 88 CreateObjectStoreAbortOperation(scoped_refptr<IndexedDBDatabase> database, |
89 int64 object_store_id) | 89 int64 object_store_id) |
90 : database_(database), object_store_id_(object_store_id) {} | 90 : database_(database), object_store_id_(object_store_id) {} |
91 virtual void Perform(IndexedDBTransaction* transaction) OVERRIDE; | 91 virtual void Perform(IndexedDBTransaction* transaction) OVERRIDE; |
92 | 92 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 const scoped_refptr<IndexedDBBackingStore> backing_store_; | 366 const scoped_refptr<IndexedDBBackingStore> backing_store_; |
367 const int64 database_id_; | 367 const int64 database_id_; |
368 const int64 object_store_id_; | 368 const int64 object_store_id_; |
369 const scoped_refptr<IndexedDBCallbacksWrapper> callbacks_; | 369 const scoped_refptr<IndexedDBCallbacksWrapper> callbacks_; |
370 }; | 370 }; |
371 | 371 |
372 class IndexedDBDatabase::PendingOpenCall { | 372 class IndexedDBDatabase::PendingOpenCall { |
373 public: | 373 public: |
374 PendingOpenCall( | 374 PendingOpenCall( |
375 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, | 375 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, |
376 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks, | 376 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
377 int64 transaction_id, | 377 int64 transaction_id, |
378 int64 version) | 378 int64 version) |
379 : callbacks_(callbacks), | 379 : callbacks_(callbacks), |
380 database_callbacks_(database_callbacks), | 380 database_callbacks_(database_callbacks), |
381 version_(version), | 381 version_(version), |
382 transaction_id_(transaction_id) {} | 382 transaction_id_(transaction_id) {} |
383 scoped_refptr<IndexedDBCallbacksWrapper> Callbacks() { return callbacks_; } | 383 scoped_refptr<IndexedDBCallbacksWrapper> Callbacks() { return callbacks_; } |
384 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> DatabaseCallbacks() { | 384 scoped_refptr<IndexedDBDatabaseCallbacks> DatabaseCallbacks() { |
385 return database_callbacks_; | 385 return database_callbacks_; |
386 } | 386 } |
387 int64 Version() { return version_; } | 387 int64 Version() { return version_; } |
388 int64 TransactionId() const { return transaction_id_; } | 388 int64 TransactionId() const { return transaction_id_; } |
389 | 389 |
390 private: | 390 private: |
391 scoped_refptr<IndexedDBCallbacksWrapper> callbacks_; | 391 scoped_refptr<IndexedDBCallbacksWrapper> callbacks_; |
392 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks_; | 392 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks_; |
393 int64 version_; | 393 int64 version_; |
394 const int64 transaction_id_; | 394 const int64 transaction_id_; |
395 }; | 395 }; |
396 | 396 |
397 class IndexedDBDatabase::PendingDeleteCall { | 397 class IndexedDBDatabase::PendingDeleteCall { |
398 public: | 398 public: |
399 explicit PendingDeleteCall(scoped_refptr<IndexedDBCallbacksWrapper> callbacks) | 399 explicit PendingDeleteCall(scoped_refptr<IndexedDBCallbacksWrapper> callbacks) |
400 : callbacks_(callbacks) {} | 400 : callbacks_(callbacks) {} |
401 scoped_refptr<IndexedDBCallbacksWrapper> Callbacks() { return callbacks_; } | 401 scoped_refptr<IndexedDBCallbacksWrapper> Callbacks() { return callbacks_; } |
402 | 402 |
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1505 OpenConnection(pending_open_call->Callbacks(), | 1505 OpenConnection(pending_open_call->Callbacks(), |
1506 pending_open_call->DatabaseCallbacks(), | 1506 pending_open_call->DatabaseCallbacks(), |
1507 pending_open_call->TransactionId(), | 1507 pending_open_call->TransactionId(), |
1508 pending_open_call->Version()); | 1508 pending_open_call->Version()); |
1509 } | 1509 } |
1510 } | 1510 } |
1511 } | 1511 } |
1512 | 1512 |
1513 void IndexedDBDatabase::CreateTransaction( | 1513 void IndexedDBDatabase::CreateTransaction( |
1514 int64 transaction_id, | 1514 int64 transaction_id, |
1515 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> callbacks, | 1515 scoped_refptr<IndexedDBDatabaseCallbacks> callbacks, |
1516 const std::vector<int64>& object_store_ids, | 1516 const std::vector<int64>& object_store_ids, |
1517 uint16 mode) { | 1517 uint16 mode) { |
1518 | 1518 |
1519 DCHECK(database_callbacks_set_.has(callbacks)); | 1519 DCHECK(database_callbacks_set_.has(callbacks)); |
1520 | 1520 |
1521 scoped_refptr<IndexedDBTransaction> transaction = | 1521 scoped_refptr<IndexedDBTransaction> transaction = |
1522 IndexedDBTransaction::Create( | 1522 IndexedDBTransaction::Create( |
1523 transaction_id, | 1523 transaction_id, |
1524 callbacks, | 1524 callbacks, |
1525 object_store_ids, | 1525 object_store_ids, |
1526 static_cast<indexed_db::TransactionMode>(mode), | 1526 static_cast<indexed_db::TransactionMode>(mode), |
1527 this); | 1527 this); |
1528 DCHECK(transactions_.find(transaction_id) == transactions_.end()); | 1528 DCHECK(transactions_.find(transaction_id) == transactions_.end()); |
1529 transactions_[transaction_id] = transaction.get(); | 1529 transactions_[transaction_id] = transaction.get(); |
1530 } | 1530 } |
1531 | 1531 |
1532 bool IndexedDBDatabase::IsOpenConnectionBlocked() const { | 1532 bool IndexedDBDatabase::IsOpenConnectionBlocked() const { |
1533 return !pending_delete_calls_.empty() || | 1533 return !pending_delete_calls_.empty() || |
1534 running_version_change_transaction_ || | 1534 running_version_change_transaction_ || |
1535 pending_run_version_change_transaction_call_; | 1535 pending_run_version_change_transaction_call_; |
1536 } | 1536 } |
1537 | 1537 |
1538 void IndexedDBDatabase::OpenConnection( | 1538 void IndexedDBDatabase::OpenConnection( |
1539 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, | 1539 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, |
1540 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks, | 1540 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
1541 int64 transaction_id, | 1541 int64 transaction_id, |
1542 int64 version) { | 1542 int64 version) { |
1543 const WebKit::WebIDBCallbacks::DataLoss kDataLoss = | 1543 const WebKit::WebIDBCallbacks::DataLoss kDataLoss = |
1544 WebKit::WebIDBCallbacks::DataLossNone; | 1544 WebKit::WebIDBCallbacks::DataLossNone; |
1545 OpenConnection( | 1545 OpenConnection( |
1546 callbacks, database_callbacks, transaction_id, version, kDataLoss); | 1546 callbacks, database_callbacks, transaction_id, version, kDataLoss); |
1547 } | 1547 } |
1548 | 1548 |
1549 void IndexedDBDatabase::OpenConnection( | 1549 void IndexedDBDatabase::OpenConnection( |
1550 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, | 1550 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, |
1551 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks, | 1551 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
1552 int64 transaction_id, | 1552 int64 transaction_id, |
1553 int64 version, | 1553 int64 version, |
1554 WebKit::WebIDBCallbacks::DataLoss data_loss) { | 1554 WebKit::WebIDBCallbacks::DataLoss data_loss) { |
1555 DCHECK(backing_store_.get()); | 1555 DCHECK(backing_store_.get()); |
1556 | 1556 |
1557 // TODO(jsbell): Should have a priority queue so that higher version | 1557 // TODO(jsbell): Should have a priority queue so that higher version |
1558 // requests are processed first. http://crbug.com/225850 | 1558 // requests are processed first. http://crbug.com/225850 |
1559 if (IsOpenConnectionBlocked()) { | 1559 if (IsOpenConnectionBlocked()) { |
1560 // The backing store only detects data loss when it is first opened. The | 1560 // The backing store only detects data loss when it is first opened. The |
1561 // presence of existing connections means we didn't even check for data loss | 1561 // presence of existing connections means we didn't even check for data loss |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 Int64ToString16(metadata_.int_version) + ASCIIToUTF16(")."))); | 1628 Int64ToString16(metadata_.int_version) + ASCIIToUTF16(")."))); |
1629 return; | 1629 return; |
1630 } | 1630 } |
1631 DCHECK_EQ(version, metadata_.int_version); | 1631 DCHECK_EQ(version, metadata_.int_version); |
1632 database_callbacks_set_.insert(database_callbacks); | 1632 database_callbacks_set_.insert(database_callbacks); |
1633 callbacks->OnSuccess(this, this->metadata()); | 1633 callbacks->OnSuccess(this, this->metadata()); |
1634 } | 1634 } |
1635 | 1635 |
1636 void IndexedDBDatabase::RunVersionChangeTransaction( | 1636 void IndexedDBDatabase::RunVersionChangeTransaction( |
1637 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, | 1637 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, |
1638 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks, | 1638 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
1639 int64 transaction_id, | 1639 int64 transaction_id, |
1640 int64 requested_version, | 1640 int64 requested_version, |
1641 WebKit::WebIDBCallbacks::DataLoss data_loss) { | 1641 WebKit::WebIDBCallbacks::DataLoss data_loss) { |
1642 | 1642 |
1643 DCHECK(callbacks.get()); | 1643 DCHECK(callbacks.get()); |
1644 DCHECK(database_callbacks_set_.has(database_callbacks)); | 1644 DCHECK(database_callbacks_set_.has(database_callbacks)); |
1645 if (ConnectionCount() > 1) { | 1645 if (ConnectionCount() > 1) { |
1646 DCHECK_NE(WebKit::WebIDBCallbacks::DataLossTotal, data_loss); | 1646 DCHECK_NE(WebKit::WebIDBCallbacks::DataLossTotal, data_loss); |
1647 // Front end ensures the event is not fired at connections that have | 1647 // Front end ensures the event is not fired at connections that have |
1648 // close_pending set. | 1648 // close_pending set. |
(...skipping 16 matching lines...) Expand all Loading... |
1665 } | 1665 } |
1666 RunVersionChangeTransactionFinal(callbacks, | 1666 RunVersionChangeTransactionFinal(callbacks, |
1667 database_callbacks, | 1667 database_callbacks, |
1668 transaction_id, | 1668 transaction_id, |
1669 requested_version, | 1669 requested_version, |
1670 data_loss); | 1670 data_loss); |
1671 } | 1671 } |
1672 | 1672 |
1673 void IndexedDBDatabase::RunVersionChangeTransactionFinal( | 1673 void IndexedDBDatabase::RunVersionChangeTransactionFinal( |
1674 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, | 1674 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, |
1675 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks, | 1675 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
1676 int64 transaction_id, | 1676 int64 transaction_id, |
1677 int64 requested_version) { | 1677 int64 requested_version) { |
1678 const WebKit::WebIDBCallbacks::DataLoss kDataLoss = | 1678 const WebKit::WebIDBCallbacks::DataLoss kDataLoss = |
1679 WebKit::WebIDBCallbacks::DataLossNone; | 1679 WebKit::WebIDBCallbacks::DataLossNone; |
1680 RunVersionChangeTransactionFinal(callbacks, | 1680 RunVersionChangeTransactionFinal(callbacks, |
1681 database_callbacks, | 1681 database_callbacks, |
1682 transaction_id, | 1682 transaction_id, |
1683 requested_version, | 1683 requested_version, |
1684 kDataLoss); | 1684 kDataLoss); |
1685 } | 1685 } |
1686 | 1686 |
1687 void IndexedDBDatabase::RunVersionChangeTransactionFinal( | 1687 void IndexedDBDatabase::RunVersionChangeTransactionFinal( |
1688 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, | 1688 scoped_refptr<IndexedDBCallbacksWrapper> callbacks, |
1689 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks, | 1689 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
1690 int64 transaction_id, | 1690 int64 transaction_id, |
1691 int64 requested_version, | 1691 int64 requested_version, |
1692 WebKit::WebIDBCallbacks::DataLoss data_loss) { | 1692 WebKit::WebIDBCallbacks::DataLoss data_loss) { |
1693 | 1693 |
1694 std::vector<int64> object_store_ids; | 1694 std::vector<int64> object_store_ids; |
1695 CreateTransaction(transaction_id, | 1695 CreateTransaction(transaction_id, |
1696 database_callbacks, | 1696 database_callbacks, |
1697 object_store_ids, | 1697 object_store_ids, |
1698 indexed_db::TRANSACTION_VERSION_CHANGE); | 1698 indexed_db::TRANSACTION_VERSION_CHANGE); |
1699 scoped_refptr<IndexedDBTransaction> transaction = | 1699 scoped_refptr<IndexedDBTransaction> transaction = |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1750 return; | 1750 return; |
1751 } | 1751 } |
1752 metadata_.version = kNoStringVersion; | 1752 metadata_.version = kNoStringVersion; |
1753 metadata_.id = kInvalidId; | 1753 metadata_.id = kInvalidId; |
1754 metadata_.int_version = IndexedDBDatabaseMetadata::NO_INT_VERSION; | 1754 metadata_.int_version = IndexedDBDatabaseMetadata::NO_INT_VERSION; |
1755 metadata_.object_stores.clear(); | 1755 metadata_.object_stores.clear(); |
1756 callbacks->OnSuccess(); | 1756 callbacks->OnSuccess(); |
1757 } | 1757 } |
1758 | 1758 |
1759 void IndexedDBDatabase::Close( | 1759 void IndexedDBDatabase::Close( |
1760 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> callbacks) { | 1760 scoped_refptr<IndexedDBDatabaseCallbacks> callbacks) { |
1761 DCHECK(callbacks.get()); | 1761 DCHECK(callbacks.get()); |
1762 DCHECK(database_callbacks_set_.has(callbacks)); | 1762 DCHECK(database_callbacks_set_.has(callbacks)); |
1763 | 1763 |
1764 // Close outstanding transactions from the closing connection. This | 1764 // Close outstanding transactions from the closing connection. This |
1765 // can not happen if the close is requested by the connection itself | 1765 // can not happen if the close is requested by the connection itself |
1766 // as the front-end defers the close until all transactions are | 1766 // as the front-end defers the close until all transactions are |
1767 // complete, so something unusual has happened e.g. unexpected | 1767 // complete, so something unusual has happened e.g. unexpected |
1768 // process termination. | 1768 // process termination. |
1769 { | 1769 { |
1770 TransactionMap transactions(transactions_); | 1770 TransactionMap transactions(transactions_); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1829 | 1829 |
1830 void IndexedDBDatabase::VersionChangeAbortOperation::Perform( | 1830 void IndexedDBDatabase::VersionChangeAbortOperation::Perform( |
1831 IndexedDBTransaction* transaction) { | 1831 IndexedDBTransaction* transaction) { |
1832 IDB_TRACE("VersionChangeAbortOperation"); | 1832 IDB_TRACE("VersionChangeAbortOperation"); |
1833 DCHECK(!transaction); | 1833 DCHECK(!transaction); |
1834 database_->metadata_.version = previous_version_; | 1834 database_->metadata_.version = previous_version_; |
1835 database_->metadata_.int_version = previous_int_version_; | 1835 database_->metadata_.int_version = previous_int_version_; |
1836 } | 1836 } |
1837 | 1837 |
1838 } // namespace content | 1838 } // namespace content |
OLD | NEW |