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

Side by Side Diff: chrome/browser/ui/webui/favicon_source.cc

Issue 11881055: Simplify WebUI data sources. Currently WebUI data sources implement a URLDataSourceDelegate interfa… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix clang Created 7 years, 11 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/ui/webui/favicon_source.h" 5 #include "chrome/browser/ui/webui/favicon_source.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "chrome/browser/favicon/favicon_service_factory.h" 9 #include "chrome/browser/favicon/favicon_service_factory.h"
10 #include "chrome/browser/history/top_sites.h" 10 #include "chrome/browser/history/top_sites.h"
11 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
13 #include "chrome/browser/ui/webui/web_ui_util.h" 12 #include "chrome/browser/ui/webui/web_ui_util.h"
14 #include "chrome/common/url_constants.h" 13 #include "chrome/common/url_constants.h"
15 #include "grit/locale_settings.h" 14 #include "grit/locale_settings.h"
16 #include "grit/ui_resources.h" 15 #include "grit/ui_resources.h"
17 #include "ui/base/l10n/l10n_util.h" 16 #include "ui/base/l10n/l10n_util.h"
18 #include "ui/base/layout.h" 17 #include "ui/base/layout.h"
19 #include "ui/base/resource/resource_bundle.h" 18 #include "ui/base/resource/resource_bundle.h"
20 19
20 FaviconSource::IconRequest::IconRequest()
21 : request_path(""),
Evan Stade 2013/01/15 20:49:34 why is this necessary?
jam 2013/01/15 21:09:08 I had moved this from the header, i'll take this o
22 size_in_dip(gfx::kFaviconSize),
23 scale_factor(ui::SCALE_FACTOR_NONE) {
24 }
25
26 FaviconSource::IconRequest::IconRequest(
27 const content::URLDataSource::GotDataCallback& cb,
28 const std::string& path,
29 int size,
30 ui::ScaleFactor scale)
31 : callback(cb),
32 request_path(path),
33 size_in_dip(size),
34 scale_factor(scale) {
35 }
36
37 FaviconSource::IconRequest::~IconRequest() {
38 }
39
21 FaviconSource::FaviconSource(Profile* profile, IconType type) 40 FaviconSource::FaviconSource(Profile* profile, IconType type)
22 : profile_(profile->GetOriginalProfile()), 41 : profile_(profile->GetOriginalProfile()),
23 icon_types_(type == FAVICON ? history::FAVICON : 42 icon_types_(type == FAVICON ? history::FAVICON :
24 history::TOUCH_PRECOMPOSED_ICON | history::TOUCH_ICON | 43 history::TOUCH_PRECOMPOSED_ICON | history::TOUCH_ICON |
25 history::FAVICON) { 44 history::FAVICON) {
26 } 45 }
27 46
28 FaviconSource::~FaviconSource() { 47 FaviconSource::~FaviconSource() {
29 } 48 }
30 49
31 std::string FaviconSource::GetSource() { 50 std::string FaviconSource::GetSource() {
32 return icon_types_ == history::FAVICON ? 51 return icon_types_ == history::FAVICON ?
33 chrome::kChromeUIFaviconHost : chrome::kChromeUITouchIconHost; 52 chrome::kChromeUIFaviconHost : chrome::kChromeUITouchIconHost;
34 } 53 }
35 54
36 void FaviconSource::StartDataRequest(const std::string& path, 55 void FaviconSource::StartDataRequest(
37 bool is_incognito, 56 const std::string& path,
38 int request_id) { 57 bool is_incognito,
58 const content::URLDataSource::GotDataCallback& callback) {
39 FaviconService* favicon_service = 59 FaviconService* favicon_service =
40 FaviconServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS); 60 FaviconServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
41 if (!favicon_service || path.empty()) { 61 if (!favicon_service || path.empty()) {
42 SendDefaultResponse(IconRequest(request_id, 62 SendDefaultResponse(IconRequest(callback,
43 "", 63 "",
44 16, 64 16,
45 ui::SCALE_FACTOR_100P)); 65 ui::SCALE_FACTOR_100P));
46 return; 66 return;
47 } 67 }
48 68
49 int size_in_dip = gfx::kFaviconSize; 69 int size_in_dip = gfx::kFaviconSize;
50 ui::ScaleFactor scale_factor = ui::SCALE_FACTOR_100P; 70 ui::ScaleFactor scale_factor = ui::SCALE_FACTOR_100P;
51 71
52 if (path.size() > 8 && 72 if (path.size() > 8 &&
53 (path.substr(0, 8) == "iconurl/" || path.substr(0, 8) == "iconurl@")) { 73 (path.substr(0, 8) == "iconurl/" || path.substr(0, 8) == "iconurl@")) {
54 size_t prefix_length = 8; 74 size_t prefix_length = 8;
55 // Optional scale factor appended to iconurl, which may be @1x or @2x. 75 // Optional scale factor appended to iconurl, which may be @1x or @2x.
56 if (path.at(7) == '@') { 76 if (path.at(7) == '@') {
57 size_t slash = path.find("/"); 77 size_t slash = path.find("/");
58 std::string scale_str = path.substr(8, slash - 8); 78 std::string scale_str = path.substr(8, slash - 8);
59 web_ui_util::ParseScaleFactor(scale_str, &scale_factor); 79 web_ui_util::ParseScaleFactor(scale_str, &scale_factor);
60 prefix_length = slash + 1; 80 prefix_length = slash + 1;
61 } 81 }
62 // TODO(michaelbai): Change GetRawFavicon to support combination of 82 // TODO(michaelbai): Change GetRawFavicon to support combination of
63 // IconType. 83 // IconType.
64 favicon_service->GetRawFavicon( 84 favicon_service->GetRawFavicon(
65 GURL(path.substr(prefix_length)), 85 GURL(path.substr(prefix_length)),
66 history::FAVICON, 86 history::FAVICON,
67 size_in_dip, 87 size_in_dip,
68 scale_factor, 88 scale_factor,
69 base::Bind(&FaviconSource::OnFaviconDataAvailable, 89 base::Bind(&FaviconSource::OnFaviconDataAvailable,
70 base::Unretained(this), 90 base::Unretained(this),
71 IconRequest(request_id, 91 IconRequest(callback,
72 path.substr(prefix_length), 92 path.substr(prefix_length),
73 size_in_dip, 93 size_in_dip,
74 scale_factor)), 94 scale_factor)),
75 &cancelable_task_tracker_); 95 &cancelable_task_tracker_);
76 } else { 96 } else {
77 GURL url; 97 GURL url;
78 if (path.size() > 5 && path.substr(0, 5) == "size/") { 98 if (path.size() > 5 && path.substr(0, 5) == "size/") {
79 size_t slash = path.find("/", 5); 99 size_t slash = path.find("/", 5);
80 size_t scale_delimiter = path.find("@", 5); 100 size_t scale_delimiter = path.find("@", 5);
81 std::string size = path.substr(5, slash - 5); 101 std::string size = path.substr(5, slash - 5);
(...skipping 26 matching lines...) Expand all
108 url = GURL(originalUrl).GetOrigin(); 128 url = GURL(originalUrl).GetOrigin();
109 } else { 129 } else {
110 url = GURL(path); 130 url = GURL(path);
111 } 131 }
112 } 132 }
113 133
114 // Intercept requests for prepopulated pages. 134 // Intercept requests for prepopulated pages.
115 for (size_t i = 0; i < arraysize(history::kPrepopulatedPages); i++) { 135 for (size_t i = 0; i < arraysize(history::kPrepopulatedPages); i++) {
116 if (url.spec() == 136 if (url.spec() ==
117 l10n_util::GetStringUTF8(history::kPrepopulatedPages[i].url_id)) { 137 l10n_util::GetStringUTF8(history::kPrepopulatedPages[i].url_id)) {
118 url_data_source()->SendResponse(request_id, 138 callback.Run(
119 ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale( 139 ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale(
120 history::kPrepopulatedPages[i].favicon_id, 140 history::kPrepopulatedPages[i].favicon_id,
121 scale_factor)); 141 scale_factor));
122 return; 142 return;
123 } 143 }
124 } 144 }
125 145
126 favicon_service->GetRawFaviconForURL( 146 favicon_service->GetRawFaviconForURL(
127 FaviconService::FaviconForURLParams( 147 FaviconService::FaviconForURLParams(
128 profile_, url, icon_types_, size_in_dip), 148 profile_, url, icon_types_, size_in_dip),
129 scale_factor, 149 scale_factor,
130 base::Bind(&FaviconSource::OnFaviconDataAvailable, 150 base::Bind(&FaviconSource::OnFaviconDataAvailable,
131 base::Unretained(this), 151 base::Unretained(this),
132 IconRequest(request_id, 152 IconRequest(callback,
133 url.spec(), 153 url.spec(),
134 size_in_dip, 154 size_in_dip,
135 scale_factor)), 155 scale_factor)),
136 &cancelable_task_tracker_); 156 &cancelable_task_tracker_);
137 } 157 }
138 } 158 }
139 159
140 std::string FaviconSource::GetMimeType(const std::string&) const { 160 std::string FaviconSource::GetMimeType(const std::string&) const {
141 // We need to explicitly return a mime type, otherwise if the user tries to 161 // We need to explicitly return a mime type, otherwise if the user tries to
142 // drag the image they get no extension. 162 // drag the image they get no extension.
(...skipping 10 matching lines...) Expand all
153 // No additional checks to locate the favicon resource in the base 173 // No additional checks to locate the favicon resource in the base
154 // implementation. 174 // implementation.
155 return false; 175 return false;
156 } 176 }
157 177
158 void FaviconSource::OnFaviconDataAvailable( 178 void FaviconSource::OnFaviconDataAvailable(
159 const IconRequest& request, 179 const IconRequest& request,
160 const history::FaviconBitmapResult& bitmap_result) { 180 const history::FaviconBitmapResult& bitmap_result) {
161 if (bitmap_result.is_valid()) { 181 if (bitmap_result.is_valid()) {
162 // Forward the data along to the networking system. 182 // Forward the data along to the networking system.
163 url_data_source()->SendResponse( 183 request.callback.Run(bitmap_result.bitmap_data);
164 request.request_id, bitmap_result.bitmap_data);
165 } else if (!HandleMissingResource(request)) { 184 } else if (!HandleMissingResource(request)) {
166 SendDefaultResponse(request); 185 SendDefaultResponse(request);
167 } 186 }
168 } 187 }
169 188
170 void FaviconSource::SendDefaultResponse(const IconRequest& icon_request) { 189 void FaviconSource::SendDefaultResponse(const IconRequest& icon_request) {
171 int favicon_index; 190 int favicon_index;
172 int resource_id; 191 int resource_id;
173 switch (icon_request.size_in_dip) { 192 switch (icon_request.size_in_dip) {
174 case 64: 193 case 64:
(...skipping 11 matching lines...) Expand all
186 } 205 }
187 base::RefCountedMemory* default_favicon = default_favicons_[favicon_index]; 206 base::RefCountedMemory* default_favicon = default_favicons_[favicon_index];
188 207
189 if (!default_favicon) { 208 if (!default_favicon) {
190 ui::ScaleFactor scale_factor = icon_request.scale_factor; 209 ui::ScaleFactor scale_factor = icon_request.scale_factor;
191 default_favicon = ResourceBundle::GetSharedInstance() 210 default_favicon = ResourceBundle::GetSharedInstance()
192 .LoadDataResourceBytesForScale(resource_id, scale_factor); 211 .LoadDataResourceBytesForScale(resource_id, scale_factor);
193 default_favicons_[favicon_index] = default_favicon; 212 default_favicons_[favicon_index] = default_favicon;
194 } 213 }
195 214
196 url_data_source()->SendResponse(icon_request.request_id, default_favicon); 215 icon_request.callback.Run(default_favicon);
197 } 216 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698