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

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

Issue 18023022: Blob support for IDB [Chromium] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use ScopedVector and stl_utils for BlobDataHandles. Created 7 years 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 | Annotate | Revision Log
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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/guid.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/time/time.h"
12 #include "content/browser/child_process_security_policy_impl.h"
13 #include "content/browser/fileapi/fileapi_message_filter.h"
14 #include "content/browser/indexed_db/indexed_db_blob_info.h"
9 #include "content/browser/indexed_db/indexed_db_connection.h" 15 #include "content/browser/indexed_db/indexed_db_connection.h"
16 #include "content/browser/indexed_db/indexed_db_context_impl.h"
10 #include "content/browser/indexed_db/indexed_db_cursor.h" 17 #include "content/browser/indexed_db/indexed_db_cursor.h"
11 #include "content/browser/indexed_db/indexed_db_database_callbacks.h" 18 #include "content/browser/indexed_db/indexed_db_database_callbacks.h"
12 #include "content/browser/indexed_db/indexed_db_database_error.h" 19 #include "content/browser/indexed_db/indexed_db_database_error.h"
13 #include "content/browser/indexed_db/indexed_db_metadata.h" 20 #include "content/browser/indexed_db/indexed_db_metadata.h"
21 #include "content/browser/indexed_db/indexed_db_value.h"
14 #include "content/common/indexed_db/indexed_db_constants.h" 22 #include "content/common/indexed_db/indexed_db_constants.h"
15 #include "content/common/indexed_db/indexed_db_messages.h" 23 #include "content/common/indexed_db/indexed_db_messages.h"
24 #include "webkit/browser/blob/blob_storage_context.h"
16 #include "webkit/browser/quota/quota_manager.h" 25 #include "webkit/browser/quota/quota_manager.h"
26 #include "webkit/common/blob/blob_data.h"
27 #include "webkit/common/blob/shareable_file_reference.h"
28
29 using webkit_blob::ShareableFileReference;
17 30
18 namespace content { 31 namespace content {
19 32
20 namespace { 33 namespace {
21 const int32 kNoCursor = -1; 34 const int32 kNoCursor = -1;
22 const int32 kNoDatabaseCallbacks = -1; 35 const int32 kNoDatabaseCallbacks = -1;
23 const int64 kNoTransaction = -1; 36 const int64 kNoTransaction = -1;
24 } 37 }
25 38
26 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, 39 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 165
153 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBDatabase( 166 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBDatabase(
154 ipc_thread_id_, 167 ipc_thread_id_,
155 ipc_callbacks_id_, 168 ipc_callbacks_id_,
156 ipc_database_callbacks_id_, 169 ipc_database_callbacks_id_,
157 ipc_object_id, 170 ipc_object_id,
158 IndexedDBDispatcherHost::ConvertMetadata(metadata))); 171 IndexedDBDispatcherHost::ConvertMetadata(metadata)));
159 dispatcher_host_ = NULL; 172 dispatcher_host_ = NULL;
160 } 173 }
161 174
175 static std::string CreateBlobData(
176 const IndexedDBBlobInfo& blob_info,
177 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
178 webkit_blob::BlobStorageContext* blob_storage_context,
179 base::TaskRunner* task_runner) {
180 scoped_refptr<ShareableFileReference> shareable_file =
181 ShareableFileReference::Get(blob_info.file_path());
182 if (!shareable_file.get()) {
183 shareable_file = ShareableFileReference::GetOrCreate(
184 blob_info.file_path(),
185 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
186 task_runner);
187 shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
188 }
189
190 std::string uuid(base::GenerateGUID());
191 scoped_refptr<webkit_blob::BlobData> blob_data =
192 new webkit_blob::BlobData(uuid);
193 blob_data->AppendFile(blob_info.file_path(), 0, blob_info.size(),
194 blob_info.last_modified());
195 scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle(
196 blob_storage_context->AddFinishedBlob(blob_data.get()));
197 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle);
198
199 return uuid;
200 }
201
202 static bool CreateAllBlobs(
203 const std::vector<IndexedDBBlobInfo>& blob_info,
204 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info,
205 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) {
206 size_t i;
207 if (!dispatcher_host->blob_storage_context())
208 return false;
209 for (i = 0; i < blob_info.size(); ++i) {
210 (*blob_or_file_info)[i].uuid =
211 CreateBlobData(blob_info[i], dispatcher_host,
212 dispatcher_host->blob_storage_context(),
213 dispatcher_host->Context()->TaskRunner());
214 }
215 return true;
216 }
217
218 static void BlobLookupForIDBCursor(
219 IndexedDBMsg_CallbacksSuccessIDBCursor_Params* params,
220 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
221 const std::vector<IndexedDBBlobInfo>& blob_info,
222 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
223 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
224 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
225 dispatcher_host->Send(
226 new IndexedDBMsg_CallbacksSuccessIDBCursor(*params));
227 }
228
229 static void BlobLookupForCursorContinue(
230 IndexedDBMsg_CallbacksSuccessCursorContinue_Params* params,
231 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
232 const std::vector<IndexedDBBlobInfo>& blob_info,
233 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
235 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
236 dispatcher_host->Send(
237 new IndexedDBMsg_CallbacksSuccessCursorContinue(*params));
238 }
239
240 static void BlobLookupForValueWithKey(
241 IndexedDBMsg_CallbacksSuccessValueWithKey_Params* params,
242 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
243 const std::vector<IndexedDBBlobInfo>& blob_info,
244 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
245 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
246 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
247 dispatcher_host->Send(
248 new IndexedDBMsg_CallbacksSuccessValueWithKey(*params));
249 }
250
251 static void BlobLookupForValue(
252 IndexedDBMsg_CallbacksSuccessValue_Params* params,
253 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
254 const std::vector<IndexedDBBlobInfo>& blob_info,
255 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
256 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
257 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
258 dispatcher_host->Send(new IndexedDBMsg_CallbacksSuccessValue(*params));
259 }
260
261 static void BlobLookupForCursorPrefetch(
262 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params* params,
263 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
264 const std::vector<IndexedDBValue>& values,
265 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> >*
266 blob_or_file_infos) {
267 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
268 DCHECK(values.size() == blob_or_file_infos->size());
269
270 std::vector<IndexedDBValue>::const_iterator value_iter;
271 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> >::iterator blob_iter;
272 for (value_iter = values.begin(), blob_iter = blob_or_file_infos->begin();
273 value_iter != values.end(); ++value_iter, ++blob_iter) {
274 if (!CreateAllBlobs(value_iter->blob_info, &*blob_iter, dispatcher_host))
275 return;
276 }
277 dispatcher_host->Send(
278 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params));
279 }
280
281 static void FillInBlobData(
282 const std::vector<IndexedDBBlobInfo>& blob_info,
283 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
284 for (std::vector<IndexedDBBlobInfo>::const_iterator iter = blob_info.begin();
285 iter != blob_info.end(); ++iter) {
286 if (iter->is_file()) {
287 IndexedDBMsg_BlobOrFileInfo info;
288 info.is_file = true;
289 info.mime_type = iter->type();
290 info.file_name = iter->file_name();
291 info.file_path = iter->file_path().AsUTF16Unsafe();
292 DCHECK_NE(-1, iter->size());
293 info.size = iter->size();
294 info.last_modified = iter->last_modified().ToDoubleT();
295 blob_or_file_info->push_back(info);
296 } else {
297 IndexedDBMsg_BlobOrFileInfo info;
298 info.mime_type = iter->type();
299 info.size = iter->size();
300 blob_or_file_info->push_back(info);
301 }
302 }
303 }
304
305 void IndexedDBCallbacks::RegisterBlobsAndSend(
306 const std::vector<IndexedDBBlobInfo>& blob_info,
307 const base::Closure& callback) {
308 std::vector<IndexedDBBlobInfo>::const_iterator iter;
309 for (iter = blob_info.begin(); iter != blob_info.end(); ++iter) {
310 iter->mark_used_callback().Run();
311 }
312 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
313 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback);
314 }
315
162 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, 316 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor,
163 const IndexedDBKey& key, 317 const IndexedDBKey& key,
164 const IndexedDBKey& primary_key, 318 const IndexedDBKey& primary_key,
165 std::string* value) { 319 IndexedDBValue* value) {
166 DCHECK(dispatcher_host_.get()); 320 DCHECK(dispatcher_host_.get());
167 321
168 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 322 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
169 DCHECK_EQ(kNoTransaction, host_transaction_id_); 323 DCHECK_EQ(kNoTransaction, host_transaction_id_);
170 DCHECK_EQ(kNoDatabase, ipc_database_id_); 324 DCHECK_EQ(kNoDatabase, ipc_database_id_);
171 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 325 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
172 326
173 int32 ipc_object_id = dispatcher_host_->Add(cursor.get()); 327 int32 ipc_object_id = dispatcher_host_->Add(cursor.get());
174 IndexedDBMsg_CallbacksSuccessIDBCursor_Params params; 328 scoped_ptr<IndexedDBMsg_CallbacksSuccessIDBCursor_Params> params(
175 params.ipc_thread_id = ipc_thread_id_; 329 new IndexedDBMsg_CallbacksSuccessIDBCursor_Params());
176 params.ipc_callbacks_id = ipc_callbacks_id_; 330 params->ipc_thread_id = ipc_thread_id_;
177 params.ipc_cursor_id = ipc_object_id; 331 params->ipc_callbacks_id = ipc_callbacks_id_;
178 params.key = key; 332 params->ipc_cursor_id = ipc_object_id;
179 params.primary_key = primary_key; 333 params->key = key;
334 params->primary_key = primary_key;
180 if (value && !value->empty()) 335 if (value && !value->empty())
181 std::swap(params.value, *value); 336 std::swap(params->value, value->bits);
182 // TODO(alecflett): Avoid a copy here: the whole params object is 337 // TODO(alecflett): Avoid a copy here: the whole params object is
183 // being copied into the message. 338 // being copied into the message.
184 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(params)); 339 if (!value || value->blob_info.empty()) {
185 340 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(*params));
341 } else {
342 IndexedDBMsg_CallbacksSuccessIDBCursor_Params* p = params.get();
343 FillInBlobData(value->blob_info, &p->blob_or_file_info);
344 RegisterBlobsAndSend(
345 value->blob_info,
346 base::Bind(BlobLookupForIDBCursor, base::Owned(params.release()),
347 dispatcher_host_, value->blob_info,
348 base::Unretained(&p->blob_or_file_info)));
349 }
186 dispatcher_host_ = NULL; 350 dispatcher_host_ = NULL;
187 } 351 }
188 352
189 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, 353 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key,
190 const IndexedDBKey& primary_key, 354 const IndexedDBKey& primary_key,
191 std::string* value) { 355 IndexedDBValue* value) {
192 DCHECK(dispatcher_host_.get()); 356 DCHECK(dispatcher_host_.get());
193 357
194 DCHECK_NE(kNoCursor, ipc_cursor_id_); 358 DCHECK_NE(kNoCursor, ipc_cursor_id_);
195 DCHECK_EQ(kNoTransaction, host_transaction_id_); 359 DCHECK_EQ(kNoTransaction, host_transaction_id_);
196 DCHECK_EQ(kNoDatabase, ipc_database_id_); 360 DCHECK_EQ(kNoDatabase, ipc_database_id_);
197 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 361 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
198 362
199 IndexedDBCursor* idb_cursor = 363 IndexedDBCursor* idb_cursor =
200 dispatcher_host_->GetCursorFromId(ipc_cursor_id_); 364 dispatcher_host_->GetCursorFromId(ipc_cursor_id_);
201 365
202 DCHECK(idb_cursor); 366 DCHECK(idb_cursor);
203 if (!idb_cursor) 367 if (!idb_cursor)
204 return; 368 return;
205 IndexedDBMsg_CallbacksSuccessCursorContinue_Params params; 369
206 params.ipc_thread_id = ipc_thread_id_; 370 scoped_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params(
207 params.ipc_callbacks_id = ipc_callbacks_id_; 371 new IndexedDBMsg_CallbacksSuccessCursorContinue_Params());
208 params.ipc_cursor_id = ipc_cursor_id_; 372 params->ipc_thread_id = ipc_thread_id_;
209 params.key = key; 373 params->ipc_callbacks_id = ipc_callbacks_id_;
210 params.primary_key = primary_key; 374 params->ipc_cursor_id = ipc_cursor_id_;
375 params->key = key;
376 params->primary_key = primary_key;
211 if (value && !value->empty()) 377 if (value && !value->empty())
212 std::swap(params.value, *value); 378 std::swap(params->value, value->bits);
213 // TODO(alecflett): Avoid a copy here: the whole params object is 379 // TODO(alecflett): Avoid a copy here: the whole params object is
214 // being copied into the message. 380 // being copied into the message.
215 dispatcher_host_->Send( 381 if (!value || value->blob_info.empty()) {
216 new IndexedDBMsg_CallbacksSuccessCursorContinue(params)); 382 dispatcher_host_->Send(
383 new IndexedDBMsg_CallbacksSuccessCursorContinue(*params));
384 } else {
385 IndexedDBMsg_CallbacksSuccessCursorContinue_Params* p = params.get();
386 FillInBlobData(value->blob_info, &p->blob_or_file_info);
387 RegisterBlobsAndSend(
388 value->blob_info,
389 base::Bind(BlobLookupForCursorContinue, base::Owned(params.release()),
390 dispatcher_host_, value->blob_info,
391 base::Unretained(&p->blob_or_file_info)));
392 }
217 dispatcher_host_ = NULL; 393 dispatcher_host_ = NULL;
218 } 394 }
219 395
220 void IndexedDBCallbacks::OnSuccessWithPrefetch( 396 void IndexedDBCallbacks::OnSuccessWithPrefetch(
221 const std::vector<IndexedDBKey>& keys, 397 const std::vector<IndexedDBKey>& keys,
222 const std::vector<IndexedDBKey>& primary_keys, 398 const std::vector<IndexedDBKey>& primary_keys,
223 const std::vector<std::string>& values) { 399 std::vector<IndexedDBValue>& values) {
224 DCHECK_EQ(keys.size(), primary_keys.size()); 400 DCHECK_EQ(keys.size(), primary_keys.size());
225 DCHECK_EQ(keys.size(), values.size()); 401 DCHECK_EQ(keys.size(), values.size());
226 402
227 DCHECK(dispatcher_host_.get()); 403 DCHECK(dispatcher_host_.get());
228 404
229 DCHECK_NE(kNoCursor, ipc_cursor_id_); 405 DCHECK_NE(kNoCursor, ipc_cursor_id_);
230 DCHECK_EQ(kNoTransaction, host_transaction_id_); 406 DCHECK_EQ(kNoTransaction, host_transaction_id_);
231 DCHECK_EQ(kNoDatabase, ipc_database_id_); 407 DCHECK_EQ(kNoDatabase, ipc_database_id_);
232 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 408 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
233 409
234 std::vector<IndexedDBKey> msgKeys; 410 std::vector<IndexedDBKey> msgKeys;
235 std::vector<IndexedDBKey> msgPrimaryKeys; 411 std::vector<IndexedDBKey> msgPrimaryKeys;
236 412
237 for (size_t i = 0; i < keys.size(); ++i) { 413 for (size_t i = 0; i < keys.size(); ++i) {
238 msgKeys.push_back(keys[i]); 414 msgKeys.push_back(keys[i]);
239 msgPrimaryKeys.push_back(primary_keys[i]); 415 msgPrimaryKeys.push_back(primary_keys[i]);
240 } 416 }
241 417
242 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params params; 418 scoped_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params(
243 params.ipc_thread_id = ipc_thread_id_; 419 new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params());
244 params.ipc_callbacks_id = ipc_callbacks_id_; 420 params->ipc_thread_id = ipc_thread_id_;
245 params.ipc_cursor_id = ipc_cursor_id_; 421 params->ipc_callbacks_id = ipc_callbacks_id_;
246 params.keys = msgKeys; 422 params->ipc_cursor_id = ipc_cursor_id_;
247 params.primary_keys = msgPrimaryKeys; 423 params->keys = msgKeys;
248 params.values = values; 424 params->primary_keys = msgPrimaryKeys;
249 dispatcher_host_->Send( 425 std::vector<std::string> values_bits(values.size());
250 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(params)); 426 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> >
427 values_blob_infos(values.size());
428 std::vector<IndexedDBValue>::iterator iter = values.begin();
429
430 bool found_blob_info = false;
431 for (size_t i = 0; iter != values.end(); ++iter, ++i) {
432 values_bits[i].swap(iter->bits);
433 if (iter->blob_info.size()) {
434 found_blob_info = true;
435 FillInBlobData(iter->blob_info, &values_blob_infos[i]);
436 std::vector<IndexedDBBlobInfo>::const_iterator blob_iter;
437 for (blob_iter = iter->blob_info.begin();
438 blob_iter != iter->blob_info.end(); ++blob_iter) {
439 blob_iter->mark_used_callback().Run();
440 }
441 }
442 }
443
444 params->values.swap(values_bits);
445 params->blob_or_file_infos.swap(values_blob_infos);
446 if (found_blob_info) {
447 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
448 base::Bind(BlobLookupForCursorPrefetch, base::Owned(params.release()),
449 dispatcher_host_, values,
450 base::Unretained(&params->blob_or_file_infos)));
451 } else {
452 dispatcher_host_->Send(
453 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get()));
454 }
251 dispatcher_host_ = NULL; 455 dispatcher_host_ = NULL;
252 } 456 }
253 457
254 void IndexedDBCallbacks::OnSuccess(std::string* value, 458 void IndexedDBCallbacks::OnSuccess(IndexedDBValue* value,
255 const IndexedDBKey& key, 459 const IndexedDBKey& key,
256 const IndexedDBKeyPath& key_path) { 460 const IndexedDBKeyPath& key_path) {
257 DCHECK(dispatcher_host_.get()); 461 DCHECK(dispatcher_host_.get());
258 462
259 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 463 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
260 DCHECK_EQ(kNoTransaction, host_transaction_id_); 464 DCHECK_EQ(kNoTransaction, host_transaction_id_);
261 DCHECK_EQ(kNoDatabase, ipc_database_id_); 465 DCHECK_EQ(kNoDatabase, ipc_database_id_);
262 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 466 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
263 467
264 std::string value_copy; 468 scoped_ptr<IndexedDBMsg_CallbacksSuccessValueWithKey_Params> params(new
469 IndexedDBMsg_CallbacksSuccessValueWithKey_Params());
470 params->ipc_thread_id = ipc_thread_id_;
471 params->ipc_callbacks_id = ipc_callbacks_id_;
472 params->primary_key = key;
473 params->key_path = key_path;
265 if (value && !value->empty()) 474 if (value && !value->empty())
266 std::swap(value_copy, *value); 475 std::swap(params->value, value->bits);
267 476 if (!value || value->blob_info.empty()) {
268 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValueWithKey( 477 dispatcher_host_->Send(
269 ipc_thread_id_, 478 new IndexedDBMsg_CallbacksSuccessValueWithKey(*params));
270 ipc_callbacks_id_, 479 } else {
271 // TODO(alecflett): Avoid a copy here. 480 IndexedDBMsg_CallbacksSuccessValueWithKey_Params* p = params.get();
272 value_copy, 481 FillInBlobData(value->blob_info, &p->blob_or_file_info);
273 key, 482 RegisterBlobsAndSend(
274 key_path)); 483 value->blob_info,
484 base::Bind(BlobLookupForValueWithKey, base::Owned(params.release()),
485 dispatcher_host_, value->blob_info,
486 base::Unretained(&p->blob_or_file_info)));
487 }
275 dispatcher_host_ = NULL; 488 dispatcher_host_ = NULL;
276 } 489 }
277 490
278 void IndexedDBCallbacks::OnSuccess(std::string* value) { 491 void IndexedDBCallbacks::OnSuccess(IndexedDBValue* value) {
279 DCHECK(dispatcher_host_.get()); 492 DCHECK(dispatcher_host_.get());
280
281 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL); 493 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL);
282 DCHECK_EQ(kNoTransaction, host_transaction_id_); 494 DCHECK_EQ(kNoTransaction, host_transaction_id_);
283 DCHECK_EQ(kNoDatabase, ipc_database_id_); 495 DCHECK_EQ(kNoDatabase, ipc_database_id_);
284 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 496 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
285 497
286 std::string value_copy; 498 scoped_ptr<IndexedDBMsg_CallbacksSuccessValue_Params> params(new
499 IndexedDBMsg_CallbacksSuccessValue_Params());
500 params->ipc_thread_id = ipc_thread_id_;
501 params->ipc_callbacks_id = ipc_callbacks_id_;
287 if (value && !value->empty()) 502 if (value && !value->empty())
288 std::swap(value_copy, *value); 503 std::swap(params->value, value->bits);
289 504 if (!value || value->blob_info.empty()) {
290 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue( 505 dispatcher_host_->Send(
291 ipc_thread_id_, 506 new IndexedDBMsg_CallbacksSuccessValue(*params));
292 ipc_callbacks_id_, 507 } else {
293 // TODO(alecflett): avoid a copy here. 508 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get();
294 value_copy)); 509 FillInBlobData(value->blob_info, &p->blob_or_file_info);
510 RegisterBlobsAndSend(
511 value->blob_info,
512 base::Bind(BlobLookupForValue, base::Owned(params.release()),
513 dispatcher_host_, value->blob_info,
514 base::Unretained(&p->blob_or_file_info)));
515 }
295 dispatcher_host_ = NULL; 516 dispatcher_host_ = NULL;
296 } 517 }
297 518
298 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { 519 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) {
299 DCHECK(dispatcher_host_.get()); 520 DCHECK(dispatcher_host_.get());
300 521
301 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 522 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
302 DCHECK_EQ(kNoTransaction, host_transaction_id_); 523 DCHECK_EQ(kNoTransaction, host_transaction_id_);
303 DCHECK_EQ(kNoDatabase, ipc_database_id_); 524 DCHECK_EQ(kNoDatabase, ipc_database_id_);
304 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 525 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
(...skipping 23 matching lines...) Expand all
328 DCHECK_EQ(kNoTransaction, host_transaction_id_); 549 DCHECK_EQ(kNoTransaction, host_transaction_id_);
329 DCHECK_EQ(kNoDatabase, ipc_database_id_); 550 DCHECK_EQ(kNoDatabase, ipc_database_id_);
330 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 551 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
331 552
332 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined( 553 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined(
333 ipc_thread_id_, ipc_callbacks_id_)); 554 ipc_thread_id_, ipc_callbacks_id_));
334 dispatcher_host_ = NULL; 555 dispatcher_host_ = NULL;
335 } 556 }
336 557
337 } // namespace content 558 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698