| Index: webkit/browser/quota/storage_monitor.cc
|
| diff --git a/webkit/browser/quota/storage_monitor.cc b/webkit/browser/quota/storage_monitor.cc
|
| deleted file mode 100644
|
| index 366d4d7b399bac9039fc35d833d80d13114b4332..0000000000000000000000000000000000000000
|
| --- a/webkit/browser/quota/storage_monitor.cc
|
| +++ /dev/null
|
| @@ -1,379 +0,0 @@
|
| -// Copyright 2014 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/browser/quota/storage_monitor.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/stl_util.h"
|
| -#include "net/base/net_util.h"
|
| -#include "webkit/browser/quota/quota_manager.h"
|
| -#include "webkit/common/quota/quota_status_code.h"
|
| -
|
| -namespace storage {
|
| -
|
| -// StorageObserverList:
|
| -
|
| -StorageObserverList::ObserverState::ObserverState()
|
| - : requires_update(false) {
|
| -}
|
| -
|
| -StorageObserverList::StorageObserverList() {}
|
| -
|
| -StorageObserverList::~StorageObserverList() {}
|
| -
|
| -void StorageObserverList::AddObserver(
|
| - StorageObserver* observer, const StorageObserver::MonitorParams& params) {
|
| - ObserverState& observer_state = observers_[observer];
|
| - observer_state.origin = params.filter.origin;
|
| - observer_state.rate = params.rate;
|
| -}
|
| -
|
| -void StorageObserverList::RemoveObserver(StorageObserver* observer) {
|
| - observers_.erase(observer);
|
| -}
|
| -
|
| -int StorageObserverList::ObserverCount() const {
|
| - return observers_.size();
|
| -}
|
| -
|
| -void StorageObserverList::OnStorageChange(const StorageObserver::Event& event) {
|
| - for (StorageObserverStateMap::iterator it = observers_.begin();
|
| - it != observers_.end(); ++it) {
|
| - it->second.requires_update = true;
|
| - }
|
| -
|
| - MaybeDispatchEvent(event);
|
| -}
|
| -
|
| -void StorageObserverList::MaybeDispatchEvent(
|
| - const StorageObserver::Event& event) {
|
| - notification_timer_.Stop();
|
| - base::TimeDelta min_delay = base::TimeDelta::Max();
|
| - bool all_observers_notified = true;
|
| -
|
| - for (StorageObserverStateMap::iterator it = observers_.begin();
|
| - it != observers_.end(); ++it) {
|
| - if (!it->second.requires_update)
|
| - continue;
|
| -
|
| - base::TimeTicks current_time = base::TimeTicks::Now();
|
| - base::TimeDelta delta = current_time - it->second.last_notification_time;
|
| - if (it->second.last_notification_time.is_null() ||
|
| - delta >= it->second.rate) {
|
| - it->second.requires_update = false;
|
| - it->second.last_notification_time = current_time;
|
| -
|
| - if (it->second.origin == event.filter.origin) {
|
| - it->first->OnStorageEvent(event);
|
| - } else {
|
| - // When the quota and usage of an origin is requested, QuotaManager
|
| - // returns the quota and usage of the host. Multiple origins can map to
|
| - // to the same host, so ensure the |origin| field in the dispatched
|
| - // event matches the |origin| specified by the observer when it was
|
| - // registered.
|
| - StorageObserver::Event dispatch_event(event);
|
| - dispatch_event.filter.origin = it->second.origin;
|
| - it->first->OnStorageEvent(dispatch_event);
|
| - }
|
| - } else {
|
| - all_observers_notified = false;
|
| - base::TimeDelta delay = it->second.rate - delta;
|
| - if (delay < min_delay)
|
| - min_delay = delay;
|
| - }
|
| - }
|
| -
|
| - // We need to respect the notification rate specified by observers. So if it
|
| - // is too soon to dispatch an event to an observer, save the event and
|
| - // dispatch it after a delay. If we simply drop the event, another one may
|
| - // not arrive anytime soon and the observer will miss the most recent event.
|
| - if (!all_observers_notified) {
|
| - pending_event_ = event;
|
| - notification_timer_.Start(
|
| - FROM_HERE,
|
| - min_delay,
|
| - this,
|
| - &StorageObserverList::DispatchPendingEvent);
|
| - }
|
| -}
|
| -
|
| -void StorageObserverList::ScheduleUpdateForObserver(StorageObserver* observer) {
|
| - DCHECK(ContainsKey(observers_, observer));
|
| - observers_[observer].requires_update = true;
|
| -}
|
| -
|
| -void StorageObserverList::DispatchPendingEvent() {
|
| - MaybeDispatchEvent(pending_event_);
|
| -}
|
| -
|
| -
|
| -// HostStorageObservers:
|
| -
|
| -HostStorageObservers::HostStorageObservers(QuotaManager* quota_manager)
|
| - : quota_manager_(quota_manager),
|
| - initialized_(false),
|
| - initializing_(false),
|
| - event_occurred_before_init_(false),
|
| - usage_deltas_during_init_(0),
|
| - cached_usage_(0),
|
| - cached_quota_(0),
|
| - weak_factory_(this) {
|
| -}
|
| -
|
| -HostStorageObservers::~HostStorageObservers() {}
|
| -
|
| -void HostStorageObservers::AddObserver(
|
| - StorageObserver* observer,
|
| - const StorageObserver::MonitorParams& params) {
|
| - observers_.AddObserver(observer, params);
|
| -
|
| - if (!params.dispatch_initial_state)
|
| - return;
|
| -
|
| - if (initialized_) {
|
| - StorageObserver::Event event(params.filter,
|
| - std::max<int64>(cached_usage_, 0),
|
| - std::max<int64>(cached_quota_, 0));
|
| - observer->OnStorageEvent(event);
|
| - return;
|
| - }
|
| -
|
| - // Ensure the observer receives the initial storage state once initialization
|
| - // is complete.
|
| - observers_.ScheduleUpdateForObserver(observer);
|
| - StartInitialization(params.filter);
|
| -}
|
| -
|
| -void HostStorageObservers::RemoveObserver(StorageObserver* observer) {
|
| - observers_.RemoveObserver(observer);
|
| -}
|
| -
|
| -bool HostStorageObservers::ContainsObservers() const {
|
| - return observers_.ObserverCount() > 0;
|
| -}
|
| -
|
| -void HostStorageObservers::NotifyUsageChange(
|
| - const StorageObserver::Filter& filter, int64 delta) {
|
| - if (initialized_) {
|
| - cached_usage_ += delta;
|
| - DispatchEvent(filter, true);
|
| - return;
|
| - }
|
| -
|
| - // If a storage change occurs before initialization, ensure all observers will
|
| - // receive an event once initialization is complete.
|
| - event_occurred_before_init_ = true;
|
| -
|
| - // During QuotaManager::GetUsageAndQuotaForWebApps(), cached data is read
|
| - // synchronously, but other data may be retrieved asynchronously. A usage
|
| - // change may occur between the function call and callback. These deltas need
|
| - // to be added to the usage received by GotHostUsageAndQuota() to ensure
|
| - // |cached_usage_| is correctly initialized.
|
| - if (initializing_) {
|
| - usage_deltas_during_init_ += delta;
|
| - return;
|
| - }
|
| -
|
| - StartInitialization(filter);
|
| -}
|
| -
|
| -void HostStorageObservers::StartInitialization(
|
| - const StorageObserver::Filter& filter) {
|
| - if (initialized_ || initializing_)
|
| - return;
|
| -
|
| - initializing_ = true;
|
| - quota_manager_->GetUsageAndQuotaForWebApps(
|
| - filter.origin,
|
| - filter.storage_type,
|
| - base::Bind(&HostStorageObservers::GotHostUsageAndQuota,
|
| - weak_factory_.GetWeakPtr(),
|
| - filter));
|
| -}
|
| -
|
| -void HostStorageObservers::GotHostUsageAndQuota(
|
| - const StorageObserver::Filter& filter,
|
| - QuotaStatusCode status,
|
| - int64 usage,
|
| - int64 quota) {
|
| - initializing_ = false;
|
| - if (status != kQuotaStatusOk)
|
| - return;
|
| -
|
| - initialized_ = true;
|
| - cached_quota_ = quota;
|
| - cached_usage_ = usage + usage_deltas_during_init_;
|
| - DispatchEvent(filter, event_occurred_before_init_);
|
| -}
|
| -
|
| -void HostStorageObservers::DispatchEvent(
|
| - const StorageObserver::Filter& filter, bool is_update) {
|
| - StorageObserver::Event event(filter,
|
| - std::max<int64>(cached_usage_, 0),
|
| - std::max<int64>(cached_quota_, 0));
|
| - if (is_update)
|
| - observers_.OnStorageChange(event);
|
| - else
|
| - observers_.MaybeDispatchEvent(event);
|
| -}
|
| -
|
| -
|
| -// StorageTypeObservers:
|
| -
|
| -StorageTypeObservers::StorageTypeObservers(QuotaManager* quota_manager)
|
| - : quota_manager_(quota_manager) {
|
| -}
|
| -
|
| -StorageTypeObservers::~StorageTypeObservers() {
|
| - STLDeleteValues(&host_observers_map_);
|
| -}
|
| -
|
| -void StorageTypeObservers::AddObserver(
|
| - StorageObserver* observer, const StorageObserver::MonitorParams& params) {
|
| - std::string host = net::GetHostOrSpecFromURL(params.filter.origin);
|
| - if (host.empty())
|
| - return;
|
| -
|
| - HostStorageObservers* host_observers = NULL;
|
| - HostObserversMap::iterator it = host_observers_map_.find(host);
|
| - if (it == host_observers_map_.end()) {
|
| - host_observers = new HostStorageObservers(quota_manager_);
|
| - host_observers_map_[host] = host_observers;
|
| - } else {
|
| - host_observers = it->second;
|
| - }
|
| -
|
| - host_observers->AddObserver(observer, params);
|
| -}
|
| -
|
| -void StorageTypeObservers::RemoveObserver(StorageObserver* observer) {
|
| - for (HostObserversMap::iterator it = host_observers_map_.begin();
|
| - it != host_observers_map_.end(); ) {
|
| - it->second->RemoveObserver(observer);
|
| - if (!it->second->ContainsObservers()) {
|
| - delete it->second;
|
| - host_observers_map_.erase(it++);
|
| - } else {
|
| - ++it;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void StorageTypeObservers::RemoveObserverForFilter(
|
| - StorageObserver* observer, const StorageObserver::Filter& filter) {
|
| - std::string host = net::GetHostOrSpecFromURL(filter.origin);
|
| - HostObserversMap::iterator it = host_observers_map_.find(host);
|
| - if (it == host_observers_map_.end())
|
| - return;
|
| -
|
| - it->second->RemoveObserver(observer);
|
| - if (!it->second->ContainsObservers()) {
|
| - delete it->second;
|
| - host_observers_map_.erase(it);
|
| - }
|
| -}
|
| -
|
| -const HostStorageObservers* StorageTypeObservers::GetHostObservers(
|
| - const std::string& host) const {
|
| - HostObserversMap::const_iterator it = host_observers_map_.find(host);
|
| - if (it != host_observers_map_.end())
|
| - return it->second;
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -void StorageTypeObservers::NotifyUsageChange(
|
| - const StorageObserver::Filter& filter, int64 delta) {
|
| - std::string host = net::GetHostOrSpecFromURL(filter.origin);
|
| - HostObserversMap::iterator it = host_observers_map_.find(host);
|
| - if (it == host_observers_map_.end())
|
| - return;
|
| -
|
| - it->second->NotifyUsageChange(filter, delta);
|
| -}
|
| -
|
| -
|
| -// StorageMonitor:
|
| -
|
| -StorageMonitor::StorageMonitor(QuotaManager* quota_manager)
|
| - : quota_manager_(quota_manager) {
|
| -}
|
| -
|
| -StorageMonitor::~StorageMonitor() {
|
| - STLDeleteValues(&storage_type_observers_map_);
|
| -}
|
| -
|
| -void StorageMonitor::AddObserver(
|
| - StorageObserver* observer, const StorageObserver::MonitorParams& params) {
|
| - DCHECK(observer);
|
| -
|
| - // Check preconditions.
|
| - if (params.filter.storage_type == kStorageTypeUnknown ||
|
| - params.filter.storage_type == kStorageTypeQuotaNotManaged ||
|
| - params.filter.origin.is_empty()) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - StorageTypeObservers* type_observers = NULL;
|
| - StorageTypeObserversMap::iterator it =
|
| - storage_type_observers_map_.find(params.filter.storage_type);
|
| - if (it == storage_type_observers_map_.end()) {
|
| - type_observers = new StorageTypeObservers(quota_manager_);
|
| - storage_type_observers_map_[params.filter.storage_type] = type_observers;
|
| - } else {
|
| - type_observers = it->second;
|
| - }
|
| -
|
| - type_observers->AddObserver(observer, params);
|
| -}
|
| -
|
| -void StorageMonitor::RemoveObserver(StorageObserver* observer) {
|
| - for (StorageTypeObserversMap::iterator it =
|
| - storage_type_observers_map_.begin();
|
| - it != storage_type_observers_map_.end(); ++it) {
|
| - it->second->RemoveObserver(observer);
|
| - }
|
| -}
|
| -
|
| -void StorageMonitor::RemoveObserverForFilter(
|
| - StorageObserver* observer, const StorageObserver::Filter& filter) {
|
| - StorageTypeObserversMap::iterator it =
|
| - storage_type_observers_map_.find(filter.storage_type);
|
| - if (it == storage_type_observers_map_.end())
|
| - return;
|
| -
|
| - it->second->RemoveObserverForFilter(observer, filter);
|
| -}
|
| -
|
| -const StorageTypeObservers* StorageMonitor::GetStorageTypeObservers(
|
| - StorageType storage_type) const {
|
| - StorageTypeObserversMap::const_iterator it =
|
| - storage_type_observers_map_.find(storage_type);
|
| - if (it != storage_type_observers_map_.end())
|
| - return it->second;
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -void StorageMonitor::NotifyUsageChange(
|
| - const StorageObserver::Filter& filter, int64 delta) {
|
| - // Check preconditions.
|
| - if (filter.storage_type == kStorageTypeUnknown ||
|
| - filter.storage_type == kStorageTypeQuotaNotManaged ||
|
| - filter.origin.is_empty()) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - StorageTypeObserversMap::iterator it =
|
| - storage_type_observers_map_.find(filter.storage_type);
|
| - if (it == storage_type_observers_map_.end())
|
| - return;
|
| -
|
| - it->second->NotifyUsageChange(filter, delta);
|
| -}
|
| -
|
| -} // namespace storage
|
|
|