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

Unified Diff: webkit/appcache/appcache_service.cc

Issue 8662047: base::Bind: Implement a 1-arity CancelableCallback and use this to implement (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comment fixes. Created 9 years, 1 month 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
« no previous file with comments | « webkit/appcache/appcache_service.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/appcache/appcache_service.cc
diff --git a/webkit/appcache/appcache_service.cc b/webkit/appcache/appcache_service.cc
index a2d90976eabf890ecaac925cf620b95b13837068..e30df560244826b5e6eff97cc99f2b27bac9bfde 100644
--- a/webkit/appcache/appcache_service.cc
+++ b/webkit/appcache/appcache_service.cc
@@ -28,6 +28,52 @@ AppCacheInfoCollection::~AppCacheInfoCollection() {}
// AsyncHelper -------
+class AppCacheService::NewAsyncHelper
+ : public AppCacheStorage::Delegate {
+ public:
+ NewAsyncHelper(AppCacheService* service,
+ const net::CompletionCallback& callback)
+ : service_(service), callback_(callback) {
+ service_->pending_new_helpers_.insert(this);
+ }
+
+ virtual ~NewAsyncHelper() {
+ if (service_)
+ service_->pending_new_helpers_.erase(this);
+ }
+
+ virtual void Start() = 0;
+ virtual void Cancel();
+
+ protected:
+ void CallCallback(int rv) {
+ if (!callback_.is_null()) {
+ // Defer to guarantee async completion.
+ MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&DeferredCallCallback, callback_, rv));
+ }
+ callback_.Reset();
+ }
+
+ static void DeferredCallCallback(const net::CompletionCallback& callback,
+ int rv) {
+ callback.Run(rv);
+ }
+
+ AppCacheService* service_;
+ net::CompletionCallback callback_;
+};
+
+void AppCacheService::NewAsyncHelper::Cancel() {
+ if (!callback_.is_null()) {
+ callback_.Run(net::ERR_ABORTED);
+ callback_.Reset();
+ }
+
+ service_->storage()->CancelDelegateCallbacks(this);
+ service_ = NULL;
+}
+
class AppCacheService::AsyncHelper
: public AppCacheStorage::Delegate {
public:
@@ -75,12 +121,14 @@ void AppCacheService::AsyncHelper::Cancel() {
// CanHandleOfflineHelper -------
-class AppCacheService::CanHandleOfflineHelper : AsyncHelper {
+class AppCacheService::CanHandleOfflineHelper : NewAsyncHelper {
public:
CanHandleOfflineHelper(
AppCacheService* service, const GURL& url,
- const GURL& first_party, net::OldCompletionCallback* callback)
- : AsyncHelper(service, callback), url_(url), first_party_(first_party) {
+ const GURL& first_party, const net::CompletionCallback& callback)
+ : NewAsyncHelper(service, callback),
+ url_(url),
+ first_party_(first_party) {
}
virtual void Start() {
@@ -90,6 +138,7 @@ class AppCacheService::CanHandleOfflineHelper : AsyncHelper {
delete this;
return;
}
+
service_->storage()->FindResponseForMainRequest(url_, GURL(), this);
}
@@ -102,6 +151,7 @@ class AppCacheService::CanHandleOfflineHelper : AsyncHelper {
GURL url_;
GURL first_party_;
+
DISALLOW_COPY_AND_ASSIGN(CanHandleOfflineHelper);
};
@@ -426,6 +476,10 @@ AppCacheService::~AppCacheService() {
pending_helpers_.end(),
std::mem_fun(&AsyncHelper::Cancel));
STLDeleteElements(&pending_helpers_);
+ std::for_each(pending_new_helpers_.begin(),
+ pending_new_helpers_.end(),
+ std::mem_fun(&NewAsyncHelper::Cancel));
+ STLDeleteElements(&pending_new_helpers_);
if (quota_client_)
quota_client_->NotifyAppCacheDestroyed();
@@ -446,7 +500,7 @@ void AppCacheService::Initialize(const FilePath& cache_directory,
void AppCacheService::CanHandleMainResourceOffline(
const GURL& url,
const GURL& first_party,
- net::OldCompletionCallback* callback) {
+ const net::CompletionCallback& callback) {
CanHandleOfflineHelper* helper =
new CanHandleOfflineHelper(this, url, first_party, callback);
helper->Start();
« no previous file with comments | « webkit/appcache/appcache_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698