| 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 4b8b43508ec4deafd8f439148e4f50277b65b077..0212790bc4618db28d48dfbf6108599b77446155 100644
|
| --- a/chrome/browser/password_manager/password_store.h
|
| +++ b/chrome/browser/password_manager/password_store.h
|
| @@ -6,16 +6,16 @@
|
| #define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_H_
|
| #pragma once
|
|
|
| -#include <set>
|
| #include <vector>
|
|
|
| +#include "base/callback.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/observer_list.h"
|
| #include "base/threading/thread.h"
|
| #include "base/time.h"
|
| -#include "webkit/glue/password_form.h"
|
| +#include "content/browser/cancelable_request.h"
|
|
|
| -class Profile;
|
| +class PasswordStoreConsumer;
|
| class Task;
|
|
|
| namespace browser_sync {
|
| @@ -24,20 +24,39 @@ class PasswordModelAssociator;
|
| class PasswordModelWorker;
|
| };
|
|
|
| -class PasswordStoreConsumer {
|
| - public:
|
| - virtual ~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;
|
| +namespace webkit_glue {
|
| +struct PasswordForm;
|
| };
|
|
|
| // 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;
|
| +
|
| + // PasswordForm vector elements are meant to be owned by the
|
| + // PasswordStoreConsumer. However, if the request is canceled after the
|
| + // allocation, then the request must take care of the deletion.
|
| + // TODO(scr) If we can convert vector<PasswordForm*> to
|
| + // ScopedVector<PasswordForm>, then we can move the following class to merely
|
| + // a typedef. At the moment, a subclass of CancelableRequest1 is required to
|
| + // provide a destructor, which cleans up after canceled requests by deleting
|
| + // vector elements.
|
| + class GetLoginsRequest : public CancelableRequest1<
|
| + GetLoginsCallback, std::vector<webkit_glue::PasswordForm*> > {
|
| + public:
|
| + explicit GetLoginsRequest(GetLoginsCallback* callback);
|
| + virtual ~GetLoginsRequest();
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(GetLoginsRequest);
|
| + };
|
| +
|
| // An interface used to notify clients (observers) of this object that data in
|
| // the password store has changed. Register the observer via
|
| // PasswordStore::SetObserver.
|
| @@ -69,24 +88,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 PasswordStoreConsumer 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.
|
| void ReportMetrics();
|
| @@ -106,25 +122,7 @@ 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.
|
| + // Schedule the given |task| to be run in the PasswordStore's own thread.
|
| virtual void ScheduleTask(Task* task);
|
|
|
| // These will be run in PasswordStore's own thread.
|
| @@ -156,22 +154,23 @@ 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);
|
| + // Dispatches the result to the PasswordStoreConsumer on the original caller's
|
| + // thread so the callback can be executed there. This should be the UI
|
| + // thread.
|
| + virtual void ForwardLoginsResult(GetLoginsRequest* request);
|
|
|
| - 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);
|
| + // Schedule the given |func| to be run in the PasswordStore's own thread with
|
| + // responses delivered to |consumer| on the current thread.
|
| + template<typename BackendFunc>
|
| + Handle Schedule(BackendFunc func, PasswordStoreConsumer* consumer);
|
|
|
| - // Returns a new request handle tracked in pending_requests_.
|
| - int GetNewRequestHandle();
|
| + // Schedule the given |func| to be run in the PasswordStore's own thread with
|
| + // argument |a| and responses delivered to |consumer| on the current thread.
|
| + template<typename BackendFunc, typename ArgA>
|
| + Handle Schedule(BackendFunc func, PasswordStoreConsumer* consumer,
|
| + const ArgA& a);
|
|
|
| + private:
|
| // Wrapper method called on the destination thread (DB for non-mac) that calls
|
| // the method specified in |task| and then calls back into the source thread
|
| // to notify observers that the password store may have been modified via
|
| @@ -185,14 +184,6 @@ class PasswordStore : public base::RefCountedThreadSafe<PasswordStore> {
|
| // may have been changed.
|
| void NotifyLoginsChanged();
|
|
|
| - // 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_;
|
| -
|
| // The observers.
|
| ObserverList<Observer> observers_;
|
|
|
|
|