blob: 3f1cf4c10b7b05df5e76767f5971fa5960c53dbb [file] [log] [blame]
// Copyright (c) 2020 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 "content/browser/indexed_db/indexed_db_control_wrapper.h"
#include "base/task/post_task.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
namespace content {
IndexedDBControlWrapper::IndexedDBControlWrapper(
const base::FilePath& data_path,
scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy,
scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
base::Clock* clock,
mojo::PendingRemote<storage::mojom::BlobStorageContext>
blob_storage_context,
mojo::PendingRemote<storage::mojom::FileSystemAccessContext>
file_system_access_context,
scoped_refptr<base::SequencedTaskRunner> io_task_runner,
scoped_refptr<base::SequencedTaskRunner> custom_task_runner) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
context_ = base::MakeRefCounted<IndexedDBContextImpl>(
data_path, std::move(quota_manager_proxy), clock,
std::move(blob_storage_context), std::move(file_system_access_context),
io_task_runner, std::move(custom_task_runner));
if (special_storage_policy) {
storage_policy_observer_.emplace(
base::BindRepeating(&IndexedDBControlWrapper::ApplyPolicyUpdates,
weak_factory_.GetWeakPtr()),
io_task_runner, std::move(special_storage_policy));
}
}
IndexedDBControlWrapper::~IndexedDBControlWrapper() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
context_->Shutdown();
IndexedDBContextImpl::ReleaseOnIDBSequence(std::move(context_));
}
void IndexedDBControlWrapper::BindIndexedDB(
const blink::StorageKey& storage_key,
mojo::PendingReceiver<blink::mojom::IDBFactory> receiver) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
if (storage_policy_observer_) {
// TODO(https://crbug.com/1199077): Pass the real StorageKey once
// StoragePolicyObserver is migrated.
storage_policy_observer_->StartTrackingOrigin(storage_key.origin());
}
indexed_db_control_->BindIndexedDB(storage_key, std::move(receiver));
}
void IndexedDBControlWrapper::GetUsage(GetUsageCallback usage_callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->GetUsage(std::move(usage_callback));
}
void IndexedDBControlWrapper::DeleteForStorageKey(
const blink::StorageKey& storage_key,
DeleteForStorageKeyCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->DeleteForStorageKey(storage_key, std::move(callback));
}
void IndexedDBControlWrapper::ForceClose(
const blink::StorageKey& storage_key,
storage::mojom::ForceCloseReason reason,
base::OnceClosure callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->ForceClose(storage_key, reason, std::move(callback));
}
void IndexedDBControlWrapper::GetConnectionCount(
const blink::StorageKey& storage_key,
GetConnectionCountCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->GetConnectionCount(storage_key, std::move(callback));
}
void IndexedDBControlWrapper::DownloadStorageKeyData(
const blink::StorageKey& storage_key,
DownloadStorageKeyDataCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->DownloadStorageKeyData(storage_key, std::move(callback));
}
void IndexedDBControlWrapper::GetAllStorageKeysDetails(
GetAllStorageKeysDetailsCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->GetAllStorageKeysDetails(std::move(callback));
}
void IndexedDBControlWrapper::SetForceKeepSessionState() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->SetForceKeepSessionState();
}
void IndexedDBControlWrapper::ApplyPolicyUpdates(
std::vector<storage::mojom::StoragePolicyUpdatePtr> policy_updates) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->ApplyPolicyUpdates(std::move(policy_updates));
}
void IndexedDBControlWrapper::BindTestInterface(
mojo::PendingReceiver<storage::mojom::IndexedDBControlTest> receiver) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->BindTestInterface(std::move(receiver));
}
void IndexedDBControlWrapper::AddObserver(
mojo::PendingRemote<storage::mojom::IndexedDBObserver> observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
BindRemoteIfNeeded();
indexed_db_control_->AddObserver(std::move(observer));
}
void IndexedDBControlWrapper::BindRemoteIfNeeded() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(
!(indexed_db_control_.is_bound() && !indexed_db_control_.is_connected()))
<< "Rebinding is not supported yet.";
if (indexed_db_control_.is_bound())
return;
context_->IDBTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&IndexedDBContextImpl::Bind, context_,
indexed_db_control_.BindNewPipeAndPassReceiver()));
}
} // namespace content