Home | History | Annotate | Download | only in quota
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "webkit/browser/quota/mock_storage_client.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/bind.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/memory/singleton.h"
     11 #include "base/message_loop/message_loop_proxy.h"
     12 #include "base/stl_util.h"
     13 #include "net/base/net_util.h"
     14 #include "webkit/browser/quota/quota_manager.h"
     15 
     16 namespace quota {
     17 
     18 using std::make_pair;
     19 
     20 MockStorageClient::MockStorageClient(
     21     QuotaManagerProxy* quota_manager_proxy,
     22     const MockOriginData* mock_data, QuotaClient::ID id, size_t mock_data_size)
     23     : quota_manager_proxy_(quota_manager_proxy),
     24       id_(id),
     25       mock_time_counter_(0),
     26       weak_factory_(this) {
     27   Populate(mock_data, mock_data_size);
     28 }
     29 
     30 void MockStorageClient::Populate(
     31     const MockOriginData* mock_data,
     32     size_t mock_data_size) {
     33   for (size_t i = 0; i < mock_data_size; ++i) {
     34     origin_data_[make_pair(GURL(mock_data[i].origin), mock_data[i].type)] =
     35         mock_data[i].usage;
     36   }
     37 }
     38 
     39 MockStorageClient::~MockStorageClient() {}
     40 
     41 void MockStorageClient::AddOriginAndNotify(
     42     const GURL& origin_url, StorageType type, int64 size) {
     43   DCHECK(origin_data_.find(make_pair(origin_url, type)) == origin_data_.end());
     44   DCHECK_GE(size, 0);
     45   origin_data_[make_pair(origin_url, type)] = size;
     46   quota_manager_proxy_->quota_manager()->NotifyStorageModifiedInternal(
     47       id(), origin_url, type, size, IncrementMockTime());
     48 }
     49 
     50 void MockStorageClient::ModifyOriginAndNotify(
     51     const GURL& origin_url, StorageType type, int64 delta) {
     52   OriginDataMap::iterator find = origin_data_.find(make_pair(origin_url, type));
     53   DCHECK(find != origin_data_.end());
     54   find->second += delta;
     55   DCHECK_GE(find->second, 0);
     56 
     57   // TODO(tzik): Check quota to prevent usage exceed
     58   quota_manager_proxy_->quota_manager()->NotifyStorageModifiedInternal(
     59       id(), origin_url, type, delta, IncrementMockTime());
     60 }
     61 
     62 void MockStorageClient::TouchAllOriginsAndNotify() {
     63   for (OriginDataMap::const_iterator itr = origin_data_.begin();
     64        itr != origin_data_.end();
     65        ++itr) {
     66     quota_manager_proxy_->quota_manager()->NotifyStorageModifiedInternal(
     67         id(), itr->first.first, itr->first.second, 0, IncrementMockTime());
     68   }
     69 }
     70 
     71 void MockStorageClient::AddOriginToErrorSet(
     72     const GURL& origin_url, StorageType type) {
     73   error_origins_.insert(make_pair(origin_url, type));
     74 }
     75 
     76 base::Time MockStorageClient::IncrementMockTime() {
     77   ++mock_time_counter_;
     78   return base::Time::FromDoubleT(mock_time_counter_ * 10.0);
     79 }
     80 
     81 QuotaClient::ID MockStorageClient::id() const {
     82   return id_;
     83 }
     84 
     85 void MockStorageClient::OnQuotaManagerDestroyed() {
     86   delete this;
     87 }
     88 
     89 void MockStorageClient::GetOriginUsage(const GURL& origin_url,
     90                                        StorageType type,
     91                                        const GetUsageCallback& callback) {
     92   base::MessageLoopProxy::current()->PostTask(
     93       FROM_HERE,
     94       base::Bind(&MockStorageClient::RunGetOriginUsage,
     95                  weak_factory_.GetWeakPtr(), origin_url, type, callback));
     96 }
     97 
     98 void MockStorageClient::GetOriginsForType(
     99     StorageType type, const GetOriginsCallback& callback) {
    100   base::MessageLoopProxy::current()->PostTask(
    101       FROM_HERE,
    102       base::Bind(&MockStorageClient::RunGetOriginsForType,
    103                  weak_factory_.GetWeakPtr(), type, callback));
    104 }
    105 
    106 void MockStorageClient::GetOriginsForHost(
    107     StorageType type, const std::string& host,
    108     const GetOriginsCallback& callback) {
    109   base::MessageLoopProxy::current()->PostTask(
    110       FROM_HERE,
    111       base::Bind(&MockStorageClient::RunGetOriginsForHost,
    112                  weak_factory_.GetWeakPtr(), type, host, callback));
    113 }
    114 
    115 void MockStorageClient::DeleteOriginData(
    116     const GURL& origin, StorageType type,
    117     const DeletionCallback& callback) {
    118   base::MessageLoopProxy::current()->PostTask(
    119       FROM_HERE,
    120       base::Bind(&MockStorageClient::RunDeleteOriginData,
    121                  weak_factory_.GetWeakPtr(), origin, type, callback));
    122 }
    123 
    124 void MockStorageClient::RunGetOriginUsage(
    125     const GURL& origin_url, StorageType type,
    126     const GetUsageCallback& callback) {
    127   OriginDataMap::iterator find = origin_data_.find(make_pair(origin_url, type));
    128   if (find == origin_data_.end()) {
    129     callback.Run(0);
    130   } else {
    131     callback.Run(find->second);
    132   }
    133 }
    134 
    135 void MockStorageClient::RunGetOriginsForType(
    136     StorageType type, const GetOriginsCallback& callback) {
    137   std::set<GURL> origins;
    138   for (OriginDataMap::iterator iter = origin_data_.begin();
    139        iter != origin_data_.end(); ++iter) {
    140     if (type == iter->first.second)
    141       origins.insert(iter->first.first);
    142   }
    143   callback.Run(origins);
    144 }
    145 
    146 void MockStorageClient::RunGetOriginsForHost(
    147     StorageType type, const std::string& host,
    148     const GetOriginsCallback& callback) {
    149   std::set<GURL> origins;
    150   for (OriginDataMap::iterator iter = origin_data_.begin();
    151        iter != origin_data_.end(); ++iter) {
    152     std::string host_or_spec = net::GetHostOrSpecFromURL(iter->first.first);
    153     if (type == iter->first.second && host == host_or_spec)
    154       origins.insert(iter->first.first);
    155   }
    156   callback.Run(origins);
    157 }
    158 
    159 void MockStorageClient::RunDeleteOriginData(
    160     const GURL& origin_url,
    161     StorageType type,
    162     const DeletionCallback& callback) {
    163   ErrorOriginSet::iterator itr_error =
    164       error_origins_.find(make_pair(origin_url, type));
    165   if (itr_error != error_origins_.end()) {
    166     callback.Run(kQuotaErrorInvalidModification);
    167     return;
    168   }
    169 
    170   OriginDataMap::iterator itr =
    171       origin_data_.find(make_pair(origin_url, type));
    172   if (itr != origin_data_.end()) {
    173     int64 delta = itr->second;
    174     quota_manager_proxy_->
    175         NotifyStorageModified(id(), origin_url, type, -delta);
    176     origin_data_.erase(itr);
    177   }
    178 
    179   callback.Run(kQuotaStatusOk);
    180 }
    181 
    182 }  // namespace quota
    183