| Index: content/renderer/dom_storage/local_storage_cached_area.cc
|
| diff --git a/content/renderer/dom_storage/local_storage_cached_area.cc b/content/renderer/dom_storage/local_storage_cached_area.cc
|
| index 379394c4f2a39dc079d7021717e26460668c4cba..662da6697247726fc4c210a2d4b776d3c55a46cf 100644
|
| --- a/content/renderer/dom_storage/local_storage_cached_area.cc
|
| +++ b/content/renderer/dom_storage/local_storage_cached_area.cc
|
| @@ -83,6 +83,7 @@ LocalStorageCachedArea::LocalStorageCachedArea(
|
| cached_areas_(cached_areas), weak_factory_(this) {
|
| storage_partition_service->OpenLocalStorage(origin_,
|
| mojo::MakeRequest(&leveldb_));
|
| + leveldb_.set_process_async_during_sync(true);
|
| mojom::LevelDBObserverAssociatedPtrInfo ptr_info;
|
| binding_.Bind(&ptr_info, leveldb_.associated_group());
|
| leveldb_->AddObserver(std::move(ptr_info));
|
| @@ -128,6 +129,8 @@ bool LocalStorageCachedArea::SetItem(const base::string16& key,
|
| PackSource(page_url, storage_area_id),
|
| base::Bind(&LocalStorageCachedArea::OnSetItemComplete,
|
| weak_factory_.GetWeakPtr(), key));
|
| + FlushIfNeeded();
|
| +
|
| return true;
|
| }
|
|
|
| @@ -145,18 +148,19 @@ void LocalStorageCachedArea::RemoveItem(const base::string16& key,
|
| PackSource(page_url, storage_area_id),
|
| base::Bind(&LocalStorageCachedArea::OnRemoveItemComplete,
|
| weak_factory_.GetWeakPtr(), key));
|
| + FlushIfNeeded();
|
| }
|
|
|
| void LocalStorageCachedArea::Clear(const GURL& page_url,
|
| const std::string& storage_area_id) {
|
| // No need to prime the cache in this case.
|
| -
|
| Reset();
|
| map_ = new DOMStorageMap(kPerStorageAreaQuota);
|
| ignore_all_mutations_ = true;
|
| leveldb_->DeleteAll(PackSource(page_url, storage_area_id),
|
| base::Bind(&LocalStorageCachedArea::OnClearComplete,
|
| weak_factory_.GetWeakPtr()));
|
| + FlushIfNeeded();
|
| }
|
|
|
| void LocalStorageCachedArea::AreaCreated(LocalStorageArea* area) {
|
| @@ -323,6 +327,13 @@ void LocalStorageCachedArea::EnsureLoaded() {
|
| }
|
| }
|
|
|
| +void LocalStorageCachedArea::FlushIfNeeded() {
|
| + if (leveldb_.pending_callback_count() > 1000) {
|
| + leveldb_->FlushPipe();
|
| + DCHECK_EQ(0u, leveldb_.pending_callback_count());
|
| + }
|
| +}
|
| +
|
| void LocalStorageCachedArea::OnSetItemComplete(const base::string16& key,
|
| bool success) {
|
| if (!success) {
|
|
|