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 c37b7e912d2c9f7c344b19408c21e6e65d633853..55aaa5ead306e2bd340ab30513e8b0f4fd72efc2 100644 |
--- a/content/browser/indexed_db/indexed_db_database.cc |
+++ b/content/browser/indexed_db/indexed_db_database.cc |
@@ -810,7 +810,8 @@ void IndexedDBDatabase::AddPendingObserver( |
void IndexedDBDatabase::FilterObservation(IndexedDBTransaction* transaction, |
int64_t object_store_id, |
blink::WebIDBOperationType type, |
- const IndexedDBKeyRange& key_range) { |
+ const IndexedDBKeyRange& key_range, |
+ IndexedDBValue* value) { |
for (auto* connection : connections_) { |
bool recorded = false; |
for (const auto& observer : connection->active_observers()) { |
@@ -826,8 +827,39 @@ void IndexedDBDatabase::FilterObservation(IndexedDBTransaction* transaction, |
transaction->AddObservation(connection->id(), std::move(observation)); |
recorded = true; |
} |
- transaction->RecordObserverForLastObservation(connection->id(), |
- observer->id()); |
+ auto* changes_ptr = |
+ transaction->GetPendingChangesForConnection(connection->id()); |
+ DCHECK(changes_ptr); |
cmumford
2017/01/09 21:31:25
We don't generally check for NULL ptrs just before
dmurph
2017/01/10 00:17:39
Done.
|
+ ::indexed_db::mojom::ObserverChangesPtr& changes = *changes_ptr; |
+ |
+ changes->observation_index_map[observer->id()].push_back( |
+ changes->observations.size() - 1); |
+ if (observer->include_transaction() && |
+ changes->transaction_map.find(observer->id()) == |
cmumford
2017/01/09 21:31:25
I think this is simpler:
if (!base::ContainsKey(
dmurph
2017/01/10 00:17:39
Done.
|
+ changes->transaction_map.end()) { |
+ IndexedDBTransaction* observer_transaction = |
+ connection->CreateTransaction( |
+ connection->NextObserverTransactionId(), |
+ observer->object_store_ids(), |
+ blink::WebIDBTransactionModeReadOnly, |
+ new IndexedDBBackingStore::Transaction(backing_store_.get())); |
+ transaction_coordinator_.DidCreateObserverTransaction( |
+ observer_transaction); |
+ observer_transaction->Start(); |
+ transaction_count_++; |
cmumford
2017/01/09 21:31:25
Start posts a task. Should transaction_count_ be i
dmurph
2017/01/10 00:17:39
Done.
|
+ |
+ auto mojo_transaction = ::indexed_db::mojom::ObserverTransaction::New(); |
+ mojo_transaction->id = observer_transaction->id(); |
+ for (int64_t object_store : observer->object_store_ids()) { |
cmumford
2017/01/09 21:31:25
s/object_store/id/ or maybe s/object_store/object_
dmurph
2017/01/10 00:17:39
Done.
|
+ mojo_transaction->scope.push_back(object_store); |
+ } |
+ changes->transaction_map[observer->id()] = std::move(mojo_transaction); |
+ } |
+ if (value && observer->values() && !changes->observations.back()->value) { |
+ IndexedDBValue copy = *value; |
+ changes->observations.back()->value = |
+ IndexedDBCallbacks::ConvertValue(©); |
+ } |
} |
} |
} |
@@ -836,8 +868,11 @@ void IndexedDBDatabase::SendObservations( |
std::map<int32_t, ::indexed_db::mojom::ObserverChangesPtr> changes_map) { |
for (auto* conn : connections_) { |
auto it = changes_map.find(conn->id()); |
- if (it != changes_map.end()) |
- conn->callbacks()->OnDatabaseChange(std::move(it->second)); |
+ if (it == changes_map.end()) |
pwnall
2017/01/10 01:01:24
FWIW, the previous version seems mildly easier to
dmurph
2017/01/10 20:40:00
I think they're both similar, this was most likely
|
+ continue; |
+ |
+ // Create our transactions if applicable. |
+ conn->callbacks()->OnDatabaseChange(std::move(it->second)); |
} |
} |
@@ -1341,7 +1376,7 @@ leveldb::Status IndexedDBDatabase::PutOperation( |
params->put_mode == blink::WebIDBPutModeAddOnly |
? blink::WebIDBAdd |
: blink::WebIDBPut, |
- IndexedDBKeyRange(*key)); |
+ IndexedDBKeyRange(*key), ¶ms->value); |
return s; |
} |
@@ -1655,7 +1690,7 @@ leveldb::Status IndexedDBDatabase::DeleteRangeOperation( |
return s; |
callbacks->OnSuccess(); |
FilterObservation(transaction, object_store_id, blink::WebIDBDelete, |
- *key_range); |
+ *key_range, nullptr); |
return s; |
} |
@@ -1685,7 +1720,7 @@ leveldb::Status IndexedDBDatabase::ClearOperation( |
callbacks->OnSuccess(); |
FilterObservation(transaction, object_store_id, blink::WebIDBClear, |
- IndexedDBKeyRange()); |
+ IndexedDBKeyRange(), nullptr); |
return s; |
} |