Index: chrome/browser/icon_manager.cc |
diff --git a/chrome/browser/icon_manager.cc b/chrome/browser/icon_manager.cc |
index 991a214d63c11ab171928fe756bca33dff13a09d..b584b1a3959edbd62c129f17c25f95654f332af0 100644 |
--- a/chrome/browser/icon_manager.cc |
+++ b/chrome/browser/icon_manager.cc |
@@ -27,7 +27,7 @@ void RunCallbackIfNotCanceled( |
struct IconManager::ClientRequest { |
IconRequestCallback callback; |
- IconGroupID group; |
+ base::FilePath file_path; |
IconLoader::IconSize size; |
}; |
@@ -38,9 +38,17 @@ IconManager::~IconManager() { |
STLDeleteValues(&icon_cache_); |
} |
-gfx::Image* IconManager::LookupIcon(const base::FilePath& file_name, |
- IconLoader::IconSize size) { |
- IconGroupID group = GetGroupIDFromFilepath(file_name); |
+gfx::Image* IconManager::LookupIconFromFilepath(const base::FilePath& file_name, |
+ IconLoader::IconSize size) { |
+ GroupMap::iterator it = group_cache_.find(file_name); |
+ if (it != group_cache_.end()) |
+ return LookupIconFromGroup(it->second, size); |
+ |
+ return NULL; |
+} |
+ |
+gfx::Image* IconManager::LookupIconFromGroup(const IconGroupID& group, |
+ IconLoader::IconSize size) { |
IconMap::iterator it = icon_cache_.find(CacheKey(group, size)); |
if (it != icon_cache_.end()) |
return it->second; |
@@ -53,9 +61,7 @@ CancelableTaskTracker::TaskId IconManager::LoadIcon( |
IconLoader::IconSize size, |
const IconRequestCallback& callback, |
CancelableTaskTracker* tracker) { |
- IconGroupID group = GetGroupIDFromFilepath(file_name); |
- |
- IconLoader* loader = new IconLoader(group, size, this); |
+ IconLoader* loader = new IconLoader(file_name, size, this); |
loader->AddRef(); |
loader->Start(); |
@@ -64,14 +70,31 @@ CancelableTaskTracker::TaskId IconManager::LoadIcon( |
IconRequestCallback callback_runner = base::Bind( |
&RunCallbackIfNotCanceled, is_canceled, callback); |
- ClientRequest client_request = { callback_runner, group, size }; |
+ ClientRequest client_request = { callback_runner, file_name, size }; |
requests_[loader] = client_request; |
return id; |
} |
// IconLoader::Delegate implementation ----------------------------------------- |
-bool IconManager::OnImageLoaded(IconLoader* loader, gfx::Image* result) { |
+bool IconManager::OnGroupLoaded(IconLoader* loader, |
+ const IconGroupID& group) { |
+ ClientRequests::iterator rit = requests_.find(loader); |
+ if (rit == requests_.end()) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ |
+ gfx::Image* result = LookupIconFromGroup(group, rit->second.size); |
+ if (!result) { |
+ return false; |
+ } |
+ |
+ return OnImageLoaded(loader, result, group); |
+} |
+ |
+bool IconManager::OnImageLoaded( |
+ IconLoader* loader, gfx::Image* result, const IconGroupID& group) { |
ClientRequests::iterator rit = requests_.find(loader); |
// Balances the AddRef() in LoadIcon(). |
@@ -87,16 +110,20 @@ bool IconManager::OnImageLoaded(IconLoader* loader, gfx::Image* result) { |
// Cache the bitmap. Watch out: |result| or the cached bitmap may be NULL to |
// indicate a current or past failure. |
- CacheKey key(client_request.group, client_request.size); |
+ CacheKey key(group, client_request.size); |
IconMap::iterator it = icon_cache_.find(key); |
if (it != icon_cache_.end() && result && it->second) { |
- it->second->SwapRepresentations(result); |
- delete result; |
- result = it->second; |
+ if (it->second != result) { |
+ it->second->SwapRepresentations(result); |
+ delete result; |
+ result = it->second; |
+ } |
} else { |
icon_cache_[key] = result; |
} |
+ group_cache_[client_request.file_path] = group; |
+ |
// Inform our client that the request has completed. |
client_request.callback.Run(result); |
requests_.erase(rit); |