Index: content/browser/indexed_db/indexed_db_transaction_unittest.cc |
diff --git a/content/browser/indexed_db/indexed_db_transaction_unittest.cc b/content/browser/indexed_db/indexed_db_transaction_unittest.cc |
index 632b1ee6427baa78c75bf17a88195b003afaeb62..7073d120c3c025f04d30f839f105fdbba0272512 100644 |
--- a/content/browser/indexed_db/indexed_db_transaction_unittest.cc |
+++ b/content/browser/indexed_db/indexed_db_transaction_unittest.cc |
@@ -12,7 +12,9 @@ |
#include "base/message_loop/message_loop.h" |
#include "base/run_loop.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "content/browser/indexed_db/indexed_db_connection.h" |
#include "content/browser/indexed_db/indexed_db_fake_backing_store.h" |
+#include "content/browser/indexed_db/indexed_db_observer.h" |
#include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" |
#include "content/browser/indexed_db/mock_indexed_db_factory.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -86,12 +88,11 @@ TEST_F(IndexedDBTransactionTest, Timeout) { |
const int64_t id = 0; |
const std::set<int64_t> scope; |
const leveldb::Status commit_success = leveldb::Status::OK(); |
+ std::unique_ptr<IndexedDBConnection> connection( |
+ new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks())); |
scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
- id, |
- new MockIndexedDBDatabaseCallbacks(), |
- scope, |
+ id, connection->GetWeakPtr(), scope, |
blink::WebIDBTransactionModeReadWrite, |
- db_.get(), |
new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
db_->TransactionCreated(transaction.get()); |
@@ -130,12 +131,10 @@ TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { |
const int64_t id = 0; |
const std::set<int64_t> scope; |
const leveldb::Status commit_success = leveldb::Status::OK(); |
+ std::unique_ptr<IndexedDBConnection> connection( |
+ new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks())); |
scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
- id, |
- new MockIndexedDBDatabaseCallbacks(), |
- scope, |
- blink::WebIDBTransactionModeReadOnly, |
- db_.get(), |
+ id, connection->GetWeakPtr(), scope, blink::WebIDBTransactionModeReadOnly, |
new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
db_->TransactionCreated(transaction.get()); |
@@ -162,12 +161,10 @@ TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) { |
const int64_t id = 0; |
const std::set<int64_t> scope; |
const leveldb::Status commit_success = leveldb::Status::OK(); |
+ std::unique_ptr<IndexedDBConnection> connection( |
+ new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks())); |
scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
- id, |
- new MockIndexedDBDatabaseCallbacks(), |
- scope, |
- GetParam(), |
- db_.get(), |
+ id, connection->GetWeakPtr(), scope, GetParam(), |
new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
EXPECT_FALSE(transaction->HasPendingTasks()); |
@@ -224,12 +221,11 @@ TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) { |
const int64_t id = 0; |
const std::set<int64_t> scope; |
const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); |
+ std::unique_ptr<IndexedDBConnection> connection( |
+ new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks())); |
scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
- id, |
- new MockIndexedDBDatabaseCallbacks(), |
- scope, |
+ id, connection->GetWeakPtr(), scope, |
blink::WebIDBTransactionModeVersionChange, |
- db_.get(), |
new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); |
EXPECT_FALSE(transaction->HasPendingTasks()); |
@@ -285,12 +281,10 @@ TEST_P(IndexedDBTransactionTestMode, AbortTasks) { |
const int64_t id = 0; |
const std::set<int64_t> scope; |
const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); |
+ std::unique_ptr<IndexedDBConnection> connection( |
+ new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks())); |
scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
- id, |
- new MockIndexedDBDatabaseCallbacks(), |
- scope, |
- GetParam(), |
- db_.get(), |
+ id, connection->GetWeakPtr(), scope, GetParam(), |
new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); |
db_->TransactionCreated(transaction.get()); |
@@ -315,12 +309,10 @@ TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) { |
const int64_t id = 0; |
const std::set<int64_t> scope; |
const leveldb::Status commit_success = leveldb::Status::OK(); |
+ std::unique_ptr<IndexedDBConnection> connection( |
+ new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks())); |
scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
- id, |
- new MockIndexedDBDatabaseCallbacks(), |
- scope, |
- GetParam(), |
- db_.get(), |
+ id, connection->GetWeakPtr(), scope, GetParam(), |
new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
db_->TransactionCreated(transaction.get()); |
@@ -362,6 +354,50 @@ TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) { |
transaction->diagnostics().tasks_scheduled); |
} |
+TEST_F(IndexedDBTransactionTest, IndexedDBObserver) { |
+ const int64_t id = 0; |
+ const std::set<int64_t> scope; |
+ const leveldb::Status commit_success = leveldb::Status::OK(); |
+ std::unique_ptr<IndexedDBConnection> connection( |
+ new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks())); |
+ scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
+ id, connection->GetWeakPtr(), scope, |
+ blink::WebIDBTransactionModeReadWrite, |
+ new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
+ db_->TransactionCreated(transaction.get()); |
+ |
+ EXPECT_EQ(0UL, transaction->pending_observers_.size()); |
+ EXPECT_EQ(0UL, connection->active_observers().size()); |
+ |
+ // Add observers to pending observer list. |
+ const int32_t observer_id1 = 1, observer_id2 = 2; |
+ IndexedDBObserver::Options options(false, false, false, 0U); |
+ transaction->AddPendingObserver(observer_id1, options); |
+ transaction->AddPendingObserver(observer_id2, options); |
+ EXPECT_EQ(2UL, transaction->pending_observers_.size()); |
+ EXPECT_EQ(0UL, connection->active_observers().size()); |
+ |
+ // Before commit, observer would be in pending list of transaction. |
+ std::vector<int32_t> observer_to_remove1 = {observer_id1}; |
+ connection->RemoveObservers(observer_to_remove1); |
+ EXPECT_EQ(1UL, transaction->pending_observers_.size()); |
+ EXPECT_EQ(0UL, connection->active_observers().size()); |
+ |
+ // After commit, observer moved to connection's active observer. |
+ transaction->Commit(); |
+ EXPECT_EQ(0UL, transaction->pending_observers_.size()); |
+ EXPECT_EQ(1UL, connection->active_observers().size()); |
+ |
+ // Observer does not exist, so no change to active_observers. |
+ connection->RemoveObservers(observer_to_remove1); |
+ EXPECT_EQ(1UL, connection->active_observers().size()); |
+ |
+ // Observer removed from connection's active observer. |
+ std::vector<int32_t> observer_to_remove2 = {observer_id2}; |
+ connection->RemoveObservers(observer_to_remove2); |
+ EXPECT_EQ(0UL, connection->active_observers().size()); |
+} |
+ |
static const blink::WebIDBTransactionMode kTestModes[] = { |
blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite, |
blink::WebIDBTransactionModeVersionChange}; |