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

Side by Side Diff: chrome/browser/password_manager/password_store.cc

Issue 6646051: Fix DCHECK, memory leak, and refactor PasswordStore to use CancelableRequest (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Responding to review comments. 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "chrome/browser/password_manager/password_store.h" 5 #include "chrome/browser/password_manager/password_store.h"
6 6
7 #include "base/message_loop.h" 7 #include "base/message_loop.h"
8 #include "base/scoped_ptr.h" 8 #include "base/scoped_ptr.h"
9 #include "base/stl_util-inl.h"
9 #include "base/task.h" 10 #include "base/task.h"
10 #include "content/browser/browser_thread.h" 11 #include "content/browser/browser_thread.h"
11 12
12 using std::vector; 13 using std::vector;
13 using webkit_glue::PasswordForm; 14 using webkit_glue::PasswordForm;
14 15
15 PasswordStore::PasswordStore() : handle_(0) { 16 PasswordStore::PasswordStore() {
16 } 17 }
17 18
18 bool PasswordStore::Init() { 19 bool PasswordStore::Init() {
19 ReportMetrics(); 20 ReportMetrics();
20 return true; 21 return true;
21 } 22 }
22 23
23 void PasswordStore::AddLogin(const PasswordForm& form) { 24 void PasswordStore::AddLogin(const PasswordForm& form) {
24 Task* task = NewRunnableMethod(this, &PasswordStore::AddLoginImpl, form); 25 Task* task = NewRunnableMethod(this, &PasswordStore::AddLoginImpl, form);
25 ScheduleTask( 26 ScheduleTask(
(...skipping 14 matching lines...) Expand all
40 41
41 void PasswordStore::RemoveLoginsCreatedBetween(const base::Time& delete_begin, 42 void PasswordStore::RemoveLoginsCreatedBetween(const base::Time& delete_begin,
42 const base::Time& delete_end) { 43 const base::Time& delete_end) {
43 Task* task = NewRunnableMethod(this, 44 Task* task = NewRunnableMethod(this,
44 &PasswordStore::RemoveLoginsCreatedBetweenImpl, 45 &PasswordStore::RemoveLoginsCreatedBetweenImpl,
45 delete_begin, delete_end); 46 delete_begin, delete_end);
46 ScheduleTask( 47 ScheduleTask(
47 NewRunnableMethod(this, &PasswordStore::WrapModificationTask, task)); 48 NewRunnableMethod(this, &PasswordStore::WrapModificationTask, task));
48 } 49 }
49 50
50 int PasswordStore::GetLogins(const PasswordForm& form, 51 PasswordStore::Handle PasswordStore::GetLogins(
51 PasswordStoreConsumer* consumer) { 52 const PasswordForm& form, PasswordStoreConsumer* consumer) {
52 int handle = GetNewRequestHandle(); 53 return Schedule(&PasswordStore::GetLoginsImpl, consumer, form);
53 GetLoginsRequest* request = new GetLoginsRequest(consumer, handle);
54 ScheduleTask(NewRunnableMethod(this, &PasswordStore::GetLoginsImpl, request,
55 form));
56 return handle;
57 } 54 }
58 55
59 int PasswordStore::GetAutofillableLogins(PasswordStoreConsumer* consumer) { 56 PasswordStore::Handle PasswordStore::GetAutofillableLogins(
60 int handle = GetNewRequestHandle(); 57 PasswordStoreConsumer* consumer) {
61 GetLoginsRequest* request = new GetLoginsRequest(consumer, handle); 58 return Schedule(&PasswordStore::GetAutofillableLoginsImpl, consumer);
62 ScheduleTask(NewRunnableMethod(this,
63 &PasswordStore::GetAutofillableLoginsImpl,
64 request));
65 return handle;
66 } 59 }
67 60
68 int PasswordStore::GetBlacklistLogins(PasswordStoreConsumer* consumer) { 61 PasswordStore::Handle PasswordStore::GetBlacklistLogins(
69 int handle = GetNewRequestHandle(); 62 PasswordStoreConsumer* consumer) {
70 GetLoginsRequest* request = new GetLoginsRequest(consumer, handle); 63 return Schedule(&PasswordStore::GetBlacklistLoginsImpl, consumer);
71 ScheduleTask(NewRunnableMethod(this,
72 &PasswordStore::GetBlacklistLoginsImpl,
73 request));
74 return handle;
75 } 64 }
76 65
77 void PasswordStore::CancelLoginsQuery(int handle) { 66 void PasswordStore::ForwardLoginsResult(GetLoginsRequest* request) {
James Hawkins 2011/03/21 01:45:06 Method ordering: ForwardLoginsResult() implementat
Sheridan Rawlins 2011/03/21 05:20:17 Done.
78 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 67 request->ForwardResult(GetLoginsRequest::TupleType(request->handle(),
79 pending_requests_.erase(handle); 68 request->value));
80 } 69 }
81 70
82 void PasswordStore::ReportMetrics() { 71 void PasswordStore::ReportMetrics() {
83 ScheduleTask(NewRunnableMethod(this, &PasswordStore::ReportMetricsImpl)); 72 ScheduleTask(NewRunnableMethod(this, &PasswordStore::ReportMetricsImpl));
84 } 73 }
85 74
86 void PasswordStore::AddObserver(Observer* observer) { 75 void PasswordStore::AddObserver(Observer* observer) {
87 observers_.AddObserver(observer); 76 observers_.AddObserver(observer);
88 } 77 }
89 78
90 void PasswordStore::RemoveObserver(Observer* observer) { 79 void PasswordStore::RemoveObserver(Observer* observer) {
91 observers_.RemoveObserver(observer); 80 observers_.RemoveObserver(observer);
92 } 81 }
93 82
94 PasswordStore::~PasswordStore() {} 83 PasswordStore::~PasswordStore() {}
95 84
96 PasswordStore::GetLoginsRequest::GetLoginsRequest(
97 PasswordStoreConsumer* consumer, int handle)
98 : consumer(consumer), handle(handle), message_loop(MessageLoop::current()) {
99 }
100
101 void PasswordStore::ScheduleTask(Task* task) { 85 void PasswordStore::ScheduleTask(Task* task) {
102 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, task); 86 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, task);
103 } 87 }
104 88
105 void PasswordStore::NotifyConsumer(GetLoginsRequest* request, 89 template<typename BackendFunc>
106 const vector<PasswordForm*>& forms) { 90 PasswordStore::Handle PasswordStore::Schedule(
107 scoped_ptr<GetLoginsRequest> request_ptr(request); 91 BackendFunc func, PasswordStoreConsumer* consumer) {
108 92 scoped_refptr<GetLoginsRequest> request(new GetLoginsRequest(
109 #if !defined(OS_MACOSX) 93 NewCallback(consumer,
110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 94 &PasswordStoreConsumer::OnPasswordStoreRequestDone)));
111 #endif 95 AddRequest(request, consumer->cancelable_consumer());
112 request->message_loop->PostTask( 96 ScheduleTask(NewRunnableMethod(this, func, request));
113 FROM_HERE, 97 return request->handle();
114 NewRunnableMethod(this,
115 &PasswordStore::NotifyConsumerImpl,
116 request->consumer, request->handle, forms));
117 } 98 }
118 99
119 void PasswordStore::NotifyConsumerImpl(PasswordStoreConsumer* consumer, 100 template<typename BackendFunc, typename ArgA>
120 int handle, 101 PasswordStore::Handle PasswordStore::Schedule(
121 const vector<PasswordForm*>& forms) { 102 BackendFunc func, PasswordStoreConsumer* consumer, const ArgA& a) {
122 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 103 scoped_refptr<GetLoginsRequest> request(new GetLoginsRequest(
123 // Don't notify the consumer if the request was canceled. 104 NewCallback(consumer,
124 if (pending_requests_.find(handle) == pending_requests_.end()) { 105 &PasswordStoreConsumer::OnPasswordStoreRequestDone)));
125 // |forms| is const so we iterate rather than use STLDeleteElements(). 106 AddRequest(request, consumer->cancelable_consumer());
126 for (size_t i = 0; i < forms.size(); ++i) 107 ScheduleTask(NewRunnableMethod(this, func, request, a));
127 delete forms[i]; 108 return request->handle();
128 return;
129 }
130 pending_requests_.erase(handle);
131
132 consumer->OnPasswordStoreRequestDone(handle, forms);
133 } 109 }
134 110
135 int PasswordStore::GetNewRequestHandle() { 111 PasswordStore::GetLoginsRequest::GetLoginsRequest(GetLoginsCallback* callback)
James Hawkins 2011/03/21 01:45:06 The ordering of the methods in the source file sho
Sheridan Rawlins 2011/03/21 05:20:17 Done.
136 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 112 : CancelableRequest1<GetLoginsCallback,
137 int handle = handle_++; 113 std::vector<webkit_glue::PasswordForm*> >(callback) {
138 pending_requests_.insert(handle); 114 }
139 return handle; 115
116 PasswordStore::GetLoginsRequest::~GetLoginsRequest() {
117 if (canceled()) {
118 STLDeleteElements(&value);
119 }
140 } 120 }
141 121
142 void PasswordStore::WrapModificationTask(Task* task) { 122 void PasswordStore::WrapModificationTask(Task* task) {
143 #if !defined(OS_MACOSX) 123 #if !defined(OS_MACOSX)
144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 124 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
145 #endif // !defined(OS_MACOSX) 125 #endif // !defined(OS_MACOSX)
146 126
147 DCHECK(task); 127 DCHECK(task);
148 task->Run(); 128 task->Run();
149 delete task; 129 delete task;
150 130
151 BrowserThread::PostTask( 131 BrowserThread::PostTask(
152 BrowserThread::UI, FROM_HERE, 132 BrowserThread::UI, FROM_HERE,
153 NewRunnableMethod(this, &PasswordStore::NotifyLoginsChanged)); 133 NewRunnableMethod(this, &PasswordStore::NotifyLoginsChanged));
154 } 134 }
155 135
156 void PasswordStore::NotifyLoginsChanged() { 136 void PasswordStore::NotifyLoginsChanged() {
157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
158 FOR_EACH_OBSERVER(Observer, observers_, OnLoginsChanged()); 138 FOR_EACH_OBSERVER(Observer, observers_, OnLoginsChanged());
159 } 139 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698