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

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: . Created 7 years, 12 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..d7a370f303f88bc0705a0760f34461afa2d0e479 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.
@@ -48,14 +49,15 @@ class NET_EXPORT DefaultServerBoundCertStore : public ServerBoundCertStore {
// to the thread you actually want to be notified on.
void FlushStore(const base::Closure& completion_task);
- // ServerBoundCertStore implementation.
+ // ServerBoundCertStore implementation. All the callbacks for the following
+ // methods will be run on the calling thread.
erikwright (departed) 2013/01/04 19:20:10 This class is no longer threadsafe, right? If so t
mattm 2013/01/08 04:53:21 Well, I wanted to make the distinction from FlushS
erikwright (departed) 2013/01/10 22:03:30 I see. OK, the comment does make sense in that con
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 +65,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 +111,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_|. Takes ownership.
+ void EnqueueTask(Task* task);
erikwright (departed) 2013/01/04 19:20:10 "Takes ownership" should be reflected by a scoped_
mattm 2013/01/08 04:53:21 Done.
+ // If already initialized, run |task| immediately. Otherwise add it to
+ // |waiting_tasks_|. Takes ownership.
+ void RunOrEnqueueTask(Task* task);
erikwright (departed) 2013/01/04 19:20:10 ditto.
mattm 2013/01/08 04:53:21 Done.
+
// 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 +145,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 +171,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;

Powered by Google App Engine
This is Rietveld 408576698