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

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

Issue 2586003002: patch from issue 2577273002 at patchset 20001 (http://crrev.com/2577273002#ps20001)
Patch Set: Convert to OnceCallback, and make it compile at least on Linux. 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
« no previous file with comments | « 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/memory/ptr_util.h"
11 #include "base/task_runner.h" 12 #include "base/task_runner.h"
12 #include "third_party/skia/include/core/SkBitmap.h" 13 #include "third_party/skia/include/core/SkBitmap.h"
13 #include "third_party/skia/include/core/SkCanvas.h" 14 #include "third_party/skia/include/core/SkCanvas.h"
14 15
15 namespace { 16 namespace {
16 17
17 void RunCallbackIfNotCanceled( 18 void RunCallbackIfNotCanceled(
18 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled, 19 const base::CancelableTaskTracker::IsCanceledCallback& is_canceled,
19 const IconManager::IconRequestCallback& callback, 20 IconManager::IconRequestCallback callback,
20 gfx::Image* image) { 21 gfx::Image* image) {
21 if (is_canceled.Run()) 22 if (is_canceled.Run())
22 return; 23 return;
23 callback.Run(image); 24 std::move(callback).Run(image);
24 } 25 }
25 26
26 } // namespace 27 } // namespace
27 28
28 struct IconManager::ClientRequest { 29 struct IconManager::ClientRequest {
30 std::unique_ptr<IconLoader> loader;
29 IconRequestCallback callback; 31 IconRequestCallback callback;
30 base::FilePath file_path; 32 base::FilePath file_path;
31 IconLoader::IconSize size; 33 IconLoader::IconSize size;
32 }; 34 };
33 35
34 IconManager::IconManager() { 36 IconManager::IconManager() {
35 } 37 }
36 38
37 IconManager::~IconManager() { 39 IconManager::~IconManager() {
38 } 40 }
39 41
40 gfx::Image* IconManager::LookupIconFromFilepath(const base::FilePath& file_path, 42 gfx::Image* IconManager::LookupIconFromFilepath(const base::FilePath& file_path,
41 IconLoader::IconSize size) { 43 IconLoader::IconSize size) {
42 auto group_it = group_cache_.find(file_path); 44 auto group_it = group_cache_.find(file_path);
43 if (group_it == group_cache_.end()) 45 if (group_it == group_cache_.end())
44 return nullptr; 46 return nullptr;
45 47
46 CacheKey key(group_it->second, size); 48 CacheKey key(group_it->second, size);
47 auto icon_it = icon_cache_.find(key); 49 auto icon_it = icon_cache_.find(key);
48 if (icon_it == icon_cache_.end()) 50 if (icon_it == icon_cache_.end())
49 return nullptr; 51 return nullptr;
50 52
51 return icon_it->second.get(); 53 return icon_it->second.get();
52 } 54 }
53 55
54 base::CancelableTaskTracker::TaskId IconManager::LoadIcon( 56 base::CancelableTaskTracker::TaskId IconManager::LoadIcon(
55 const base::FilePath& file_path, 57 const base::FilePath& file_path,
56 IconLoader::IconSize size, 58 IconLoader::IconSize size,
57 const IconRequestCallback& callback, 59 IconRequestCallback callback,
58 base::CancelableTaskTracker* tracker) { 60 base::CancelableTaskTracker* tracker) {
59 IconLoader* loader = new IconLoader(file_path, size, this); 61 auto loader = base::MakeUnique<IconLoader>(
60 loader->AddRef(); 62 file_path, size,
63 base::Bind(&IconManager::OnIconLoaded, base::Unretained(this)));
61 loader->Start(); 64 loader->Start();
62 65
63 base::CancelableTaskTracker::IsCanceledCallback is_canceled; 66 base::CancelableTaskTracker::IsCanceledCallback is_canceled;
64 base::CancelableTaskTracker::TaskId id = 67 base::CancelableTaskTracker::TaskId id =
65 tracker->NewTrackedTaskId(&is_canceled); 68 tracker->NewTrackedTaskId(&is_canceled);
66 IconRequestCallback callback_runner = base::Bind( 69 IconRequestCallback callback_runner = base::Bind(
67 &RunCallbackIfNotCanceled, is_canceled, callback); 70 &RunCallbackIfNotCanceled, is_canceled, base::Passed(&callback));
68 71
69 requests_[loader] = {callback_runner, file_path, size}; 72 IconLoader* loader_ptr = loader.get();
73 requests_[loader_ptr] = {std::move(loader), std::move(callback_runner),
74 file_path, size};
70 return id; 75 return id;
71 } 76 }
72 77
73 // IconLoader::Delegate implementation ----------------------------------------- 78 void IconManager::OnIconLoaded(IconLoader* loader,
74 79 std::unique_ptr<gfx::Image> result,
75 void IconManager::OnImageLoaded(IconLoader* loader, 80 const IconLoader::IconGroup& group) {
76 std::unique_ptr<gfx::Image> result,
77 const IconLoader::IconGroup& group) {
78 auto request_it = requests_.find(loader); 81 auto request_it = requests_.find(loader);
79 DCHECK(request_it != requests_.end()); 82 DCHECK(request_it != requests_.end());
80 83
81 // Balances the AddRef() in LoadIcon(). 84 // TODO(jbroman): Or you could take a ClientRequest& here and keep the erase
82 loader->Release(); 85 // where it was, for marginally more efficiency, but it's less obvious whether
83 86 // the move is safe.
84 const ClientRequest& client_request = request_it->second; 87 ClientRequest client_request = std::move(request_it->second);
88 requests_.erase(request_it);
85 89
86 // Cache the bitmap. Watch out: |result| may be null, which indicates a 90 // 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 91 // failure. We assume that if we have an entry in |icon_cache_| it must not be
88 // null. 92 // null.
89 CacheKey key(group, client_request.size); 93 CacheKey key(group, client_request.size);
90 if (result) { 94 if (result) {
91 client_request.callback.Run(result.get()); 95 std::move(client_request.callback).Run(result.get());
92 icon_cache_[key] = std::move(result); 96 icon_cache_[key] = std::move(result);
93 } else { 97 } else {
94 client_request.callback.Run(nullptr); 98 std::move(client_request.callback).Run(nullptr);
95 icon_cache_.erase(key); 99 icon_cache_.erase(key);
96 } 100 }
97 101
98 group_cache_[client_request.file_path] = group; 102 group_cache_[client_request.file_path] = group;
99
100 requests_.erase(request_it);
101 } 103 }
102 104
103 IconManager::CacheKey::CacheKey(const IconLoader::IconGroup& group, 105 IconManager::CacheKey::CacheKey(const IconLoader::IconGroup& group,
104 IconLoader::IconSize size) 106 IconLoader::IconSize size)
105 : group(group), size(size) {} 107 : group(group), size(size) {}
106 108
107 bool IconManager::CacheKey::operator<(const CacheKey &other) const { 109 bool IconManager::CacheKey::operator<(const CacheKey &other) const {
108 return std::tie(group, size) < std::tie(other.group, other.size); 110 return std::tie(group, size) < std::tie(other.group, other.size);
109 } 111 }
OLDNEW
« no previous file with comments | « chrome/browser/icon_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698