1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/net/nss_context.h"
6 
7 #include "base/bind.h"
8 #include "base/sequenced_task_runner.h"
9 #include "base/single_thread_task_runner.h"
10 #include "base/threading/thread_task_runner_handle.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "content/public/browser/browser_task_traits.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "content/public/browser/resource_context.h"
15 
16 using content::BrowserThread;
17 
18 namespace {
19 
20 // Relays callback to the right message loop.
DidGetCertDBOnIOThread(const scoped_refptr<base::SequencedTaskRunner> & response_task_runner,base::OnceCallback<void (net::NSSCertDatabase *)> callback,net::NSSCertDatabase * cert_db)21 void DidGetCertDBOnIOThread(
22     const scoped_refptr<base::SequencedTaskRunner>& response_task_runner,
23     base::OnceCallback<void(net::NSSCertDatabase*)> callback,
24     net::NSSCertDatabase* cert_db) {
25   DCHECK_CURRENTLY_ON(BrowserThread::IO);
26 
27   response_task_runner->PostTask(FROM_HERE,
28                                  base::BindOnce(std::move(callback), cert_db));
29 }
30 
31 // Gets NSSCertDatabase for the resource context.
GetCertDBOnIOThread(content::ResourceContext * context,scoped_refptr<base::SequencedTaskRunner> response_task_runner,base::OnceCallback<void (net::NSSCertDatabase *)> callback)32 void GetCertDBOnIOThread(
33     content::ResourceContext* context,
34     scoped_refptr<base::SequencedTaskRunner> response_task_runner,
35     base::OnceCallback<void(net::NSSCertDatabase*)> callback) {
36   DCHECK_CURRENTLY_ON(BrowserThread::IO);
37 
38   // Note that the callback will be used only if the cert database hasn't yet
39   // been initialized.
40   auto completion_callback = base::AdaptCallbackForRepeating(base::BindOnce(
41       &DidGetCertDBOnIOThread, response_task_runner, std::move(callback)));
42   net::NSSCertDatabase* cert_db =
43       GetNSSCertDatabaseForResourceContext(context, completion_callback);
44 
45   if (cert_db)
46     completion_callback.Run(cert_db);
47 }
48 
49 }  // namespace
50 
GetNSSCertDatabaseForProfile(Profile * profile,base::OnceCallback<void (net::NSSCertDatabase *)> callback)51 void GetNSSCertDatabaseForProfile(
52     Profile* profile,
53     base::OnceCallback<void(net::NSSCertDatabase*)> callback) {
54   DCHECK_CURRENTLY_ON(BrowserThread::UI);
55 
56   content::GetIOThreadTaskRunner({})->PostTask(
57       FROM_HERE,
58       base::BindOnce(&GetCertDBOnIOThread, profile->GetResourceContext(),
59                      base::ThreadTaskRunnerHandle::Get(), std::move(callback)));
60 }
61