Index: chrome/browser/webdata/web_data_request_manager.cc |
diff --git a/chrome/browser/webdata/web_data_request_manager.cc b/chrome/browser/webdata/web_data_request_manager.cc |
index cf3e6130ff396aef213012cf3cbef73e8d00c656..4591e60c96c204d26fae8ff0dc40a7f08d3cb75f 100644 |
--- a/chrome/browser/webdata/web_data_request_manager.cc |
+++ b/chrome/browser/webdata/web_data_request_manager.cc |
@@ -7,8 +7,6 @@ |
#include "base/bind.h" |
#include "base/message_loop.h" |
#include "base/stl_util.h" |
-#include "chrome/browser/autofill/autofill_profile.h" |
-#include "chrome/browser/autofill/credit_card.h" |
#include "chrome/browser/webdata/web_data_service.h" |
//////////////////////////////////////////////////////////////////////////////// |
@@ -17,19 +15,24 @@ |
// |
//////////////////////////////////////////////////////////////////////////////// |
-WebDataRequest::WebDataRequest(WebDataService* service, |
- WebDataServiceConsumer* consumer, |
+WebDataRequest::WebDataRequest(WebDataServiceConsumer* consumer, |
WebDataRequestManager* manager) |
- : service_(service), |
+ : manager_(manager), |
cancelled_(false), |
consumer_(consumer), |
result_(NULL) { |
- handle_ = manager->GetNextRequestHandle(); |
+ handle_ = manager_->GetNextRequestHandle(); |
message_loop_ = MessageLoop::current(); |
- manager->RegisterRequest(this); |
+ manager_->RegisterRequest(this); |
} |
WebDataRequest::~WebDataRequest() { |
+ if (manager_) { |
+ manager_->CancelRequest(handle_); |
+ } |
+ if (result_.get()) { |
+ result_->Destroy(); |
+ } |
} |
WebDataService::Handle WebDataRequest::GetHandle() const { |
@@ -40,6 +43,10 @@ WebDataServiceConsumer* WebDataRequest::GetConsumer() const { |
return consumer_; |
} |
+MessageLoop* WebDataRequest::GetMessageLoop() const { |
+ return message_loop_; |
+} |
+ |
bool WebDataRequest::IsCancelled() const { |
base::AutoLock l(cancel_lock_); |
return cancelled_; |
@@ -49,19 +56,19 @@ void WebDataRequest::Cancel() { |
base::AutoLock l(cancel_lock_); |
cancelled_ = true; |
consumer_ = NULL; |
+ manager_ = NULL; |
} |
-void WebDataRequest::SetResult(scoped_ptr<WDTypedResult> r) { |
- result_ = r.Pass(); |
+void WebDataRequest::OnComplete() { |
+ manager_= NULL; |
} |
-const WDTypedResult* WebDataRequest::GetResult() const { |
- return result_.get(); |
+void WebDataRequest::SetResult(scoped_ptr<WDTypedResult> r) { |
+ result_ = r.Pass(); |
} |
-void WebDataRequest::RequestComplete() { |
- message_loop_->PostTask(FROM_HERE, Bind(&WebDataService::RequestCompleted, |
- service_.get(), handle_)); |
+scoped_ptr<WDTypedResult> WebDataRequest::GetResult(){ |
+ return result_.Pass(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -75,6 +82,12 @@ WebDataRequestManager::WebDataRequestManager() |
} |
WebDataRequestManager::~WebDataRequestManager() { |
+ base::AutoLock l(pending_lock_); |
+ for (RequestMap::iterator i = pending_requests_.begin(); |
+ i != pending_requests_.end(); ++i) { |
+ i->second->Cancel(); |
+ } |
+ pending_requests_.clear(); |
} |
void WebDataRequestManager::RegisterRequest(WebDataRequest* request) { |
@@ -95,33 +108,42 @@ void WebDataRequestManager::CancelRequest(WebDataServiceBase::Handle h) { |
return; |
} |
i->second->Cancel(); |
+ pending_requests_.erase(i); |
} |
-void WebDataRequestManager::RequestCompleted(WebDataServiceBase::Handle h) { |
- pending_lock_.Acquire(); |
- RequestMap::iterator i = pending_requests_.find(h); |
- if (i == pending_requests_.end()) { |
- NOTREACHED() << "Request completed called for an unknown request"; |
- pending_lock_.Release(); |
+void WebDataRequestManager::RequestCompleted( |
+ scoped_ptr<WebDataRequest> request) { |
+ MessageLoop* loop = request->GetMessageLoop(); |
+ loop->PostTask(FROM_HERE, base::Bind( |
+ &WebDataRequestManager::RequestCompletedOnThread, |
+ this, |
+ base::Passed(&request))); |
+} |
+ |
+void WebDataRequestManager::RequestCompletedOnThread( |
+ scoped_ptr<WebDataRequest> request) { |
+ if (request->IsCancelled()) |
return; |
- } |
+ { |
+ base::AutoLock l(pending_lock_); |
+ RequestMap::iterator i = pending_requests_.find(request->GetHandle()); |
+ if (i == pending_requests_.end()) { |
+ NOTREACHED() << "Request completed called for an unknown request"; |
+ return; |
+ } |
- // Take ownership of the request object and remove it from the map. |
- scoped_ptr<WebDataRequest> request(i->second); |
- pending_requests_.erase(i); |
- pending_lock_.Release(); |
+ // Take ownership of the request object and remove it from the map. |
+ pending_requests_.erase(i); |
+ } |
// Notify the consumer if needed. |
- WebDataServiceConsumer* consumer = request->GetConsumer(); |
- if (!request->IsCancelled() && consumer) { |
- consumer->OnWebDataServiceRequestDone(request->GetHandle(), |
- request->GetResult()); |
- } else { |
- // Nobody is taken ownership of the result, either because it is cancelled |
- // or there is no consumer. Destroy results that require special handling. |
- WDTypedResult const *result = request->GetResult(); |
- if (result) { |
- result->Destroy(); |
+ if (!request->IsCancelled()) { |
+ WebDataServiceConsumer* consumer = request->GetConsumer(); |
+ request->OnComplete(); |
+ if (consumer) { |
+ scoped_ptr<WDTypedResult> r = request->GetResult(); |
+ consumer->OnWebDataServiceRequestDone(request->GetHandle(), r.get()); |
} |
} |
+ |
} |