| 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 a73ba298ee5616a7fdbbe4925781907e33cae45f..ae9f78de7d7d5b8366dba5f7cdb484f09fa411d7 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"
|
| @@ -561,6 +563,40 @@ void IndexedDBDatabase::RemovePendingObservers(
|
| }
|
| }
|
|
|
| +// TODO(palakj): Augment the function with IDBValue later.
|
| +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)) {
|
| + if (!recorded) {
|
| + if (type == blink::WebIDBClear) {
|
| + transaction->AddObservation(
|
| + connection->id(),
|
| + base::WrapUnique(new IndexedDBObservation(type)));
|
| + } else {
|
| + transaction->AddObservation(
|
| + connection->id(),
|
| + base::WrapUnique(new IndexedDBObservation(type, key_range)));
|
| + }
|
| + recorded = true;
|
| + }
|
| + transaction->AddObservationIndex(observer->id(), connection->id());
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +void IndexedDBDatabase::SendObservations(
|
| + std::map<int32_t, std::unique_ptr<IndexedDBObserverChanges>> change_map) {
|
| + for (const auto& it : connections_)
|
| + it->callbacks()->OnDatabaseChange(std::move(change_map[it->id()]));
|
| +}
|
| +
|
| void IndexedDBDatabase::GetAll(int64_t transaction_id,
|
| int64_t object_store_id,
|
| int64_t index_id,
|
| @@ -1115,6 +1151,12 @@ 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,
|
| @@ -1458,6 +1500,8 @@ void IndexedDBDatabase::DeleteRangeOperation(
|
| } else {
|
| callbacks->OnSuccess();
|
| }
|
| + FilterObservation(transaction, object_store_id, blink::WebIDBDelete,
|
| + *key_range);
|
| }
|
|
|
| void IndexedDBDatabase::Clear(int64_t transaction_id,
|
| @@ -1493,6 +1537,9 @@ void IndexedDBDatabase::ClearOperation(
|
| return;
|
| }
|
| callbacks->OnSuccess();
|
| +
|
| + FilterObservation(transaction, object_store_id, blink::WebIDBClear,
|
| + IndexedDBKeyRange());
|
| }
|
|
|
| void IndexedDBDatabase::DeleteObjectStoreOperation(
|
|
|