Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Unified Diff: net/base/default_server_bound_cert_store.h

Issue 11742037: Make ServerBoundCertStore interface async, move SQLiteServerBoundCertStore load onto DB thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix login_utils_browsertest Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/base/default_server_bound_cert_store.h
diff --git a/net/base/default_server_bound_cert_store.h b/net/base/default_server_bound_cert_store.h
index 48bf784b3d28367a8accf6e5e6fb5fea0841d6ea..33b63cec1ce79f4dc0633128d7287d7ffd6ce6e8 100644
--- a/net/base/default_server_bound_cert_store.h
+++ b/net/base/default_server_bound_cert_store.h
@@ -12,11 +12,12 @@
#include "base/callback_forward.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
+#include "base/memory/weak_ptr.h"
#include "net/base/net_export.h"
#include "net/base/server_bound_cert_store.h"
-class Task;
-
namespace net {
// This class is the system for storing and retrieving server bound certs.
@@ -52,10 +53,10 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
virtual bool GetServerBoundCert(
const std::string& server_identifier,
SSLClientCertType* type,
- base::Time* creation_time,
base::Time* expiration_time,
std::string* private_key_result,
- std::string* cert_result) OVERRIDE;
+ std::string* cert_result,
+ const GetCertCallback& callback) OVERRIDE;
virtual void SetServerBoundCert(
const std::string& server_identifier,
SSLClientCertType type,
@@ -63,29 +64,44 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
base::Time expiration_time,
const std::string& private_key,
const std::string& cert) OVERRIDE;
- virtual void DeleteServerBoundCert(const std::string& server_identifier)
- OVERRIDE;
- virtual void DeleteAllCreatedBetween(base::Time delete_begin,
- base::Time delete_end) OVERRIDE;
- virtual void DeleteAll() OVERRIDE;
+ virtual void DeleteServerBoundCert(
+ const std::string& server_identifier,
+ const base::Closure& callback) OVERRIDE;
+ virtual void DeleteAllCreatedBetween(
+ base::Time delete_begin,
+ base::Time delete_end,
+ const base::Closure& callback) OVERRIDE;
+ virtual void DeleteAll(const base::Closure& callback) OVERRIDE;
virtual void GetAllServerBoundCerts(
- ServerBoundCertList* server_bound_certs) OVERRIDE;
+ const GetCertListCallback& callback) OVERRIDE;
virtual int GetCertCount() OVERRIDE;
virtual void SetForceKeepSessionState() OVERRIDE;
private:
+ class Task;
+ class GetServerBoundCertTask;
+ class SetServerBoundCertTask;
+ class DeleteServerBoundCertTask;
+ class DeleteAllCreatedBetweenTask;
+ class GetAllServerBoundCertsTask;
+
static const size_t kMaxCerts;
// Deletes all of the certs. Does not delete them from |store_|.
void DeleteAllInMemory();
// Called by all non-static functions to ensure that the cert store has
- // been initialized. This is not done during creating so it doesn't block
- // the window showing.
+ // been initialized.
+ // TODO(mattm): since we load asynchronously now, maybe we should start
+ // loading immediately on construction, or provide some method to initiate
+ // loading?
void InitIfNecessary() {
if (!initialized_) {
- if (store_)
+ if (store_) {
InitStore();
+ } else {
+ loaded_ = true;
+ }
initialized_ = true;
}
}
@@ -94,6 +110,29 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
// Should only be called by InitIfNecessary().
void InitStore();
+ // Callback for backing store loading completion.
+ void OnLoaded(scoped_ptr<ScopedVector<ServerBoundCert> > certs);
+
+ // Syncronous methods which do the actual work. Can only be called after
+ // initialization is complete.
+ void SyncSetServerBoundCert(
+ const std::string& server_identifier,
+ SSLClientCertType type,
+ base::Time creation_time,
+ base::Time expiration_time,
+ const std::string& private_key,
+ const std::string& cert);
+ void SyncDeleteServerBoundCert(const std::string& server_identifier);
+ void SyncDeleteAllCreatedBetween(base::Time delete_begin,
+ base::Time delete_end);
+ void SyncGetAllServerBoundCerts(ServerBoundCertList* cert_list);
+
+ // Add |task| to |waiting_tasks_|.
+ void EnqueueTask(scoped_ptr<Task> task);
+ // If already initialized, run |task| immediately. Otherwise add it to
+ // |waiting_tasks_|.
+ void RunOrEnqueueTask(scoped_ptr<Task> task);
+
// Deletes the cert for the specified server, if such a cert exists, from the
// in-memory store. Deletes it from |store_| if |store_| is not NULL.
void InternalDeleteServerBoundCert(const std::string& server);
@@ -105,13 +144,23 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
ServerBoundCert* cert);
// Indicates whether the cert store has been initialized. This happens
- // Lazily in InitStoreIfNecessary().
+ // lazily in InitIfNecessary().
bool initialized_;
+ // Indicates whether loading from the backend store is completed and
+ // calls may be immediately processed.
+ bool loaded_;
+
+ // Tasks that are waiting to be run once we finish loading.
+ ScopedVector<Task> waiting_tasks_;
+ base::TimeTicks waiting_tasks_start_time_;
+
scoped_refptr<PersistentStore> store_;
ServerBoundCertMap server_bound_certs_;
+ base::WeakPtrFactory<DefaultServerBoundCertStore> weak_ptr_factory_;
+
DISALLOW_COPY_AND_ASSIGN(DefaultServerBoundCertStore);
};
@@ -121,11 +170,14 @@ typedef base::RefCountedThreadSafe<DefaultServerBoundCertStore::PersistentStore>
class NET_EXPORT DefaultServerBoundCertStore::PersistentStore
: public RefcountedPersistentStore {
public:
+ typedef base::Callback<void(scoped_ptr<ScopedVector<ServerBoundCert> >)>
+ LoadedCallback;
+
// Initializes the store and retrieves the existing certs. This will be
// called only once at startup. Note that the certs are individually allocated
// and that ownership is transferred to the caller upon return.
- virtual bool Load(
- std::vector<ServerBoundCert*>* certs) = 0;
+ // The |loaded_callback| must not be called synchronously.
+ virtual void Load(const LoadedCallback& loaded_callback) = 0;
virtual void AddServerBoundCert(const ServerBoundCert& cert) = 0;
« no previous file with comments | « chrome/browser/net/sqlite_server_bound_cert_store_unittest.cc ('k') | net/base/default_server_bound_cert_store.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698