// 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 "chrome/browser/net/nss_context.h" #include "base/bind.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" using content::BrowserThread; namespace { // Relays callback to the right message loop. void DidGetCertDBOnIOThread( const scoped_refptr& response_task_runner, base::OnceCallback callback, net::NSSCertDatabase* cert_db) { DCHECK_CURRENTLY_ON(BrowserThread::IO); response_task_runner->PostTask(FROM_HERE, base::BindOnce(std::move(callback), cert_db)); } // Gets NSSCertDatabase for the resource context. void GetCertDBOnIOThread( NssCertDatabaseGetter database_getter, scoped_refptr response_task_runner, base::OnceCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); // Note that the callback will be used only if the cert database hasn't yet // been initialized. auto split_callback = base::SplitOnceCallback(base::BindOnce( &DidGetCertDBOnIOThread, response_task_runner, std::move(callback))); net::NSSCertDatabase* cert_db = std::move(database_getter).Run(std::move(split_callback.first)); if (cert_db) std::move(split_callback.second).Run(cert_db); } } // namespace void GetNSSCertDatabaseForProfile( Profile* profile, base::OnceCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); content::GetIOThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(&GetCertDBOnIOThread, CreateNSSCertDatabaseGetter(profile), base::ThreadTaskRunnerHandle::Get(), std::move(callback))); }