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