// 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/message_loop/message_loop_proxy.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/resource_context.h"
using content::BrowserThread;
namespace {
// Relays callback to the right message loop.
void DidGetCertDBOnIOThread(
scoped_refptr<base::MessageLoopProxy> response_message_loop,
const base::Callback<void(net::NSSCertDatabase*)>& callback,
net::NSSCertDatabase* cert_db) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
response_message_loop->PostTask(FROM_HERE, base::Bind(callback, cert_db));
}
// Gets NSSCertDatabase for the resource context.
void GetCertDBOnIOThread(
content::ResourceContext* context,
scoped_refptr<base::MessageLoopProxy> response_message_loop,
const base::Callback<void(net::NSSCertDatabase*)>& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
// Note that the callback will be used only if the cert database hasn't yet
// been initialized.
net::NSSCertDatabase* cert_db = GetNSSCertDatabaseForResourceContext(
context,
base::Bind(&DidGetCertDBOnIOThread, response_message_loop, callback));
if (cert_db)
DidGetCertDBOnIOThread(response_message_loop, callback, cert_db);
}
} // namespace
void GetNSSCertDatabaseForProfile(
Profile* profile,
const base::Callback<void(net::NSSCertDatabase*)>& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
BrowserThread::PostTask(BrowserThread::IO,
FROM_HERE,
base::Bind(&GetCertDBOnIOThread,
profile->GetResourceContext(),
base::MessageLoopProxy::current(),
callback));
}