Index: webkit/dom_storage/dom_storage_cached_area.cc |
=================================================================== |
--- webkit/dom_storage/dom_storage_cached_area.cc (revision 203766) |
+++ webkit/dom_storage/dom_storage_cached_area.cc (working copy) |
@@ -1,230 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/dom_storage/dom_storage_cached_area.h" |
- |
-#include "base/basictypes.h" |
-#include "base/time.h" |
-#include "base/metrics/histogram.h" |
-#include "webkit/dom_storage/dom_storage_map.h" |
-#include "webkit/dom_storage/dom_storage_proxy.h" |
- |
-namespace dom_storage { |
- |
-DomStorageCachedArea::DomStorageCachedArea( |
- int64 namespace_id, const GURL& origin, DomStorageProxy* proxy) |
- : ignore_all_mutations_(false), |
- namespace_id_(namespace_id), origin_(origin), |
- proxy_(proxy), weak_factory_(this) { |
-} |
- |
-DomStorageCachedArea::~DomStorageCachedArea() { |
-} |
- |
-unsigned DomStorageCachedArea::GetLength(int connection_id) { |
- PrimeIfNeeded(connection_id); |
- return map_->Length(); |
-} |
- |
-NullableString16 DomStorageCachedArea::GetKey( |
- int connection_id, unsigned index) { |
- PrimeIfNeeded(connection_id); |
- return map_->Key(index); |
-} |
- |
-NullableString16 DomStorageCachedArea::GetItem( |
- int connection_id, const base::string16& key) { |
- PrimeIfNeeded(connection_id); |
- return map_->GetItem(key); |
-} |
- |
-bool DomStorageCachedArea::SetItem( |
- int connection_id, const base::string16& key, |
- const base::string16& value, const GURL& page_url) { |
- // A quick check to reject obviously overbudget items to avoid |
- // the priming the cache. |
- if (key.length() + value.length() > dom_storage::kPerAreaQuota) |
- return false; |
- |
- PrimeIfNeeded(connection_id); |
- NullableString16 unused; |
- if (!map_->SetItem(key, value, &unused)) |
- return false; |
- |
- // Ignore mutations to 'key' until OnSetItemComplete. |
- ignore_key_mutations_[key]++; |
- proxy_->SetItem( |
- connection_id, key, value, page_url, |
- base::Bind(&DomStorageCachedArea::OnSetItemComplete, |
- weak_factory_.GetWeakPtr(), key)); |
- return true; |
-} |
- |
-void DomStorageCachedArea::RemoveItem( |
- int connection_id, const base::string16& key, const GURL& page_url) { |
- PrimeIfNeeded(connection_id); |
- base::string16 unused; |
- if (!map_->RemoveItem(key, &unused)) |
- return; |
- |
- // Ignore mutations to 'key' until OnRemoveItemComplete. |
- ignore_key_mutations_[key]++; |
- proxy_->RemoveItem( |
- connection_id, key, page_url, |
- base::Bind(&DomStorageCachedArea::OnRemoveItemComplete, |
- weak_factory_.GetWeakPtr(), key)); |
-} |
- |
-void DomStorageCachedArea::Clear(int connection_id, const GURL& page_url) { |
- // No need to prime the cache in this case. |
- Reset(); |
- map_ = new DomStorageMap(dom_storage::kPerAreaQuota); |
- |
- // Ignore all mutations until OnClearComplete time. |
- ignore_all_mutations_ = true; |
- proxy_->ClearArea( |
- connection_id, page_url, |
- base::Bind(&DomStorageCachedArea::OnClearComplete, |
- weak_factory_.GetWeakPtr())); |
-} |
- |
-void DomStorageCachedArea::ApplyMutation( |
- const NullableString16& key, const NullableString16& new_value) { |
- if (!map_.get() || ignore_all_mutations_) |
- return; |
- |
- if (key.is_null()) { |
- // It's a clear event. |
- scoped_refptr<DomStorageMap> old = map_; |
- map_ = new DomStorageMap(dom_storage::kPerAreaQuota); |
- |
- // We have to retain local additions which happened after this |
- // clear operation from another process. |
- std::map<base::string16, int>::iterator iter = |
- ignore_key_mutations_.begin(); |
- while (iter != ignore_key_mutations_.end()) { |
- NullableString16 value = old->GetItem(iter->first); |
- if (!value.is_null()) { |
- NullableString16 unused; |
- map_->SetItem(iter->first, value.string(), &unused); |
- } |
- ++iter; |
- } |
- return; |
- } |
- |
- // We have to retain local changes. |
- if (should_ignore_key_mutation(key.string())) |
- return; |
- |
- if (new_value.is_null()) { |
- // It's a remove item event. |
- base::string16 unused; |
- map_->RemoveItem(key.string(), &unused); |
- return; |
- } |
- |
- // It's a set item event. |
- // We turn off quota checking here to accomodate the over budget |
- // allowance that's provided in the browser process. |
- NullableString16 unused; |
- map_->set_quota(kint32max); |
- map_->SetItem(key.string(), new_value.string(), &unused); |
- map_->set_quota(dom_storage::kPerAreaQuota); |
-} |
- |
-size_t DomStorageCachedArea::MemoryBytesUsedByCache() const { |
- return map_.get() ? map_->bytes_used() : 0; |
-} |
- |
-void DomStorageCachedArea::Prime(int connection_id) { |
- DCHECK(!map_.get()); |
- |
- // The LoadArea method is actually synchronous, but we have to |
- // wait for an asyncly delivered message to know when incoming |
- // mutation events should be applied. Our valuemap is plucked |
- // from ipc stream out of order, mutations in front if it need |
- // to be ignored. |
- |
- // Ignore all mutations until OnLoadComplete time. |
- ignore_all_mutations_ = true; |
- ValuesMap values; |
- base::TimeTicks before = base::TimeTicks::Now(); |
- proxy_->LoadArea( |
- connection_id, &values, |
- base::Bind(&DomStorageCachedArea::OnLoadComplete, |
- weak_factory_.GetWeakPtr())); |
- base::TimeDelta time_to_prime = base::TimeTicks::Now() - before; |
- // Keeping this histogram named the same (without the ForRenderer suffix) |
- // to maintain histogram continuity. |
- UMA_HISTOGRAM_TIMES("LocalStorage.TimeToPrimeLocalStorage", |
- time_to_prime); |
- map_ = new DomStorageMap(dom_storage::kPerAreaQuota); |
- map_->SwapValues(&values); |
- |
- size_t local_storage_size_kb = map_->bytes_used() / 1024; |
- // Track localStorage size, from 0-6MB. Note that the maximum size should be |
- // 5MB, but we add some slop since we want to make sure the max size is always |
- // above what we see in practice, since histograms can't change. |
- UMA_HISTOGRAM_CUSTOM_COUNTS("LocalStorage.RendererLocalStorageSizeInKB", |
- local_storage_size_kb, |
- 0, 6 * 1024, 50); |
- if (local_storage_size_kb < 100) { |
- UMA_HISTOGRAM_TIMES( |
- "LocalStorage.RendererTimeToPrimeLocalStorageUnder100KB", |
- time_to_prime); |
- } else if (local_storage_size_kb < 1000) { |
- UMA_HISTOGRAM_TIMES( |
- "LocalStorage.RendererTimeToPrimeLocalStorage100KBTo1MB", |
- time_to_prime); |
- } else { |
- UMA_HISTOGRAM_TIMES( |
- "LocalStorage.RendererTimeToPrimeLocalStorage1MBTo5MB", |
- time_to_prime); |
- } |
-} |
- |
-void DomStorageCachedArea::Reset() { |
- map_ = NULL; |
- weak_factory_.InvalidateWeakPtrs(); |
- ignore_key_mutations_.clear(); |
- ignore_all_mutations_ = false; |
-} |
- |
-void DomStorageCachedArea::OnLoadComplete(bool success) { |
- DCHECK(success); |
- DCHECK(ignore_all_mutations_); |
- ignore_all_mutations_ = false; |
-} |
- |
-void DomStorageCachedArea::OnSetItemComplete( |
- const base::string16& key, bool success) { |
- if (!success) { |
- Reset(); |
- return; |
- } |
- std::map<base::string16, int>::iterator found = |
- ignore_key_mutations_.find(key); |
- DCHECK(found != ignore_key_mutations_.end()); |
- if (--found->second == 0) |
- ignore_key_mutations_.erase(found); |
-} |
- |
-void DomStorageCachedArea::OnRemoveItemComplete( |
- const base::string16& key, bool success) { |
- DCHECK(success); |
- std::map<base::string16, int>::iterator found = |
- ignore_key_mutations_.find(key); |
- DCHECK(found != ignore_key_mutations_.end()); |
- if (--found->second == 0) |
- ignore_key_mutations_.erase(found); |
-} |
- |
-void DomStorageCachedArea::OnClearComplete(bool success) { |
- DCHECK(success); |
- DCHECK(ignore_all_mutations_); |
- ignore_all_mutations_ = false; |
-} |
- |
-} // namespace dom_storage |