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( |