// 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/quota/quota_context.h" #include #include "base/files/file_path.h" #include "base/memory/ref_counted_delete_on_sequence.h" #include "base/memory/scoped_refptr.h" #include "base/single_thread_task_runner.h" #include "content/browser/quota/quota_manager_host.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/quota_permission_context.h" #include "content/public/common/content_client.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "storage/browser/quota/quota_manager.h" #include "storage/browser/quota/quota_settings.h" #include "storage/browser/quota/special_storage_policy.h" namespace content { QuotaContext::QuotaContext( bool is_incognito, const base::FilePath& profile_path, scoped_refptr special_storage_policy, storage::GetQuotaSettingsFunc get_settings_function) : base::RefCountedDeleteOnSequence(GetIOThreadTaskRunner({})), io_thread_(GetIOThreadTaskRunner({})), quota_manager_(base::MakeRefCounted( is_incognito, profile_path, io_thread_, std::move(special_storage_policy), std::move(get_settings_function))), permission_context_( GetContentClient()->browser()->CreateQuotaPermissionContext()) {} void QuotaContext::BindQuotaManagerHost( int process_id, int render_frame_id, const url::Origin& origin, mojo::PendingReceiver receiver) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); io_thread_->PostTask( FROM_HERE, base::BindOnce(&QuotaContext::BindQuotaManagerHostOnIOThread, this, process_id, render_frame_id, origin, std::move(receiver))); } QuotaContext::~QuotaContext() { DCHECK_CURRENTLY_ON(BrowserThread::IO); } void QuotaContext::BindQuotaManagerHostOnIOThread( int process_id, int render_frame_id, const url::Origin& origin, mojo::PendingReceiver receiver) { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (!quota_change_dispatcher_) { quota_change_dispatcher_ = base::MakeRefCounted(); } // The quota manager currently runs on the I/O thread. auto host = std::make_unique( process_id, render_frame_id, origin, quota_manager_.get(), permission_context_.get(), quota_change_dispatcher_); auto* host_ptr = host.get(); receivers_.Add(host_ptr, std::move(receiver), std::move(host)); } void QuotaContext::OverrideQuotaManagerForTesting( scoped_refptr new_manager) { quota_manager_ = std::move(new_manager); } } // namespace content