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

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

Powered by Google App Engine
This is Rietveld 408576698