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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/password_manager/password_store.cc
diff --git a/chrome/browser/password_manager/password_store.cc b/chrome/browser/password_manager/password_store.cc
index 80380928d18ad8c4f9ead4dc09ce2e7bc93911e6..e91806998e14ec89094a5e780d95ba3d75ba1717 100644
--- a/chrome/browser/password_manager/password_store.cc
+++ b/chrome/browser/password_manager/password_store.cc
@@ -6,13 +6,14 @@
#include "base/message_loop.h"
#include "base/scoped_ptr.h"
+#include "base/stl_util-inl.h"
#include "base/task.h"
#include "content/browser/browser_thread.h"
using std::vector;
using webkit_glue::PasswordForm;
-PasswordStore::PasswordStore() : handle_(0) {
+PasswordStore::PasswordStore() {
}
bool PasswordStore::Init() {
@@ -47,36 +48,24 @@ void PasswordStore::RemoveLoginsCreatedBetween(const base::Time& delete_begin,
NewRunnableMethod(this, &PasswordStore::WrapModificationTask, task));
}
-int PasswordStore::GetLogins(const PasswordForm& form,
- PasswordStoreConsumer* consumer) {
- int handle = GetNewRequestHandle();
- GetLoginsRequest* request = new GetLoginsRequest(consumer, handle);
- ScheduleTask(NewRunnableMethod(this, &PasswordStore::GetLoginsImpl, request,
- form));
- return handle;
+PasswordStore::Handle PasswordStore::GetLogins(
+ const PasswordForm& form, PasswordStoreConsumer* consumer) {
+ return Schedule(&PasswordStore::GetLoginsImpl, consumer, form);
}
-int PasswordStore::GetAutofillableLogins(PasswordStoreConsumer* consumer) {
- int handle = GetNewRequestHandle();
- GetLoginsRequest* request = new GetLoginsRequest(consumer, handle);
- ScheduleTask(NewRunnableMethod(this,
- &PasswordStore::GetAutofillableLoginsImpl,
- request));
- return handle;
+PasswordStore::Handle PasswordStore::GetAutofillableLogins(
+ PasswordStoreConsumer* consumer) {
+ return Schedule(&PasswordStore::GetAutofillableLoginsImpl, consumer);
}
-int PasswordStore::GetBlacklistLogins(PasswordStoreConsumer* consumer) {
- int handle = GetNewRequestHandle();
- GetLoginsRequest* request = new GetLoginsRequest(consumer, handle);
- ScheduleTask(NewRunnableMethod(this,
- &PasswordStore::GetBlacklistLoginsImpl,
- request));
- return handle;
+PasswordStore::Handle PasswordStore::GetBlacklistLogins(
+ PasswordStoreConsumer* consumer) {
+ return Schedule(&PasswordStore::GetBlacklistLoginsImpl, consumer);
}
-void PasswordStore::CancelLoginsQuery(int handle) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- pending_requests_.erase(handle);
+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.
+ request->ForwardResult(GetLoginsRequest::TupleType(request->handle(),
+ request->value));
}
void PasswordStore::ReportMetrics() {
@@ -93,50 +82,41 @@ void PasswordStore::RemoveObserver(Observer* observer) {
PasswordStore::~PasswordStore() {}
-PasswordStore::GetLoginsRequest::GetLoginsRequest(
- PasswordStoreConsumer* consumer, int handle)
- : consumer(consumer), handle(handle), message_loop(MessageLoop::current()) {
-}
-
void PasswordStore::ScheduleTask(Task* task) {
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, task);
}
-void PasswordStore::NotifyConsumer(GetLoginsRequest* request,
- const vector<PasswordForm*>& forms) {
- scoped_ptr<GetLoginsRequest> request_ptr(request);
-
-#if !defined(OS_MACOSX)
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
-#endif
- request->message_loop->PostTask(
- FROM_HERE,
- NewRunnableMethod(this,
- &PasswordStore::NotifyConsumerImpl,
- request->consumer, request->handle, forms));
+template<typename BackendFunc>
+PasswordStore::Handle PasswordStore::Schedule(
+ BackendFunc func, PasswordStoreConsumer* consumer) {
+ scoped_refptr<GetLoginsRequest> request(new GetLoginsRequest(
+ NewCallback(consumer,
+ &PasswordStoreConsumer::OnPasswordStoreRequestDone)));
+ AddRequest(request, consumer->cancelable_consumer());
+ ScheduleTask(NewRunnableMethod(this, func, request));
+ return request->handle();
}
-void PasswordStore::NotifyConsumerImpl(PasswordStoreConsumer* consumer,
- int handle,
- const vector<PasswordForm*>& forms) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- // Don't notify the consumer if the request was canceled.
- if (pending_requests_.find(handle) == pending_requests_.end()) {
- // |forms| is const so we iterate rather than use STLDeleteElements().
- for (size_t i = 0; i < forms.size(); ++i)
- delete forms[i];
- return;
- }
- pending_requests_.erase(handle);
+template<typename BackendFunc, typename ArgA>
+PasswordStore::Handle PasswordStore::Schedule(
+ BackendFunc func, 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();
+}
- consumer->OnPasswordStoreRequestDone(handle, forms);
+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.
+ : CancelableRequest1<GetLoginsCallback,
+ std::vector<webkit_glue::PasswordForm*> >(callback) {
}
-int PasswordStore::GetNewRequestHandle() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- int handle = handle_++;
- pending_requests_.insert(handle);
- return handle;
+PasswordStore::GetLoginsRequest::~GetLoginsRequest() {
+ if (canceled()) {
+ STLDeleteElements(&value);
+ }
}
void PasswordStore::WrapModificationTask(Task* task) {

Powered by Google App Engine
This is Rietveld 408576698