Convert IconManager to use new CancelableTaskTracker
BUG=155883
Review URL: https://chromiumcodereview.appspot.com/11441006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171296 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/icon_manager.cc b/chrome/browser/icon_manager.cc
index e22ccefe..2f1444e 100644
--- a/chrome/browser/icon_manager.cc
+++ b/chrome/browser/icon_manager.cc
@@ -4,14 +4,29 @@
#include "chrome/browser/icon_manager.h"
+#include "base/bind.h"
#include "base/file_util.h"
#include "base/memory/scoped_ptr.h"
#include "base/stl_util.h"
+#include "base/task_runner.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkCanvas.h"
+namespace {
+
+void RunCallbackIfNotCanceled(
+ const CancelableTaskTracker::IsCanceledCallback& is_canceled,
+ const IconManager::IconRequestCallback& callback,
+ gfx::Image* image) {
+ if (is_canceled.Run())
+ return;
+ callback.Run(image);
+}
+
+} // namespace
+
struct IconManager::ClientRequest {
- scoped_refptr<IconRequest> request;
+ IconRequestCallback callback;
IconGroupID group;
IconLoader::IconSize size;
};
@@ -33,29 +48,34 @@
return NULL;
}
-IconManager::Handle IconManager::LoadIcon(
+CancelableTaskTracker::TaskId IconManager::LoadIcon(
const FilePath& file_name,
IconLoader::IconSize size,
- CancelableRequestConsumerBase* consumer,
- const IconRequestCallback& callback) {
+ const IconRequestCallback& callback,
+ CancelableTaskTracker* tracker) {
IconGroupID group = GetGroupIDFromFilepath(file_name);
- IconRequest* request = new IconRequest(callback);
- AddRequest(request, consumer);
IconLoader* loader = new IconLoader(group, size, this);
loader->AddRef();
loader->Start();
- ClientRequest client_request = { request, group, size };
+
+ CancelableTaskTracker::IsCanceledCallback is_canceled;
+ CancelableTaskTracker::TaskId id = tracker->NewTrackedTaskId(&is_canceled);
+ IconRequestCallback callback_runner = base::Bind(
+ &RunCallbackIfNotCanceled, is_canceled, callback);
+
+ ClientRequest client_request = { callback_runner, group, size };
requests_[loader] = client_request;
- return request->handle();
+ return id;
}
// IconLoader::Delegate implementation -----------------------------------------
-bool IconManager::OnImageLoaded(IconLoader* source, gfx::Image* result) {
- ClientRequests::iterator rit = requests_.find(source);
+bool IconManager::OnImageLoaded(IconLoader* loader, gfx::Image* result) {
+ ClientRequests::iterator rit = requests_.find(loader);
+
// Balances the AddRef() in LoadIcon().
- source->Release();
+ loader->Release();
// Look up our client state.
if (rit == requests_.end()) {
@@ -63,11 +83,7 @@
return false; // Return false to indicate result should be deleted.
}
- ClientRequest client_request = rit->second;
- if (client_request.request->canceled()) {
- requests_.erase(rit);
- return false; // Return false to indicate result should be deleted.
- }
+ const ClientRequest& client_request = rit->second;
// Cache the bitmap. Watch out: |result| or the cached bitmap may be NULL to
// indicate a current or past failure.
@@ -82,8 +98,7 @@
}
// Inform our client that the request has completed.
- IconRequest* icon_request = client_request.request;
- icon_request->ForwardResult(icon_request->handle(), result);
+ client_request.callback.Run(result);
requests_.erase(rit);
return true; // Indicates we took ownership of result.