diff options
author | simonhatch@chromium.org <simonhatch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-03 20:50:59 +0000 |
---|---|---|
committer | simonhatch@chromium.org <simonhatch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-03 20:50:59 +0000 |
commit | bc0147b7ef914e76ed68cdb764a5f291f74d4200 (patch) | |
tree | a3e6c180b5275ccff612977cfedb9dc23735acc9 /chrome/browser/icon_manager.cc | |
parent | 8500eb923cea4d658e2f8e99a24d4c6667cd0ee1 (diff) | |
download | chromium_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.cc | 53 |
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); |