blob: ce096f1ac62f5bae283786214bb71e70cb5266cc [file] [log] [blame]
// Copyright 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/native_io/native_io_context_impl.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "build/build_config.h"
#include "content/browser/native_io/native_io_manager.h"
#include "content/public/browser/browser_thread.h"
#if defined(OS_MAC)
#include "base/mac/mac_util.h"
#endif // defined(OS_MAC)
namespace content {
NativeIOContextImpl::NativeIOContextImpl() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
NativeIOContextImpl::~NativeIOContextImpl() {
// The destructor must be called on the IO thread, because it
// runs `native_io_manager_`s destructor, and the latter is only accessed on
// the IO thread.
DCHECK_CURRENTLY_ON(BrowserThread::IO);
}
void NativeIOContextImpl::Initialize(
const base::FilePath& profile_root,
scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy,
scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
#if DCHECK_IS_ON()
initialize_called_ = true;
#endif // DCHECK_IS_ON()
content::GetIOThreadTaskRunner({})->PostTask(
FROM_HERE,
base::BindOnce(&NativeIOContextImpl::InitializeOnIOThread, this,
profile_root, std::move(special_storage_policy),
std::move(quota_manager_proxy)));
}
void NativeIOContextImpl::BindReceiver(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
#if DCHECK_IS_ON()
DCHECK(initialize_called_) << __func__ << " called before Initialize()";
#endif // DCHECK_IS_ON()
content::GetIOThreadTaskRunner({})->PostTask(
FROM_HERE,
base::BindOnce(&NativeIOContextImpl::BindReceiverOnIOThread,
scoped_refptr<NativeIOContextImpl>(this), origin,
std::move(receiver), mojo::GetBadMessageCallback()));
}
void NativeIOContextImpl::DeleteOriginData(
const url::Origin& origin,
storage::mojom::QuotaClient::DeleteOriginDataCallback success_callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
#if DCHECK_IS_ON()
DCHECK(initialize_called_) << __func__ << " called before Initialize()";
#endif // DCHECK_IS_ON()
content::GetIOThreadTaskRunner({})->PostTask(
FROM_HERE,
base::BindOnce(
&NativeIOContextImpl::DeleteOriginDataOnIOThread,
scoped_refptr<NativeIOContextImpl>(this), std::move(origin),
base::BindOnce(
[](scoped_refptr<base::SequencedTaskRunner> task_runner,
storage::mojom::QuotaClient::DeleteOriginDataCallback callback,
blink::mojom::QuotaStatusCode result) {
task_runner->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), result));
},
base::SequencedTaskRunnerHandle::Get(),
std::move(success_callback))));
}
void NativeIOContextImpl::GetOriginUsageMap(
base::OnceCallback<void(const std::map<url::Origin, int64_t>)>
success_callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
#if DCHECK_IS_ON()
DCHECK(initialize_called_) << __func__ << " called before Initialize()";
#endif // DCHECK_IS_ON()
content::GetIOThreadTaskRunner({})->PostTask(
FROM_HERE,
base::BindOnce(
&NativeIOContextImpl::GetOriginUsageMapOnIOThread,
scoped_refptr<NativeIOContextImpl>(this),
base::BindOnce(
[](scoped_refptr<base::SequencedTaskRunner> task_runner,
base::OnceCallback<void(const std::map<url::Origin, int64_t>)>
callback,
std::map<url::Origin, int64_t> result) {
task_runner->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), result));
},
base::SequencedTaskRunnerHandle::Get(),
std::move(success_callback))));
}
void NativeIOContextImpl::InitializeOnIOThread(
const base::FilePath& profile_root,
scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy,
scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK(!native_io_manager_) << __func__ << " called more than once";
native_io_manager_ = std::make_unique<NativeIOManager>(
profile_root,
#if defined(OS_MAC)
!base::mac::IsAtLeastOS10_15(),
#endif // defined(OS_MAC)
std::move(special_storage_policy), std::move(quota_manager_proxy));
}
void NativeIOContextImpl::BindReceiverOnIOThread(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::NativeIOHost> receiver,
mojo::ReportBadMessageCallback bad_message_callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
native_io_manager_->BindReceiver(origin, std::move(receiver),
std::move(bad_message_callback));
}
void NativeIOContextImpl::DeleteOriginDataOnIOThread(
const url::Origin& origin,
storage::mojom::QuotaClient::DeleteOriginDataCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
native_io_manager_->DeleteOriginData(origin, std::move(callback));
}
void NativeIOContextImpl::GetOriginUsageMapOnIOThread(
base::OnceCallback<void(const std::map<url::Origin, int64_t>)> callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
std::map<url::Origin, int64_t> result = std::map<url::Origin, int64_t>();
native_io_manager_->GetOriginUsageMap(std::move(callback));
}
} // namespace content