OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/indexed_db/indexed_db_callbacks.h" | 5 #include "content/browser/indexed_db/indexed_db_callbacks.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <utility> | 10 #include <utility> |
11 | 11 |
12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
15 #include "content/browser/child_process_security_policy_impl.h" | 15 #include "content/browser/child_process_security_policy_impl.h" |
16 #include "content/browser/fileapi/fileapi_message_filter.h" | 16 #include "content/browser/fileapi/fileapi_message_filter.h" |
17 #include "content/browser/indexed_db/cursor_impl.h" | |
17 #include "content/browser/indexed_db/database_impl.h" | 18 #include "content/browser/indexed_db/database_impl.h" |
18 #include "content/browser/indexed_db/indexed_db_blob_info.h" | 19 #include "content/browser/indexed_db/indexed_db_blob_info.h" |
19 #include "content/browser/indexed_db/indexed_db_connection.h" | 20 #include "content/browser/indexed_db/indexed_db_connection.h" |
20 #include "content/browser/indexed_db/indexed_db_context_impl.h" | 21 #include "content/browser/indexed_db/indexed_db_context_impl.h" |
21 #include "content/browser/indexed_db/indexed_db_cursor.h" | 22 #include "content/browser/indexed_db/indexed_db_cursor.h" |
22 #include "content/browser/indexed_db/indexed_db_database_error.h" | 23 #include "content/browser/indexed_db/indexed_db_database_error.h" |
23 #include "content/browser/indexed_db/indexed_db_return_value.h" | 24 #include "content/browser/indexed_db/indexed_db_return_value.h" |
24 #include "content/browser/indexed_db/indexed_db_tracing.h" | 25 #include "content/browser/indexed_db/indexed_db_tracing.h" |
25 #include "content/browser/indexed_db/indexed_db_value.h" | 26 #include "content/browser/indexed_db/indexed_db_value.h" |
26 #include "content/common/indexed_db/indexed_db_constants.h" | 27 #include "content/common/indexed_db/indexed_db_constants.h" |
27 #include "content/common/indexed_db/indexed_db_messages.h" | 28 #include "content/common/indexed_db/indexed_db_messages.h" |
28 #include "content/common/indexed_db/indexed_db_metadata.h" | 29 #include "content/common/indexed_db/indexed_db_metadata.h" |
29 #include "mojo/public/cpp/bindings/strong_associated_binding.h" | 30 #include "mojo/public/cpp/bindings/strong_associated_binding.h" |
30 #include "storage/browser/blob/blob_storage_context.h" | 31 #include "storage/browser/blob/blob_storage_context.h" |
31 #include "storage/browser/blob/shareable_file_reference.h" | 32 #include "storage/browser/blob/shareable_file_reference.h" |
32 #include "storage/browser/quota/quota_manager.h" | 33 #include "storage/browser/quota/quota_manager.h" |
33 | 34 |
34 using indexed_db::mojom::CallbacksAssociatedPtrInfo; | 35 using indexed_db::mojom::CallbacksAssociatedPtrInfo; |
35 using std::swap; | 36 using std::swap; |
36 using storage::ShareableFileReference; | 37 using storage::ShareableFileReference; |
37 | 38 |
38 namespace content { | 39 namespace content { |
39 | 40 |
40 namespace { | 41 namespace { |
41 const int32_t kNoCursor = -1; | |
42 const int64_t kNoTransaction = -1; | 42 const int64_t kNoTransaction = -1; |
43 | 43 |
44 void ConvertBlobInfo( | 44 void ConvertBlobInfo( |
45 const std::vector<IndexedDBBlobInfo>& blob_info, | 45 const std::vector<IndexedDBBlobInfo>& blob_info, |
46 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { | 46 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { |
47 blob_or_file_info->reserve(blob_info.size()); | 47 blob_or_file_info->reserve(blob_info.size()); |
48 for (const auto& iter : blob_info) { | 48 for (const auto& iter : blob_info) { |
49 if (!iter.mark_used_callback().is_null()) | 49 if (!iter.mark_used_callback().is_null()) |
50 iter.mark_used_callback().Run(); | 50 iter.mark_used_callback().Run(); |
51 | 51 |
(...skipping 18 matching lines...) Expand all Loading... | |
70 if (value->primary_key.IsValid()) { | 70 if (value->primary_key.IsValid()) { |
71 mojo_value->primary_key = value->primary_key; | 71 mojo_value->primary_key = value->primary_key; |
72 mojo_value->key_path = value->key_path; | 72 mojo_value->key_path = value->key_path; |
73 } | 73 } |
74 if (!value->empty()) | 74 if (!value->empty()) |
75 swap(mojo_value->value->bits, value->bits); | 75 swap(mojo_value->value->bits, value->bits); |
76 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); | 76 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); |
77 return mojo_value; | 77 return mojo_value; |
78 } | 78 } |
79 | 79 |
80 // Destructively converts an IndexedDBValue to a Mojo Value. | |
81 ::indexed_db::mojom::ValuePtr ConvertValue(IndexedDBValue* value) { | |
82 auto mojo_value = ::indexed_db::mojom::Value::New(); | |
83 if (!value->empty()) | |
84 swap(mojo_value->bits, value->bits); | |
85 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); | |
86 return mojo_value; | |
87 } | |
88 | |
80 } // namespace | 89 } // namespace |
81 | 90 |
82 class IndexedDBCallbacks::IOThreadHelper { | 91 class IndexedDBCallbacks::IOThreadHelper { |
83 public: | 92 public: |
84 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, | 93 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, |
85 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); | 94 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); |
86 ~IOThreadHelper(); | 95 ~IOThreadHelper(); |
87 | 96 |
88 void SendError(const IndexedDBDatabaseError& error); | 97 void SendError(const IndexedDBDatabaseError& error); |
89 void SendSuccessStringList(const std::vector<base::string16>& value); | 98 void SendSuccessStringList(const std::vector<base::string16>& value); |
90 void SendBlocked(int64_t existing_version); | 99 void SendBlocked(int64_t existing_version); |
91 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database, | 100 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database, |
92 int64_t old_version, | 101 int64_t old_version, |
93 blink::WebIDBDataLoss data_loss, | 102 blink::WebIDBDataLoss data_loss, |
94 const std::string& data_loss_message, | 103 const std::string& data_loss_message, |
95 const content::IndexedDBDatabaseMetadata& metadata); | 104 const content::IndexedDBDatabaseMetadata& metadata); |
96 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database, | 105 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database, |
97 const content::IndexedDBDatabaseMetadata& metadata); | 106 const content::IndexedDBDatabaseMetadata& metadata); |
98 void SendSuccessCursor(int32_t cursor_id, | 107 void SendSuccessCursor(std::unique_ptr<CursorImpl> cursor, |
99 const IndexedDBKey& key, | 108 const IndexedDBKey& key, |
100 const IndexedDBKey& primary_key, | 109 const IndexedDBKey& primary_key, |
101 ::indexed_db::mojom::ValuePtr value, | 110 ::indexed_db::mojom::ValuePtr value, |
102 const std::vector<IndexedDBBlobInfo>& blob_info); | 111 const std::vector<IndexedDBBlobInfo>& blob_info); |
103 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value, | 112 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value, |
104 const std::vector<IndexedDBBlobInfo>& blob_info); | 113 const std::vector<IndexedDBBlobInfo>& blob_info); |
114 void SendSuccessCursorContinue( | |
115 const IndexedDBKey& key, | |
116 const IndexedDBKey& primary_key, | |
117 ::indexed_db::mojom::ValuePtr value, | |
118 const std::vector<IndexedDBBlobInfo>& blob_info); | |
119 void SendSuccessCursorPrefetch( | |
120 const std::vector<IndexedDBKey>& keys, | |
121 const std::vector<IndexedDBKey>& primary_keys, | |
122 std::vector<::indexed_db::mojom::ValuePtr> mojo_values, | |
123 const std::vector<IndexedDBValue>& values); | |
105 void SendSuccessArray( | 124 void SendSuccessArray( |
106 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, | 125 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, |
107 const std::vector<IndexedDBReturnValue>& values); | 126 const std::vector<IndexedDBReturnValue>& values); |
108 void SendSuccessKey(const IndexedDBKey& value); | 127 void SendSuccessKey(const IndexedDBKey& value); |
109 void SendSuccessInteger(int64_t value); | 128 void SendSuccessInteger(int64_t value); |
110 void SendSuccess(); | 129 void SendSuccess(); |
111 | 130 |
112 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info); | 131 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info); |
113 bool CreateAllBlobs( | 132 bool CreateAllBlobs( |
114 const std::vector<IndexedDBBlobInfo>& blob_info, | 133 const std::vector<IndexedDBBlobInfo>& blob_info, |
115 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); | 134 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); |
116 | 135 |
117 private: | 136 private: |
118 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; | 137 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; |
119 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; | 138 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; |
120 | 139 |
121 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); | 140 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); |
122 }; | 141 }; |
123 | 142 |
124 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, | |
125 int32_t ipc_thread_id, | |
126 int32_t ipc_callbacks_id) | |
127 : dispatcher_host_(dispatcher_host), | |
128 ipc_callbacks_id_(ipc_callbacks_id), | |
129 ipc_thread_id_(ipc_thread_id), | |
130 ipc_cursor_id_(kNoCursor), | |
131 host_transaction_id_(kNoTransaction), | |
132 data_loss_(blink::WebIDBDataLossNone), | |
133 sent_blocked_(false), | |
134 io_helper_(nullptr) {} | |
135 | |
136 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, | |
137 int32_t ipc_thread_id, | |
138 int32_t ipc_callbacks_id, | |
139 int32_t ipc_cursor_id) | |
140 : dispatcher_host_(dispatcher_host), | |
141 ipc_callbacks_id_(ipc_callbacks_id), | |
142 ipc_thread_id_(ipc_thread_id), | |
143 ipc_cursor_id_(ipc_cursor_id), | |
144 host_transaction_id_(kNoTransaction), | |
145 data_loss_(blink::WebIDBDataLossNone), | |
146 sent_blocked_(false), | |
147 io_helper_(nullptr) {} | |
148 | |
149 IndexedDBCallbacks::IndexedDBCallbacks( | 143 IndexedDBCallbacks::IndexedDBCallbacks( |
150 IndexedDBDispatcherHost* dispatcher_host, | 144 IndexedDBDispatcherHost* dispatcher_host, |
151 const url::Origin& origin, | 145 const url::Origin& origin, |
152 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) | 146 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) |
153 : dispatcher_host_(dispatcher_host), | 147 : dispatcher_host_(dispatcher_host), |
154 ipc_cursor_id_(kNoCursor), | |
155 host_transaction_id_(kNoTransaction), | 148 host_transaction_id_(kNoTransaction), |
156 origin_(origin), | 149 origin_(origin), |
157 data_loss_(blink::WebIDBDataLossNone), | 150 data_loss_(blink::WebIDBDataLossNone), |
158 sent_blocked_(false), | 151 sent_blocked_(false), |
159 io_helper_( | 152 io_helper_( |
160 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { | 153 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { |
161 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 154 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
162 thread_checker_.DetachFromThread(); | 155 thread_checker_.DetachFromThread(); |
163 } | 156 } |
164 | 157 |
165 IndexedDBCallbacks::~IndexedDBCallbacks() { | 158 IndexedDBCallbacks::~IndexedDBCallbacks() { |
166 DCHECK(thread_checker_.CalledOnValidThread()); | 159 DCHECK(thread_checker_.CalledOnValidThread()); |
167 } | 160 } |
168 | 161 |
169 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { | 162 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { |
170 DCHECK(thread_checker_.CalledOnValidThread()); | 163 DCHECK(thread_checker_.CalledOnValidThread()); |
171 DCHECK(dispatcher_host_); | 164 DCHECK(dispatcher_host_); |
172 | 165 |
173 if (io_helper_) { | 166 BrowserThread::PostTask( |
174 BrowserThread::PostTask( | 167 BrowserThread::IO, FROM_HERE, |
175 BrowserThread::IO, FROM_HERE, | 168 base::Bind(&IOThreadHelper::SendError, base::Unretained(io_helper_.get()), |
176 base::Bind(&IOThreadHelper::SendError, | 169 error)); |
177 base::Unretained(io_helper_.get()), error)); | |
178 } else { | |
179 dispatcher_host_->Send(new IndexedDBMsg_CallbacksError( | |
180 ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message())); | |
181 } | |
182 dispatcher_host_ = nullptr; | 170 dispatcher_host_ = nullptr; |
183 | 171 |
184 if (!connection_open_start_time_.is_null()) { | 172 if (!connection_open_start_time_.is_null()) { |
185 UMA_HISTOGRAM_MEDIUM_TIMES( | 173 UMA_HISTOGRAM_MEDIUM_TIMES( |
186 "WebCore.IndexedDB.OpenTime.Error", | 174 "WebCore.IndexedDB.OpenTime.Error", |
187 base::TimeTicks::Now() - connection_open_start_time_); | 175 base::TimeTicks::Now() - connection_open_start_time_); |
188 connection_open_start_time_ = base::TimeTicks(); | 176 connection_open_start_time_ = base::TimeTicks(); |
189 } | 177 } |
190 } | 178 } |
191 | 179 |
192 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { | 180 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { |
193 DCHECK(thread_checker_.CalledOnValidThread()); | 181 DCHECK(thread_checker_.CalledOnValidThread()); |
194 DCHECK(dispatcher_host_); | 182 DCHECK(dispatcher_host_); |
195 DCHECK(io_helper_); | 183 DCHECK(io_helper_); |
196 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
197 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 184 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
198 | 185 |
199 BrowserThread::PostTask( | 186 BrowserThread::PostTask( |
200 BrowserThread::IO, FROM_HERE, | 187 BrowserThread::IO, FROM_HERE, |
201 base::Bind(&IOThreadHelper::SendSuccessStringList, | 188 base::Bind(&IOThreadHelper::SendSuccessStringList, |
202 base::Unretained(io_helper_.get()), value)); | 189 base::Unretained(io_helper_.get()), value)); |
203 dispatcher_host_ = nullptr; | 190 dispatcher_host_ = nullptr; |
204 } | 191 } |
205 | 192 |
206 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { | 193 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { |
207 DCHECK(thread_checker_.CalledOnValidThread()); | 194 DCHECK(thread_checker_.CalledOnValidThread()); |
208 DCHECK(dispatcher_host_); | 195 DCHECK(dispatcher_host_); |
209 DCHECK(io_helper_); | 196 DCHECK(io_helper_); |
210 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
211 | 197 |
212 if (sent_blocked_) | 198 if (sent_blocked_) |
213 return; | 199 return; |
214 | 200 |
215 sent_blocked_ = true; | 201 sent_blocked_ = true; |
216 | 202 |
217 BrowserThread::PostTask( | 203 BrowserThread::PostTask( |
218 BrowserThread::IO, FROM_HERE, | 204 BrowserThread::IO, FROM_HERE, |
219 base::Bind(&IOThreadHelper::SendBlocked, | 205 base::Bind(&IOThreadHelper::SendBlocked, |
220 base::Unretained(io_helper_.get()), existing_version)); | 206 base::Unretained(io_helper_.get()), existing_version)); |
221 | 207 |
222 if (!connection_open_start_time_.is_null()) { | 208 if (!connection_open_start_time_.is_null()) { |
223 UMA_HISTOGRAM_MEDIUM_TIMES( | 209 UMA_HISTOGRAM_MEDIUM_TIMES( |
224 "WebCore.IndexedDB.OpenTime.Blocked", | 210 "WebCore.IndexedDB.OpenTime.Blocked", |
225 base::TimeTicks::Now() - connection_open_start_time_); | 211 base::TimeTicks::Now() - connection_open_start_time_); |
226 connection_open_start_time_ = base::TimeTicks(); | 212 connection_open_start_time_ = base::TimeTicks(); |
227 } | 213 } |
228 } | 214 } |
229 | 215 |
230 void IndexedDBCallbacks::OnUpgradeNeeded( | 216 void IndexedDBCallbacks::OnUpgradeNeeded( |
231 int64_t old_version, | 217 int64_t old_version, |
232 std::unique_ptr<IndexedDBConnection> connection, | 218 std::unique_ptr<IndexedDBConnection> connection, |
233 const IndexedDBDatabaseMetadata& metadata, | 219 const IndexedDBDatabaseMetadata& metadata, |
234 const IndexedDBDataLossInfo& data_loss_info) { | 220 const IndexedDBDataLossInfo& data_loss_info) { |
235 DCHECK(thread_checker_.CalledOnValidThread()); | 221 DCHECK(thread_checker_.CalledOnValidThread()); |
236 DCHECK(dispatcher_host_); | 222 DCHECK(dispatcher_host_); |
237 DCHECK(io_helper_); | 223 DCHECK(io_helper_); |
238 | 224 |
239 DCHECK_NE(kNoTransaction, host_transaction_id_); | 225 DCHECK_NE(kNoTransaction, host_transaction_id_); |
240 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
241 DCHECK(!database_sent_); | 226 DCHECK(!database_sent_); |
242 | 227 |
243 data_loss_ = data_loss_info.status; | 228 data_loss_ = data_loss_info.status; |
244 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); | 229 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); |
245 database_sent_ = true; | 230 database_sent_ = true; |
246 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_, | 231 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_, |
247 dispatcher_host_); | 232 dispatcher_host_); |
248 | 233 |
249 BrowserThread::PostTask( | 234 BrowserThread::PostTask( |
250 BrowserThread::IO, FROM_HERE, | 235 BrowserThread::IO, FROM_HERE, |
(...skipping 10 matching lines...) Expand all Loading... | |
261 } | 246 } |
262 } | 247 } |
263 | 248 |
264 void IndexedDBCallbacks::OnSuccess( | 249 void IndexedDBCallbacks::OnSuccess( |
265 std::unique_ptr<IndexedDBConnection> connection, | 250 std::unique_ptr<IndexedDBConnection> connection, |
266 const IndexedDBDatabaseMetadata& metadata) { | 251 const IndexedDBDatabaseMetadata& metadata) { |
267 DCHECK(thread_checker_.CalledOnValidThread()); | 252 DCHECK(thread_checker_.CalledOnValidThread()); |
268 DCHECK(dispatcher_host_); | 253 DCHECK(dispatcher_host_); |
269 DCHECK(io_helper_); | 254 DCHECK(io_helper_); |
270 | 255 |
271 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
272 DCHECK_NE(kNoTransaction, host_transaction_id_); | 256 DCHECK_NE(kNoTransaction, host_transaction_id_); |
273 DCHECK_EQ(database_sent_, !connection); | 257 DCHECK_EQ(database_sent_, !connection); |
274 | 258 |
275 scoped_refptr<IndexedDBCallbacks> self(this); | 259 scoped_refptr<IndexedDBCallbacks> self(this); |
276 | 260 |
277 // Only send a new Database if the connection was not previously sent in | 261 // Only send a new Database if the connection was not previously sent in |
278 // OnUpgradeNeeded. | 262 // OnUpgradeNeeded. |
279 std::unique_ptr<DatabaseImpl> database; | 263 std::unique_ptr<DatabaseImpl> database; |
280 if (!database_sent_) | 264 if (!database_sent_) |
281 database.reset( | 265 database.reset( |
282 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_)); | 266 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_)); |
283 | 267 |
284 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 268 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
285 base::Bind(&IOThreadHelper::SendSuccessDatabase, | 269 base::Bind(&IOThreadHelper::SendSuccessDatabase, |
286 base::Unretained(io_helper_.get()), | 270 base::Unretained(io_helper_.get()), |
287 base::Passed(&database), metadata)); | 271 base::Passed(&database), metadata)); |
288 dispatcher_host_ = nullptr; | 272 dispatcher_host_ = nullptr; |
289 | 273 |
290 if (!connection_open_start_time_.is_null()) { | 274 if (!connection_open_start_time_.is_null()) { |
291 UMA_HISTOGRAM_MEDIUM_TIMES( | 275 UMA_HISTOGRAM_MEDIUM_TIMES( |
292 "WebCore.IndexedDB.OpenTime.Success", | 276 "WebCore.IndexedDB.OpenTime.Success", |
293 base::TimeTicks::Now() - connection_open_start_time_); | 277 base::TimeTicks::Now() - connection_open_start_time_); |
294 connection_open_start_time_ = base::TimeTicks(); | 278 connection_open_start_time_ = base::TimeTicks(); |
295 } | 279 } |
296 } | 280 } |
297 | 281 |
298 static std::string CreateBlobData( | |
299 const IndexedDBBlobInfo& blob_info, | |
300 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | |
301 base::TaskRunner* task_runner) { | |
302 if (!blob_info.uuid().empty()) { | |
303 // We're sending back a live blob, not a reference into our backing store. | |
304 return dispatcher_host->HoldBlobData(blob_info); | |
305 } | |
306 scoped_refptr<ShareableFileReference> shareable_file = | |
307 ShareableFileReference::Get(blob_info.file_path()); | |
308 if (!shareable_file.get()) { | |
309 shareable_file = ShareableFileReference::GetOrCreate( | |
310 blob_info.file_path(), | |
311 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, | |
312 task_runner); | |
313 if (!blob_info.release_callback().is_null()) | |
314 shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); | |
315 } | |
316 return dispatcher_host->HoldBlobData(blob_info); | |
317 } | |
318 | |
319 static bool CreateAllBlobs( | |
320 const std::vector<IndexedDBBlobInfo>& blob_info, | |
321 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info, | |
322 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) { | |
323 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); | |
324 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); | |
325 size_t i; | |
326 if (!dispatcher_host->blob_storage_context()) | |
327 return false; | |
328 for (i = 0; i < blob_info.size(); ++i) { | |
329 (*blob_or_file_info)[i].uuid = | |
330 CreateBlobData(blob_info[i], dispatcher_host, | |
331 dispatcher_host->context()->TaskRunner()); | |
332 } | |
333 return true; | |
334 } | |
335 | |
336 template <class ParamType, class MsgType> | |
337 static void CreateBlobsAndSend( | |
338 ParamType* params, | |
339 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | |
340 const std::vector<IndexedDBBlobInfo>& blob_info, | |
341 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) { | |
342 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
343 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host)) | |
344 dispatcher_host->Send(new MsgType(*params)); | |
345 } | |
346 | |
347 static void BlobLookupForCursorPrefetch( | |
348 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params* params, | |
349 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | |
350 const std::vector<IndexedDBValue>& values) { | |
351 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
352 DCHECK_EQ(values.size(), params->values.size()); | |
353 | |
354 for (size_t i = 0; i < values.size(); ++i) { | |
355 if (!CreateAllBlobs(values[i].blob_info, | |
356 ¶ms->values[i].blob_or_file_info, dispatcher_host)) | |
357 return; | |
358 } | |
359 | |
360 dispatcher_host->Send( | |
361 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params)); | |
362 } | |
363 | |
364 static void FillInBlobData( | |
365 const std::vector<IndexedDBBlobInfo>& blob_info, | |
366 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) { | |
367 for (const auto& iter : blob_info) { | |
368 if (iter.is_file()) { | |
369 IndexedDBMsg_BlobOrFileInfo info; | |
370 info.is_file = true; | |
371 info.mime_type = iter.type(); | |
372 info.file_name = iter.file_name(); | |
373 info.file_path = iter.file_path().AsUTF16Unsafe(); | |
374 info.size = iter.size(); | |
375 info.last_modified = iter.last_modified().ToDoubleT(); | |
376 blob_or_file_info->push_back(info); | |
377 } else { | |
378 IndexedDBMsg_BlobOrFileInfo info; | |
379 info.mime_type = iter.type(); | |
380 info.size = iter.size(); | |
381 blob_or_file_info->push_back(info); | |
382 } | |
383 } | |
384 } | |
385 | |
386 void IndexedDBCallbacks::RegisterBlobsAndSend( | |
387 const std::vector<IndexedDBBlobInfo>& blob_info, | |
388 const base::Closure& callback) { | |
389 for (const auto& iter : blob_info) { | |
390 if (!iter.mark_used_callback().is_null()) | |
391 iter.mark_used_callback().Run(); | |
392 } | |
393 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
394 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); | |
395 } | |
396 | |
397 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, | 282 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, |
398 const IndexedDBKey& key, | 283 const IndexedDBKey& key, |
399 const IndexedDBKey& primary_key, | 284 const IndexedDBKey& primary_key, |
400 IndexedDBValue* value) { | 285 IndexedDBValue* value) { |
401 DCHECK(thread_checker_.CalledOnValidThread()); | 286 DCHECK(thread_checker_.CalledOnValidThread()); |
402 DCHECK(dispatcher_host_); | 287 DCHECK(dispatcher_host_); |
403 DCHECK(io_helper_); | 288 DCHECK(io_helper_); |
404 | 289 |
405 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
406 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 290 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
407 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 291 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
408 | 292 |
293 std::unique_ptr<CursorImpl> cursor_impl( | |
294 new CursorImpl(cursor, origin_, dispatcher_host_)); | |
295 | |
409 ::indexed_db::mojom::ValuePtr mojo_value; | 296 ::indexed_db::mojom::ValuePtr mojo_value; |
410 std::vector<IndexedDBBlobInfo> blob_info; | 297 std::vector<IndexedDBBlobInfo> blob_info; |
411 if (value) { | 298 if (value) { |
412 mojo_value = ::indexed_db::mojom::Value::New(); | 299 mojo_value = ::indexed_db::mojom::Value::New(); |
413 if (!value->empty()) | 300 if (!value->empty()) |
414 swap(mojo_value->bits, value->bits); | 301 swap(mojo_value->bits, value->bits); |
415 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); | 302 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); |
416 blob_info = value->blob_info; | 303 blob_info = value->blob_info; |
417 } | 304 } |
418 | 305 |
419 BrowserThread::PostTask( | 306 BrowserThread::PostTask( |
420 BrowserThread::IO, FROM_HERE, | 307 BrowserThread::IO, FROM_HERE, |
421 base::Bind(&IOThreadHelper::SendSuccessCursor, | 308 base::Bind(&IOThreadHelper::SendSuccessCursor, |
422 base::Unretained(io_helper_.get()), | 309 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), |
423 dispatcher_host_->Add(cursor.get()), key, primary_key, | 310 key, primary_key, base::Passed(&mojo_value), |
424 base::Passed(&mojo_value), base::Passed(&blob_info))); | 311 base::Passed(&blob_info))); |
425 dispatcher_host_ = nullptr; | 312 dispatcher_host_ = nullptr; |
426 } | 313 } |
427 | 314 |
428 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, | 315 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, |
429 const IndexedDBKey& primary_key, | 316 const IndexedDBKey& primary_key, |
430 IndexedDBValue* value) { | 317 IndexedDBValue* value) { |
431 DCHECK(thread_checker_.CalledOnValidThread()); | 318 DCHECK(thread_checker_.CalledOnValidThread()); |
432 DCHECK(dispatcher_host_); | 319 DCHECK(dispatcher_host_); |
433 DCHECK(!io_helper_); | 320 DCHECK(io_helper_); |
434 | 321 |
435 DCHECK_NE(kNoCursor, ipc_cursor_id_); | |
436 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 322 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
437 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 323 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
438 | 324 |
439 IndexedDBCursor* idb_cursor = | 325 ::indexed_db::mojom::ValuePtr mojo_value; |
440 dispatcher_host_->GetCursorFromId(ipc_cursor_id_); | 326 std::vector<IndexedDBBlobInfo> blob_info; |
327 if (value) { | |
328 mojo_value = ::indexed_db::mojom::Value::New(); | |
329 if (!value->empty()) | |
330 std::swap(mojo_value->bits, value->bits); | |
dcheng
2016/11/17 03:46:23
No std:: to get ADL
Reilly Grant (use Gerrit)
2016/11/17 20:04:52
Done.
| |
331 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); | |
332 blob_info = value->blob_info; | |
333 } | |
441 | 334 |
442 DCHECK(idb_cursor); | 335 BrowserThread::PostTask( |
443 if (!idb_cursor) | 336 BrowserThread::IO, FROM_HERE, |
444 return; | 337 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, |
445 | 338 base::Unretained(io_helper_.get()), key, primary_key, |
446 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params( | 339 base::Passed(&mojo_value), base::Passed(&blob_info))); |
447 new IndexedDBMsg_CallbacksSuccessCursorContinue_Params()); | |
448 params->ipc_thread_id = ipc_thread_id_; | |
449 params->ipc_callbacks_id = ipc_callbacks_id_; | |
450 params->ipc_cursor_id = ipc_cursor_id_; | |
451 params->key = key; | |
452 params->primary_key = primary_key; | |
453 if (value && !value->empty()) | |
454 swap(params->value.bits, value->bits); | |
455 // TODO(alecflett): Avoid a copy here: the whole params object is | |
456 // being copied into the message. | |
457 if (!value || value->blob_info.empty()) { | |
458 dispatcher_host_->Send( | |
459 new IndexedDBMsg_CallbacksSuccessCursorContinue(*params)); | |
460 } else { | |
461 IndexedDBMsg_CallbacksSuccessCursorContinue_Params* p = params.get(); | |
462 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); | |
463 RegisterBlobsAndSend( | |
464 value->blob_info, | |
465 base::Bind(CreateBlobsAndSend< | |
466 IndexedDBMsg_CallbacksSuccessCursorContinue_Params, | |
467 IndexedDBMsg_CallbacksSuccessCursorContinue>, | |
468 base::Owned(params.release()), dispatcher_host_, | |
469 value->blob_info, | |
470 base::Unretained(&p->value.blob_or_file_info))); | |
471 } | |
472 dispatcher_host_ = nullptr; | 340 dispatcher_host_ = nullptr; |
473 } | 341 } |
474 | 342 |
475 void IndexedDBCallbacks::OnSuccessWithPrefetch( | 343 void IndexedDBCallbacks::OnSuccessWithPrefetch( |
476 const std::vector<IndexedDBKey>& keys, | 344 const std::vector<IndexedDBKey>& keys, |
477 const std::vector<IndexedDBKey>& primary_keys, | 345 const std::vector<IndexedDBKey>& primary_keys, |
478 std::vector<IndexedDBValue>* values) { | 346 std::vector<IndexedDBValue>* values) { |
479 DCHECK(thread_checker_.CalledOnValidThread()); | 347 DCHECK(thread_checker_.CalledOnValidThread()); |
480 DCHECK(dispatcher_host_); | 348 DCHECK(dispatcher_host_); |
481 DCHECK(!io_helper_); | 349 DCHECK(io_helper_); |
482 DCHECK_EQ(keys.size(), primary_keys.size()); | 350 DCHECK_EQ(keys.size(), primary_keys.size()); |
483 DCHECK_EQ(keys.size(), values->size()); | 351 DCHECK_EQ(keys.size(), values->size()); |
484 | 352 |
485 DCHECK_NE(kNoCursor, ipc_cursor_id_); | |
486 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 353 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
487 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 354 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
488 | 355 |
489 std::vector<IndexedDBKey> msg_keys; | 356 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; |
490 std::vector<IndexedDBKey> msg_primary_keys; | 357 mojo_values.reserve(values->size()); |
358 for (size_t i = 0; i < values->size(); ++i) | |
359 mojo_values.push_back(ConvertValue(&(*values)[i])); | |
491 | 360 |
492 for (size_t i = 0; i < keys.size(); ++i) { | 361 BrowserThread::PostTask( |
493 msg_keys.push_back(keys[i]); | 362 BrowserThread::IO, FROM_HERE, |
494 msg_primary_keys.push_back(primary_keys[i]); | 363 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, |
495 } | 364 base::Unretained(io_helper_.get()), keys, primary_keys, |
496 | 365 base::Passed(&mojo_values), *values)); |
497 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params( | |
498 new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params()); | |
499 params->ipc_thread_id = ipc_thread_id_; | |
500 params->ipc_callbacks_id = ipc_callbacks_id_; | |
501 params->ipc_cursor_id = ipc_cursor_id_; | |
502 params->keys = msg_keys; | |
503 params->primary_keys = msg_primary_keys; | |
504 params->values.resize(values->size()); | |
505 | |
506 bool found_blob_info = false; | |
507 for (size_t i = 0; i < values->size(); ++i) { | |
508 params->values[i].bits.swap(values->at(i).bits); | |
509 if (!values->at(i).blob_info.empty()) { | |
510 found_blob_info = true; | |
511 FillInBlobData(values->at(i).blob_info, | |
512 ¶ms->values[i].blob_or_file_info); | |
513 for (const auto& blob_iter : values->at(i).blob_info) { | |
514 if (!blob_iter.mark_used_callback().is_null()) | |
515 blob_iter.mark_used_callback().Run(); | |
516 } | |
517 } | |
518 } | |
519 | |
520 if (found_blob_info) { | |
521 BrowserThread::PostTask(BrowserThread::IO, | |
522 FROM_HERE, | |
523 base::Bind(BlobLookupForCursorPrefetch, | |
524 base::Owned(params.release()), | |
525 dispatcher_host_, | |
526 *values)); | |
527 } else { | |
528 dispatcher_host_->Send( | |
529 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); | |
530 } | |
531 dispatcher_host_ = nullptr; | 366 dispatcher_host_ = nullptr; |
532 } | 367 } |
533 | 368 |
534 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { | 369 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
535 DCHECK(thread_checker_.CalledOnValidThread()); | 370 DCHECK(thread_checker_.CalledOnValidThread()); |
536 DCHECK(dispatcher_host_); | 371 DCHECK(dispatcher_host_); |
537 | 372 |
538 if (value && value->primary_key.IsValid()) { | |
539 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
540 } else { | |
541 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL); | |
542 } | |
543 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 373 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
544 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 374 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
545 | 375 |
546 if (io_helper_) { | 376 ::indexed_db::mojom::ReturnValuePtr mojo_value; |
547 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | 377 std::vector<IndexedDBBlobInfo> blob_info; |
378 if (value) { | |
379 mojo_value = ConvertReturnValue(value); | |
380 blob_info = value->blob_info; | |
381 } | |
548 | 382 |
549 ::indexed_db::mojom::ReturnValuePtr mojo_value; | 383 BrowserThread::PostTask( |
550 std::vector<IndexedDBBlobInfo> blob_info; | 384 BrowserThread::IO, FROM_HERE, |
551 if (value) { | 385 base::Bind(&IOThreadHelper::SendSuccessValue, |
552 mojo_value = ConvertReturnValue(value); | 386 base::Unretained(io_helper_.get()), base::Passed(&mojo_value), |
553 blob_info = value->blob_info; | 387 base::Passed(&blob_info))); |
554 } | |
555 BrowserThread::PostTask( | |
556 BrowserThread::IO, FROM_HERE, | |
557 base::Bind(&IOThreadHelper::SendSuccessValue, | |
558 base::Unretained(io_helper_.get()), | |
559 base::Passed(&mojo_value), base::Passed(&blob_info))); | |
560 } else { | |
561 auto params = base::MakeUnique<IndexedDBMsg_CallbacksSuccessValue_Params>(); | |
562 params->ipc_thread_id = ipc_thread_id_; | |
563 params->ipc_callbacks_id = ipc_callbacks_id_; | |
564 if (value && value->primary_key.IsValid()) { | |
565 params->value.primary_key = value->primary_key; | |
566 params->value.key_path = value->key_path; | |
567 } | |
568 if (value && !value->empty()) | |
569 swap(params->value.bits, value->bits); | |
570 if (!value || value->blob_info.empty()) { | |
571 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params)); | |
572 } else { | |
573 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get(); | |
574 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); | |
575 RegisterBlobsAndSend( | |
576 value->blob_info, | |
577 base::Bind( | |
578 CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params, | |
579 IndexedDBMsg_CallbacksSuccessValue>, | |
580 base::Owned(params.release()), dispatcher_host_, value->blob_info, | |
581 base::Unretained(&p->value.blob_or_file_info))); | |
582 } | |
583 } | |
584 dispatcher_host_ = nullptr; | 388 dispatcher_host_ = nullptr; |
585 } | 389 } |
586 | 390 |
587 void IndexedDBCallbacks::OnSuccessArray( | 391 void IndexedDBCallbacks::OnSuccessArray( |
588 std::vector<IndexedDBReturnValue>* values) { | 392 std::vector<IndexedDBReturnValue>* values) { |
589 DCHECK(thread_checker_.CalledOnValidThread()); | 393 DCHECK(thread_checker_.CalledOnValidThread()); |
590 DCHECK(dispatcher_host_); | 394 DCHECK(dispatcher_host_); |
591 DCHECK(io_helper_); | 395 DCHECK(io_helper_); |
592 | 396 |
593 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 397 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
594 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 398 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
595 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
596 | 399 |
597 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; | 400 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; |
598 mojo_values.reserve(values->size()); | 401 mojo_values.reserve(values->size()); |
599 for (size_t i = 0; i < values->size(); ++i) | 402 for (size_t i = 0; i < values->size(); ++i) |
600 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); | 403 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); |
601 | 404 |
602 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 405 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
603 base::Bind(&IOThreadHelper::SendSuccessArray, | 406 base::Bind(&IOThreadHelper::SendSuccessArray, |
604 base::Unretained(io_helper_.get()), | 407 base::Unretained(io_helper_.get()), |
605 base::Passed(&mojo_values), *values)); | 408 base::Passed(&mojo_values), *values)); |
606 dispatcher_host_ = nullptr; | 409 dispatcher_host_ = nullptr; |
607 } | 410 } |
608 | 411 |
609 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { | 412 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { |
610 DCHECK(thread_checker_.CalledOnValidThread()); | 413 DCHECK(thread_checker_.CalledOnValidThread()); |
611 DCHECK(dispatcher_host_); | 414 DCHECK(dispatcher_host_); |
612 DCHECK(io_helper_); | 415 DCHECK(io_helper_); |
613 | 416 |
614 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
615 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 417 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
616 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 418 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
617 | 419 |
618 BrowserThread::PostTask( | 420 BrowserThread::PostTask( |
619 BrowserThread::IO, FROM_HERE, | 421 BrowserThread::IO, FROM_HERE, |
620 base::Bind(&IOThreadHelper::SendSuccessKey, | 422 base::Bind(&IOThreadHelper::SendSuccessKey, |
621 base::Unretained(io_helper_.get()), value)); | 423 base::Unretained(io_helper_.get()), value)); |
622 dispatcher_host_ = nullptr; | 424 dispatcher_host_ = nullptr; |
623 } | 425 } |
624 | 426 |
625 void IndexedDBCallbacks::OnSuccess(int64_t value) { | 427 void IndexedDBCallbacks::OnSuccess(int64_t value) { |
626 DCHECK(thread_checker_.CalledOnValidThread()); | 428 DCHECK(thread_checker_.CalledOnValidThread()); |
627 DCHECK(dispatcher_host_); | 429 DCHECK(dispatcher_host_); |
628 if (io_helper_) { | |
629 BrowserThread::PostTask( | |
630 BrowserThread::IO, FROM_HERE, | |
631 base::Bind(&IOThreadHelper::SendSuccessInteger, | |
632 base::Unretained(io_helper_.get()), value)); | |
633 } else { | |
634 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
635 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
636 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | |
637 | 430 |
638 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger( | 431 BrowserThread::PostTask( |
639 ipc_thread_id_, ipc_callbacks_id_, value)); | 432 BrowserThread::IO, FROM_HERE, |
640 } | 433 base::Bind(&IOThreadHelper::SendSuccessInteger, |
434 base::Unretained(io_helper_.get()), value)); | |
641 dispatcher_host_ = nullptr; | 435 dispatcher_host_ = nullptr; |
642 } | 436 } |
643 | 437 |
644 void IndexedDBCallbacks::OnSuccess() { | 438 void IndexedDBCallbacks::OnSuccess() { |
645 DCHECK(thread_checker_.CalledOnValidThread()); | 439 DCHECK(thread_checker_.CalledOnValidThread()); |
646 DCHECK(dispatcher_host_); | 440 DCHECK(dispatcher_host_); |
647 DCHECK(io_helper_); | 441 DCHECK(io_helper_); |
648 | 442 |
649 DCHECK_EQ(kNoCursor, ipc_cursor_id_); | |
650 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 443 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
651 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 444 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
652 | 445 |
653 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 446 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
654 base::Bind(&IOThreadHelper::SendSuccess, | 447 base::Bind(&IOThreadHelper::SendSuccess, |
655 base::Unretained(io_helper_.get()))); | 448 base::Unretained(io_helper_.get()))); |
656 dispatcher_host_ = nullptr; | 449 dispatcher_host_ = nullptr; |
657 } | 450 } |
658 | 451 |
659 bool IndexedDBCallbacks::IsValid() const { | 452 bool IndexedDBCallbacks::IsValid() const { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
713 if (database) { | 506 if (database) { |
714 ::indexed_db::mojom::DatabaseAssociatedRequest request; | 507 ::indexed_db::mojom::DatabaseAssociatedRequest request; |
715 callbacks_.associated_group()->CreateAssociatedInterface( | 508 callbacks_.associated_group()->CreateAssociatedInterface( |
716 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); | 509 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
717 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); | 510 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); |
718 } | 511 } |
719 callbacks_->SuccessDatabase(std::move(ptr_info), metadata); | 512 callbacks_->SuccessDatabase(std::move(ptr_info), metadata); |
720 } | 513 } |
721 | 514 |
722 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor( | 515 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor( |
723 int32_t cursor_id, | 516 std::unique_ptr<CursorImpl> cursor, |
724 const IndexedDBKey& key, | 517 const IndexedDBKey& key, |
725 const IndexedDBKey& primary_key, | 518 const IndexedDBKey& primary_key, |
726 ::indexed_db::mojom::ValuePtr value, | 519 ::indexed_db::mojom::ValuePtr value, |
727 const std::vector<IndexedDBBlobInfo>& blob_info) { | 520 const std::vector<IndexedDBBlobInfo>& blob_info) { |
728 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info)) | 521 if (value && !CreateAllBlobs(blob_info, &value->blob_or_file_info)) |
729 callbacks_->SuccessCursor(cursor_id, key, primary_key, std::move(value)); | 522 return; |
523 | |
524 ::indexed_db::mojom::CursorAssociatedPtrInfo ptr_info; | |
525 ::indexed_db::mojom::CursorAssociatedRequest request; | |
526 callbacks_.associated_group()->CreateAssociatedInterface( | |
527 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); | |
528 mojo::MakeStrongAssociatedBinding(std::move(cursor), std::move(request)); | |
529 callbacks_->SuccessCursor(std::move(ptr_info), key, primary_key, | |
530 std::move(value)); | |
730 } | 531 } |
731 | 532 |
732 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue( | 533 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue( |
733 ::indexed_db::mojom::ReturnValuePtr value, | 534 ::indexed_db::mojom::ReturnValuePtr value, |
734 const std::vector<IndexedDBBlobInfo>& blob_info) { | 535 const std::vector<IndexedDBBlobInfo>& blob_info) { |
735 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info)) | 536 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info)) |
736 callbacks_->SuccessValue(std::move(value)); | 537 callbacks_->SuccessValue(std::move(value)); |
737 } | 538 } |
738 | 539 |
739 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray( | 540 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray( |
740 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, | 541 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, |
741 const std::vector<IndexedDBReturnValue>& values) { | 542 const std::vector<IndexedDBReturnValue>& values) { |
742 DCHECK_EQ(mojo_values.size(), values.size()); | 543 DCHECK_EQ(mojo_values.size(), values.size()); |
743 | 544 |
744 for (size_t i = 0; i < mojo_values.size(); ++i) { | 545 for (size_t i = 0; i < mojo_values.size(); ++i) { |
745 if (!CreateAllBlobs(values[i].blob_info, | 546 if (!CreateAllBlobs(values[i].blob_info, |
746 &mojo_values[i]->value->blob_or_file_info)) | 547 &mojo_values[i]->value->blob_or_file_info)) |
747 return; | 548 return; |
748 } | 549 } |
749 callbacks_->SuccessArray(std::move(mojo_values)); | 550 callbacks_->SuccessArray(std::move(mojo_values)); |
750 } | 551 } |
751 | 552 |
553 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorContinue( | |
554 const IndexedDBKey& key, | |
555 const IndexedDBKey& primary_key, | |
556 ::indexed_db::mojom::ValuePtr value, | |
557 const std::vector<IndexedDBBlobInfo>& blob_info) { | |
558 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info)) | |
559 callbacks_->SuccessCursorContinue(key, primary_key, std::move(value)); | |
560 } | |
561 | |
562 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorPrefetch( | |
563 const std::vector<IndexedDBKey>& keys, | |
564 const std::vector<IndexedDBKey>& primary_keys, | |
565 std::vector<::indexed_db::mojom::ValuePtr> mojo_values, | |
566 const std::vector<IndexedDBValue>& values) { | |
567 DCHECK_EQ(mojo_values.size(), values.size()); | |
568 | |
569 for (size_t i = 0; i < mojo_values.size(); ++i) { | |
570 if (!CreateAllBlobs(values[i].blob_info, | |
571 &mojo_values[i]->blob_or_file_info)) { | |
572 return; | |
573 } | |
574 } | |
575 | |
576 callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values)); | |
577 } | |
578 | |
752 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey( | 579 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey( |
753 const IndexedDBKey& value) { | 580 const IndexedDBKey& value) { |
754 callbacks_->SuccessKey(value); | 581 callbacks_->SuccessKey(value); |
755 } | 582 } |
756 | 583 |
757 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { | 584 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { |
758 callbacks_->SuccessInteger(value); | 585 callbacks_->SuccessInteger(value); |
759 } | 586 } |
760 | 587 |
761 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() { | 588 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() { |
(...skipping 25 matching lines...) Expand all Loading... | |
787 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); | 614 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); |
788 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); | 615 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); |
789 if (!dispatcher_host_->blob_storage_context()) | 616 if (!dispatcher_host_->blob_storage_context()) |
790 return false; | 617 return false; |
791 for (size_t i = 0; i < blob_info.size(); ++i) | 618 for (size_t i = 0; i < blob_info.size(); ++i) |
792 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); | 619 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); |
793 return true; | 620 return true; |
794 } | 621 } |
795 | 622 |
796 } // namespace content | 623 } // namespace content |
OLD | NEW |