| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/database_impl.h" | 5 #include "content/browser/indexed_db/database_impl.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/sequenced_task_runner.h" |
| 8 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
| 9 #include "content/browser/bad_message.h" | 10 #include "content/browser/bad_message.h" |
| 10 #include "content/browser/child_process_security_policy_impl.h" | 11 #include "content/browser/child_process_security_policy_impl.h" |
| 11 #include "content/browser/indexed_db/indexed_db_connection.h" | 12 #include "content/browser/indexed_db/indexed_db_connection.h" |
| 12 #include "content/browser/indexed_db/indexed_db_context_impl.h" | 13 #include "content/browser/indexed_db/indexed_db_context_impl.h" |
| 13 #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" | 14 #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" |
| 14 #include "content/browser/indexed_db/indexed_db_transaction.h" | 15 #include "content/browser/indexed_db/indexed_db_transaction.h" |
| 15 #include "content/browser/indexed_db/indexed_db_value.h" | 16 #include "content/browser/indexed_db/indexed_db_value.h" |
| 16 #include "storage/browser/blob/blob_storage_context.h" | 17 #include "storage/browser/blob/blob_storage_context.h" |
| 17 #include "storage/browser/quota/quota_manager_proxy.h" | 18 #include "storage/browser/quota/quota_manager_proxy.h" |
| 18 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseExc
eption.h" | 19 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseExc
eption.h" |
| 19 | 20 |
| 20 using std::swap; | 21 using std::swap; |
| 21 | 22 |
| 22 namespace content { | 23 namespace content { |
| 23 | 24 |
| 24 namespace { | 25 namespace { |
| 25 const char kInvalidBlobUuid[] = "Blob UUID is invalid"; | 26 const char kInvalidBlobUuid[] = "Blob UUID is invalid"; |
| 26 const char kInvalidBlobFilePath[] = "Blob file path is invalid"; | 27 const char kInvalidBlobFilePath[] = "Blob file path is invalid"; |
| 27 } // namespace | 28 } // namespace |
| 28 | 29 |
| 30 // Expect to be created on IO thread, and called/destroyed on IDB thread. |
| 29 class DatabaseImpl::IDBThreadHelper { | 31 class DatabaseImpl::IDBThreadHelper { |
| 30 public: | 32 public: |
| 31 IDBThreadHelper(std::unique_ptr<IndexedDBConnection> connection, | 33 IDBThreadHelper(std::unique_ptr<IndexedDBConnection> connection, |
| 32 const url::Origin& origin, | 34 const url::Origin& origin, |
| 33 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); | 35 scoped_refptr<IndexedDBContextImpl> indexed_db_context); |
| 34 ~IDBThreadHelper(); | 36 ~IDBThreadHelper(); |
| 35 | 37 |
| 38 void ConnectionOpened(); |
| 39 |
| 36 void CreateObjectStore(int64_t transaction_id, | 40 void CreateObjectStore(int64_t transaction_id, |
| 37 int64_t object_store_id, | 41 int64_t object_store_id, |
| 38 const base::string16& name, | 42 const base::string16& name, |
| 39 const IndexedDBKeyPath& key_path, | 43 const IndexedDBKeyPath& key_path, |
| 40 bool auto_increment); | 44 bool auto_increment); |
| 41 void DeleteObjectStore(int64_t transaction_id, int64_t object_store_id); | 45 void DeleteObjectStore(int64_t transaction_id, int64_t object_store_id); |
| 42 void RenameObjectStore(int64_t transaction_id, | 46 void RenameObjectStore(int64_t transaction_id, |
| 43 int64_t object_store_id, | 47 int64_t object_store_id, |
| 44 const base::string16& new_name); | 48 const base::string16& new_name); |
| 45 void CreateTransaction(int64_t transaction_id, | 49 void CreateTransaction(int64_t transaction_id, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 const base::string16& new_name); | 123 const base::string16& new_name); |
| 120 void Abort(int64_t transaction_id); | 124 void Abort(int64_t transaction_id); |
| 121 void Commit(int64_t transaction_id); | 125 void Commit(int64_t transaction_id); |
| 122 void OnGotUsageAndQuotaForCommit(int64_t transaction_id, | 126 void OnGotUsageAndQuotaForCommit(int64_t transaction_id, |
| 123 storage::QuotaStatusCode status, | 127 storage::QuotaStatusCode status, |
| 124 int64_t usage, | 128 int64_t usage, |
| 125 int64_t quota); | 129 int64_t quota); |
| 126 void AckReceivedBlobs(const std::vector<std::string>& uuids); | 130 void AckReceivedBlobs(const std::vector<std::string>& uuids); |
| 127 | 131 |
| 128 private: | 132 private: |
| 129 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; | 133 scoped_refptr<IndexedDBContextImpl> indexed_db_context_; |
| 130 std::unique_ptr<IndexedDBConnection> connection_; | 134 std::unique_ptr<IndexedDBConnection> connection_; |
| 131 const url::Origin origin_; | 135 const url::Origin origin_; |
| 132 base::WeakPtrFactory<IDBThreadHelper> weak_factory_; | 136 base::WeakPtrFactory<IDBThreadHelper> weak_factory_; |
| 133 }; | 137 }; |
| 134 | 138 |
| 135 DatabaseImpl::DatabaseImpl( | 139 DatabaseImpl::DatabaseImpl(std::unique_ptr<IndexedDBConnection> connection, |
| 136 std::unique_ptr<IndexedDBConnection> connection, | 140 const url::Origin& origin, |
| 137 const url::Origin& origin, | 141 IndexedDBDispatcherHost* dispatcher_host, |
| 138 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) | 142 scoped_refptr<base::SequencedTaskRunner> idb_runner) |
| 139 : dispatcher_host_(dispatcher_host), | 143 : dispatcher_host_(dispatcher_host), |
| 140 origin_(origin), | 144 origin_(origin), |
| 141 idb_runner_(base::ThreadTaskRunnerHandle::Get()) { | 145 idb_runner_(std::move(idb_runner)) { |
| 146 DCHECK(connection); |
| 142 helper_ = new IDBThreadHelper(std::move(connection), origin, | 147 helper_ = new IDBThreadHelper(std::move(connection), origin, |
| 143 std::move(dispatcher_host)); | 148 dispatcher_host->context()); |
| 149 idb_runner_->PostTask(FROM_HERE, |
| 150 base::Bind(&IDBThreadHelper::ConnectionOpened, |
| 151 base::Unretained(helper_))); |
| 144 } | 152 } |
| 145 | 153 |
| 146 DatabaseImpl::~DatabaseImpl() { | 154 DatabaseImpl::~DatabaseImpl() { |
| 147 idb_runner_->DeleteSoon(FROM_HERE, helper_); | 155 idb_runner_->DeleteSoon(FROM_HERE, helper_); |
| 148 } | 156 } |
| 149 | 157 |
| 150 void DatabaseImpl::CreateObjectStore(int64_t transaction_id, | 158 void DatabaseImpl::CreateObjectStore(int64_t transaction_id, |
| 151 int64_t object_store_id, | 159 int64_t object_store_id, |
| 152 const base::string16& name, | 160 const base::string16& name, |
| 153 const IndexedDBKeyPath& key_path, | 161 const IndexedDBKeyPath& key_path, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 base::Unretained(helper_), observers)); | 223 base::Unretained(helper_), observers)); |
| 216 } | 224 } |
| 217 | 225 |
| 218 void DatabaseImpl::Get( | 226 void DatabaseImpl::Get( |
| 219 int64_t transaction_id, | 227 int64_t transaction_id, |
| 220 int64_t object_store_id, | 228 int64_t object_store_id, |
| 221 int64_t index_id, | 229 int64_t index_id, |
| 222 const IndexedDBKeyRange& key_range, | 230 const IndexedDBKeyRange& key_range, |
| 223 bool key_only, | 231 bool key_only, |
| 224 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { | 232 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
| 225 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 233 scoped_refptr<IndexedDBCallbacks> callbacks( |
| 226 dispatcher_host_.get(), origin_, std::move(callbacks_info))); | 234 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_, |
| 235 std::move(callbacks_info), idb_runner_)); |
| 227 idb_runner_->PostTask( | 236 idb_runner_->PostTask( |
| 228 FROM_HERE, base::Bind(&IDBThreadHelper::Get, base::Unretained(helper_), | 237 FROM_HERE, base::Bind(&IDBThreadHelper::Get, base::Unretained(helper_), |
| 229 transaction_id, object_store_id, index_id, | 238 transaction_id, object_store_id, index_id, |
| 230 key_range, key_only, base::Passed(&callbacks))); | 239 key_range, key_only, base::Passed(&callbacks))); |
| 231 } | 240 } |
| 232 | 241 |
| 233 void DatabaseImpl::GetAll( | 242 void DatabaseImpl::GetAll( |
| 234 int64_t transaction_id, | 243 int64_t transaction_id, |
| 235 int64_t object_store_id, | 244 int64_t object_store_id, |
| 236 int64_t index_id, | 245 int64_t index_id, |
| 237 const IndexedDBKeyRange& key_range, | 246 const IndexedDBKeyRange& key_range, |
| 238 bool key_only, | 247 bool key_only, |
| 239 int64_t max_count, | 248 int64_t max_count, |
| 240 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { | 249 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
| 241 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 250 scoped_refptr<IndexedDBCallbacks> callbacks( |
| 242 dispatcher_host_.get(), origin_, std::move(callbacks_info))); | 251 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_, |
| 252 std::move(callbacks_info), idb_runner_)); |
| 243 idb_runner_->PostTask( | 253 idb_runner_->PostTask( |
| 244 FROM_HERE, | 254 FROM_HERE, |
| 245 base::Bind(&IDBThreadHelper::GetAll, base::Unretained(helper_), | 255 base::Bind(&IDBThreadHelper::GetAll, base::Unretained(helper_), |
| 246 transaction_id, object_store_id, index_id, key_range, key_only, | 256 transaction_id, object_store_id, index_id, key_range, key_only, |
| 247 max_count, base::Passed(&callbacks))); | 257 max_count, base::Passed(&callbacks))); |
| 248 } | 258 } |
| 249 | 259 |
| 250 void DatabaseImpl::Put( | 260 void DatabaseImpl::Put( |
| 251 int64_t transaction_id, | 261 int64_t transaction_id, |
| 252 int64_t object_store_id, | 262 int64_t object_store_id, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 info->file->name, info->mime_type); | 294 info->file->name, info->mime_type); |
| 285 if (info->size != -1) { | 295 if (info->size != -1) { |
| 286 blob_info[i].set_last_modified(info->file->last_modified); | 296 blob_info[i].set_last_modified(info->file->last_modified); |
| 287 blob_info[i].set_size(info->size); | 297 blob_info[i].set_size(info->size); |
| 288 } | 298 } |
| 289 } else { | 299 } else { |
| 290 blob_info[i] = IndexedDBBlobInfo(info->uuid, info->mime_type, info->size); | 300 blob_info[i] = IndexedDBBlobInfo(info->uuid, info->mime_type, info->size); |
| 291 } | 301 } |
| 292 } | 302 } |
| 293 | 303 |
| 294 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 304 scoped_refptr<IndexedDBCallbacks> callbacks( |
| 295 dispatcher_host_.get(), origin_, std::move(callbacks_info))); | 305 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_, |
| 306 std::move(callbacks_info), idb_runner_)); |
| 296 | 307 |
| 297 idb_runner_->PostTask( | 308 idb_runner_->PostTask( |
| 298 FROM_HERE, | 309 FROM_HERE, |
| 299 base::Bind(&IDBThreadHelper::Put, base::Unretained(helper_), | 310 base::Bind(&IDBThreadHelper::Put, base::Unretained(helper_), |
| 300 transaction_id, object_store_id, base::Passed(&value), | 311 transaction_id, object_store_id, base::Passed(&value), |
| 301 base::Passed(&handles), base::Passed(&blob_info), key, mode, | 312 base::Passed(&handles), base::Passed(&blob_info), key, mode, |
| 302 index_keys, base::Passed(&callbacks))); | 313 index_keys, base::Passed(&callbacks))); |
| 303 } | 314 } |
| 304 | 315 |
| 305 void DatabaseImpl::SetIndexKeys( | 316 void DatabaseImpl::SetIndexKeys( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 324 | 335 |
| 325 void DatabaseImpl::OpenCursor( | 336 void DatabaseImpl::OpenCursor( |
| 326 int64_t transaction_id, | 337 int64_t transaction_id, |
| 327 int64_t object_store_id, | 338 int64_t object_store_id, |
| 328 int64_t index_id, | 339 int64_t index_id, |
| 329 const IndexedDBKeyRange& key_range, | 340 const IndexedDBKeyRange& key_range, |
| 330 blink::WebIDBCursorDirection direction, | 341 blink::WebIDBCursorDirection direction, |
| 331 bool key_only, | 342 bool key_only, |
| 332 blink::WebIDBTaskType task_type, | 343 blink::WebIDBTaskType task_type, |
| 333 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { | 344 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
| 334 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 345 scoped_refptr<IndexedDBCallbacks> callbacks( |
| 335 dispatcher_host_.get(), origin_, std::move(callbacks_info))); | 346 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_, |
| 347 std::move(callbacks_info), idb_runner_)); |
| 336 idb_runner_->PostTask( | 348 idb_runner_->PostTask( |
| 337 FROM_HERE, | 349 FROM_HERE, |
| 338 base::Bind(&IDBThreadHelper::OpenCursor, base::Unretained(helper_), | 350 base::Bind(&IDBThreadHelper::OpenCursor, base::Unretained(helper_), |
| 339 transaction_id, object_store_id, index_id, key_range, | 351 transaction_id, object_store_id, index_id, key_range, |
| 340 direction, key_only, task_type, base::Passed(&callbacks))); | 352 direction, key_only, task_type, base::Passed(&callbacks))); |
| 341 } | 353 } |
| 342 | 354 |
| 343 void DatabaseImpl::Count( | 355 void DatabaseImpl::Count( |
| 344 int64_t transaction_id, | 356 int64_t transaction_id, |
| 345 int64_t object_store_id, | 357 int64_t object_store_id, |
| 346 int64_t index_id, | 358 int64_t index_id, |
| 347 const IndexedDBKeyRange& key_range, | 359 const IndexedDBKeyRange& key_range, |
| 348 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { | 360 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
| 349 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 361 scoped_refptr<IndexedDBCallbacks> callbacks( |
| 350 dispatcher_host_.get(), origin_, std::move(callbacks_info))); | 362 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_, |
| 363 std::move(callbacks_info), idb_runner_)); |
| 351 idb_runner_->PostTask( | 364 idb_runner_->PostTask( |
| 352 FROM_HERE, base::Bind(&IDBThreadHelper::Count, base::Unretained(helper_), | 365 FROM_HERE, base::Bind(&IDBThreadHelper::Count, base::Unretained(helper_), |
| 353 transaction_id, object_store_id, index_id, | 366 transaction_id, object_store_id, index_id, |
| 354 key_range, base::Passed(&callbacks))); | 367 key_range, base::Passed(&callbacks))); |
| 355 } | 368 } |
| 356 | 369 |
| 357 void DatabaseImpl::DeleteRange( | 370 void DatabaseImpl::DeleteRange( |
| 358 int64_t transaction_id, | 371 int64_t transaction_id, |
| 359 int64_t object_store_id, | 372 int64_t object_store_id, |
| 360 const IndexedDBKeyRange& key_range, | 373 const IndexedDBKeyRange& key_range, |
| 361 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { | 374 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
| 362 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 375 scoped_refptr<IndexedDBCallbacks> callbacks( |
| 363 dispatcher_host_.get(), origin_, std::move(callbacks_info))); | 376 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_, |
| 377 std::move(callbacks_info), idb_runner_)); |
| 364 idb_runner_->PostTask( | 378 idb_runner_->PostTask( |
| 365 FROM_HERE, | 379 FROM_HERE, |
| 366 base::Bind(&IDBThreadHelper::DeleteRange, base::Unretained(helper_), | 380 base::Bind(&IDBThreadHelper::DeleteRange, base::Unretained(helper_), |
| 367 transaction_id, object_store_id, key_range, | 381 transaction_id, object_store_id, key_range, |
| 368 base::Passed(&callbacks))); | 382 base::Passed(&callbacks))); |
| 369 } | 383 } |
| 370 | 384 |
| 371 void DatabaseImpl::Clear( | 385 void DatabaseImpl::Clear( |
| 372 int64_t transaction_id, | 386 int64_t transaction_id, |
| 373 int64_t object_store_id, | 387 int64_t object_store_id, |
| 374 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { | 388 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
| 375 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 389 scoped_refptr<IndexedDBCallbacks> callbacks( |
| 376 dispatcher_host_.get(), origin_, std::move(callbacks_info))); | 390 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_, |
| 391 std::move(callbacks_info), idb_runner_)); |
| 377 idb_runner_->PostTask( | 392 idb_runner_->PostTask( |
| 378 FROM_HERE, | 393 FROM_HERE, |
| 379 base::Bind(&IDBThreadHelper::Clear, base::Unretained(helper_), | 394 base::Bind(&IDBThreadHelper::Clear, base::Unretained(helper_), |
| 380 transaction_id, object_store_id, base::Passed(&callbacks))); | 395 transaction_id, object_store_id, base::Passed(&callbacks))); |
| 381 } | 396 } |
| 382 | 397 |
| 383 void DatabaseImpl::CreateIndex(int64_t transaction_id, | 398 void DatabaseImpl::CreateIndex(int64_t transaction_id, |
| 384 int64_t object_store_id, | 399 int64_t object_store_id, |
| 385 int64_t index_id, | 400 int64_t index_id, |
| 386 const base::string16& name, | 401 const base::string16& name, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 } | 441 } |
| 427 | 442 |
| 428 void DatabaseImpl::AckReceivedBlobs(const std::vector<std::string>& uuids) { | 443 void DatabaseImpl::AckReceivedBlobs(const std::vector<std::string>& uuids) { |
| 429 for (const auto& uuid : uuids) | 444 for (const auto& uuid : uuids) |
| 430 dispatcher_host_->DropBlobData(uuid); | 445 dispatcher_host_->DropBlobData(uuid); |
| 431 } | 446 } |
| 432 | 447 |
| 433 DatabaseImpl::IDBThreadHelper::IDBThreadHelper( | 448 DatabaseImpl::IDBThreadHelper::IDBThreadHelper( |
| 434 std::unique_ptr<IndexedDBConnection> connection, | 449 std::unique_ptr<IndexedDBConnection> connection, |
| 435 const url::Origin& origin, | 450 const url::Origin& origin, |
| 436 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) | 451 scoped_refptr<IndexedDBContextImpl> indexed_db_context) |
| 437 : dispatcher_host_(std::move(dispatcher_host)), | 452 : indexed_db_context_(indexed_db_context), |
| 438 connection_(std::move(connection)), | 453 connection_(std::move(connection)), |
| 439 origin_(origin), | 454 origin_(origin), |
| 440 weak_factory_(this) { | 455 weak_factory_(this) {} |
| 441 dispatcher_host_->context()->ConnectionOpened(origin_, connection.get()); | |
| 442 } | |
| 443 | 456 |
| 444 DatabaseImpl::IDBThreadHelper::~IDBThreadHelper() { | 457 DatabaseImpl::IDBThreadHelper::~IDBThreadHelper() { |
| 445 if (connection_->IsConnected()) | 458 if (connection_->IsConnected()) |
| 446 connection_->Close(); | 459 connection_->Close(); |
| 447 dispatcher_host_->context()->ConnectionClosed(origin_, connection_.get()); | 460 indexed_db_context_->ConnectionClosed(origin_, connection_.get()); |
| 461 } |
| 462 |
| 463 void DatabaseImpl::IDBThreadHelper::ConnectionOpened() { |
| 464 indexed_db_context_->ConnectionOpened(origin_, connection_.get()); |
| 448 } | 465 } |
| 449 | 466 |
| 450 void DatabaseImpl::IDBThreadHelper::CreateObjectStore( | 467 void DatabaseImpl::IDBThreadHelper::CreateObjectStore( |
| 451 int64_t transaction_id, | 468 int64_t transaction_id, |
| 452 int64_t object_store_id, | 469 int64_t object_store_id, |
| 453 const base::string16& name, | 470 const base::string16& name, |
| 454 const IndexedDBKeyPath& key_path, | 471 const IndexedDBKeyPath& key_path, |
| 455 bool auto_increment) { | 472 bool auto_increment) { |
| 456 if (!connection_->IsConnected()) | 473 if (!connection_->IsConnected()) |
| 457 return; | 474 return; |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 connection_->GetTransaction(transaction_id); | 817 connection_->GetTransaction(transaction_id); |
| 801 if (!transaction) | 818 if (!transaction) |
| 802 return; | 819 return; |
| 803 | 820 |
| 804 // Always allow empty or delete-only transactions. | 821 // Always allow empty or delete-only transactions. |
| 805 if (transaction->size() == 0) { | 822 if (transaction->size() == 0) { |
| 806 connection_->database()->Commit(transaction); | 823 connection_->database()->Commit(transaction); |
| 807 return; | 824 return; |
| 808 } | 825 } |
| 809 | 826 |
| 810 dispatcher_host_->context()->quota_manager_proxy()->GetUsageAndQuota( | 827 indexed_db_context_->quota_manager_proxy()->GetUsageAndQuota( |
| 811 dispatcher_host_->context()->TaskRunner(), origin_.GetURL(), | 828 indexed_db_context_->TaskRunner(), origin_.GetURL(), |
| 812 storage::kStorageTypeTemporary, | 829 storage::kStorageTypeTemporary, |
| 813 base::Bind(&IDBThreadHelper::OnGotUsageAndQuotaForCommit, | 830 base::Bind(&IDBThreadHelper::OnGotUsageAndQuotaForCommit, |
| 814 weak_factory_.GetWeakPtr(), transaction_id)); | 831 weak_factory_.GetWeakPtr(), transaction_id)); |
| 815 } | 832 } |
| 816 | 833 |
| 817 void DatabaseImpl::IDBThreadHelper::OnGotUsageAndQuotaForCommit( | 834 void DatabaseImpl::IDBThreadHelper::OnGotUsageAndQuotaForCommit( |
| 818 int64_t transaction_id, | 835 int64_t transaction_id, |
| 819 storage::QuotaStatusCode status, | 836 storage::QuotaStatusCode status, |
| 820 int64_t usage, | 837 int64_t usage, |
| 821 int64_t quota) { | 838 int64_t quota) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 832 usage + transaction->size() <= quota) { | 849 usage + transaction->size() <= quota) { |
| 833 connection_->database()->Commit(transaction); | 850 connection_->database()->Commit(transaction); |
| 834 } else { | 851 } else { |
| 835 connection_->AbortTransaction( | 852 connection_->AbortTransaction( |
| 836 transaction, | 853 transaction, |
| 837 IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionQuotaError)); | 854 IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionQuotaError)); |
| 838 } | 855 } |
| 839 } | 856 } |
| 840 | 857 |
| 841 } // namespace content | 858 } // namespace content |
| OLD | NEW |