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

Side by Side Diff: chrome/browser/icon_manager.cc

Issue 2577273002: Clean up IconLoader. (Closed)
Patch Set: lifetime fixed Created 4 years 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 unified diff | Download patch
« chrome/browser/icon_loader.cc ('K') | « chrome/browser/icon_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/icon_manager.h" 5 #include "chrome/browser/icon_manager.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <tuple> 8 #include <tuple>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/task_runner.h" 11 #include "base/task_runner.h"
12 #include "third_party/skia/include/core/SkBitmap.h" 12 #include "third_party/skia/include/core/SkBitmap.h"
13 #include "third_party/skia/include/core/SkCanvas.h" 13 #include "third_party/skia/include/core/SkCanvas.h"
14 14
15 namespace { 15 namespace {
16 16
17 void RunCallbackIfNotCanceled( 17 void RunCallbackIfNotCanceled(
18 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled, 18 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled,
19 const IconManager::IconRequestCallback& callback, 19 const IconManager::IconRequestCallback& callback,
20 gfx::Image* image) { 20 gfx::Image* image) {
21 if (is_canceled.Run()) 21 if (is_canceled.Run())
22 return; 22 return;
23 callback.Run(image); 23 callback.Run(image);
24 } 24 }
25 25
26 } // namespace 26 } // namespace
27 27
28 struct IconManager::ClientRequest { 28 struct IconManager::ClientRequest {
29 IconLoader* loader;
sky 2016/12/16 23:27:27 Do you need this anymore?
Avi (use Gerrit) 2016/12/17 02:28:53 I don't need any of this any more :)
29 IconRequestCallback callback; 30 IconRequestCallback callback;
30 base::FilePath file_path; 31 base::FilePath file_path;
31 IconLoader::IconSize size; 32 IconLoader::IconSize size;
32 }; 33 };
33 34
34 IconManager::IconManager() { 35 IconManager::IconManager() : weak_factory_(this) {}
35 }
36 36
37 IconManager::~IconManager() { 37 IconManager::~IconManager() {
38 } 38 }
39 39
40 gfx::Image* IconManager::LookupIconFromFilepath(const base::FilePath& file_path, 40 gfx::Image* IconManager::LookupIconFromFilepath(const base::FilePath& file_path,
41 IconLoader::IconSize size) { 41 IconLoader::IconSize size) {
42 auto group_it = group_cache_.find(file_path); 42 auto group_it = group_cache_.find(file_path);
43 if (group_it == group_cache_.end()) 43 if (group_it == group_cache_.end())
44 return nullptr; 44 return nullptr;
45 45
46 CacheKey key(group_it->second, size); 46 CacheKey key(group_it->second, size);
47 auto icon_it = icon_cache_.find(key); 47 auto icon_it = icon_cache_.find(key);
48 if (icon_it == icon_cache_.end()) 48 if (icon_it == icon_cache_.end())
49 return nullptr; 49 return nullptr;
50 50
51 return icon_it->second.get(); 51 return icon_it->second.get();
52 } 52 }
53 53
54 base::CancelableTaskTracker::TaskId IconManager::LoadIcon( 54 base::CancelableTaskTracker::TaskId IconManager::LoadIcon(
55 const base::FilePath& file_path, 55 const base::FilePath& file_path,
56 IconLoader::IconSize size, 56 IconLoader::IconSize size,
57 const IconRequestCallback& callback, 57 const IconRequestCallback& callback,
58 base::CancelableTaskTracker* tracker) { 58 base::CancelableTaskTracker* tracker) {
59 IconLoader* loader = new IconLoader(file_path, size, this); 59 IconLoader* loader = IconLoader::Create(
60 loader->AddRef(); 60 file_path, size,
61 base::Bind(&IconManager::OnIconLoaded, weak_factory_.GetWeakPtr()));
61 loader->Start(); 62 loader->Start();
62 63
63 base::CancelableTaskTracker::IsCanceledCallback is_canceled; 64 base::CancelableTaskTracker::IsCanceledCallback is_canceled;
64 base::CancelableTaskTracker::TaskId id = 65 base::CancelableTaskTracker::TaskId id =
65 tracker->NewTrackedTaskId(&is_canceled); 66 tracker->NewTrackedTaskId(&is_canceled);
66 IconRequestCallback callback_runner = base::Bind( 67 IconRequestCallback callback_runner = base::Bind(
67 &RunCallbackIfNotCanceled, is_canceled, callback); 68 &RunCallbackIfNotCanceled, is_canceled, callback);
68 69
69 requests_[loader] = {callback_runner, file_path, size}; 70 requests_[loader] = {loader, callback_runner, file_path, size};
70 return id; 71 return id;
71 } 72 }
72 73
73 // IconLoader::Delegate implementation ----------------------------------------- 74 void IconManager::OnIconLoaded(IconLoader* loader,
74 75 std::unique_ptr<gfx::Image> result,
75 void IconManager::OnImageLoaded(IconLoader* loader, 76 const IconLoader::IconGroup& group) {
76 std::unique_ptr<gfx::Image> result,
77 const IconLoader::IconGroup& group) {
78 auto request_it = requests_.find(loader); 77 auto request_it = requests_.find(loader);
79 DCHECK(request_it != requests_.end()); 78 DCHECK(request_it != requests_.end());
80 79
81 // Balances the AddRef() in LoadIcon().
82 loader->Release();
83
84 const ClientRequest& client_request = request_it->second; 80 const ClientRequest& client_request = request_it->second;
85 81
86 // Cache the bitmap. Watch out: |result| may be null, which indicates a 82 // Cache the bitmap. Watch out: |result| may be null, which indicates a
87 // failure. We assume that if we have an entry in |icon_cache_| it must not be 83 // failure. We assume that if we have an entry in |icon_cache_| it must not be
88 // null. 84 // null.
89 CacheKey key(group, client_request.size); 85 CacheKey key(group, client_request.size);
90 if (result) { 86 if (result) {
91 client_request.callback.Run(result.get()); 87 client_request.callback.Run(result.get());
92 icon_cache_[key] = std::move(result); 88 icon_cache_[key] = std::move(result);
93 } else { 89 } else {
94 client_request.callback.Run(nullptr); 90 client_request.callback.Run(nullptr);
95 icon_cache_.erase(key); 91 icon_cache_.erase(key);
96 } 92 }
97 93
98 group_cache_[client_request.file_path] = group; 94 group_cache_[client_request.file_path] = group;
99 95
100 requests_.erase(request_it); 96 requests_.erase(request_it);
101 } 97 }
102 98
103 IconManager::CacheKey::CacheKey(const IconLoader::IconGroup& group, 99 IconManager::CacheKey::CacheKey(const IconLoader::IconGroup& group,
104 IconLoader::IconSize size) 100 IconLoader::IconSize size)
105 : group(group), size(size) {} 101 : group(group), size(size) {}
106 102
107 bool IconManager::CacheKey::operator<(const CacheKey &other) const { 103 bool IconManager::CacheKey::operator<(const CacheKey &other) const {
108 return std::tie(group, size) < std::tie(other.group, other.size); 104 return std::tie(group, size) < std::tie(other.group, other.size);
109 } 105 }
OLDNEW
« chrome/browser/icon_loader.cc ('K') | « chrome/browser/icon_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698