| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/indexed_db/indexed_db_callbacks.h" | 5 #include "content/browser/indexed_db/indexed_db_callbacks.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 if (value->primary_key.IsValid()) { | 69 if (value->primary_key.IsValid()) { |
| 70 mojo_value->primary_key = value->primary_key; | 70 mojo_value->primary_key = value->primary_key; |
| 71 mojo_value->key_path = value->key_path; | 71 mojo_value->key_path = value->key_path; |
| 72 } | 72 } |
| 73 if (!value->empty()) | 73 if (!value->empty()) |
| 74 swap(mojo_value->value->bits, value->bits); | 74 swap(mojo_value->value->bits, value->bits); |
| 75 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); | 75 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); |
| 76 return mojo_value; | 76 return mojo_value; |
| 77 } | 77 } |
| 78 | 78 |
| 79 // Destructively converts an IndexedDBValue to a Mojo Value. | |
| 80 ::indexed_db::mojom::ValuePtr ConvertValue(IndexedDBValue* value) { | |
| 81 auto mojo_value = ::indexed_db::mojom::Value::New(); | |
| 82 if (!value->empty()) | |
| 83 swap(mojo_value->bits, value->bits); | |
| 84 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); | |
| 85 return mojo_value; | |
| 86 } | |
| 87 | |
| 88 } // namespace | 79 } // namespace |
| 89 | 80 |
| 90 class IndexedDBCallbacks::IOThreadHelper { | 81 class IndexedDBCallbacks::IOThreadHelper { |
| 91 public: | 82 public: |
| 92 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, | 83 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, |
| 93 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); | 84 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); |
| 94 ~IOThreadHelper(); | 85 ~IOThreadHelper(); |
| 95 | 86 |
| 96 void SendError(const IndexedDBDatabaseError& error); | 87 void SendError(const IndexedDBDatabaseError& error); |
| 97 void SendSuccessStringList(const std::vector<base::string16>& value); | 88 void SendSuccessStringList(const std::vector<base::string16>& value); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); | 124 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); |
| 134 void OnConnectionError(); | 125 void OnConnectionError(); |
| 135 | 126 |
| 136 private: | 127 private: |
| 137 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; | 128 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; |
| 138 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; | 129 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; |
| 139 | 130 |
| 140 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); | 131 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); |
| 141 }; | 132 }; |
| 142 | 133 |
| 134 // static |
| 135 ::indexed_db::mojom::ValuePtr IndexedDBCallbacks::ConvertAndEraseValue( |
| 136 IndexedDBValue* value) { |
| 137 auto mojo_value = ::indexed_db::mojom::Value::New(); |
| 138 if (!value->empty()) |
| 139 swap(mojo_value->bits, value->bits); |
| 140 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); |
| 141 return mojo_value; |
| 142 } |
| 143 |
| 143 IndexedDBCallbacks::IndexedDBCallbacks( | 144 IndexedDBCallbacks::IndexedDBCallbacks( |
| 144 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | 145 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, |
| 145 const url::Origin& origin, | 146 const url::Origin& origin, |
| 146 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) | 147 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) |
| 147 : dispatcher_host_(std::move(dispatcher_host)), | 148 : dispatcher_host_(std::move(dispatcher_host)), |
| 148 origin_(origin), | 149 origin_(origin), |
| 149 data_loss_(blink::WebIDBDataLossNone), | 150 data_loss_(blink::WebIDBDataLossNone), |
| 150 sent_blocked_(false), | 151 sent_blocked_(false), |
| 151 io_helper_( | 152 io_helper_( |
| 152 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { | 153 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 DCHECK(io_helper_); | 285 DCHECK(io_helper_); |
| 285 | 286 |
| 286 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 287 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 287 | 288 |
| 288 auto cursor_impl = base::MakeUnique<CursorImpl>(std::move(cursor), origin_, | 289 auto cursor_impl = base::MakeUnique<CursorImpl>(std::move(cursor), origin_, |
| 289 dispatcher_host_); | 290 dispatcher_host_); |
| 290 | 291 |
| 291 ::indexed_db::mojom::ValuePtr mojo_value; | 292 ::indexed_db::mojom::ValuePtr mojo_value; |
| 292 std::vector<IndexedDBBlobInfo> blob_info; | 293 std::vector<IndexedDBBlobInfo> blob_info; |
| 293 if (value) { | 294 if (value) { |
| 294 mojo_value = ConvertValue(value); | 295 mojo_value = ConvertAndEraseValue(value); |
| 295 blob_info.swap(value->blob_info); | 296 blob_info.swap(value->blob_info); |
| 296 } | 297 } |
| 297 | 298 |
| 298 BrowserThread::PostTask( | 299 BrowserThread::PostTask( |
| 299 BrowserThread::IO, FROM_HERE, | 300 BrowserThread::IO, FROM_HERE, |
| 300 base::Bind(&IOThreadHelper::SendSuccessCursor, | 301 base::Bind(&IOThreadHelper::SendSuccessCursor, |
| 301 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), | 302 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), |
| 302 key, primary_key, base::Passed(&mojo_value), | 303 key, primary_key, base::Passed(&mojo_value), |
| 303 base::Passed(&blob_info))); | 304 base::Passed(&blob_info))); |
| 304 dispatcher_host_ = nullptr; | 305 dispatcher_host_ = nullptr; |
| 305 } | 306 } |
| 306 | 307 |
| 307 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, | 308 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, |
| 308 const IndexedDBKey& primary_key, | 309 const IndexedDBKey& primary_key, |
| 309 IndexedDBValue* value) { | 310 IndexedDBValue* value) { |
| 310 DCHECK(thread_checker_.CalledOnValidThread()); | 311 DCHECK(thread_checker_.CalledOnValidThread()); |
| 311 DCHECK(dispatcher_host_); | 312 DCHECK(dispatcher_host_); |
| 312 DCHECK(io_helper_); | 313 DCHECK(io_helper_); |
| 313 | 314 |
| 314 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 315 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 315 | 316 |
| 316 ::indexed_db::mojom::ValuePtr mojo_value; | 317 ::indexed_db::mojom::ValuePtr mojo_value; |
| 317 std::vector<IndexedDBBlobInfo> blob_info; | 318 std::vector<IndexedDBBlobInfo> blob_info; |
| 318 if (value) { | 319 if (value) { |
| 319 mojo_value = ConvertValue(value); | 320 mojo_value = ConvertAndEraseValue(value); |
| 320 blob_info.swap(value->blob_info); | 321 blob_info.swap(value->blob_info); |
| 321 } | 322 } |
| 322 | 323 |
| 323 BrowserThread::PostTask( | 324 BrowserThread::PostTask( |
| 324 BrowserThread::IO, FROM_HERE, | 325 BrowserThread::IO, FROM_HERE, |
| 325 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, | 326 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, |
| 326 base::Unretained(io_helper_.get()), key, primary_key, | 327 base::Unretained(io_helper_.get()), key, primary_key, |
| 327 base::Passed(&mojo_value), base::Passed(&blob_info))); | 328 base::Passed(&mojo_value), base::Passed(&blob_info))); |
| 328 dispatcher_host_ = nullptr; | 329 dispatcher_host_ = nullptr; |
| 329 } | 330 } |
| 330 | 331 |
| 331 void IndexedDBCallbacks::OnSuccessWithPrefetch( | 332 void IndexedDBCallbacks::OnSuccessWithPrefetch( |
| 332 const std::vector<IndexedDBKey>& keys, | 333 const std::vector<IndexedDBKey>& keys, |
| 333 const std::vector<IndexedDBKey>& primary_keys, | 334 const std::vector<IndexedDBKey>& primary_keys, |
| 334 std::vector<IndexedDBValue>* values) { | 335 std::vector<IndexedDBValue>* values) { |
| 335 DCHECK(thread_checker_.CalledOnValidThread()); | 336 DCHECK(thread_checker_.CalledOnValidThread()); |
| 336 DCHECK(dispatcher_host_); | 337 DCHECK(dispatcher_host_); |
| 337 DCHECK(io_helper_); | 338 DCHECK(io_helper_); |
| 338 DCHECK_EQ(keys.size(), primary_keys.size()); | 339 DCHECK_EQ(keys.size(), primary_keys.size()); |
| 339 DCHECK_EQ(keys.size(), values->size()); | 340 DCHECK_EQ(keys.size(), values->size()); |
| 340 | 341 |
| 341 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 342 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 342 | 343 |
| 343 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; | 344 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; |
| 344 mojo_values.reserve(values->size()); | 345 mojo_values.reserve(values->size()); |
| 345 for (size_t i = 0; i < values->size(); ++i) | 346 for (size_t i = 0; i < values->size(); ++i) |
| 346 mojo_values.push_back(ConvertValue(&(*values)[i])); | 347 mojo_values.push_back(ConvertAndEraseValue(&(*values)[i])); |
| 347 | 348 |
| 348 BrowserThread::PostTask( | 349 BrowserThread::PostTask( |
| 349 BrowserThread::IO, FROM_HERE, | 350 BrowserThread::IO, FROM_HERE, |
| 350 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, | 351 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, |
| 351 base::Unretained(io_helper_.get()), keys, primary_keys, | 352 base::Unretained(io_helper_.get()), keys, primary_keys, |
| 352 base::Passed(&mojo_values), *values)); | 353 base::Passed(&mojo_values), *values)); |
| 353 dispatcher_host_ = nullptr; | 354 dispatcher_host_ = nullptr; |
| 354 } | 355 } |
| 355 | 356 |
| 356 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { | 357 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); | 628 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); |
| 628 return true; | 629 return true; |
| 629 } | 630 } |
| 630 | 631 |
| 631 void IndexedDBCallbacks::IOThreadHelper::OnConnectionError() { | 632 void IndexedDBCallbacks::IOThreadHelper::OnConnectionError() { |
| 632 callbacks_.reset(); | 633 callbacks_.reset(); |
| 633 dispatcher_host_ = nullptr; | 634 dispatcher_host_ = nullptr; |
| 634 } | 635 } |
| 635 | 636 |
| 636 } // namespace content | 637 } // namespace content |
| OLD | NEW |