| Index: content/browser/indexed_db/indexed_db_database.cc
|
| diff --git a/content/browser/indexed_db/indexed_db_database.cc b/content/browser/indexed_db/indexed_db_database.cc
|
| index 6d104a56d42d256a631fe1c1834c64bd176c1f5d..dd8185031dba23592dedeef50eba2f38def8baf4 100644
|
| --- a/content/browser/indexed_db/indexed_db_database.cc
|
| +++ b/content/browser/indexed_db/indexed_db_database.cc
|
| @@ -29,6 +29,8 @@
|
| #include "content/browser/indexed_db/indexed_db_cursor.h"
|
| #include "content/browser/indexed_db/indexed_db_factory.h"
|
| #include "content/browser/indexed_db/indexed_db_index_writer.h"
|
| +#include "content/browser/indexed_db/indexed_db_observation.h"
|
| +#include "content/browser/indexed_db/indexed_db_observer_changes.h"
|
| #include "content/browser/indexed_db/indexed_db_pending_connection.h"
|
| #include "content/browser/indexed_db/indexed_db_return_value.h"
|
| #include "content/browser/indexed_db/indexed_db_tracing.h"
|
| @@ -541,6 +543,66 @@ void IndexedDBDatabase::Abort(int64_t transaction_id,
|
| transaction->Abort(error);
|
| }
|
|
|
| +void IndexedDBDatabase::AddPendingObserver(int64_t transaction_id,
|
| + int32_t observer_id,
|
| + IndexedDBObserver::Options options) {
|
| + IndexedDBTransaction* transaction = GetTransaction(transaction_id);
|
| + if (!transaction)
|
| + return;
|
| + transaction->AddPendingObserver(observer_id, options);
|
| +}
|
| +
|
| +void IndexedDBDatabase::RemovePendingObservers(
|
| + IndexedDBConnection* connection,
|
| + const std::vector<int32_t>& pending_observer_ids) {
|
| + TransactionMap::iterator it;
|
| + for (it = transactions_.begin(); it != transactions_.end(); it++) {
|
| + // Avoid call to RemovePendingObservers for transactions on other
|
| + // connections.
|
| + if (it->second->connection() == connection)
|
| + it->second->RemovePendingObservers(pending_observer_ids);
|
| + }
|
| +}
|
| +
|
| +// TODO(palakj): Augment the function with IDBValue later. Issue
|
| +// crbug.com/609934.
|
| +void IndexedDBDatabase::FilterObservation(IndexedDBTransaction* transaction,
|
| + int64_t object_store_id,
|
| + blink::WebIDBOperationType type,
|
| + const IndexedDBKeyRange& key_range) {
|
| + for (const auto& connection : connections_) {
|
| + bool recorded = false;
|
| + for (const auto& observer : connection->active_observers()) {
|
| + if (!observer->IsRecordingType(type) ||
|
| + !observer->IsRecordingObjectStore(object_store_id))
|
| + continue;
|
| + if (!recorded) {
|
| + if (type == blink::WebIDBClear) {
|
| + transaction->AddObservation(connection->id(),
|
| + base::WrapUnique(new IndexedDBObservation(
|
| + object_store_id, type)));
|
| + } else {
|
| + transaction->AddObservation(connection->id(),
|
| + base::WrapUnique(new IndexedDBObservation(
|
| + object_store_id, type, key_range)));
|
| + }
|
| + recorded = true;
|
| + }
|
| + transaction->RecordObserverForLastObservation(connection->id(),
|
| + observer->id());
|
| + }
|
| + }
|
| +}
|
| +
|
| +void IndexedDBDatabase::SendObservations(
|
| + std::map<int32_t, std::unique_ptr<IndexedDBObserverChanges>> changes_map) {
|
| + for (const auto& conn : connections_) {
|
| + auto it = changes_map.find(conn->id());
|
| + if (it != changes_map.end())
|
| + conn->callbacks()->OnDatabaseChange(it->first, std::move(it->second));
|
| + }
|
| +}
|
| +
|
| void IndexedDBDatabase::GetAll(int64_t transaction_id,
|
| int64_t object_store_id,
|
| int64_t index_id,
|
| @@ -1095,6 +1157,11 @@ void IndexedDBDatabase::PutOperation(std::unique_ptr<PutOperationParams> params,
|
| transaction->id());
|
| params->callbacks->OnSuccess(*key);
|
| }
|
| + FilterObservation(transaction, params->object_store_id,
|
| + params->put_mode == blink::WebIDBPutModeAddOnly
|
| + ? blink::WebIDBAdd
|
| + : blink::WebIDBPut,
|
| + IndexedDBKeyRange(*key));
|
| }
|
|
|
| void IndexedDBDatabase::SetIndexKeys(int64_t transaction_id,
|
| @@ -1438,6 +1505,8 @@ void IndexedDBDatabase::DeleteRangeOperation(
|
| } else {
|
| callbacks->OnSuccess();
|
| }
|
| + FilterObservation(transaction, object_store_id, blink::WebIDBDelete,
|
| + *key_range);
|
| }
|
|
|
| void IndexedDBDatabase::Clear(int64_t transaction_id,
|
| @@ -1473,6 +1542,9 @@ void IndexedDBDatabase::ClearOperation(
|
| return;
|
| }
|
| callbacks->OnSuccess();
|
| +
|
| + FilterObservation(transaction, object_store_id, blink::WebIDBClear,
|
| + IndexedDBKeyRange());
|
| }
|
|
|
| void IndexedDBDatabase::DeleteObjectStoreOperation(
|
| @@ -1665,9 +1737,9 @@ void IndexedDBDatabase::CreateTransaction(
|
| // The transaction will add itself to this database's coordinator, which
|
| // manages the lifetime of the object.
|
| TransactionCreated(IndexedDBClassFactory::Get()->CreateIndexedDBTransaction(
|
| - transaction_id, connection->callbacks(),
|
| + transaction_id, connection->GetWeakPtr(),
|
| std::set<int64_t>(object_store_ids.begin(), object_store_ids.end()), mode,
|
| - this, new IndexedDBBackingStore::Transaction(backing_store_.get())));
|
| + new IndexedDBBackingStore::Transaction(backing_store_.get())));
|
| }
|
|
|
| void IndexedDBDatabase::TransactionCreated(IndexedDBTransaction* transaction) {
|
| @@ -1905,7 +1977,7 @@ void IndexedDBDatabase::Close(IndexedDBConnection* connection, bool forced) {
|
| {
|
| TransactionMap transactions(transactions_);
|
| for (const auto& it : transactions) {
|
| - if (it.second->connection() == connection->callbacks())
|
| + if (it.second->callbacks() == connection->callbacks())
|
| it.second->Abort(
|
| IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError,
|
| "Connection is closing."));
|
|
|