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

Side by Side Diff: components/password_manager/core/browser/password_store.h

Issue 866983003: GetLoginsRequest: Use ScopedVector to express ownership of forms (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@324291_scopedvector
Patch Set: Second fix of the rebase Created 5 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ 5 #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_
6 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ 6 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_
7 7
8 #include <vector>
9
10 #include "base/callback.h" 8 #include "base/callback.h"
11 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h" 11 #include "base/memory/scoped_vector.h"
14 #include "base/observer_list_threadsafe.h" 12 #include "base/observer_list_threadsafe.h"
15 #include "base/threading/thread.h" 13 #include "base/single_thread_task_runner.h"
16 #include "base/threading/thread_checker.h"
17 #include "base/time/time.h" 14 #include "base/time/time.h"
18 #include "components/password_manager/core/browser/password_store_change.h" 15 #include "components/password_manager/core/browser/password_store_change.h"
19 #include "components/password_manager/core/browser/password_store_sync.h" 16 #include "components/password_manager/core/browser/password_store_sync.h"
20 #include "sync/api/syncable_service.h" 17 #include "sync/api/syncable_service.h"
21 18
22 namespace autofill { 19 namespace autofill {
23 struct PasswordForm; 20 struct PasswordForm;
24 } 21 }
25 22
26 namespace syncer { 23 namespace syncer {
(...skipping 15 matching lines...) Expand all
42 // should fail without side effects, return no data, and send no notifications. 39 // should fail without side effects, return no data, and send no notifications.
43 // PasswordStoreSync is a hidden base class because only PasswordSyncableService 40 // PasswordStoreSync is a hidden base class because only PasswordSyncableService
44 // needs to access these methods. 41 // needs to access these methods.
45 class PasswordStore : protected PasswordStoreSync, 42 class PasswordStore : protected PasswordStoreSync,
46 public base::RefCountedThreadSafe<PasswordStore> { 43 public base::RefCountedThreadSafe<PasswordStore> {
47 public: 44 public:
48 // Whether or not it's acceptable for Chrome to request access to locked 45 // Whether or not it's acceptable for Chrome to request access to locked
49 // passwords, which requires prompting the user for permission. 46 // passwords, which requires prompting the user for permission.
50 enum AuthorizationPromptPolicy { ALLOW_PROMPT, DISALLOW_PROMPT }; 47 enum AuthorizationPromptPolicy { ALLOW_PROMPT, DISALLOW_PROMPT };
51 48
52 // PasswordForm vector elements are meant to be owned by the
53 // PasswordStoreConsumer. However, if the request is canceled after the
54 // allocation, then the request must take care of the deletion.
55 class GetLoginsRequest {
56 public:
57 explicit GetLoginsRequest(PasswordStoreConsumer* consumer);
58 virtual ~GetLoginsRequest();
59
60 void set_ignore_logins_cutoff(base::Time cutoff) {
61 ignore_logins_cutoff_ = cutoff;
62 }
63
64 // Removes any logins in the result list that were saved before the cutoff.
65 void ApplyIgnoreLoginsCutoff();
66
67 // Forward the result to the consumer on the original message loop.
68 void ForwardResult();
69
70 std::vector<autofill::PasswordForm*>* result() const {
71 return result_.get();
72 }
73
74 private:
75 // See GetLogins(). Logins older than this will be removed from the reply.
76 base::Time ignore_logins_cutoff_;
77
78 base::WeakPtr<PasswordStoreConsumer> consumer_weak_;
79
80 // The result of the request. It is filled in on the PasswordStore's task
81 // thread and consumed on the UI thread.
82 // TODO(dubroy): Remove this, and instead pass the vector directly to the
83 // backend methods.
84 scoped_ptr<std::vector<autofill::PasswordForm*>> result_;
85
86 base::ThreadChecker thread_checker_;
87 scoped_refptr<base::MessageLoopProxy> origin_loop_;
88
89 DISALLOW_COPY_AND_ASSIGN(GetLoginsRequest);
90 };
91
92 // An interface used to notify clients (observers) of this object that data in 49 // An interface used to notify clients (observers) of this object that data in
93 // the password store has changed. Register the observer via 50 // the password store has changed. Register the observer via
94 // PasswordStore::AddObserver. 51 // PasswordStore::AddObserver.
95 class Observer { 52 class Observer {
96 public: 53 public:
97 // Notifies the observer that password data changed. Will be called from 54 // Notifies the observer that password data changed. Will be called from
98 // the UI thread. 55 // the UI thread.
99 virtual void OnLoginsChanged(const PasswordStoreChangeList& changes) = 0; 56 virtual void OnLoginsChanged(const PasswordStoreChangeList& changes) = 0;
100 57
101 protected: 58 protected:
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 124
168 #if defined(PASSWORD_MANAGER_ENABLE_SYNC) 125 #if defined(PASSWORD_MANAGER_ENABLE_SYNC)
169 base::WeakPtr<syncer::SyncableService> GetPasswordSyncableService(); 126 base::WeakPtr<syncer::SyncableService> GetPasswordSyncableService();
170 #endif 127 #endif
171 128
172 protected: 129 protected:
173 friend class base::RefCountedThreadSafe<PasswordStore>; 130 friend class base::RefCountedThreadSafe<PasswordStore>;
174 131
175 typedef base::Callback<PasswordStoreChangeList(void)> ModificationTask; 132 typedef base::Callback<PasswordStoreChangeList(void)> ModificationTask;
176 133
134 class GetLoginsRequest {
135 public:
136 explicit GetLoginsRequest(PasswordStoreConsumer* consumer);
137 virtual ~GetLoginsRequest();
138
139 void set_ignore_logins_cutoff(base::Time cutoff) {
140 ignore_logins_cutoff_ = cutoff;
141 }
142
143 // Removes any logins in the result list that were saved before the cutoff.
144 void ApplyIgnoreLoginsCutoff();
145
146 // Forward the result to the consumer on the original message loop.
147 void ForwardResult();
148
149 ScopedVector<autofill::PasswordForm>* result() { return &result_; }
150
151 private:
152 // See GetLogins(). Logins older than this will be removed from the reply.
153 base::Time ignore_logins_cutoff_;
154
155 base::WeakPtr<PasswordStoreConsumer> consumer_weak_;
156
157 // The result of the request. It is filled in on the PasswordStore's task
158 // thread and consumed on the UI thread.
159 ScopedVector<autofill::PasswordForm> result_;
160
161 scoped_refptr<base::MessageLoopProxy> origin_loop_;
162
163 DISALLOW_COPY_AND_ASSIGN(GetLoginsRequest);
164 };
165
177 ~PasswordStore() override; 166 ~PasswordStore() override;
178 167
179 // Get the TaskRunner to use for PasswordStore background tasks. 168 // Get the TaskRunner to use for PasswordStore background tasks.
180 // By default, a SingleThreadTaskRunner on the DB thread is used, but 169 // By default, a SingleThreadTaskRunner on the DB thread is used, but
181 // subclasses can override. 170 // subclasses can override.
182 virtual scoped_refptr<base::SingleThreadTaskRunner> GetBackgroundTaskRunner(); 171 virtual scoped_refptr<base::SingleThreadTaskRunner> GetBackgroundTaskRunner();
183 172
184 // Methods below will be run in PasswordStore's own thread. 173 // Methods below will be run in PasswordStore's own thread.
185 // Synchronous implementation that reports usage metrics. 174 // Synchronous implementation that reports usage metrics.
186 virtual void ReportMetricsImpl(const std::string& sync_username, 175 virtual void ReportMetricsImpl(const std::string& sync_username,
(...skipping 23 matching lines...) Expand all
210 ConsumerCallbackRunner; 199 ConsumerCallbackRunner;
211 200
212 // Should find all PasswordForms with the same signon_realm. The results 201 // Should find all PasswordForms with the same signon_realm. The results
213 // will then be scored by the PasswordFormManager. Once they are found 202 // will then be scored by the PasswordFormManager. Once they are found
214 // (or not), the consumer should be notified. 203 // (or not), the consumer should be notified.
215 virtual void GetLoginsImpl(const autofill::PasswordForm& form, 204 virtual void GetLoginsImpl(const autofill::PasswordForm& form,
216 AuthorizationPromptPolicy prompt_policy, 205 AuthorizationPromptPolicy prompt_policy,
217 const ConsumerCallbackRunner& callback_runner) = 0; 206 const ConsumerCallbackRunner& callback_runner) = 0;
218 207
219 // Finds all non-blacklist PasswordForms, and notifies the consumer. 208 // Finds all non-blacklist PasswordForms, and notifies the consumer.
220 virtual void GetAutofillableLoginsImpl(GetLoginsRequest* request) = 0; 209 virtual void GetAutofillableLoginsImpl(
210 scoped_ptr<GetLoginsRequest> request) = 0;
221 211
222 // Finds all blacklist PasswordForms, and notifies the consumer. 212 // Finds all blacklist PasswordForms, and notifies the consumer.
223 virtual void GetBlacklistLoginsImpl(GetLoginsRequest* request) = 0; 213 virtual void GetBlacklistLoginsImpl(scoped_ptr<GetLoginsRequest> request) = 0;
224 214
225 // Dispatches the result to the PasswordStoreConsumer on the original caller's 215 // Dispatches the result to the PasswordStoreConsumer on the original caller's
226 // thread so the callback can be executed there. This should be the UI thread. 216 // thread so the callback can be executed there. This should be the UI thread.
227 static void ForwardLoginsResult(GetLoginsRequest* request); 217 static void ForwardLoginsResult(scoped_ptr<GetLoginsRequest> request);
228 218
229 // Log UMA stats for number of bulk deletions. 219 // Log UMA stats for number of bulk deletions.
230 void LogStatsForBulkDeletion(int num_deletions); 220 void LogStatsForBulkDeletion(int num_deletions);
231 221
232 // Log UMA stats for password deletions happening on clear browsing data 222 // Log UMA stats for password deletions happening on clear browsing data
233 // since first sync during rollback. 223 // since first sync during rollback.
234 void LogStatsForBulkDeletionDuringRollback(int num_deletions); 224 void LogStatsForBulkDeletionDuringRollback(int num_deletions);
235 225
236 // PasswordStoreSync: 226 // PasswordStoreSync:
237 // Called by WrapModificationTask() once the underlying data-modifying 227 // Called by WrapModificationTask() once the underlying data-modifying
238 // operation has been performed. Notifies observers that password store data 228 // operation has been performed. Notifies observers that password store data
239 // may have been changed. 229 // may have been changed.
240 void NotifyLoginsChanged(const PasswordStoreChangeList& changes) override; 230 void NotifyLoginsChanged(const PasswordStoreChangeList& changes) override;
241 231
242 // TaskRunner for tasks that run on the main thread (usually the UI thread). 232 // TaskRunner for tasks that run on the main thread (usually the UI thread).
243 scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner_; 233 scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner_;
244 234
245 // TaskRunner for the DB thread. By default, this is the task runner used for 235 // TaskRunner for the DB thread. By default, this is the task runner used for
246 // background tasks -- see |GetBackgroundTaskRunner|. 236 // background tasks -- see |GetBackgroundTaskRunner|.
247 scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner_; 237 scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner_;
248 238
249 private: 239 private:
250 // Schedule the given |func| to be run in the PasswordStore's own thread with 240 // Schedule the given |func| to be run in the PasswordStore's own thread with
251 // responses delivered to |consumer| on the current thread. 241 // responses delivered to |consumer| on the current thread.
252 template <typename BackendFunc> 242 void Schedule(void (PasswordStore::*func)(scoped_ptr<GetLoginsRequest>),
253 void Schedule(BackendFunc func, PasswordStoreConsumer* consumer); 243 PasswordStoreConsumer* consumer);
254 244
255 // Wrapper method called on the destination thread (DB for non-mac) that 245 // Wrapper method called on the destination thread (DB for non-mac) that
256 // invokes |task| and then calls back into the source thread to notify 246 // invokes |task| and then calls back into the source thread to notify
257 // observers that the password store may have been modified via 247 // observers that the password store may have been modified via
258 // NotifyLoginsChanged(). Note that there is no guarantee that the called 248 // NotifyLoginsChanged(). Note that there is no guarantee that the called
259 // method will actually modify the password store data. 249 // method will actually modify the password store data.
260 void WrapModificationTask(ModificationTask task); 250 void WrapModificationTask(ModificationTask task);
261 251
262 // Temporary specializations of WrapModificationTask for a better stack trace. 252 // Temporary specializations of WrapModificationTask for a better stack trace.
263 void AddLoginInternal(const autofill::PasswordForm& form); 253 void AddLoginInternal(const autofill::PasswordForm& form);
264 void UpdateLoginInternal(const autofill::PasswordForm& form); 254 void UpdateLoginInternal(const autofill::PasswordForm& form);
265 void RemoveLoginInternal(const autofill::PasswordForm& form); 255 void RemoveLoginInternal(const autofill::PasswordForm& form);
266 void RemoveLoginsCreatedBetweenInternal(base::Time delete_begin, 256 void RemoveLoginsCreatedBetweenInternal(base::Time delete_begin,
267 base::Time delete_end); 257 base::Time delete_end);
268 void RemoveLoginsSyncedBetweenInternal(base::Time delete_begin, 258 void RemoveLoginsSyncedBetweenInternal(base::Time delete_begin,
269 base::Time delete_end); 259 base::Time delete_end);
270 260
271 // Copies |matched_forms| into the request's result vector, then calls 261 // Moves |matched_forms| into the request's result vector, then calls
272 // |ForwardLoginsResult|. Temporarily used as an adapter between the API of 262 // |ForwardLoginsResult|. Temporarily used as an adapter between the API of
273 // |GetLoginsImpl| and |PasswordStoreConsumer|. 263 // |GetLoginsImpl| and |PasswordStoreConsumer|.
274 // TODO(dubroy): Get rid of this. 264 // TODO(dubroy): Get rid of this.
275 static void CopyAndForwardLoginsResult( 265 static void MoveAndForwardLoginsResult(
276 PasswordStore::GetLoginsRequest* request, 266 scoped_ptr<PasswordStore::GetLoginsRequest> request,
277 ScopedVector<autofill::PasswordForm> matched_forms); 267 ScopedVector<autofill::PasswordForm> matched_forms);
278 268
279 #if defined(PASSWORD_MANAGER_ENABLE_SYNC) 269 #if defined(PASSWORD_MANAGER_ENABLE_SYNC)
280 // Creates PasswordSyncableService instance on the background thread. 270 // Creates PasswordSyncableService instance on the background thread.
281 void InitSyncableService( 271 void InitSyncableService(
282 const syncer::SyncableService::StartSyncFlare& flare); 272 const syncer::SyncableService::StartSyncFlare& flare);
283 273
284 // Deletes PasswordSyncableService instance on the background thread. 274 // Deletes PasswordSyncableService instance on the background thread.
285 void DestroySyncableService(); 275 void DestroySyncableService();
286 #endif 276 #endif
287 277
288 // The observers. 278 // The observers.
289 scoped_refptr<ObserverListThreadSafe<Observer>> observers_; 279 scoped_refptr<ObserverListThreadSafe<Observer>> observers_;
290 280
291 scoped_ptr<PasswordSyncableService> syncable_service_; 281 scoped_ptr<PasswordSyncableService> syncable_service_;
292 282
293 bool shutdown_called_; 283 bool shutdown_called_;
294 284
295 DISALLOW_COPY_AND_ASSIGN(PasswordStore); 285 DISALLOW_COPY_AND_ASSIGN(PasswordStore);
296 }; 286 };
297 287
298 } // namespace password_manager 288 } // namespace password_manager
299 289
300 #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ 290 #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698