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

Unified Diff: chrome/browser/password_manager/password_store.h

Issue 6646051: Fix DCHECK, memory leak, and refactor PasswordStore to use CancelableRequest (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: git try works all platforms now. Created 9 years, 9 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: chrome/browser/password_manager/password_store.h
diff --git a/chrome/browser/password_manager/password_store.h b/chrome/browser/password_manager/password_store.h
index 32f9c81e4ca96bdc76c806a0e139e7af07c5c1fd..4360bb5bdc2d6d76b0875c0d48d22e11d753ea8b 100644
--- a/chrome/browser/password_manager/password_store.h
+++ b/chrome/browser/password_manager/password_store.h
@@ -6,15 +6,15 @@
#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_H_
#pragma once
-#include <set>
#include <vector>
+#include "base/callback.h"
#include "base/ref_counted.h"
#include "base/threading/thread.h"
#include "base/time.h"
+#include "content/browser/cancelable_request.h"
#include "webkit/glue/password_form.h"
-class Profile;
class Task;
namespace browser_sync {
@@ -29,14 +29,42 @@ class PasswordStoreConsumer {
// Call this when the request is finished. If there are no results, call it
// anyway with an empty vector.
virtual void OnPasswordStoreRequestDone(
- int handle, const std::vector<webkit_glue::PasswordForm*>& result) = 0;
+ CancelableRequestProvider::Handle handle,
+ const std::vector<webkit_glue::PasswordForm*>& result) = 0;
+
+ CancelableRequestConsumerBase* cancelable_consumer() {
stuartmorgan 2011/03/16 23:25:20 Comment?
Sheridan Rawlins 2011/03/20 08:13:11 Done.
+ return &cancelable_consumer_;
+ }
+
+ private:
+ CancelableRequestConsumer cancelable_consumer_;
};
// Interface for storing form passwords in a platform-specific secure way.
// The login request/manipulation API is not threadsafe and must be used
// from the UI thread.
-class PasswordStore : public base::RefCountedThreadSafe<PasswordStore> {
+class PasswordStore
+ : public base::RefCountedThreadSafe<PasswordStore>,
+ public CancelableRequestProvider {
public:
+ typedef Callback2<Handle,
+ const std::vector<webkit_glue::PasswordForm*>&>::Type
+ GetLoginsCallback;
+
+ // Destructor cleans up after canceled requests by deleting vector elements.
stuartmorgan 2011/03/16 23:25:20 This doesn't seem like a description of the class.
Sheridan Rawlins 2011/03/20 08:13:11 Done.
+ class GetLoginsRequest
James Hawkins 2011/03/16 22:39:35 This should probably be defined in the implementat
brettw 2011/03/17 21:40:34 Why do you do this at all instead of just having a
Sheridan Rawlins 2011/03/18 15:45:48 If I can change the type of |value| to a ScopedVec
Sheridan Rawlins 2011/03/20 08:13:11 Done.
+ : public CancelableRequest1<GetLoginsCallback,
+ std::vector<webkit_glue::PasswordForm*> > {
+ public:
+ explicit GetLoginsRequest(GetLoginsCallback* callback)
+ : CancelableRequest1<GetLoginsCallback,
+ std::vector<webkit_glue::PasswordForm*> >(callback) {}
stuartmorgan 2011/03/16 23:25:20 Fix indentation. Also, I believe having the empty
Sheridan Rawlins 2011/03/18 15:45:48 Good point. Again, if I change to typedef, this w
Sheridan Rawlins 2011/03/20 08:13:11 Done.
Sheridan Rawlins 2011/03/21 05:20:17 I noticed the following addition was merged in rec
+ virtual ~GetLoginsRequest();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(GetLoginsRequest);
+ };
+
PasswordStore();
// Reimplement this to add custom initialization. Always call this too.
@@ -56,24 +84,21 @@ class PasswordStore : public base::RefCountedThreadSafe<PasswordStore> {
const base::Time& delete_end);
// Searches for a matching PasswordForm and returns a handle so the async
- // request can be tracked. Implement the PasswordStoreConsumer interface to
- // be notified on completion.
- virtual int GetLogins(const webkit_glue::PasswordForm& form,
- PasswordStoreConsumer* consumer);
+ // request can be tracked. Implement the Consumer interface to be
+ // notified on completion.
+ virtual Handle GetLogins(const webkit_glue::PasswordForm& form,
+ PasswordStoreConsumer* consumer);
// Gets the complete list of PasswordForms that are not blacklist entries--and
// are thus auto-fillable--and returns a handle so the async request can be
- // tracked. Implement the PasswordStoreConsumer interface to be notified
- // on completion.
- int GetAutofillableLogins(PasswordStoreConsumer* consumer);
+ // tracked. Implement the PasswordStoreConsumer interface to be notified on
+ // completion.
+ Handle GetAutofillableLogins(PasswordStoreConsumer* consumer);
// Gets the complete list of PasswordForms that are blacklist entries, and
// returns a handle so the async request can be tracked. Implement the
// PasswordStoreConsumer interface to be notified on completion.
- int GetBlacklistLogins(PasswordStoreConsumer* consumer);
-
- // Cancels a previous Get*Logins query (async)
- void CancelLoginsQuery(int handle);
+ Handle GetBlacklistLogins(PasswordStoreConsumer* consumer);
// Reports usage metrics for the database.
virtual void ReportMetrics();
@@ -87,27 +112,34 @@ class PasswordStore : public base::RefCountedThreadSafe<PasswordStore> {
virtual ~PasswordStore();
- // Simple container class that represents a login lookup request.
- class GetLoginsRequest {
- public:
- GetLoginsRequest(PasswordStoreConsumer* c,
- int handle);
-
- // The consumer to notify when this request is complete.
- PasswordStoreConsumer* consumer;
- // A unique handle for the request
- int handle;
- // The message loop that the request was made from. We send the result
- // back to the consumer in this same message loop.
- MessageLoop* message_loop;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(GetLoginsRequest);
- };
-
// Schedule the given task to be run in the PasswordStore's own thread.
virtual void ScheduleTask(Task* task);
+ template<typename BackendFunc>
+ Handle Schedule(
James Hawkins 2011/03/16 22:39:35 Don't add code to headers.
Sheridan Rawlins 2011/03/18 15:45:48 I referenced the HistoryService files when creatin
Sheridan Rawlins 2011/03/20 08:13:11 Done.
+ BackendFunc func, // Function to call on PasswordStore's thread.
stuartmorgan 2011/03/16 23:25:20 I've never seen this style; please use the normal
Sheridan Rawlins 2011/03/18 15:45:48 I believe this also is referenced from HistoryServ
+ PasswordStoreConsumer* consumer) {
+ scoped_refptr<GetLoginsRequest> request(new GetLoginsRequest(
stuartmorgan 2011/03/16 23:25:20 Why is the implementation inline?
Sheridan Rawlins 2011/03/18 15:45:48 Because of templating. If this is defined in the
Sheridan Rawlins 2011/03/20 08:13:11 Done.
+ NewCallback(consumer,
+ &PasswordStoreConsumer::OnPasswordStoreRequestDone)));
+ AddRequest(request, consumer->cancelable_consumer());
+ ScheduleTask(NewRunnableMethod(this, func, request));
+ return request->handle();
+ }
+
+ template<typename BackendFunc, typename ArgA>
+ Handle Schedule(
stuartmorgan 2011/03/16 23:25:20 Same concerns here.
Sheridan Rawlins 2011/03/18 15:45:48 Ditto above. Will look into this.
Sheridan Rawlins 2011/03/20 08:13:11 Done.
+ BackendFunc func, // Function to call on PasswordStore's thread.
+ PasswordStoreConsumer* consumer,
+ const ArgA& a) {
+ scoped_refptr<GetLoginsRequest> request(new GetLoginsRequest(
+ NewCallback(consumer,
+ &PasswordStoreConsumer::OnPasswordStoreRequestDone)));
+ AddRequest(request, consumer->cancelable_consumer());
+ ScheduleTask(NewRunnableMethod(this, func, request, a));
+ return request->handle();
+ }
+
// These will be run in PasswordStore's own thread.
// Synchronous implementation that reports usage metrics.
virtual void ReportMetricsImpl() = 0;
@@ -137,29 +169,9 @@ class PasswordStore : public base::RefCountedThreadSafe<PasswordStore> {
virtual bool FillBlacklistLogins(
std::vector<webkit_glue::PasswordForm*>* forms) = 0;
- // Notifies the consumer that a Get*Logins() request is complete.
- virtual void NotifyConsumer(
- GetLoginsRequest* request,
- const std::vector<webkit_glue::PasswordForm*>& forms);
+ virtual void ForwardLoginsResult(GetLoginsRequest* request);
stuartmorgan 2011/03/16 23:25:20 Comment
Sheridan Rawlins 2011/03/20 08:13:11 Done.
private:
- // Called by NotifyConsumer, but runs in the consumer's thread. Will not
- // call the consumer if the request was canceled. This extra layer is here so
- // that PasswordStoreConsumer doesn't have to be reference counted (we assume
- // consumers will cancel their requests before they are destroyed).
- void NotifyConsumerImpl(PasswordStoreConsumer* consumer, int handle,
- const std::vector<webkit_glue::PasswordForm*>& forms);
-
- // Returns a new request handle tracked in pending_requests_.
- int GetNewRequestHandle();
-
- // Next handle to return from Get*Logins() to allow callers to track
- // their request.
- int handle_;
-
- // List of pending request handles. Handles are removed from the set when
- // they finish or are canceled.
- std::set<int> pending_requests_;
DISALLOW_COPY_AND_ASSIGN(PasswordStore);
};

Powered by Google App Engine
This is Rietveld 408576698