|  | // 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 |