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

Side by Side Diff: content/browser/indexed_db/indexed_db_callbacks.cc

Issue 2449953008: Port messages sent by WebIDBDatabaseImpl to Mojo. (Closed)
Patch Set: Address cmumford@ and jsbell@'s comments. Created 4 years, 1 month 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 (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/database_impl.h"
17 #include "content/browser/indexed_db/indexed_db_blob_info.h" 18 #include "content/browser/indexed_db/indexed_db_blob_info.h"
18 #include "content/browser/indexed_db/indexed_db_connection.h" 19 #include "content/browser/indexed_db/indexed_db_connection.h"
19 #include "content/browser/indexed_db/indexed_db_context_impl.h" 20 #include "content/browser/indexed_db/indexed_db_context_impl.h"
20 #include "content/browser/indexed_db/indexed_db_cursor.h" 21 #include "content/browser/indexed_db/indexed_db_cursor.h"
21 #include "content/browser/indexed_db/indexed_db_database_error.h" 22 #include "content/browser/indexed_db/indexed_db_database_error.h"
22 #include "content/browser/indexed_db/indexed_db_return_value.h" 23 #include "content/browser/indexed_db/indexed_db_return_value.h"
23 #include "content/browser/indexed_db/indexed_db_tracing.h" 24 #include "content/browser/indexed_db/indexed_db_tracing.h"
24 #include "content/browser/indexed_db/indexed_db_value.h" 25 #include "content/browser/indexed_db/indexed_db_value.h"
25 #include "content/common/indexed_db/indexed_db_constants.h" 26 #include "content/common/indexed_db/indexed_db_constants.h"
26 #include "content/common/indexed_db/indexed_db_messages.h" 27 #include "content/common/indexed_db/indexed_db_messages.h"
27 #include "content/common/indexed_db/indexed_db_metadata.h" 28 #include "content/common/indexed_db/indexed_db_metadata.h"
29 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
28 #include "storage/browser/blob/blob_storage_context.h" 30 #include "storage/browser/blob/blob_storage_context.h"
29 #include "storage/browser/blob/shareable_file_reference.h" 31 #include "storage/browser/blob/shareable_file_reference.h"
30 #include "storage/browser/quota/quota_manager.h" 32 #include "storage/browser/quota/quota_manager.h"
31 33
32 using indexed_db::mojom::CallbacksAssociatedPtrInfo; 34 using indexed_db::mojom::CallbacksAssociatedPtrInfo;
33 using storage::ShareableFileReference; 35 using storage::ShareableFileReference;
34 36
35 namespace content { 37 namespace content {
36 38
37 namespace { 39 namespace {
38 const int32_t kNoCursor = -1; 40 const int32_t kNoCursor = -1;
39 const int64_t kNoTransaction = -1; 41 const int64_t kNoTransaction = -1;
42
43 void ConvertBlobInfo(
44 const std::vector<IndexedDBBlobInfo>& blob_info,
45 std::vector<::indexed_db::mojom::BlobOrFileInfoPtr>* blob_or_file_info) {
46 blob_or_file_info->reserve(blob_info.size());
47 for (const auto& iter : blob_info) {
48 if (!iter.mark_used_callback().is_null())
49 iter.mark_used_callback().Run();
50
51 auto info = ::indexed_db::mojom::BlobOrFileInfo::New();
52 info->mime_type = iter.type();
53 info->size = iter.size();
54 info->is_file = iter.is_file();
55 if (info->is_file) {
56 info->file_name = iter.file_name();
57 info->file_path = iter.file_path().AsUTF16Unsafe();
58 info->last_modified = iter.last_modified().ToDoubleT();
59 }
60 blob_or_file_info->push_back(std::move(info));
61 }
40 } 62 }
41 63
64 ::indexed_db::mojom::ReturnValuePtr ConvertReturnValue(
65 IndexedDBReturnValue* value) {
66 auto mojo_value = ::indexed_db::mojom::ReturnValue::New();
67 mojo_value->value = ::indexed_db::mojom::Value::New();
68 if (value->primary_key.IsValid()) {
69 mojo_value->primary_key = value->primary_key;
70 mojo_value->key_path = value->key_path;
71 }
72 if (!value->empty())
73 std::swap(mojo_value->value->bits, value->bits);
dcheng 2016/11/03 04:27:04 Aside: I think it's slightly surprising to destruc
Reilly Grant (use Gerrit) 2016/11/03 21:32:22 It surprised me too. I've added a comment.
74 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info);
75 return mojo_value;
76 }
77
78 } // namespace
79
42 class IndexedDBCallbacks::IOThreadHelper { 80 class IndexedDBCallbacks::IOThreadHelper {
43 public: 81 public:
44 explicit IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info); 82 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info,
83 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host);
45 ~IOThreadHelper(); 84 ~IOThreadHelper();
46 85
47 void SendError(const IndexedDBDatabaseError& error); 86 void SendError(const IndexedDBDatabaseError& error);
48 void SendSuccessStringList(const std::vector<base::string16>& value); 87 void SendSuccessStringList(const std::vector<base::string16>& value);
49 void SendBlocked(int64_t existing_version); 88 void SendBlocked(int64_t existing_version);
50 void SendUpgradeNeeded(int32_t database_id, 89 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database,
51 int64_t old_version, 90 int64_t old_version,
52 blink::WebIDBDataLoss data_loss, 91 blink::WebIDBDataLoss data_loss,
53 const std::string& data_loss_message, 92 const std::string& data_loss_message,
54 const content::IndexedDBDatabaseMetadata& metadata); 93 const content::IndexedDBDatabaseMetadata& metadata);
55 void SendSuccessDatabase(int32_t database_id, 94 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database,
56 const content::IndexedDBDatabaseMetadata& metadata); 95 const content::IndexedDBDatabaseMetadata& metadata);
96 void SendSuccessCursor(int32_t cursor_id,
97 const IndexedDBKey& key,
98 const IndexedDBKey& primary_key,
99 ::indexed_db::mojom::ValuePtr value,
100 const std::vector<IndexedDBBlobInfo>& blob_info);
101 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value,
102 const std::vector<IndexedDBBlobInfo>& blob_info);
103 void SendSuccessArray(
104 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values,
105 const std::vector<IndexedDBReturnValue>& values);
106 void SendSuccessKey(const IndexedDBKey& value);
57 void SendSuccessInteger(int64_t value); 107 void SendSuccessInteger(int64_t value);
108 void SendSuccess();
109
110 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info);
111 bool CreateAllBlobs(
112 const std::vector<IndexedDBBlobInfo>& blob_info,
113 std::vector<::indexed_db::mojom::BlobOrFileInfoPtr>* blob_or_file_info);
58 114
59 private: 115 private:
116 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_;
60 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; 117 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_;
61 118
62 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); 119 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper);
63 }; 120 };
64 121
65 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, 122 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
66 int32_t ipc_thread_id, 123 int32_t ipc_thread_id,
67 int32_t ipc_callbacks_id) 124 int32_t ipc_callbacks_id)
68 : dispatcher_host_(dispatcher_host), 125 : dispatcher_host_(dispatcher_host),
69 ipc_callbacks_id_(ipc_callbacks_id), 126 ipc_callbacks_id_(ipc_callbacks_id),
70 ipc_thread_id_(ipc_thread_id), 127 ipc_thread_id_(ipc_thread_id),
71 ipc_cursor_id_(kNoCursor), 128 ipc_cursor_id_(kNoCursor),
72 host_transaction_id_(kNoTransaction), 129 host_transaction_id_(kNoTransaction),
73 ipc_database_id_(kNoDatabase),
74 data_loss_(blink::WebIDBDataLossNone), 130 data_loss_(blink::WebIDBDataLossNone),
75 sent_blocked_(false), 131 sent_blocked_(false),
76 io_helper_(nullptr) {} 132 io_helper_(nullptr) {}
77 133
78 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, 134 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
79 int32_t ipc_thread_id, 135 int32_t ipc_thread_id,
80 int32_t ipc_callbacks_id, 136 int32_t ipc_callbacks_id,
81 int32_t ipc_cursor_id) 137 int32_t ipc_cursor_id)
82 : dispatcher_host_(dispatcher_host), 138 : dispatcher_host_(dispatcher_host),
83 ipc_callbacks_id_(ipc_callbacks_id), 139 ipc_callbacks_id_(ipc_callbacks_id),
84 ipc_thread_id_(ipc_thread_id), 140 ipc_thread_id_(ipc_thread_id),
85 ipc_cursor_id_(ipc_cursor_id), 141 ipc_cursor_id_(ipc_cursor_id),
86 host_transaction_id_(kNoTransaction), 142 host_transaction_id_(kNoTransaction),
87 ipc_database_id_(kNoDatabase),
88 data_loss_(blink::WebIDBDataLossNone), 143 data_loss_(blink::WebIDBDataLossNone),
89 sent_blocked_(false), 144 sent_blocked_(false),
90 io_helper_(nullptr) {} 145 io_helper_(nullptr) {}
91 146
92 IndexedDBCallbacks::IndexedDBCallbacks( 147 IndexedDBCallbacks::IndexedDBCallbacks(
93 IndexedDBDispatcherHost* dispatcher_host, 148 IndexedDBDispatcherHost* dispatcher_host,
94 const url::Origin& origin, 149 const url::Origin& origin,
95 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) 150 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info)
96 : dispatcher_host_(dispatcher_host), 151 : dispatcher_host_(dispatcher_host),
97 ipc_cursor_id_(kNoCursor), 152 ipc_cursor_id_(kNoCursor),
98 host_transaction_id_(kNoTransaction), 153 host_transaction_id_(kNoTransaction),
99 origin_(origin), 154 origin_(origin),
100 ipc_database_id_(kNoDatabase),
101 data_loss_(blink::WebIDBDataLossNone), 155 data_loss_(blink::WebIDBDataLossNone),
102 sent_blocked_(false), 156 sent_blocked_(false),
103 io_helper_(new IOThreadHelper(std::move(callbacks_info))) { 157 io_helper_(
158 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) {
104 DCHECK_CURRENTLY_ON(BrowserThread::IO); 159 DCHECK_CURRENTLY_ON(BrowserThread::IO);
105 thread_checker_.DetachFromThread(); 160 thread_checker_.DetachFromThread();
106 } 161 }
107 162
108 IndexedDBCallbacks::~IndexedDBCallbacks() { 163 IndexedDBCallbacks::~IndexedDBCallbacks() {
109 DCHECK(thread_checker_.CalledOnValidThread()); 164 DCHECK(thread_checker_.CalledOnValidThread());
110 } 165 }
111 166
112 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { 167 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) {
113 DCHECK(thread_checker_.CalledOnValidThread()); 168 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 17 matching lines...) Expand all
131 connection_open_start_time_ = base::TimeTicks(); 186 connection_open_start_time_ = base::TimeTicks();
132 } 187 }
133 } 188 }
134 189
135 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { 190 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) {
136 DCHECK(thread_checker_.CalledOnValidThread()); 191 DCHECK(thread_checker_.CalledOnValidThread());
137 DCHECK(dispatcher_host_); 192 DCHECK(dispatcher_host_);
138 DCHECK(io_helper_); 193 DCHECK(io_helper_);
139 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 194 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
140 DCHECK_EQ(kNoTransaction, host_transaction_id_); 195 DCHECK_EQ(kNoTransaction, host_transaction_id_);
141 DCHECK_EQ(kNoDatabase, ipc_database_id_);
142 196
143 BrowserThread::PostTask( 197 BrowserThread::PostTask(
144 BrowserThread::IO, FROM_HERE, 198 BrowserThread::IO, FROM_HERE,
145 base::Bind(&IOThreadHelper::SendSuccessStringList, 199 base::Bind(&IOThreadHelper::SendSuccessStringList,
146 base::Unretained(io_helper_.get()), value)); 200 base::Unretained(io_helper_.get()), value));
147 dispatcher_host_ = nullptr; 201 dispatcher_host_ = nullptr;
148 } 202 }
149 203
150 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { 204 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) {
151 DCHECK(thread_checker_.CalledOnValidThread()); 205 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 20 matching lines...) Expand all
172 } 226 }
173 227
174 void IndexedDBCallbacks::OnUpgradeNeeded( 228 void IndexedDBCallbacks::OnUpgradeNeeded(
175 int64_t old_version, 229 int64_t old_version,
176 std::unique_ptr<IndexedDBConnection> connection, 230 std::unique_ptr<IndexedDBConnection> connection,
177 const IndexedDBDatabaseMetadata& metadata, 231 const IndexedDBDatabaseMetadata& metadata,
178 const IndexedDBDataLossInfo& data_loss_info) { 232 const IndexedDBDataLossInfo& data_loss_info) {
179 DCHECK(thread_checker_.CalledOnValidThread()); 233 DCHECK(thread_checker_.CalledOnValidThread());
180 DCHECK(dispatcher_host_); 234 DCHECK(dispatcher_host_);
181 DCHECK(io_helper_); 235 DCHECK(io_helper_);
236
182 DCHECK_NE(kNoTransaction, host_transaction_id_); 237 DCHECK_NE(kNoTransaction, host_transaction_id_);
183 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 238 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
184 DCHECK_EQ(kNoDatabase, ipc_database_id_); 239 DCHECK(!database_sent_);
185 240
186 data_loss_ = data_loss_info.status; 241 data_loss_ = data_loss_info.status;
187 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); 242 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_);
188 int32_t ipc_database_id = 243 database_sent_ = true;
189 dispatcher_host_->Add(connection.release(), origin_); 244 std::unique_ptr<DatabaseImpl> database(
190 if (ipc_database_id < 0) 245 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_));
191 return;
192
193 ipc_database_id_ = ipc_database_id;
194 246
195 BrowserThread::PostTask( 247 BrowserThread::PostTask(
196 BrowserThread::IO, FROM_HERE, 248 BrowserThread::IO, FROM_HERE,
197 base::Bind(&IOThreadHelper::SendUpgradeNeeded, 249 base::Bind(&IOThreadHelper::SendUpgradeNeeded,
198 base::Unretained(io_helper_.get()), ipc_database_id, 250 base::Unretained(io_helper_.get()), base::Passed(&database),
199 old_version, data_loss_info.status, data_loss_info.message, 251 old_version, data_loss_info.status, data_loss_info.message,
200 metadata)); 252 metadata));
201 253
202 if (!connection_open_start_time_.is_null()) { 254 if (!connection_open_start_time_.is_null()) {
203 UMA_HISTOGRAM_MEDIUM_TIMES( 255 UMA_HISTOGRAM_MEDIUM_TIMES(
204 "WebCore.IndexedDB.OpenTime.UpgradeNeeded", 256 "WebCore.IndexedDB.OpenTime.UpgradeNeeded",
205 base::TimeTicks::Now() - connection_open_start_time_); 257 base::TimeTicks::Now() - connection_open_start_time_);
206 connection_open_start_time_ = base::TimeTicks(); 258 connection_open_start_time_ = base::TimeTicks();
207 } 259 }
208 } 260 }
209 261
210 void IndexedDBCallbacks::OnSuccess( 262 void IndexedDBCallbacks::OnSuccess(
211 std::unique_ptr<IndexedDBConnection> connection, 263 std::unique_ptr<IndexedDBConnection> connection,
212 const IndexedDBDatabaseMetadata& metadata) { 264 const IndexedDBDatabaseMetadata& metadata) {
213 DCHECK(thread_checker_.CalledOnValidThread()); 265 DCHECK(thread_checker_.CalledOnValidThread());
214 DCHECK(dispatcher_host_); 266 DCHECK(dispatcher_host_);
215 DCHECK(io_helper_); 267 DCHECK(io_helper_);
268
216 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 269 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
217 DCHECK_NE(kNoTransaction, host_transaction_id_); 270 DCHECK_NE(kNoTransaction, host_transaction_id_);
218 DCHECK_NE(ipc_database_id_ == kNoDatabase, !connection); 271 DCHECK_EQ(database_sent_, !connection);
219 272
220 scoped_refptr<IndexedDBCallbacks> self(this); 273 scoped_refptr<IndexedDBCallbacks> self(this);
221 274
222 int32_t ipc_object_id = kNoDatabase; 275 // Only send a new Database if the connection was not previously sent in
223 // Only register if the connection was not previously sent in OnUpgradeNeeded. 276 // OnUpgradeNeeded.
224 if (ipc_database_id_ == kNoDatabase) { 277 std::unique_ptr<DatabaseImpl> database;
225 ipc_object_id = dispatcher_host_->Add(connection.release(), origin_); 278 if (!database_sent_)
226 } 279 database.reset(
280 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_));
227 281
228 BrowserThread::PostTask( 282 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
229 BrowserThread::IO, FROM_HERE, 283 base::Bind(&IOThreadHelper::SendSuccessDatabase,
230 base::Bind(&IOThreadHelper::SendSuccessDatabase, 284 base::Unretained(io_helper_.get()),
231 base::Unretained(io_helper_.get()), ipc_object_id, metadata)); 285 base::Passed(&database), metadata));
232 dispatcher_host_ = nullptr; 286 dispatcher_host_ = nullptr;
233 287
234 if (!connection_open_start_time_.is_null()) { 288 if (!connection_open_start_time_.is_null()) {
235 UMA_HISTOGRAM_MEDIUM_TIMES( 289 UMA_HISTOGRAM_MEDIUM_TIMES(
236 "WebCore.IndexedDB.OpenTime.Success", 290 "WebCore.IndexedDB.OpenTime.Success",
237 base::TimeTicks::Now() - connection_open_start_time_); 291 base::TimeTicks::Now() - connection_open_start_time_);
238 connection_open_start_time_ = base::TimeTicks(); 292 connection_open_start_time_ = base::TimeTicks();
239 } 293 }
240 } 294 }
241 295
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 for (size_t i = 0; i < values.size(); ++i) { 352 for (size_t i = 0; i < values.size(); ++i) {
299 if (!CreateAllBlobs(values[i].blob_info, 353 if (!CreateAllBlobs(values[i].blob_info,
300 &params->values[i].blob_or_file_info, dispatcher_host)) 354 &params->values[i].blob_or_file_info, dispatcher_host))
301 return; 355 return;
302 } 356 }
303 357
304 dispatcher_host->Send( 358 dispatcher_host->Send(
305 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params)); 359 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params));
306 } 360 }
307 361
308 static void BlobLookupForGetAll(
309 IndexedDBMsg_CallbacksSuccessArray_Params* params,
310 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
311 const std::vector<IndexedDBReturnValue>& values) {
312 DCHECK_CURRENTLY_ON(BrowserThread::IO);
313 DCHECK_EQ(values.size(), params->values.size());
314
315 for (size_t i = 0; i < values.size(); ++i) {
316 if (!CreateAllBlobs(values[i].blob_info,
317 &params->values[i].blob_or_file_info, dispatcher_host))
318 return;
319 }
320
321 dispatcher_host->Send(new IndexedDBMsg_CallbacksSuccessArray(*params));
322 }
323
324 static void FillInBlobData( 362 static void FillInBlobData(
325 const std::vector<IndexedDBBlobInfo>& blob_info, 363 const std::vector<IndexedDBBlobInfo>& blob_info,
326 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) { 364 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
327 for (const auto& iter : blob_info) { 365 for (const auto& iter : blob_info) {
328 if (iter.is_file()) { 366 if (iter.is_file()) {
329 IndexedDBMsg_BlobOrFileInfo info; 367 IndexedDBMsg_BlobOrFileInfo info;
330 info.is_file = true; 368 info.is_file = true;
331 info.mime_type = iter.type(); 369 info.mime_type = iter.type();
332 info.file_name = iter.file_name(); 370 info.file_name = iter.file_name();
333 info.file_path = iter.file_path().AsUTF16Unsafe(); 371 info.file_path = iter.file_path().AsUTF16Unsafe();
(...skipping 19 matching lines...) Expand all
353 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); 391 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
354 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); 392 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback);
355 } 393 }
356 394
357 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, 395 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor,
358 const IndexedDBKey& key, 396 const IndexedDBKey& key,
359 const IndexedDBKey& primary_key, 397 const IndexedDBKey& primary_key,
360 IndexedDBValue* value) { 398 IndexedDBValue* value) {
361 DCHECK(thread_checker_.CalledOnValidThread()); 399 DCHECK(thread_checker_.CalledOnValidThread());
362 DCHECK(dispatcher_host_); 400 DCHECK(dispatcher_host_);
363 DCHECK(!io_helper_); 401 DCHECK(io_helper_);
364 402
365 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 403 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
366 DCHECK_EQ(kNoTransaction, host_transaction_id_); 404 DCHECK_EQ(kNoTransaction, host_transaction_id_);
367 DCHECK_EQ(kNoDatabase, ipc_database_id_);
368 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 405 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
369 406
370 int32_t ipc_object_id = dispatcher_host_->Add(cursor.get()); 407 ::indexed_db::mojom::ValuePtr mojo_value;
371 std::unique_ptr<IndexedDBMsg_CallbacksSuccessIDBCursor_Params> params( 408 std::vector<IndexedDBBlobInfo> blob_info;
372 new IndexedDBMsg_CallbacksSuccessIDBCursor_Params()); 409 if (value) {
373 params->ipc_thread_id = ipc_thread_id_; 410 mojo_value = ::indexed_db::mojom::Value::New();
374 params->ipc_callbacks_id = ipc_callbacks_id_; 411 if (!value->empty())
375 params->ipc_cursor_id = ipc_object_id; 412 std::swap(mojo_value->bits, value->bits);
376 params->key = key; 413 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info);
377 params->primary_key = primary_key; 414 blob_info = value->blob_info;
dcheng 2016/11/03 04:27:04 This is pretty complicated and a bit hard to follo
Reilly Grant (use Gerrit) 2016/11/03 21:32:22 I am hoping that once blobs are using Mojo this wi
378 if (value && !value->empty())
379 std::swap(params->value.bits, value->bits);
380 // TODO(alecflett): Avoid a copy here: the whole params object is
381 // being copied into the message.
382 if (!value || value->blob_info.empty()) {
383 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(*params));
384 } else {
385 IndexedDBMsg_CallbacksSuccessIDBCursor_Params* p = params.get();
386 FillInBlobData(value->blob_info, &p->value.blob_or_file_info);
387 RegisterBlobsAndSend(
388 value->blob_info,
389 base::Bind(
390 CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessIDBCursor_Params,
391 IndexedDBMsg_CallbacksSuccessIDBCursor>,
392 base::Owned(params.release()), dispatcher_host_, value->blob_info,
393 base::Unretained(&p->value.blob_or_file_info)));
394 } 415 }
416
417 BrowserThread::PostTask(
418 BrowserThread::IO, FROM_HERE,
419 base::Bind(&IOThreadHelper::SendSuccessCursor,
420 base::Unretained(io_helper_.get()),
421 dispatcher_host_->Add(cursor.get()), key, primary_key,
422 base::Passed(&mojo_value), base::Passed(&blob_info)));
395 dispatcher_host_ = nullptr; 423 dispatcher_host_ = nullptr;
396 } 424 }
397 425
398 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, 426 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key,
399 const IndexedDBKey& primary_key, 427 const IndexedDBKey& primary_key,
400 IndexedDBValue* value) { 428 IndexedDBValue* value) {
401 DCHECK(thread_checker_.CalledOnValidThread()); 429 DCHECK(thread_checker_.CalledOnValidThread());
402 DCHECK(dispatcher_host_); 430 DCHECK(dispatcher_host_);
403 DCHECK(!io_helper_); 431 DCHECK(!io_helper_);
404 432
405 DCHECK_NE(kNoCursor, ipc_cursor_id_); 433 DCHECK_NE(kNoCursor, ipc_cursor_id_);
406 DCHECK_EQ(kNoTransaction, host_transaction_id_); 434 DCHECK_EQ(kNoTransaction, host_transaction_id_);
407 DCHECK_EQ(kNoDatabase, ipc_database_id_);
408 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 435 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
409 436
410 IndexedDBCursor* idb_cursor = 437 IndexedDBCursor* idb_cursor =
411 dispatcher_host_->GetCursorFromId(ipc_cursor_id_); 438 dispatcher_host_->GetCursorFromId(ipc_cursor_id_);
412 439
413 DCHECK(idb_cursor); 440 DCHECK(idb_cursor);
414 if (!idb_cursor) 441 if (!idb_cursor)
415 return; 442 return;
416 443
417 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params( 444 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params(
(...skipping 30 matching lines...) Expand all
448 const std::vector<IndexedDBKey>& primary_keys, 475 const std::vector<IndexedDBKey>& primary_keys,
449 std::vector<IndexedDBValue>* values) { 476 std::vector<IndexedDBValue>* values) {
450 DCHECK(thread_checker_.CalledOnValidThread()); 477 DCHECK(thread_checker_.CalledOnValidThread());
451 DCHECK(dispatcher_host_); 478 DCHECK(dispatcher_host_);
452 DCHECK(!io_helper_); 479 DCHECK(!io_helper_);
453 DCHECK_EQ(keys.size(), primary_keys.size()); 480 DCHECK_EQ(keys.size(), primary_keys.size());
454 DCHECK_EQ(keys.size(), values->size()); 481 DCHECK_EQ(keys.size(), values->size());
455 482
456 DCHECK_NE(kNoCursor, ipc_cursor_id_); 483 DCHECK_NE(kNoCursor, ipc_cursor_id_);
457 DCHECK_EQ(kNoTransaction, host_transaction_id_); 484 DCHECK_EQ(kNoTransaction, host_transaction_id_);
458 DCHECK_EQ(kNoDatabase, ipc_database_id_);
459 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 485 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
460 486
461 std::vector<IndexedDBKey> msg_keys; 487 std::vector<IndexedDBKey> msg_keys;
462 std::vector<IndexedDBKey> msg_primary_keys; 488 std::vector<IndexedDBKey> msg_primary_keys;
463 489
464 for (size_t i = 0; i < keys.size(); ++i) { 490 for (size_t i = 0; i < keys.size(); ++i) {
465 msg_keys.push_back(keys[i]); 491 msg_keys.push_back(keys[i]);
466 msg_primary_keys.push_back(primary_keys[i]); 492 msg_primary_keys.push_back(primary_keys[i]);
467 } 493 }
468 494
(...skipping 30 matching lines...) Expand all
499 } else { 525 } else {
500 dispatcher_host_->Send( 526 dispatcher_host_->Send(
501 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); 527 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get()));
502 } 528 }
503 dispatcher_host_ = nullptr; 529 dispatcher_host_ = nullptr;
504 } 530 }
505 531
506 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { 532 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) {
507 DCHECK(thread_checker_.CalledOnValidThread()); 533 DCHECK(thread_checker_.CalledOnValidThread());
508 DCHECK(dispatcher_host_); 534 DCHECK(dispatcher_host_);
509 DCHECK(!io_helper_);
510 535
511 if (value && value->primary_key.IsValid()) { 536 if (value && value->primary_key.IsValid()) {
512 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 537 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
513 } else { 538 } else {
514 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL); 539 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL);
515 } 540 }
516 DCHECK_EQ(kNoTransaction, host_transaction_id_); 541 DCHECK_EQ(kNoTransaction, host_transaction_id_);
517 DCHECK_EQ(kNoDatabase, ipc_database_id_);
518 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 542 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
519 543
520 std::unique_ptr<IndexedDBMsg_CallbacksSuccessValue_Params> params( 544 if (io_helper_) {
521 new IndexedDBMsg_CallbacksSuccessValue_Params()); 545 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
522 params->ipc_thread_id = ipc_thread_id_; 546
523 params->ipc_callbacks_id = ipc_callbacks_id_; 547 ::indexed_db::mojom::ReturnValuePtr mojo_value;
524 if (value && value->primary_key.IsValid()) { 548 std::vector<IndexedDBBlobInfo> blob_info;
525 params->value.primary_key = value->primary_key; 549 if (value) {
526 params->value.key_path = value->key_path; 550 mojo_value = ConvertReturnValue(value);
527 } 551 blob_info = value->blob_info;
528 if (value && !value->empty()) 552 }
529 std::swap(params->value.bits, value->bits); 553 BrowserThread::PostTask(
530 if (!value || value->blob_info.empty()) { 554 BrowserThread::IO, FROM_HERE,
531 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params)); 555 base::Bind(&IOThreadHelper::SendSuccessValue,
556 base::Unretained(io_helper_.get()),
557 base::Passed(&mojo_value), base::Passed(&blob_info)));
532 } else { 558 } else {
533 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get(); 559 std::unique_ptr<IndexedDBMsg_CallbacksSuccessValue_Params> params(
534 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); 560 new IndexedDBMsg_CallbacksSuccessValue_Params());
535 RegisterBlobsAndSend( 561 params->ipc_thread_id = ipc_thread_id_;
536 value->blob_info, 562 params->ipc_callbacks_id = ipc_callbacks_id_;
537 base::Bind(CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params, 563 if (value && value->primary_key.IsValid()) {
538 IndexedDBMsg_CallbacksSuccessValue>, 564 params->value.primary_key = value->primary_key;
539 base::Owned(params.release()), dispatcher_host_, 565 params->value.key_path = value->key_path;
540 value->blob_info, 566 }
541 base::Unretained(&p->value.blob_or_file_info))); 567 if (value && !value->empty())
568 std::swap(params->value.bits, value->bits);
569 if (!value || value->blob_info.empty()) {
570 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params));
571 } else {
572 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get();
573 FillInBlobData(value->blob_info, &p->value.blob_or_file_info);
574 RegisterBlobsAndSend(
575 value->blob_info,
576 base::Bind(
577 CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params,
578 IndexedDBMsg_CallbacksSuccessValue>,
579 base::Owned(params.release()), dispatcher_host_, value->blob_info,
580 base::Unretained(&p->value.blob_or_file_info)));
581 }
542 } 582 }
543 dispatcher_host_ = nullptr; 583 dispatcher_host_ = nullptr;
544 } 584 }
545 585
546 void IndexedDBCallbacks::OnSuccessArray( 586 void IndexedDBCallbacks::OnSuccessArray(
547 std::vector<IndexedDBReturnValue>* values, 587 std::vector<IndexedDBReturnValue>* values) {
548 const IndexedDBKeyPath& key_path) {
549 DCHECK(thread_checker_.CalledOnValidThread()); 588 DCHECK(thread_checker_.CalledOnValidThread());
550 DCHECK(dispatcher_host_); 589 DCHECK(dispatcher_host_);
551 DCHECK(!io_helper_); 590 DCHECK(io_helper_);
552 591
553 DCHECK_EQ(kNoTransaction, host_transaction_id_); 592 DCHECK_EQ(kNoTransaction, host_transaction_id_);
554 DCHECK_EQ(kNoDatabase, ipc_database_id_);
555 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 593 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
594 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
556 595
557 std::unique_ptr<IndexedDBMsg_CallbacksSuccessArray_Params> params( 596 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values;
558 new IndexedDBMsg_CallbacksSuccessArray_Params()); 597 mojo_values.reserve(values->size());
559 params->ipc_thread_id = ipc_thread_id_; 598 for (size_t i = 0; i < values->size(); ++i)
560 params->ipc_callbacks_id = ipc_callbacks_id_; 599 mojo_values.push_back(ConvertReturnValue(&(*values)[i]));
561 params->values.resize(values->size());
562 600
563 bool found_blob_info = false; 601 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
564 for (size_t i = 0; i < values->size(); ++i) { 602 base::Bind(&IOThreadHelper::SendSuccessArray,
565 IndexedDBMsg_ReturnValue& pvalue = params->values[i]; 603 base::Unretained(io_helper_.get()),
566 IndexedDBReturnValue& value = (*values)[i]; 604 base::Passed(&mojo_values), *values));
567 pvalue.bits.swap(value.bits);
568 if (!value.blob_info.empty()) {
569 found_blob_info = true;
570 FillInBlobData(value.blob_info, &pvalue.blob_or_file_info);
571 for (const auto& blob_info : value.blob_info) {
572 if (!blob_info.mark_used_callback().is_null())
573 blob_info.mark_used_callback().Run();
574 }
575 }
576 pvalue.primary_key = value.primary_key;
577 pvalue.key_path = key_path;
578 }
579
580 if (found_blob_info) {
581 BrowserThread::PostTask(
582 BrowserThread::IO, FROM_HERE,
583 base::Bind(BlobLookupForGetAll, base::Owned(params.release()),
584 dispatcher_host_, *values));
585 } else {
586 dispatcher_host_->Send(
587 new IndexedDBMsg_CallbacksSuccessArray(*params.get()));
588 }
589 dispatcher_host_ = nullptr; 605 dispatcher_host_ = nullptr;
590 } 606 }
591 607
592 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { 608 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) {
593 DCHECK(thread_checker_.CalledOnValidThread()); 609 DCHECK(thread_checker_.CalledOnValidThread());
594 DCHECK(dispatcher_host_); 610 DCHECK(dispatcher_host_);
595 DCHECK(!io_helper_); 611 DCHECK(io_helper_);
596 612
597 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 613 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
598 DCHECK_EQ(kNoTransaction, host_transaction_id_); 614 DCHECK_EQ(kNoTransaction, host_transaction_id_);
599 DCHECK_EQ(kNoDatabase, ipc_database_id_);
600 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 615 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
601 616
602 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIndexedDBKey( 617 BrowserThread::PostTask(
603 ipc_thread_id_, ipc_callbacks_id_, value)); 618 BrowserThread::IO, FROM_HERE,
619 base::Bind(&IOThreadHelper::SendSuccessKey,
620 base::Unretained(io_helper_.get()), value));
604 dispatcher_host_ = nullptr; 621 dispatcher_host_ = nullptr;
605 } 622 }
606 623
607 void IndexedDBCallbacks::OnSuccess(int64_t value) { 624 void IndexedDBCallbacks::OnSuccess(int64_t value) {
608 DCHECK(thread_checker_.CalledOnValidThread()); 625 DCHECK(thread_checker_.CalledOnValidThread());
609 DCHECK(dispatcher_host_); 626 DCHECK(dispatcher_host_);
610 if (io_helper_) { 627 if (io_helper_) {
611 BrowserThread::PostTask( 628 BrowserThread::PostTask(
612 BrowserThread::IO, FROM_HERE, 629 BrowserThread::IO, FROM_HERE,
613 base::Bind(&IOThreadHelper::SendSuccessInteger, 630 base::Bind(&IOThreadHelper::SendSuccessInteger,
614 base::Unretained(io_helper_.get()), value)); 631 base::Unretained(io_helper_.get()), value));
615 } else { 632 } else {
616 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 633 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
617 DCHECK_EQ(kNoTransaction, host_transaction_id_); 634 DCHECK_EQ(kNoTransaction, host_transaction_id_);
618 DCHECK_EQ(kNoDatabase, ipc_database_id_);
619 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 635 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
620 636
621 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger( 637 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger(
622 ipc_thread_id_, ipc_callbacks_id_, value)); 638 ipc_thread_id_, ipc_callbacks_id_, value));
623 } 639 }
624 dispatcher_host_ = nullptr; 640 dispatcher_host_ = nullptr;
625 } 641 }
626 642
627 void IndexedDBCallbacks::OnSuccess() { 643 void IndexedDBCallbacks::OnSuccess() {
628 DCHECK(thread_checker_.CalledOnValidThread()); 644 DCHECK(thread_checker_.CalledOnValidThread());
629 DCHECK(dispatcher_host_); 645 DCHECK(dispatcher_host_);
630 DCHECK(!io_helper_); 646 DCHECK(io_helper_);
631 647
632 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 648 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
633 DCHECK_EQ(kNoTransaction, host_transaction_id_); 649 DCHECK_EQ(kNoTransaction, host_transaction_id_);
634 DCHECK_EQ(kNoDatabase, ipc_database_id_);
635 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 650 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
636 651
637 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined( 652 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
638 ipc_thread_id_, ipc_callbacks_id_)); 653 base::Bind(&IOThreadHelper::SendSuccess,
654 base::Unretained(io_helper_.get())));
639 dispatcher_host_ = nullptr; 655 dispatcher_host_ = nullptr;
640 } 656 }
641 657
642 bool IndexedDBCallbacks::IsValid() const { 658 bool IndexedDBCallbacks::IsValid() const {
643 DCHECK(dispatcher_host_.get()); 659 DCHECK(dispatcher_host_.get());
644 660
645 return dispatcher_host_->IsOpen(); 661 return dispatcher_host_->IsOpen();
646 } 662 }
647 663
648 void IndexedDBCallbacks::SetConnectionOpenStartTime( 664 void IndexedDBCallbacks::SetConnectionOpenStartTime(
649 const base::TimeTicks& start_time) { 665 const base::TimeTicks& start_time) {
650 connection_open_start_time_ = start_time; 666 connection_open_start_time_ = start_time;
651 } 667 }
652 668
653 IndexedDBCallbacks::IOThreadHelper::IOThreadHelper( 669 IndexedDBCallbacks::IOThreadHelper::IOThreadHelper(
654 CallbacksAssociatedPtrInfo callbacks_info) { 670 CallbacksAssociatedPtrInfo callbacks_info,
671 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host)
672 : dispatcher_host_(std::move(dispatcher_host)) {
655 DCHECK_CURRENTLY_ON(BrowserThread::IO); 673 DCHECK_CURRENTLY_ON(BrowserThread::IO);
656 callbacks_.Bind(std::move(callbacks_info)); 674 callbacks_.Bind(std::move(callbacks_info));
657 } 675 }
658 676
659 IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {} 677 IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {}
660 678
661 void IndexedDBCallbacks::IOThreadHelper::SendError( 679 void IndexedDBCallbacks::IOThreadHelper::SendError(
662 const IndexedDBDatabaseError& error) { 680 const IndexedDBDatabaseError& error) {
663 callbacks_->Error(error.code(), error.message()); 681 callbacks_->Error(error.code(), error.message());
664 } 682 }
665 683
666 void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList( 684 void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList(
667 const std::vector<base::string16>& value) { 685 const std::vector<base::string16>& value) {
668 callbacks_->SuccessStringList(value); 686 callbacks_->SuccessStringList(value);
669 } 687 }
670 688
671 void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) { 689 void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) {
672 callbacks_->Blocked(existing_version); 690 callbacks_->Blocked(existing_version);
673 } 691 }
674 692
675 void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded( 693 void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded(
676 int32_t database_id, 694 std::unique_ptr<DatabaseImpl> database,
677 int64_t old_version, 695 int64_t old_version,
678 blink::WebIDBDataLoss data_loss, 696 blink::WebIDBDataLoss data_loss,
679 const std::string& data_loss_message, 697 const std::string& data_loss_message,
680 const content::IndexedDBDatabaseMetadata& metadata) { 698 const content::IndexedDBDatabaseMetadata& metadata) {
681 callbacks_->UpgradeNeeded(database_id, old_version, data_loss, 699 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info;
700 ::indexed_db::mojom::DatabaseAssociatedRequest request;
701 callbacks_.associated_group()->CreateAssociatedInterface(
702 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
703 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request));
704 callbacks_->UpgradeNeeded(std::move(ptr_info), old_version, data_loss,
682 data_loss_message, metadata); 705 data_loss_message, metadata);
683 } 706 }
684 707
685 void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase( 708 void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase(
686 int32_t database_id, 709 std::unique_ptr<DatabaseImpl> database,
687 const content::IndexedDBDatabaseMetadata& metadata) { 710 const content::IndexedDBDatabaseMetadata& metadata) {
688 callbacks_->SuccessDatabase(database_id, metadata); 711 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info;
712 if (database) {
713 ::indexed_db::mojom::DatabaseAssociatedRequest request;
714 callbacks_.associated_group()->CreateAssociatedInterface(
715 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
716 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request));
717 }
718 callbacks_->SuccessDatabase(std::move(ptr_info), metadata);
719 }
720
721 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor(
722 int32_t cursor_id,
723 const IndexedDBKey& key,
724 const IndexedDBKey& primary_key,
725 ::indexed_db::mojom::ValuePtr value,
726 const std::vector<IndexedDBBlobInfo>& blob_info) {
727 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info))
728 callbacks_->SuccessCursor(cursor_id, key, primary_key, std::move(value));
729 }
730
731 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue(
732 ::indexed_db::mojom::ReturnValuePtr value,
733 const std::vector<IndexedDBBlobInfo>& blob_info) {
734 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info))
735 callbacks_->SuccessValue(std::move(value));
736 }
737
738 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray(
739 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values,
740 const std::vector<IndexedDBReturnValue>& values) {
741 DCHECK_EQ(mojo_values.size(), values.size());
742
743 for (size_t i = 0; i < mojo_values.size(); ++i) {
744 if (!CreateAllBlobs(values[i].blob_info,
745 &mojo_values[i]->value->blob_or_file_info))
746 return;
747 }
748 callbacks_->SuccessArray(std::move(mojo_values));
749 }
750
751 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey(
752 const IndexedDBKey& value) {
753 callbacks_->SuccessKey(value);
689 } 754 }
690 755
691 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { 756 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) {
692 callbacks_->SuccessInteger(value); 757 callbacks_->SuccessInteger(value);
693 } 758 }
694 759
760 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() {
761 callbacks_->Success();
762 }
763
764 std::string IndexedDBCallbacks::IOThreadHelper::CreateBlobData(
765 const IndexedDBBlobInfo& blob_info) {
766 if (!blob_info.uuid().empty()) {
767 // We're sending back a live blob, not a reference into our backing store.
768 return dispatcher_host_->HoldBlobData(blob_info);
769 }
770 scoped_refptr<ShareableFileReference> shareable_file =
771 ShareableFileReference::Get(blob_info.file_path());
772 if (!shareable_file.get()) {
dcheng 2016/11/03 04:27:04 Nit: no .get()
Reilly Grant (use Gerrit) 2016/11/03 21:32:22 Done.
773 shareable_file = ShareableFileReference::GetOrCreate(
774 blob_info.file_path(),
775 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
776 dispatcher_host_->context()->TaskRunner());
777 if (!blob_info.release_callback().is_null())
778 shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
779 }
780 return dispatcher_host_->HoldBlobData(blob_info);
781 }
782
783 bool IndexedDBCallbacks::IOThreadHelper::CreateAllBlobs(
784 const std::vector<IndexedDBBlobInfo>& blob_info,
785 std::vector<::indexed_db::mojom::BlobOrFileInfoPtr>* blob_or_file_info) {
786 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs");
787 DCHECK_EQ(blob_info.size(), blob_or_file_info->size());
788 if (!dispatcher_host_->blob_storage_context())
789 return false;
790 for (size_t i = 0; i < blob_info.size(); ++i)
791 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]);
792 return true;
793 }
794
695 } // namespace content 795 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698