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

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

Issue 2727733004: [IndexedDB] Closing mojo connections when renderer quits (Closed)
Patch Set: fix and rebase Created 3 years, 8 months 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 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/metrics/histogram_macros.h" 8 #include "base/metrics/histogram_macros.h"
9 #include "base/sequenced_task_runner.h"
9 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
10 #include "content/browser/bad_message.h" 11 #include "content/browser/bad_message.h"
11 #include "content/browser/child_process_security_policy_impl.h" 12 #include "content/browser/child_process_security_policy_impl.h"
12 #include "content/browser/indexed_db/indexed_db_connection.h" 13 #include "content/browser/indexed_db/indexed_db_connection.h"
13 #include "content/browser/indexed_db/indexed_db_context_impl.h" 14 #include "content/browser/indexed_db/indexed_db_context_impl.h"
14 #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" 15 #include "content/browser/indexed_db/indexed_db_dispatcher_host.h"
15 #include "content/browser/indexed_db/indexed_db_transaction.h" 16 #include "content/browser/indexed_db/indexed_db_transaction.h"
16 #include "content/browser/indexed_db/indexed_db_value.h" 17 #include "content/browser/indexed_db/indexed_db_value.h"
17 #include "storage/browser/blob/blob_storage_context.h" 18 #include "storage/browser/blob/blob_storage_context.h"
18 #include "storage/browser/quota/quota_manager_proxy.h" 19 #include "storage/browser/quota/quota_manager_proxy.h"
19 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseExc eption.h" 20 #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseExc eption.h"
20 21
21 using std::swap; 22 using std::swap;
22 23
23 namespace content { 24 namespace content {
24 class IndexedDBDatabaseError; 25 class IndexedDBDatabaseError;
25 26
26 namespace { 27 namespace {
27 const char kInvalidBlobUuid[] = "Blob does not exist"; 28 const char kInvalidBlobUuid[] = "Blob does not exist";
28 const char kInvalidBlobFilePath[] = "Blob file path is invalid"; 29 const char kInvalidBlobFilePath[] = "Blob file path is invalid";
29 } // namespace 30 } // namespace
30 31
32 // Expect to be created on IO thread, and called/destroyed on IDB thread.
jsbell 2017/04/11 16:58:03 Can you use DCHECK_CURRENTLY_ON and DCHECK(idb_run
dmurph 2017/04/11 19:32:49 Done.
31 class DatabaseImpl::IDBThreadHelper { 33 class DatabaseImpl::IDBThreadHelper {
32 public: 34 public:
33 IDBThreadHelper(std::unique_ptr<IndexedDBConnection> connection, 35 IDBThreadHelper(std::unique_ptr<IndexedDBConnection> connection,
34 const url::Origin& origin, 36 const url::Origin& origin,
35 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); 37 scoped_refptr<IndexedDBContextImpl> indexed_db_context);
36 ~IDBThreadHelper(); 38 ~IDBThreadHelper();
37 39
40 void ConnectionOpened();
41
38 void CreateObjectStore(int64_t transaction_id, 42 void CreateObjectStore(int64_t transaction_id,
39 int64_t object_store_id, 43 int64_t object_store_id,
40 const base::string16& name, 44 const base::string16& name,
41 const IndexedDBKeyPath& key_path, 45 const IndexedDBKeyPath& key_path,
42 bool auto_increment); 46 bool auto_increment);
43 void DeleteObjectStore(int64_t transaction_id, int64_t object_store_id); 47 void DeleteObjectStore(int64_t transaction_id, int64_t object_store_id);
44 void RenameObjectStore(int64_t transaction_id, 48 void RenameObjectStore(int64_t transaction_id,
45 int64_t object_store_id, 49 int64_t object_store_id,
46 const base::string16& new_name); 50 const base::string16& new_name);
47 void CreateTransaction(int64_t transaction_id, 51 void CreateTransaction(int64_t transaction_id,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 void AbortWithError(int64_t transaction_id, 127 void AbortWithError(int64_t transaction_id,
124 const IndexedDBDatabaseError& error); 128 const IndexedDBDatabaseError& error);
125 void Commit(int64_t transaction_id); 129 void Commit(int64_t transaction_id);
126 void OnGotUsageAndQuotaForCommit(int64_t transaction_id, 130 void OnGotUsageAndQuotaForCommit(int64_t transaction_id,
127 storage::QuotaStatusCode status, 131 storage::QuotaStatusCode status,
128 int64_t usage, 132 int64_t usage,
129 int64_t quota); 133 int64_t quota);
130 void AckReceivedBlobs(const std::vector<std::string>& uuids); 134 void AckReceivedBlobs(const std::vector<std::string>& uuids);
131 135
132 private: 136 private:
133 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; 137 scoped_refptr<IndexedDBContextImpl> indexed_db_context_;
134 std::unique_ptr<IndexedDBConnection> connection_; 138 std::unique_ptr<IndexedDBConnection> connection_;
135 const url::Origin origin_; 139 const url::Origin origin_;
136 base::WeakPtrFactory<IDBThreadHelper> weak_factory_; 140 base::WeakPtrFactory<IDBThreadHelper> weak_factory_;
137 }; 141 };
138 142
139 DatabaseImpl::DatabaseImpl( 143 DatabaseImpl::DatabaseImpl(std::unique_ptr<IndexedDBConnection> connection,
140 std::unique_ptr<IndexedDBConnection> connection, 144 const url::Origin& origin,
141 const url::Origin& origin, 145 IndexedDBDispatcherHost* dispatcher_host,
142 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) 146 scoped_refptr<base::SequencedTaskRunner> idb_runner)
143 : dispatcher_host_(dispatcher_host), 147 : dispatcher_host_(dispatcher_host),
144 origin_(origin), 148 origin_(origin),
145 idb_runner_(base::ThreadTaskRunnerHandle::Get()) { 149 idb_runner_(std::move(idb_runner)) {
150 DCHECK(connection);
146 helper_ = new IDBThreadHelper(std::move(connection), origin, 151 helper_ = new IDBThreadHelper(std::move(connection), origin,
147 std::move(dispatcher_host)); 152 dispatcher_host->context());
153 idb_runner_->PostTask(FROM_HERE,
154 base::Bind(&IDBThreadHelper::ConnectionOpened,
155 base::Unretained(helper_)));
148 } 156 }
149 157
150 DatabaseImpl::~DatabaseImpl() { 158 DatabaseImpl::~DatabaseImpl() {
151 idb_runner_->DeleteSoon(FROM_HERE, helper_); 159 idb_runner_->DeleteSoon(FROM_HERE, helper_);
152 } 160 }
153 161
154 void DatabaseImpl::CreateObjectStore(int64_t transaction_id, 162 void DatabaseImpl::CreateObjectStore(int64_t transaction_id,
155 int64_t object_store_id, 163 int64_t object_store_id,
156 const base::string16& name, 164 const base::string16& name,
157 const IndexedDBKeyPath& key_path, 165 const IndexedDBKeyPath& key_path,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 base::Unretained(helper_), observers)); 227 base::Unretained(helper_), observers));
220 } 228 }
221 229
222 void DatabaseImpl::Get( 230 void DatabaseImpl::Get(
223 int64_t transaction_id, 231 int64_t transaction_id,
224 int64_t object_store_id, 232 int64_t object_store_id,
225 int64_t index_id, 233 int64_t index_id,
226 const IndexedDBKeyRange& key_range, 234 const IndexedDBKeyRange& key_range,
227 bool key_only, 235 bool key_only,
228 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { 236 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) {
229 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( 237 scoped_refptr<IndexedDBCallbacks> callbacks(
230 dispatcher_host_.get(), origin_, std::move(callbacks_info))); 238 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
239 std::move(callbacks_info), idb_runner_));
231 idb_runner_->PostTask( 240 idb_runner_->PostTask(
232 FROM_HERE, base::Bind(&IDBThreadHelper::Get, base::Unretained(helper_), 241 FROM_HERE, base::Bind(&IDBThreadHelper::Get, base::Unretained(helper_),
233 transaction_id, object_store_id, index_id, 242 transaction_id, object_store_id, index_id,
234 key_range, key_only, base::Passed(&callbacks))); 243 key_range, key_only, base::Passed(&callbacks)));
235 } 244 }
236 245
237 void DatabaseImpl::GetAll( 246 void DatabaseImpl::GetAll(
238 int64_t transaction_id, 247 int64_t transaction_id,
239 int64_t object_store_id, 248 int64_t object_store_id,
240 int64_t index_id, 249 int64_t index_id,
241 const IndexedDBKeyRange& key_range, 250 const IndexedDBKeyRange& key_range,
242 bool key_only, 251 bool key_only,
243 int64_t max_count, 252 int64_t max_count,
244 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { 253 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) {
245 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( 254 scoped_refptr<IndexedDBCallbacks> callbacks(
246 dispatcher_host_.get(), origin_, std::move(callbacks_info))); 255 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
256 std::move(callbacks_info), idb_runner_));
247 idb_runner_->PostTask( 257 idb_runner_->PostTask(
248 FROM_HERE, 258 FROM_HERE,
249 base::Bind(&IDBThreadHelper::GetAll, base::Unretained(helper_), 259 base::Bind(&IDBThreadHelper::GetAll, base::Unretained(helper_),
250 transaction_id, object_store_id, index_id, key_range, key_only, 260 transaction_id, object_store_id, index_id, key_range, key_only,
251 max_count, base::Passed(&callbacks))); 261 max_count, base::Passed(&callbacks)));
252 } 262 }
253 263
254 void DatabaseImpl::Put( 264 void DatabaseImpl::Put(
255 int64_t transaction_id, 265 int64_t transaction_id,
256 int64_t object_store_id, 266 int64_t object_store_id,
257 ::indexed_db::mojom::ValuePtr value, 267 ::indexed_db::mojom::ValuePtr value,
258 const IndexedDBKey& key, 268 const IndexedDBKey& key,
259 blink::WebIDBPutMode mode, 269 blink::WebIDBPutMode mode,
260 const std::vector<IndexedDBIndexKeys>& index_keys, 270 const std::vector<IndexedDBIndexKeys>& index_keys,
261 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { 271 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) {
262 ChildProcessSecurityPolicyImpl* policy = 272 ChildProcessSecurityPolicyImpl* policy =
263 ChildProcessSecurityPolicyImpl::GetInstance(); 273 ChildProcessSecurityPolicyImpl::GetInstance();
264 274
265 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( 275 scoped_refptr<IndexedDBCallbacks> callbacks(
266 dispatcher_host_.get(), origin_, std::move(callbacks_info))); 276 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
277 std::move(callbacks_info), idb_runner_));
267 278
268 std::vector<std::unique_ptr<storage::BlobDataHandle>> handles( 279 std::vector<std::unique_ptr<storage::BlobDataHandle>> handles(
269 value->blob_or_file_info.size()); 280 value->blob_or_file_info.size());
270 std::vector<IndexedDBBlobInfo> blob_info(value->blob_or_file_info.size()); 281 std::vector<IndexedDBBlobInfo> blob_info(value->blob_or_file_info.size());
271 for (size_t i = 0; i < value->blob_or_file_info.size(); ++i) { 282 for (size_t i = 0; i < value->blob_or_file_info.size(); ++i) {
272 ::indexed_db::mojom::BlobInfoPtr& info = value->blob_or_file_info[i]; 283 ::indexed_db::mojom::BlobInfoPtr& info = value->blob_or_file_info[i];
273 284
274 std::unique_ptr<storage::BlobDataHandle> handle = 285 std::unique_ptr<storage::BlobDataHandle> handle =
275 dispatcher_host_->blob_storage_context()->GetBlobDataFromUUID( 286 dispatcher_host_->blob_storage_context()->GetBlobDataFromUUID(
276 info->uuid); 287 info->uuid);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 355
345 void DatabaseImpl::OpenCursor( 356 void DatabaseImpl::OpenCursor(
346 int64_t transaction_id, 357 int64_t transaction_id,
347 int64_t object_store_id, 358 int64_t object_store_id,
348 int64_t index_id, 359 int64_t index_id,
349 const IndexedDBKeyRange& key_range, 360 const IndexedDBKeyRange& key_range,
350 blink::WebIDBCursorDirection direction, 361 blink::WebIDBCursorDirection direction,
351 bool key_only, 362 bool key_only,
352 blink::WebIDBTaskType task_type, 363 blink::WebIDBTaskType task_type,
353 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { 364 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) {
354 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( 365 scoped_refptr<IndexedDBCallbacks> callbacks(
355 dispatcher_host_.get(), origin_, std::move(callbacks_info))); 366 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
367 std::move(callbacks_info), idb_runner_));
356 idb_runner_->PostTask( 368 idb_runner_->PostTask(
357 FROM_HERE, 369 FROM_HERE,
358 base::Bind(&IDBThreadHelper::OpenCursor, base::Unretained(helper_), 370 base::Bind(&IDBThreadHelper::OpenCursor, base::Unretained(helper_),
359 transaction_id, object_store_id, index_id, key_range, 371 transaction_id, object_store_id, index_id, key_range,
360 direction, key_only, task_type, base::Passed(&callbacks))); 372 direction, key_only, task_type, base::Passed(&callbacks)));
361 } 373 }
362 374
363 void DatabaseImpl::Count( 375 void DatabaseImpl::Count(
364 int64_t transaction_id, 376 int64_t transaction_id,
365 int64_t object_store_id, 377 int64_t object_store_id,
366 int64_t index_id, 378 int64_t index_id,
367 const IndexedDBKeyRange& key_range, 379 const IndexedDBKeyRange& key_range,
368 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { 380 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) {
369 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( 381 scoped_refptr<IndexedDBCallbacks> callbacks(
370 dispatcher_host_.get(), origin_, std::move(callbacks_info))); 382 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
383 std::move(callbacks_info), idb_runner_));
371 idb_runner_->PostTask( 384 idb_runner_->PostTask(
372 FROM_HERE, base::Bind(&IDBThreadHelper::Count, base::Unretained(helper_), 385 FROM_HERE, base::Bind(&IDBThreadHelper::Count, base::Unretained(helper_),
373 transaction_id, object_store_id, index_id, 386 transaction_id, object_store_id, index_id,
374 key_range, base::Passed(&callbacks))); 387 key_range, base::Passed(&callbacks)));
375 } 388 }
376 389
377 void DatabaseImpl::DeleteRange( 390 void DatabaseImpl::DeleteRange(
378 int64_t transaction_id, 391 int64_t transaction_id,
379 int64_t object_store_id, 392 int64_t object_store_id,
380 const IndexedDBKeyRange& key_range, 393 const IndexedDBKeyRange& key_range,
381 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { 394 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) {
382 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( 395 scoped_refptr<IndexedDBCallbacks> callbacks(
383 dispatcher_host_.get(), origin_, std::move(callbacks_info))); 396 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
397 std::move(callbacks_info), idb_runner_));
384 idb_runner_->PostTask( 398 idb_runner_->PostTask(
385 FROM_HERE, 399 FROM_HERE,
386 base::Bind(&IDBThreadHelper::DeleteRange, base::Unretained(helper_), 400 base::Bind(&IDBThreadHelper::DeleteRange, base::Unretained(helper_),
387 transaction_id, object_store_id, key_range, 401 transaction_id, object_store_id, key_range,
388 base::Passed(&callbacks))); 402 base::Passed(&callbacks)));
389 } 403 }
390 404
391 void DatabaseImpl::Clear( 405 void DatabaseImpl::Clear(
392 int64_t transaction_id, 406 int64_t transaction_id,
393 int64_t object_store_id, 407 int64_t object_store_id,
394 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { 408 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) {
395 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( 409 scoped_refptr<IndexedDBCallbacks> callbacks(
396 dispatcher_host_.get(), origin_, std::move(callbacks_info))); 410 new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
411 std::move(callbacks_info), idb_runner_));
397 idb_runner_->PostTask( 412 idb_runner_->PostTask(
398 FROM_HERE, 413 FROM_HERE,
399 base::Bind(&IDBThreadHelper::Clear, base::Unretained(helper_), 414 base::Bind(&IDBThreadHelper::Clear, base::Unretained(helper_),
400 transaction_id, object_store_id, base::Passed(&callbacks))); 415 transaction_id, object_store_id, base::Passed(&callbacks)));
401 } 416 }
402 417
403 void DatabaseImpl::CreateIndex(int64_t transaction_id, 418 void DatabaseImpl::CreateIndex(int64_t transaction_id,
404 int64_t object_store_id, 419 int64_t object_store_id,
405 int64_t index_id, 420 int64_t index_id,
406 const base::string16& name, 421 const base::string16& name,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 } 461 }
447 462
448 void DatabaseImpl::AckReceivedBlobs(const std::vector<std::string>& uuids) { 463 void DatabaseImpl::AckReceivedBlobs(const std::vector<std::string>& uuids) {
449 for (const auto& uuid : uuids) 464 for (const auto& uuid : uuids)
450 dispatcher_host_->DropBlobData(uuid); 465 dispatcher_host_->DropBlobData(uuid);
451 } 466 }
452 467
453 DatabaseImpl::IDBThreadHelper::IDBThreadHelper( 468 DatabaseImpl::IDBThreadHelper::IDBThreadHelper(
454 std::unique_ptr<IndexedDBConnection> connection, 469 std::unique_ptr<IndexedDBConnection> connection,
455 const url::Origin& origin, 470 const url::Origin& origin,
456 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) 471 scoped_refptr<IndexedDBContextImpl> indexed_db_context)
457 : dispatcher_host_(std::move(dispatcher_host)), 472 : indexed_db_context_(indexed_db_context),
458 connection_(std::move(connection)), 473 connection_(std::move(connection)),
459 origin_(origin), 474 origin_(origin),
460 weak_factory_(this) { 475 weak_factory_(this) {}
461 dispatcher_host_->context()->ConnectionOpened(origin_, connection.get());
462 }
463 476
464 DatabaseImpl::IDBThreadHelper::~IDBThreadHelper() { 477 DatabaseImpl::IDBThreadHelper::~IDBThreadHelper() {
465 if (connection_->IsConnected()) 478 if (connection_->IsConnected())
466 connection_->Close(); 479 connection_->Close();
467 dispatcher_host_->context()->ConnectionClosed(origin_, connection_.get()); 480 indexed_db_context_->ConnectionClosed(origin_, connection_.get());
481 }
482
483 void DatabaseImpl::IDBThreadHelper::ConnectionOpened() {
484 indexed_db_context_->ConnectionOpened(origin_, connection_.get());
468 } 485 }
469 486
470 void DatabaseImpl::IDBThreadHelper::CreateObjectStore( 487 void DatabaseImpl::IDBThreadHelper::CreateObjectStore(
471 int64_t transaction_id, 488 int64_t transaction_id,
472 int64_t object_store_id, 489 int64_t object_store_id,
473 const base::string16& name, 490 const base::string16& name,
474 const IndexedDBKeyPath& key_path, 491 const IndexedDBKeyPath& key_path,
475 bool auto_increment) { 492 bool auto_increment) {
476 if (!connection_->IsConnected()) 493 if (!connection_->IsConnected())
477 return; 494 return;
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 connection_->GetTransaction(transaction_id); 851 connection_->GetTransaction(transaction_id);
835 if (!transaction) 852 if (!transaction)
836 return; 853 return;
837 854
838 // Always allow empty or delete-only transactions. 855 // Always allow empty or delete-only transactions.
839 if (transaction->size() == 0) { 856 if (transaction->size() == 0) {
840 connection_->database()->Commit(transaction); 857 connection_->database()->Commit(transaction);
841 return; 858 return;
842 } 859 }
843 860
844 dispatcher_host_->context()->quota_manager_proxy()->GetUsageAndQuota( 861 indexed_db_context_->quota_manager_proxy()->GetUsageAndQuota(
845 dispatcher_host_->context()->TaskRunner(), origin_.GetURL(), 862 indexed_db_context_->TaskRunner(), origin_.GetURL(),
846 storage::kStorageTypeTemporary, 863 storage::kStorageTypeTemporary,
847 base::Bind(&IDBThreadHelper::OnGotUsageAndQuotaForCommit, 864 base::Bind(&IDBThreadHelper::OnGotUsageAndQuotaForCommit,
848 weak_factory_.GetWeakPtr(), transaction_id)); 865 weak_factory_.GetWeakPtr(), transaction_id));
849 } 866 }
850 867
851 void DatabaseImpl::IDBThreadHelper::OnGotUsageAndQuotaForCommit( 868 void DatabaseImpl::IDBThreadHelper::OnGotUsageAndQuotaForCommit(
852 int64_t transaction_id, 869 int64_t transaction_id,
853 storage::QuotaStatusCode status, 870 storage::QuotaStatusCode status,
854 int64_t usage, 871 int64_t usage,
855 int64_t quota) { 872 int64_t quota) {
(...skipping 10 matching lines...) Expand all
866 usage + transaction->size() <= quota) { 883 usage + transaction->size() <= quota) {
867 connection_->database()->Commit(transaction); 884 connection_->database()->Commit(transaction);
868 } else { 885 } else {
869 connection_->AbortTransaction( 886 connection_->AbortTransaction(
870 transaction, 887 transaction,
871 IndexedDBDatabaseError(blink::kWebIDBDatabaseExceptionQuotaError)); 888 IndexedDBDatabaseError(blink::kWebIDBDatabaseExceptionQuotaError));
872 } 889 }
873 } 890 }
874 891
875 } // namespace content 892 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698