blob: a5e7c37b0f294ed688316832da31464a8fcf0faf [file] [log] [blame]
// 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 "storage/browser/test/mock_storage_client.h"
#include <memory>
#include "base/bind.h"
#include "base/location.h"
#include "base/memory/singleton.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "net/base/url_util.h"
#include "storage/browser/quota/quota_manager_proxy.h"
#include "url/gurl.h"
namespace content {
using std::make_pair;
MockStorageClient::MockStorageClient(
QuotaManagerProxy* quota_manager_proxy,
const MockOriginData* mock_data, QuotaClient::ID id, size_t mock_data_size)
: quota_manager_proxy_(quota_manager_proxy),
id_(id),
mock_time_counter_(0),
weak_factory_(this) {
Populate(mock_data, mock_data_size);
}
void MockStorageClient::Populate(
const MockOriginData* mock_data,
size_t mock_data_size) {
for (size_t i = 0; i < mock_data_size; ++i) {
// TODO(crbug.com/889590): Use helper for url::Origin creation from string.
origin_data_[make_pair(url::Origin::Create(GURL(mock_data[i].origin)),
mock_data[i].type)] = mock_data[i].usage;
}
}
MockStorageClient::~MockStorageClient() = default;
void MockStorageClient::AddOriginAndNotify(const url::Origin& origin,
StorageType type,
int64_t size) {
DCHECK(origin_data_.find(make_pair(origin, type)) == origin_data_.end());
DCHECK_GE(size, 0);
origin_data_[make_pair(origin, type)] = size;
quota_manager_proxy_->quota_manager()->NotifyStorageModifiedInternal(
id(), origin, type, size, IncrementMockTime());
}
void MockStorageClient::ModifyOriginAndNotify(const url::Origin& origin,
StorageType type,
int64_t delta) {
auto find = origin_data_.find(make_pair(origin, type));
DCHECK(find != origin_data_.end());
find->second += delta;
DCHECK_GE(find->second, 0);
// TODO(tzik): Check quota to prevent usage exceed
quota_manager_proxy_->quota_manager()->NotifyStorageModifiedInternal(
id(), origin, type, delta, IncrementMockTime());
}
void MockStorageClient::TouchAllOriginsAndNotify() {
for (const auto& origin_type : origin_data_) {
quota_manager_proxy_->quota_manager()->NotifyStorageModifiedInternal(
id(), origin_type.first.first, origin_type.first.second, 0,
IncrementMockTime());
}
}
void MockStorageClient::AddOriginToErrorSet(const url::Origin& origin,
StorageType type) {
error_origins_.insert(make_pair(origin, type));
}
base::Time MockStorageClient::IncrementMockTime() {
++mock_time_counter_;
return base::Time::FromDoubleT(mock_time_counter_ * 10.0);
}
QuotaClient::ID MockStorageClient::id() const {
return id_;
}
void MockStorageClient::OnQuotaManagerDestroyed() {
delete this;
}
void MockStorageClient::GetOriginUsage(const url::Origin& origin,
StorageType type,
GetUsageCallback callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&MockStorageClient::RunGetOriginUsage,
weak_factory_.GetWeakPtr(), origin, type,
std::move(callback)));
}
void MockStorageClient::GetOriginsForType(StorageType type,
GetOriginsCallback callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(&MockStorageClient::RunGetOriginsForType,
weak_factory_.GetWeakPtr(), type, std::move(callback)));
}
void MockStorageClient::GetOriginsForHost(StorageType type,
const std::string& host,
GetOriginsCallback callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&MockStorageClient::RunGetOriginsForHost,
weak_factory_.GetWeakPtr(), type, host,
std::move(callback)));
}
void MockStorageClient::DeleteOriginData(const url::Origin& origin,
StorageType type,
DeletionCallback callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&MockStorageClient::RunDeleteOriginData,
weak_factory_.GetWeakPtr(), origin, type,
std::move(callback)));
}
bool MockStorageClient::DoesSupport(StorageType type) const {
return true;
}
void MockStorageClient::RunGetOriginUsage(const url::Origin& origin,
StorageType type,
GetUsageCallback callback) {
auto find = origin_data_.find(make_pair(origin, type));
if (find == origin_data_.end()) {
std::move(callback).Run(0);
} else {
std::move(callback).Run(find->second);
}
}
void MockStorageClient::RunGetOriginsForType(StorageType type,
GetOriginsCallback callback) {
std::set<url::Origin> origins;
for (const auto& origin_type_usage : origin_data_) {
if (type == origin_type_usage.first.second)
origins.insert(origin_type_usage.first.first);
}
std::move(callback).Run(origins);
}
void MockStorageClient::RunGetOriginsForHost(StorageType type,
const std::string& host,
GetOriginsCallback callback) {
std::set<url::Origin> origins;
for (const auto& origin_type_usage : origin_data_) {
std::string host_or_spec =
net::GetHostOrSpecFromURL(origin_type_usage.first.first.GetURL());
if (type == origin_type_usage.first.second && host == host_or_spec)
origins.insert(origin_type_usage.first.first);
}
std::move(callback).Run(origins);
}
void MockStorageClient::RunDeleteOriginData(const url::Origin& origin,
StorageType type,
DeletionCallback callback) {
auto itr_error = error_origins_.find(make_pair(origin, type));
if (itr_error != error_origins_.end()) {
std::move(callback).Run(
blink::mojom::QuotaStatusCode::kErrorInvalidModification);
return;
}
auto itr = origin_data_.find(make_pair(origin, type));
if (itr != origin_data_.end()) {
int64_t delta = itr->second;
quota_manager_proxy_->NotifyStorageModified(id(), origin, type, -delta);
origin_data_.erase(itr);
}
std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk);
}
} // namespace content