summaryrefslogtreecommitdiffstats
path: root/chrome/browser/icon_manager.cc
diff options
context:
space:
mode:
authorsimonhatch@chromium.org <simonhatch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-03 20:50:59 +0000
committersimonhatch@chromium.org <simonhatch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-03 20:50:59 +0000
commitbc0147b7ef914e76ed68cdb764a5f291f74d4200 (patch)
treea3e6c180b5275ccff612977cfedb9dc23735acc9 /chrome/browser/icon_manager.cc
parent8500eb923cea4d658e2f8e99a24d4c6667cd0ee1 (diff)
downloadchromium_src-bc0147b7ef914e76ed68cdb764a5f291f74d4200.zip
chromium_src-bc0147b7ef914e76ed68cdb764a5f291f74d4200.tar.gz
chromium_src-bc0147b7ef914e76ed68cdb764a5f291f74d4200.tar.bz2
Removing base::ThreadRestrictions::ScopedAllowIO from icon_manager_linux.cc
Changed cache to map file paths to icons rather than by group id. Renamed GetGroupIDFromFilepath to reflect that it can potentially do file io. BUG=72740 TEST=Bring up downloads ui on linux and file icons still show up. R=rdsmith@chromium.org Review URL: https://chromiumcodereview.appspot.com/12211049 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@192143 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/icon_manager.cc')
-rw-r--r--chrome/browser/icon_manager.cc53
1 files changed, 40 insertions, 13 deletions
diff --git a/chrome/browser/icon_manager.cc b/chrome/browser/icon_manager.cc
index 991a214..b584b1a 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);