| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/indexed_db/indexed_db_callbacks.h" | 5 #include "content/browser/indexed_db/indexed_db_callbacks.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 15 #include "content/browser/child_process_security_policy_impl.h" | 15 #include "content/browser/child_process_security_policy_impl.h" |
| 16 #include "content/browser/fileapi/fileapi_message_filter.h" | 16 #include "content/browser/fileapi/fileapi_message_filter.h" |
| 17 #include "content/browser/indexed_db/cursor_impl.h" | 17 #include "content/browser/indexed_db/cursor_impl.h" |
| 18 #include "content/browser/indexed_db/database_impl.h" | 18 #include "content/browser/indexed_db/database_impl.h" |
| 19 #include "content/browser/indexed_db/indexed_db_blob_info.h" | 19 #include "content/browser/indexed_db/indexed_db_blob_info.h" |
| 20 #include "content/browser/indexed_db/indexed_db_connection.h" | 20 #include "content/browser/indexed_db/indexed_db_connection.h" |
| 21 #include "content/browser/indexed_db/indexed_db_context_impl.h" | 21 #include "content/browser/indexed_db/indexed_db_context_impl.h" |
| 22 #include "content/browser/indexed_db/indexed_db_cursor.h" | 22 #include "content/browser/indexed_db/indexed_db_cursor.h" |
| 23 #include "content/browser/indexed_db/indexed_db_database_error.h" | 23 #include "content/browser/indexed_db/indexed_db_database_error.h" |
| 24 #include "content/browser/indexed_db/indexed_db_return_value.h" | 24 #include "content/browser/indexed_db/indexed_db_return_value.h" |
| 25 #include "content/browser/indexed_db/indexed_db_tracing.h" | 25 #include "content/browser/indexed_db/indexed_db_tracing.h" |
| 26 #include "content/browser/indexed_db/indexed_db_transaction.h" |
| 26 #include "content/browser/indexed_db/indexed_db_value.h" | 27 #include "content/browser/indexed_db/indexed_db_value.h" |
| 27 #include "content/common/indexed_db/indexed_db_constants.h" | 28 #include "content/common/indexed_db/indexed_db_constants.h" |
| 28 #include "content/common/indexed_db/indexed_db_metadata.h" | 29 #include "content/common/indexed_db/indexed_db_metadata.h" |
| 29 #include "mojo/public/cpp/bindings/strong_associated_binding.h" | 30 #include "mojo/public/cpp/bindings/strong_associated_binding.h" |
| 30 #include "storage/browser/blob/blob_storage_context.h" | 31 #include "storage/browser/blob/blob_storage_context.h" |
| 31 #include "storage/browser/blob/shareable_file_reference.h" | 32 #include "storage/browser/blob/shareable_file_reference.h" |
| 32 #include "storage/browser/quota/quota_manager.h" | 33 #include "storage/browser/quota/quota_manager.h" |
| 33 | 34 |
| 34 using indexed_db::mojom::CallbacksAssociatedPtrInfo; | 35 using indexed_db::mojom::CallbacksAssociatedPtrInfo; |
| 35 using std::swap; | 36 using std::swap; |
| 36 using storage::ShareableFileReference; | 37 using storage::ShareableFileReference; |
| 37 | 38 |
| 38 namespace content { | 39 namespace content { |
| 39 | 40 |
| 40 namespace { | 41 namespace { |
| 41 const int64_t kNoTransaction = -1; | |
| 42 | 42 |
| 43 void ConvertBlobInfo( | 43 void ConvertBlobInfo( |
| 44 const std::vector<IndexedDBBlobInfo>& blob_info, | 44 const std::vector<IndexedDBBlobInfo>& blob_info, |
| 45 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { | 45 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { |
| 46 blob_or_file_info->reserve(blob_info.size()); | 46 blob_or_file_info->reserve(blob_info.size()); |
| 47 for (const auto& iter : blob_info) { | 47 for (const auto& iter : blob_info) { |
| 48 if (!iter.mark_used_callback().is_null()) | 48 if (!iter.mark_used_callback().is_null()) |
| 49 iter.mark_used_callback().Run(); | 49 iter.mark_used_callback().Run(); |
| 50 | 50 |
| 51 auto info = ::indexed_db::mojom::BlobInfo::New(); | 51 auto info = ::indexed_db::mojom::BlobInfo::New(); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; | 137 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; |
| 138 | 138 |
| 139 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); | 139 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); |
| 140 }; | 140 }; |
| 141 | 141 |
| 142 IndexedDBCallbacks::IndexedDBCallbacks( | 142 IndexedDBCallbacks::IndexedDBCallbacks( |
| 143 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | 143 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, |
| 144 const url::Origin& origin, | 144 const url::Origin& origin, |
| 145 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) | 145 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) |
| 146 : dispatcher_host_(std::move(dispatcher_host)), | 146 : dispatcher_host_(std::move(dispatcher_host)), |
| 147 host_transaction_id_(kNoTransaction), | |
| 148 origin_(origin), | 147 origin_(origin), |
| 149 data_loss_(blink::WebIDBDataLossNone), | 148 data_loss_(blink::WebIDBDataLossNone), |
| 150 sent_blocked_(false), | 149 sent_blocked_(false), |
| 151 io_helper_( | 150 io_helper_( |
| 152 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { | 151 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { |
| 153 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 152 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 154 thread_checker_.DetachFromThread(); | 153 thread_checker_.DetachFromThread(); |
| 155 } | 154 } |
| 156 | 155 |
| 157 IndexedDBCallbacks::~IndexedDBCallbacks() { | 156 IndexedDBCallbacks::~IndexedDBCallbacks() { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 173 "WebCore.IndexedDB.OpenTime.Error", | 172 "WebCore.IndexedDB.OpenTime.Error", |
| 174 base::TimeTicks::Now() - connection_open_start_time_); | 173 base::TimeTicks::Now() - connection_open_start_time_); |
| 175 connection_open_start_time_ = base::TimeTicks(); | 174 connection_open_start_time_ = base::TimeTicks(); |
| 176 } | 175 } |
| 177 } | 176 } |
| 178 | 177 |
| 179 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { | 178 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { |
| 180 DCHECK(thread_checker_.CalledOnValidThread()); | 179 DCHECK(thread_checker_.CalledOnValidThread()); |
| 181 DCHECK(dispatcher_host_); | 180 DCHECK(dispatcher_host_); |
| 182 DCHECK(io_helper_); | 181 DCHECK(io_helper_); |
| 183 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 184 | 182 |
| 185 BrowserThread::PostTask( | 183 BrowserThread::PostTask( |
| 186 BrowserThread::IO, FROM_HERE, | 184 BrowserThread::IO, FROM_HERE, |
| 187 base::Bind(&IOThreadHelper::SendSuccessStringList, | 185 base::Bind(&IOThreadHelper::SendSuccessStringList, |
| 188 base::Unretained(io_helper_.get()), value)); | 186 base::Unretained(io_helper_.get()), value)); |
| 189 dispatcher_host_ = nullptr; | 187 dispatcher_host_ = nullptr; |
| 190 } | 188 } |
| 191 | 189 |
| 192 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { | 190 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { |
| 193 DCHECK(thread_checker_.CalledOnValidThread()); | 191 DCHECK(thread_checker_.CalledOnValidThread()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 214 | 212 |
| 215 void IndexedDBCallbacks::OnUpgradeNeeded( | 213 void IndexedDBCallbacks::OnUpgradeNeeded( |
| 216 int64_t old_version, | 214 int64_t old_version, |
| 217 std::unique_ptr<IndexedDBConnection> connection, | 215 std::unique_ptr<IndexedDBConnection> connection, |
| 218 const IndexedDBDatabaseMetadata& metadata, | 216 const IndexedDBDatabaseMetadata& metadata, |
| 219 const IndexedDBDataLossInfo& data_loss_info) { | 217 const IndexedDBDataLossInfo& data_loss_info) { |
| 220 DCHECK(thread_checker_.CalledOnValidThread()); | 218 DCHECK(thread_checker_.CalledOnValidThread()); |
| 221 DCHECK(dispatcher_host_); | 219 DCHECK(dispatcher_host_); |
| 222 DCHECK(io_helper_); | 220 DCHECK(io_helper_); |
| 223 | 221 |
| 224 DCHECK_NE(kNoTransaction, host_transaction_id_); | |
| 225 DCHECK(!database_sent_); | 222 DCHECK(!database_sent_); |
| 226 | 223 |
| 227 data_loss_ = data_loss_info.status; | 224 data_loss_ = data_loss_info.status; |
| 228 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); | |
| 229 database_sent_ = true; | 225 database_sent_ = true; |
| 230 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_, | 226 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_, |
| 231 dispatcher_host_); | 227 dispatcher_host_); |
| 232 | 228 |
| 233 BrowserThread::PostTask( | 229 BrowserThread::PostTask( |
| 234 BrowserThread::IO, FROM_HERE, | 230 BrowserThread::IO, FROM_HERE, |
| 235 base::Bind(&IOThreadHelper::SendUpgradeNeeded, | 231 base::Bind(&IOThreadHelper::SendUpgradeNeeded, |
| 236 base::Unretained(io_helper_.get()), base::Passed(&database), | 232 base::Unretained(io_helper_.get()), base::Passed(&database), |
| 237 old_version, data_loss_info.status, data_loss_info.message, | 233 old_version, data_loss_info.status, data_loss_info.message, |
| 238 metadata)); | 234 metadata)); |
| 239 | 235 |
| 240 if (!connection_open_start_time_.is_null()) { | 236 if (!connection_open_start_time_.is_null()) { |
| 241 UMA_HISTOGRAM_MEDIUM_TIMES( | 237 UMA_HISTOGRAM_MEDIUM_TIMES( |
| 242 "WebCore.IndexedDB.OpenTime.UpgradeNeeded", | 238 "WebCore.IndexedDB.OpenTime.UpgradeNeeded", |
| 243 base::TimeTicks::Now() - connection_open_start_time_); | 239 base::TimeTicks::Now() - connection_open_start_time_); |
| 244 connection_open_start_time_ = base::TimeTicks(); | 240 connection_open_start_time_ = base::TimeTicks(); |
| 245 } | 241 } |
| 246 } | 242 } |
| 247 | 243 |
| 248 void IndexedDBCallbacks::OnSuccess( | 244 void IndexedDBCallbacks::OnSuccess( |
| 249 std::unique_ptr<IndexedDBConnection> connection, | 245 std::unique_ptr<IndexedDBConnection> connection, |
| 250 const IndexedDBDatabaseMetadata& metadata) { | 246 const IndexedDBDatabaseMetadata& metadata) { |
| 251 DCHECK(thread_checker_.CalledOnValidThread()); | 247 DCHECK(thread_checker_.CalledOnValidThread()); |
| 252 DCHECK(dispatcher_host_); | 248 DCHECK(dispatcher_host_); |
| 253 DCHECK(io_helper_); | 249 DCHECK(io_helper_); |
| 254 | 250 |
| 255 DCHECK_NE(kNoTransaction, host_transaction_id_); | |
| 256 DCHECK_EQ(database_sent_, !connection); | 251 DCHECK_EQ(database_sent_, !connection); |
| 257 | 252 |
| 258 scoped_refptr<IndexedDBCallbacks> self(this); | 253 scoped_refptr<IndexedDBCallbacks> self(this); |
| 259 | 254 |
| 260 // Only send a new Database if the connection was not previously sent in | 255 // Only send a new Database if the connection was not previously sent in |
| 261 // OnUpgradeNeeded. | 256 // OnUpgradeNeeded. |
| 262 std::unique_ptr<DatabaseImpl> database; | 257 std::unique_ptr<DatabaseImpl> database; |
| 263 if (!database_sent_) | 258 if (!database_sent_) |
| 264 database.reset( | 259 database.reset( |
| 265 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_)); | 260 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_)); |
| 266 | 261 |
| 267 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 262 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 268 base::Bind(&IOThreadHelper::SendSuccessDatabase, | 263 base::Bind(&IOThreadHelper::SendSuccessDatabase, |
| 269 base::Unretained(io_helper_.get()), | 264 base::Unretained(io_helper_.get()), |
| 270 base::Passed(&database), metadata)); | 265 base::Passed(&database), metadata)); |
| 271 dispatcher_host_ = nullptr; | 266 dispatcher_host_ = nullptr; |
| 272 | 267 |
| 273 if (!connection_open_start_time_.is_null()) { | 268 if (!connection_open_start_time_.is_null()) { |
| 274 UMA_HISTOGRAM_MEDIUM_TIMES( | 269 UMA_HISTOGRAM_MEDIUM_TIMES( |
| 275 "WebCore.IndexedDB.OpenTime.Success", | 270 "WebCore.IndexedDB.OpenTime.Success", |
| 276 base::TimeTicks::Now() - connection_open_start_time_); | 271 base::TimeTicks::Now() - connection_open_start_time_); |
| 277 connection_open_start_time_ = base::TimeTicks(); | 272 connection_open_start_time_ = base::TimeTicks(); |
| 278 } | 273 } |
| 279 } | 274 } |
| 280 | 275 |
| 281 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, | 276 void IndexedDBCallbacks::OnSuccess(std::unique_ptr<IndexedDBCursor> cursor, |
| 282 const IndexedDBKey& key, | 277 const IndexedDBKey& key, |
| 283 const IndexedDBKey& primary_key, | 278 const IndexedDBKey& primary_key, |
| 284 IndexedDBValue* value) { | 279 IndexedDBValue* value) { |
| 285 DCHECK(thread_checker_.CalledOnValidThread()); | 280 DCHECK(thread_checker_.CalledOnValidThread()); |
| 286 DCHECK(dispatcher_host_); | 281 DCHECK(dispatcher_host_); |
| 287 DCHECK(io_helper_); | 282 DCHECK(io_helper_); |
| 288 | 283 |
| 289 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 290 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 284 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 291 | 285 |
| 292 auto cursor_impl = | 286 auto cursor_impl = base::MakeUnique<CursorImpl>(std::move(cursor), origin_, |
| 293 base::MakeUnique<CursorImpl>(cursor, origin_, dispatcher_host_); | 287 dispatcher_host_); |
| 294 | 288 |
| 295 ::indexed_db::mojom::ValuePtr mojo_value; | 289 ::indexed_db::mojom::ValuePtr mojo_value; |
| 296 std::vector<IndexedDBBlobInfo> blob_info; | 290 std::vector<IndexedDBBlobInfo> blob_info; |
| 297 if (value) { | 291 if (value) { |
| 298 mojo_value = ConvertValue(value); | 292 mojo_value = ConvertValue(value); |
| 299 blob_info.swap(value->blob_info); | 293 blob_info.swap(value->blob_info); |
| 300 } | 294 } |
| 301 | 295 |
| 302 BrowserThread::PostTask( | 296 BrowserThread::PostTask( |
| 303 BrowserThread::IO, FROM_HERE, | 297 BrowserThread::IO, FROM_HERE, |
| 304 base::Bind(&IOThreadHelper::SendSuccessCursor, | 298 base::Bind(&IOThreadHelper::SendSuccessCursor, |
| 305 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), | 299 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), |
| 306 key, primary_key, base::Passed(&mojo_value), | 300 key, primary_key, base::Passed(&mojo_value), |
| 307 base::Passed(&blob_info))); | 301 base::Passed(&blob_info))); |
| 308 dispatcher_host_ = nullptr; | 302 dispatcher_host_ = nullptr; |
| 309 } | 303 } |
| 310 | 304 |
| 311 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, | 305 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, |
| 312 const IndexedDBKey& primary_key, | 306 const IndexedDBKey& primary_key, |
| 313 IndexedDBValue* value) { | 307 IndexedDBValue* value) { |
| 314 DCHECK(thread_checker_.CalledOnValidThread()); | 308 DCHECK(thread_checker_.CalledOnValidThread()); |
| 315 DCHECK(dispatcher_host_); | 309 DCHECK(dispatcher_host_); |
| 316 DCHECK(io_helper_); | 310 DCHECK(io_helper_); |
| 317 | 311 |
| 318 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 319 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 312 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 320 | 313 |
| 321 ::indexed_db::mojom::ValuePtr mojo_value; | 314 ::indexed_db::mojom::ValuePtr mojo_value; |
| 322 std::vector<IndexedDBBlobInfo> blob_info; | 315 std::vector<IndexedDBBlobInfo> blob_info; |
| 323 if (value) { | 316 if (value) { |
| 324 mojo_value = ConvertValue(value); | 317 mojo_value = ConvertValue(value); |
| 325 blob_info.swap(value->blob_info); | 318 blob_info.swap(value->blob_info); |
| 326 } | 319 } |
| 327 | 320 |
| 328 BrowserThread::PostTask( | 321 BrowserThread::PostTask( |
| 329 BrowserThread::IO, FROM_HERE, | 322 BrowserThread::IO, FROM_HERE, |
| 330 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, | 323 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, |
| 331 base::Unretained(io_helper_.get()), key, primary_key, | 324 base::Unretained(io_helper_.get()), key, primary_key, |
| 332 base::Passed(&mojo_value), base::Passed(&blob_info))); | 325 base::Passed(&mojo_value), base::Passed(&blob_info))); |
| 333 dispatcher_host_ = nullptr; | 326 dispatcher_host_ = nullptr; |
| 334 } | 327 } |
| 335 | 328 |
| 336 void IndexedDBCallbacks::OnSuccessWithPrefetch( | 329 void IndexedDBCallbacks::OnSuccessWithPrefetch( |
| 337 const std::vector<IndexedDBKey>& keys, | 330 const std::vector<IndexedDBKey>& keys, |
| 338 const std::vector<IndexedDBKey>& primary_keys, | 331 const std::vector<IndexedDBKey>& primary_keys, |
| 339 std::vector<IndexedDBValue>* values) { | 332 std::vector<IndexedDBValue>* values) { |
| 340 DCHECK(thread_checker_.CalledOnValidThread()); | 333 DCHECK(thread_checker_.CalledOnValidThread()); |
| 341 DCHECK(dispatcher_host_); | 334 DCHECK(dispatcher_host_); |
| 342 DCHECK(io_helper_); | 335 DCHECK(io_helper_); |
| 343 DCHECK_EQ(keys.size(), primary_keys.size()); | 336 DCHECK_EQ(keys.size(), primary_keys.size()); |
| 344 DCHECK_EQ(keys.size(), values->size()); | 337 DCHECK_EQ(keys.size(), values->size()); |
| 345 | 338 |
| 346 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 347 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 339 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 348 | 340 |
| 349 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; | 341 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; |
| 350 mojo_values.reserve(values->size()); | 342 mojo_values.reserve(values->size()); |
| 351 for (size_t i = 0; i < values->size(); ++i) | 343 for (size_t i = 0; i < values->size(); ++i) |
| 352 mojo_values.push_back(ConvertValue(&(*values)[i])); | 344 mojo_values.push_back(ConvertValue(&(*values)[i])); |
| 353 | 345 |
| 354 BrowserThread::PostTask( | 346 BrowserThread::PostTask( |
| 355 BrowserThread::IO, FROM_HERE, | 347 BrowserThread::IO, FROM_HERE, |
| 356 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, | 348 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, |
| 357 base::Unretained(io_helper_.get()), keys, primary_keys, | 349 base::Unretained(io_helper_.get()), keys, primary_keys, |
| 358 base::Passed(&mojo_values), *values)); | 350 base::Passed(&mojo_values), *values)); |
| 359 dispatcher_host_ = nullptr; | 351 dispatcher_host_ = nullptr; |
| 360 } | 352 } |
| 361 | 353 |
| 362 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { | 354 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
| 363 DCHECK(thread_checker_.CalledOnValidThread()); | 355 DCHECK(thread_checker_.CalledOnValidThread()); |
| 364 DCHECK(dispatcher_host_); | 356 DCHECK(dispatcher_host_); |
| 365 | 357 |
| 366 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 367 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 358 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 368 | 359 |
| 369 ::indexed_db::mojom::ReturnValuePtr mojo_value; | 360 ::indexed_db::mojom::ReturnValuePtr mojo_value; |
| 370 std::vector<IndexedDBBlobInfo> blob_info; | 361 std::vector<IndexedDBBlobInfo> blob_info; |
| 371 if (value) { | 362 if (value) { |
| 372 mojo_value = ConvertReturnValue(value); | 363 mojo_value = ConvertReturnValue(value); |
| 373 blob_info = value->blob_info; | 364 blob_info = value->blob_info; |
| 374 } | 365 } |
| 375 | 366 |
| 376 BrowserThread::PostTask( | 367 BrowserThread::PostTask( |
| 377 BrowserThread::IO, FROM_HERE, | 368 BrowserThread::IO, FROM_HERE, |
| 378 base::Bind(&IOThreadHelper::SendSuccessValue, | 369 base::Bind(&IOThreadHelper::SendSuccessValue, |
| 379 base::Unretained(io_helper_.get()), base::Passed(&mojo_value), | 370 base::Unretained(io_helper_.get()), base::Passed(&mojo_value), |
| 380 base::Passed(&blob_info))); | 371 base::Passed(&blob_info))); |
| 381 dispatcher_host_ = nullptr; | 372 dispatcher_host_ = nullptr; |
| 382 } | 373 } |
| 383 | 374 |
| 384 void IndexedDBCallbacks::OnSuccessArray( | 375 void IndexedDBCallbacks::OnSuccessArray( |
| 385 std::vector<IndexedDBReturnValue>* values) { | 376 std::vector<IndexedDBReturnValue>* values) { |
| 386 DCHECK(thread_checker_.CalledOnValidThread()); | 377 DCHECK(thread_checker_.CalledOnValidThread()); |
| 387 DCHECK(dispatcher_host_); | 378 DCHECK(dispatcher_host_); |
| 388 DCHECK(io_helper_); | 379 DCHECK(io_helper_); |
| 389 | 380 |
| 390 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 391 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 381 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 392 | 382 |
| 393 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; | 383 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; |
| 394 mojo_values.reserve(values->size()); | 384 mojo_values.reserve(values->size()); |
| 395 for (size_t i = 0; i < values->size(); ++i) | 385 for (size_t i = 0; i < values->size(); ++i) |
| 396 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); | 386 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); |
| 397 | 387 |
| 398 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 388 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 399 base::Bind(&IOThreadHelper::SendSuccessArray, | 389 base::Bind(&IOThreadHelper::SendSuccessArray, |
| 400 base::Unretained(io_helper_.get()), | 390 base::Unretained(io_helper_.get()), |
| 401 base::Passed(&mojo_values), *values)); | 391 base::Passed(&mojo_values), *values)); |
| 402 dispatcher_host_ = nullptr; | 392 dispatcher_host_ = nullptr; |
| 403 } | 393 } |
| 404 | 394 |
| 405 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { | 395 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { |
| 406 DCHECK(thread_checker_.CalledOnValidThread()); | 396 DCHECK(thread_checker_.CalledOnValidThread()); |
| 407 DCHECK(dispatcher_host_); | 397 DCHECK(dispatcher_host_); |
| 408 DCHECK(io_helper_); | 398 DCHECK(io_helper_); |
| 409 | 399 |
| 410 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 411 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 400 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 412 | 401 |
| 413 BrowserThread::PostTask( | 402 BrowserThread::PostTask( |
| 414 BrowserThread::IO, FROM_HERE, | 403 BrowserThread::IO, FROM_HERE, |
| 415 base::Bind(&IOThreadHelper::SendSuccessKey, | 404 base::Bind(&IOThreadHelper::SendSuccessKey, |
| 416 base::Unretained(io_helper_.get()), value)); | 405 base::Unretained(io_helper_.get()), value)); |
| 417 dispatcher_host_ = nullptr; | 406 dispatcher_host_ = nullptr; |
| 418 } | 407 } |
| 419 | 408 |
| 420 void IndexedDBCallbacks::OnSuccess(int64_t value) { | 409 void IndexedDBCallbacks::OnSuccess(int64_t value) { |
| 421 DCHECK(thread_checker_.CalledOnValidThread()); | 410 DCHECK(thread_checker_.CalledOnValidThread()); |
| 422 DCHECK(dispatcher_host_); | 411 DCHECK(dispatcher_host_); |
| 423 | 412 |
| 424 BrowserThread::PostTask( | 413 BrowserThread::PostTask( |
| 425 BrowserThread::IO, FROM_HERE, | 414 BrowserThread::IO, FROM_HERE, |
| 426 base::Bind(&IOThreadHelper::SendSuccessInteger, | 415 base::Bind(&IOThreadHelper::SendSuccessInteger, |
| 427 base::Unretained(io_helper_.get()), value)); | 416 base::Unretained(io_helper_.get()), value)); |
| 428 dispatcher_host_ = nullptr; | 417 dispatcher_host_ = nullptr; |
| 429 } | 418 } |
| 430 | 419 |
| 431 void IndexedDBCallbacks::OnSuccess() { | 420 void IndexedDBCallbacks::OnSuccess() { |
| 432 DCHECK(thread_checker_.CalledOnValidThread()); | 421 DCHECK(thread_checker_.CalledOnValidThread()); |
| 433 DCHECK(dispatcher_host_); | 422 DCHECK(dispatcher_host_); |
| 434 DCHECK(io_helper_); | 423 DCHECK(io_helper_); |
| 435 | 424 |
| 436 DCHECK_EQ(kNoTransaction, host_transaction_id_); | |
| 437 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 425 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 438 | 426 |
| 439 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 427 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 440 base::Bind(&IOThreadHelper::SendSuccess, | 428 base::Bind(&IOThreadHelper::SendSuccess, |
| 441 base::Unretained(io_helper_.get()))); | 429 base::Unretained(io_helper_.get()))); |
| 442 dispatcher_host_ = nullptr; | 430 dispatcher_host_ = nullptr; |
| 443 } | 431 } |
| 444 | 432 |
| 445 bool IndexedDBCallbacks::IsValid() const { | 433 bool IndexedDBCallbacks::IsValid() const { |
| 446 DCHECK(dispatcher_host_.get()); | 434 DCHECK(dispatcher_host_.get()); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); | 595 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); |
| 608 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); | 596 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); |
| 609 if (!dispatcher_host_->blob_storage_context()) | 597 if (!dispatcher_host_->blob_storage_context()) |
| 610 return false; | 598 return false; |
| 611 for (size_t i = 0; i < blob_info.size(); ++i) | 599 for (size_t i = 0; i < blob_info.size(); ++i) |
| 612 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); | 600 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); |
| 613 return true; | 601 return true; |
| 614 } | 602 } |
| 615 | 603 |
| 616 } // namespace content | 604 } // namespace content |
| OLD | NEW |