Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: content/child/indexed_db/indexed_db_dispatcher.cc

Issue 2125213002: [IndexedDB] Propogating changes to observers : Renderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lifetime
Patch Set: Renderer changes Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/indexed_db/indexed_db_dispatcher.h" 5 #include "content/child/indexed_db/indexed_db_dispatcher.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "base/threading/thread_local.h" 12 #include "base/threading/thread_local.h"
13 #include "content/child/indexed_db/indexed_db_key_builders.h" 13 #include "content/child/indexed_db/indexed_db_key_builders.h"
14 #include "content/child/indexed_db/webidbcursor_impl.h" 14 #include "content/child/indexed_db/webidbcursor_impl.h"
15 #include "content/child/indexed_db/webidbdatabase_impl.h" 15 #include "content/child/indexed_db/webidbdatabase_impl.h"
16 #include "content/child/thread_safe_sender.h" 16 #include "content/child/thread_safe_sender.h"
17 #include "content/common/indexed_db/indexed_db_messages.h" 17 #include "content/common/indexed_db/indexed_db_messages.h"
18 #include "ipc/ipc_channel.h" 18 #include "ipc/ipc_channel.h"
19 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseCal lbacks.h" 19 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseCal lbacks.h"
20 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseErr or.h" 20 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseErr or.h"
21 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseExc eption.h" 21 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseExc eption.h"
22 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBObservation .h"
22 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBValue.h" 23 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBValue.h"
23 24
24 using blink::WebBlobInfo; 25 using blink::WebBlobInfo;
25 using blink::WebData; 26 using blink::WebData;
26 using blink::WebIDBCallbacks; 27 using blink::WebIDBCallbacks;
27 using blink::WebIDBCursor; 28 using blink::WebIDBCursor;
28 using blink::WebIDBDatabase; 29 using blink::WebIDBDatabase;
29 using blink::WebIDBDatabaseCallbacks; 30 using blink::WebIDBDatabaseCallbacks;
30 using blink::WebIDBDatabaseError; 31 using blink::WebIDBDatabaseError;
31 using blink::WebIDBKey; 32 using blink::WebIDBKey;
32 using blink::WebIDBMetadata; 33 using blink::WebIDBMetadata;
34 using blink::WebIDBObservation;
33 using blink::WebIDBObserver; 35 using blink::WebIDBObserver;
34 using blink::WebIDBValue; 36 using blink::WebIDBValue;
35 using blink::WebString; 37 using blink::WebString;
36 using blink::WebVector; 38 using blink::WebVector;
37 using base::ThreadLocalPointer; 39 using base::ThreadLocalPointer;
38 40
39 namespace content { 41 namespace content {
40 static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky 42 static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky
41 g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER; 43 g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER;
42 44
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 web_index_metadata.keyPath = 120 web_index_metadata.keyPath =
119 WebIDBKeyPathBuilder::Build(idb_index_metadata.key_path); 121 WebIDBKeyPathBuilder::Build(idb_index_metadata.key_path);
120 web_index_metadata.unique = idb_index_metadata.unique; 122 web_index_metadata.unique = idb_index_metadata.unique;
121 web_index_metadata.multiEntry = idb_index_metadata.multi_entry; 123 web_index_metadata.multiEntry = idb_index_metadata.multi_entry;
122 } 124 }
123 } 125 }
124 126
125 return web_metadata; 127 return web_metadata;
126 } 128 }
127 129
130 std::vector<WebIDBObservation> IndexedDBDispatcher::ConvertObservations(
131 const std::vector<IndexedDBMsg_Observation>& idb_observations) {
132 std::vector<WebIDBObservation> web_observations;
133 for (const auto& idb_observation : idb_observations) {
134 WebIDBObservation web_observation;
135 web_observation.objectStoreId = idb_observation.object_store_id;
136 web_observation.type = idb_observation.type;
137 web_observation.keyRange =
cmumford 2016/07/20 00:25:12 Are you missing "value" - or maybe a TODO here?
palakj1 2016/07/20 01:33:35 added a todo
138 WebIDBKeyRangeBuilder::Build(idb_observation.key_range);
139 web_observations.push_back(std::move(web_observation));
140 }
141 return web_observations;
142 }
143
128 void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { 144 void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) {
129 bool handled = true; 145 bool handled = true;
130 IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg) 146 IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg)
131 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBCursor, 147 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBCursor,
132 OnSuccessOpenCursor) 148 OnSuccessOpenCursor)
133 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorAdvance, 149 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorAdvance,
134 OnSuccessCursorContinue) 150 OnSuccessCursorContinue)
135 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, 151 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue,
136 OnSuccessCursorContinue) 152 OnSuccessCursorContinue)
137 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, 153 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch,
(...skipping 11 matching lines...) Expand all
149 OnSuccessUndefined) 165 OnSuccessUndefined)
150 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError) 166 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError)
151 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksIntBlocked, OnIntBlocked) 167 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksIntBlocked, OnIntBlocked)
152 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksUpgradeNeeded, OnUpgradeNeeded) 168 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksUpgradeNeeded, OnUpgradeNeeded)
153 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksForcedClose, 169 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksForcedClose,
154 OnForcedClose) 170 OnForcedClose)
155 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksVersionChange, 171 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksVersionChange,
156 OnVersionChange) 172 OnVersionChange)
157 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksAbort, OnAbort) 173 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksAbort, OnAbort)
158 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksComplete, OnComplete) 174 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksComplete, OnComplete)
175 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksChanges, OnDatabaseChange)
cmumford 2016/07/20 00:25:12 Should this be OnDatabaseChanges (plural) for symm
palakj1 2016/07/20 01:33:35 Changed
159 IPC_MESSAGE_UNHANDLED(handled = false) 176 IPC_MESSAGE_UNHANDLED(handled = false)
160 IPC_END_MESSAGE_MAP() 177 IPC_END_MESSAGE_MAP()
161 // If a message gets here, IndexedDBMessageFilter already determined that it 178 // If a message gets here, IndexedDBMessageFilter already determined that it
162 // is an IndexedDB message. 179 // is an IndexedDB message.
163 DCHECK(handled) << "Didn't handle a message defined at line " 180 DCHECK(handled) << "Didn't handle a message defined at line "
164 << IPC_MESSAGE_ID_LINE(msg.type()); 181 << IPC_MESSAGE_ID_LINE(msg.type());
165 } 182 }
166 183
167 bool IndexedDBDispatcher::Send(IPC::Message* msg) { 184 bool IndexedDBDispatcher::Send(IPC::Message* msg) {
168 return thread_safe_sender_->Send(msg); 185 return thread_safe_sender_->Send(msg);
169 } 186 }
170 187
171 int32_t IndexedDBDispatcher::AddIDBObserver( 188 int32_t IndexedDBDispatcher::AddIDBObserver(
172 int32_t ipc_database_id, 189 int32_t ipc_database_id,
173 int64_t transaction_id, 190 int64_t transaction_id,
174 std::unique_ptr<WebIDBObserver> observer) { 191 std::unique_ptr<WebIDBObserver> observer) {
192 IndexedDBHostMsg_DatabaseObserve_Params params;
193 params.include_transaction = observer->transaction();
194 params.no_records = observer->noRecords();
195 params.values = observer->values();
196 params.operation_types =
197 static_cast<unsigned short>(observer->operationTypes().to_ulong());
cmumford 2016/07/20 00:25:12 Instead of using "unsigned short" we should be usi
palakj1 2016/07/20 01:33:35 Changed
175 int32_t observer_id = observers_.Add(observer.release()); 198 int32_t observer_id = observers_.Add(observer.release());
176 IndexedDBHostMsg_DatabaseObserve_Params params;
177 // TODO(palakj): Other params are assigned values as a part of next cl.
178 params.ipc_database_id = ipc_database_id; 199 params.ipc_database_id = ipc_database_id;
179 params.transaction_id = transaction_id; 200 params.transaction_id = transaction_id;
180 params.observer_id = observer_id; 201 params.observer_id = observer_id;
181 Send(new IndexedDBHostMsg_DatabaseObserve(params)); 202 Send(new IndexedDBHostMsg_DatabaseObserve(params));
182 return observer_id; 203 return observer_id;
183 } 204 }
184 205
185 void IndexedDBDispatcher::RemoveIDBObserversFromDatabase( 206 void IndexedDBDispatcher::RemoveIDBObserversFromDatabase(
186 int32_t ipc_database_id, 207 int32_t ipc_database_id,
187 const std::vector<int32_t>& observer_ids_to_remove) { 208 const std::vector<int32_t>& observer_ids_to_remove) {
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 int32_t ipc_database_callbacks_id, 815 int32_t ipc_database_callbacks_id,
795 int64_t transaction_id) { 816 int64_t transaction_id) {
796 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 817 DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
797 WebIDBDatabaseCallbacks* callbacks = 818 WebIDBDatabaseCallbacks* callbacks =
798 pending_database_callbacks_.Lookup(ipc_database_callbacks_id); 819 pending_database_callbacks_.Lookup(ipc_database_callbacks_id);
799 if (!callbacks) 820 if (!callbacks)
800 return; 821 return;
801 callbacks->onComplete(transaction_id); 822 callbacks->onComplete(transaction_id);
802 } 823 }
803 824
825 void IndexedDBDispatcher::OnDatabaseChange(
826 int32_t ipc_thread_id,
827 int32_t ipc_database_id,
828 const IndexedDBMsg_ObserverChanges& changes) {
829 DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
830 std::vector<WebIDBObservation> observations(
831 ConvertObservations(changes.observations));
832 for (auto& obs : changes.observation_index) {
cmumford 2016/07/20 00:25:12 Nit: When iterating a map we usually use "it" for
palakj1 2016/07/20 01:33:35 Done
833 WebIDBObserver* observer = observers_.Lookup(obs.first);
834 // An observer can be removed from the renderer, but still exist in the
835 // backend.
836 // Moreover, observer might have recorded some changes before being removed
837 // from
cmumford 2016/07/20 00:25:12 fix line breaks.
palakj1 2016/07/20 01:33:35 done
838 // the backend and thus, have its id be present in changes.
839 if (!observer)
840 continue;
841 observer->onChange(observations, std::move(obs.second));
842 }
843 }
844
804 void IndexedDBDispatcher::OnForcedClose(int32_t ipc_thread_id, 845 void IndexedDBDispatcher::OnForcedClose(int32_t ipc_thread_id,
805 int32_t ipc_database_callbacks_id) { 846 int32_t ipc_database_callbacks_id) {
806 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 847 DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
807 WebIDBDatabaseCallbacks* callbacks = 848 WebIDBDatabaseCallbacks* callbacks =
808 pending_database_callbacks_.Lookup(ipc_database_callbacks_id); 849 pending_database_callbacks_.Lookup(ipc_database_callbacks_id);
809 if (!callbacks) 850 if (!callbacks)
810 return; 851 return;
811 callbacks->onForcedClose(); 852 callbacks->onForcedClose();
812 } 853 }
813 854
(...skipping 17 matching lines...) Expand all
831 typedef std::map<int32_t, WebIDBCursorImpl*>::iterator Iterator; 872 typedef std::map<int32_t, WebIDBCursorImpl*>::iterator Iterator;
832 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { 873 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) {
833 if (i->first == ipc_exception_cursor_id || 874 if (i->first == ipc_exception_cursor_id ||
834 i->second->transaction_id() != transaction_id) 875 i->second->transaction_id() != transaction_id)
835 continue; 876 continue;
836 i->second->ResetPrefetchCache(); 877 i->second->ResetPrefetchCache();
837 } 878 }
838 } 879 }
839 880
840 } // namespace content 881 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698