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

Side by Side Diff: chrome/browser/ui/elide_url.cc

Issue 312233003: Add fade eliding for Views Labels; related cleanup. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Refine alignment check; minor additional cleanup. Created 6 years, 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/elide_url.h" 5 #include "chrome/browser/ui/elide_url.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/strings/string_split.h" 8 #include "base/strings/string_split.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "net/base/escape.h" 10 #include "net/base/escape.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 const gfx::FontList& font_list, 57 const gfx::FontList& font_list,
58 float available_pixel_width) { 58 float available_pixel_width) {
59 const size_t url_path_number_of_elements = url_path_elements.size(); 59 const size_t url_path_number_of_elements = url_path_elements.size();
60 60
61 CHECK(url_path_number_of_elements); 61 CHECK(url_path_number_of_elements);
62 for (size_t i = url_path_number_of_elements - 1; i > 0; --i) { 62 for (size_t i = url_path_number_of_elements - 1; i > 0; --i) {
63 base::string16 elided_path = BuildPathFromComponents(url_path_prefix, 63 base::string16 elided_path = BuildPathFromComponents(url_path_prefix,
64 url_path_elements, url_filename, i); 64 url_path_elements, url_filename, i);
65 if (available_pixel_width >= GetStringWidthF(elided_path, font_list)) 65 if (available_pixel_width >= GetStringWidthF(elided_path, font_list))
66 return ElideText(elided_path + url_query, font_list, 66 return ElideText(elided_path + url_query, font_list,
67 available_pixel_width, gfx::ELIDE_AT_END); 67 available_pixel_width, gfx::ELIDE_TAIL);
68 } 68 }
69 69
70 return base::string16(); 70 return base::string16();
71 } 71 }
72 72
73 // Splits the hostname in the |url| into sub-strings for the full hostname, 73 // Splits the hostname in the |url| into sub-strings for the full hostname,
74 // the domain (TLD+1), and the subdomain (everything leading the domain). 74 // the domain (TLD+1), and the subdomain (everything leading the domain).
75 void SplitHost(const GURL& url, 75 void SplitHost(const GURL& url,
76 base::string16* url_host, 76 base::string16* url_host,
77 base::string16* url_domain, 77 base::string16* url_domain,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 url::Parsed parsed; 117 url::Parsed parsed;
118 const base::string16 url_string = 118 const base::string16 url_string =
119 net::FormatUrl(url, languages, net::kFormatUrlOmitAll, 119 net::FormatUrl(url, languages, net::kFormatUrlOmitAll,
120 net::UnescapeRule::SPACES, &parsed, NULL, NULL); 120 net::UnescapeRule::SPACES, &parsed, NULL, NULL);
121 if (available_pixel_width <= 0) 121 if (available_pixel_width <= 0)
122 return url_string; 122 return url_string;
123 123
124 // If non-standard, return plain eliding. 124 // If non-standard, return plain eliding.
125 if (!url.IsStandard()) 125 if (!url.IsStandard())
126 return ElideText(url_string, font_list, available_pixel_width, 126 return ElideText(url_string, font_list, available_pixel_width,
127 gfx::ELIDE_AT_END); 127 gfx::ELIDE_TAIL);
128 128
129 // Now start eliding url_string to fit within available pixel width. 129 // Now start eliding url_string to fit within available pixel width.
130 // Fist pass - check to see whether entire url_string fits. 130 // Fist pass - check to see whether entire url_string fits.
131 const float pixel_width_url_string = GetStringWidthF(url_string, font_list); 131 const float pixel_width_url_string = GetStringWidthF(url_string, font_list);
132 if (available_pixel_width >= pixel_width_url_string) 132 if (available_pixel_width >= pixel_width_url_string)
133 return url_string; 133 return url_string;
134 134
135 // Get the path substring, including query and reference. 135 // Get the path substring, including query and reference.
136 const size_t path_start_index = parsed.path.begin; 136 const size_t path_start_index = parsed.path.begin;
137 const size_t path_len = parsed.path.len; 137 const size_t path_len = parsed.path.len;
138 base::string16 url_path_query_etc = url_string.substr(path_start_index); 138 base::string16 url_path_query_etc = url_string.substr(path_start_index);
139 base::string16 url_path = url_string.substr(path_start_index, path_len); 139 base::string16 url_path = url_string.substr(path_start_index, path_len);
140 140
141 // Return general elided text if url minus the query fits. 141 // Return general elided text if url minus the query fits.
142 const base::string16 url_minus_query = 142 const base::string16 url_minus_query =
143 url_string.substr(0, path_start_index + path_len); 143 url_string.substr(0, path_start_index + path_len);
144 if (available_pixel_width >= GetStringWidthF(url_minus_query, font_list)) 144 if (available_pixel_width >= GetStringWidthF(url_minus_query, font_list))
145 return ElideText(url_string, font_list, available_pixel_width, 145 return ElideText(url_string, font_list, available_pixel_width,
146 gfx::ELIDE_AT_END); 146 gfx::ELIDE_TAIL);
147 147
148 base::string16 url_host; 148 base::string16 url_host;
149 base::string16 url_domain; 149 base::string16 url_domain;
150 base::string16 url_subdomain; 150 base::string16 url_subdomain;
151 SplitHost(url, &url_host, &url_domain, &url_subdomain); 151 SplitHost(url, &url_host, &url_domain, &url_subdomain);
152 152
153 // If this is a file type, the path is now defined as everything after ":". 153 // If this is a file type, the path is now defined as everything after ":".
154 // For example, "C:/aa/aa/bb", the path is "/aa/bb/cc". Interesting, the 154 // For example, "C:/aa/aa/bb", the path is "/aa/bb/cc". Interesting, the
155 // domain is now C: - this is a nice hack for eliding to work pleasantly. 155 // domain is now C: - this is a nice hack for eliding to work pleasantly.
156 if (url.SchemeIsFile()) { 156 if (url.SchemeIsFile()) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 // Query element. 188 // Query element.
189 base::string16 url_query; 189 base::string16 url_query;
190 const float kPixelWidthDotsTrailer = GetStringWidthF( 190 const float kPixelWidthDotsTrailer = GetStringWidthF(
191 base::string16(kEllipsisUTF16), font_list); 191 base::string16(kEllipsisUTF16), font_list);
192 if (parsed.query.is_nonempty()) { 192 if (parsed.query.is_nonempty()) {
193 url_query = UTF8ToUTF16("?") + url_string.substr(parsed.query.begin); 193 url_query = UTF8ToUTF16("?") + url_string.substr(parsed.query.begin);
194 if (available_pixel_width >= 194 if (available_pixel_width >=
195 (pixel_width_url_subdomain + pixel_width_url_domain + 195 (pixel_width_url_subdomain + pixel_width_url_domain +
196 pixel_width_url_path - GetStringWidthF(url_query, font_list))) { 196 pixel_width_url_path - GetStringWidthF(url_query, font_list))) {
197 return ElideText(url_subdomain + url_domain + url_path_query_etc, 197 return ElideText(url_subdomain + url_domain + url_path_query_etc,
198 font_list, available_pixel_width, gfx::ELIDE_AT_END); 198 font_list, available_pixel_width, gfx::ELIDE_TAIL);
199 } 199 }
200 } 200 }
201 201
202 // Parse url_path using '/'. 202 // Parse url_path using '/'.
203 std::vector<base::string16> url_path_elements; 203 std::vector<base::string16> url_path_elements;
204 base::SplitString(url_path, kForwardSlash, &url_path_elements); 204 base::SplitString(url_path, kForwardSlash, &url_path_elements);
205 205
206 // Get filename - note that for a path ending with / 206 // Get filename - note that for a path ending with /
207 // such as www.google.com/intl/ads/, the file name is ads/. 207 // such as www.google.com/intl/ads/, the file name is ads/.
208 size_t url_path_number_of_elements = url_path_elements.size(); 208 size_t url_path_number_of_elements = url_path_elements.size();
209 DCHECK(url_path_number_of_elements != 0); 209 DCHECK(url_path_number_of_elements != 0);
210 base::string16 url_filename; 210 base::string16 url_filename;
211 if ((url_path_elements.at(url_path_number_of_elements - 1)).length() > 0) { 211 if ((url_path_elements.at(url_path_number_of_elements - 1)).length() > 0) {
212 url_filename = *(url_path_elements.end() - 1); 212 url_filename = *(url_path_elements.end() - 1);
213 } else if (url_path_number_of_elements > 1) { // Path ends with a '/'. 213 } else if (url_path_number_of_elements > 1) { // Path ends with a '/'.
214 url_filename = url_path_elements.at(url_path_number_of_elements - 2) + 214 url_filename = url_path_elements.at(url_path_number_of_elements - 2) +
215 kForwardSlash; 215 kForwardSlash;
216 url_path_number_of_elements--; 216 url_path_number_of_elements--;
217 } 217 }
218 DCHECK(url_path_number_of_elements != 0); 218 DCHECK(url_path_number_of_elements != 0);
219 219
220 const size_t kMaxNumberOfUrlPathElementsAllowed = 1024; 220 const size_t kMaxNumberOfUrlPathElementsAllowed = 1024;
221 if (url_path_number_of_elements <= 1 || 221 if (url_path_number_of_elements <= 1 ||
222 url_path_number_of_elements > kMaxNumberOfUrlPathElementsAllowed) { 222 url_path_number_of_elements > kMaxNumberOfUrlPathElementsAllowed) {
223 // No path to elide, or too long of a path (could overflow in loop below) 223 // No path to elide, or too long of a path (could overflow in loop below)
224 // Just elide this as a text string. 224 // Just elide this as a text string.
225 return ElideText(url_subdomain + url_domain + url_path_query_etc, font_list, 225 return ElideText(url_subdomain + url_domain + url_path_query_etc, font_list,
226 available_pixel_width, gfx::ELIDE_AT_END); 226 available_pixel_width, gfx::ELIDE_TAIL);
227 } 227 }
228 228
229 // Start eliding the path and replacing elements by ".../". 229 // Start eliding the path and replacing elements by ".../".
230 const base::string16 kEllipsisAndSlash = 230 const base::string16 kEllipsisAndSlash =
231 base::string16(kEllipsisUTF16) + kForwardSlash; 231 base::string16(kEllipsisUTF16) + kForwardSlash;
232 const float pixel_width_ellipsis_slash = 232 const float pixel_width_ellipsis_slash =
233 GetStringWidthF(kEllipsisAndSlash, font_list); 233 GetStringWidthF(kEllipsisAndSlash, font_list);
234 234
235 // Check with both subdomain and domain. 235 // Check with both subdomain and domain.
236 base::string16 elided_path = 236 base::string16 elided_path =
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 if ((available_pixel_width - url_elided_domain_width) > 269 if ((available_pixel_width - url_elided_domain_width) >
270 pixel_width_ellipsis_slash + kPixelWidthDotsTrailer + 270 pixel_width_ellipsis_slash + kPixelWidthDotsTrailer +
271 GetStringWidthF(base::ASCIIToUTF16("UV"), font_list)) { 271 GetStringWidthF(base::ASCIIToUTF16("UV"), font_list)) {
272 final_elided_url_string += BuildPathFromComponents(base::string16(), 272 final_elided_url_string += BuildPathFromComponents(base::string16(),
273 url_path_elements, url_filename, 1); 273 url_path_elements, url_filename, 1);
274 } else { 274 } else {
275 final_elided_url_string += url_path; 275 final_elided_url_string += url_path;
276 } 276 }
277 277
278 return ElideText(final_elided_url_string, font_list, available_pixel_width, 278 return ElideText(final_elided_url_string, font_list, available_pixel_width,
279 gfx::ELIDE_AT_END); 279 gfx::ELIDE_TAIL);
280 } 280 }
281 281
282 base::string16 ElideHost(const GURL& url, 282 base::string16 ElideHost(const GURL& url,
283 const gfx::FontList& font_list, 283 const gfx::FontList& font_list,
284 float available_pixel_width) { 284 float available_pixel_width) {
285 base::string16 url_host; 285 base::string16 url_host;
286 base::string16 url_domain; 286 base::string16 url_domain;
287 base::string16 url_subdomain; 287 base::string16 url_subdomain;
288 SplitHost(url, &url_host, &url_domain, &url_subdomain); 288 SplitHost(url, &url_host, &url_domain, &url_subdomain);
289 289
290 const float pixel_width_url_host = GetStringWidthF(url_host, font_list); 290 const float pixel_width_url_host = GetStringWidthF(url_host, font_list);
291 if (available_pixel_width >= pixel_width_url_host) 291 if (available_pixel_width >= pixel_width_url_host)
292 return url_host; 292 return url_host;
293 293
294 if (url_subdomain.empty()) 294 if (url_subdomain.empty())
295 return url_domain; 295 return url_domain;
296 296
297 const float pixel_width_url_domain = GetStringWidthF(url_domain, font_list); 297 const float pixel_width_url_domain = GetStringWidthF(url_domain, font_list);
298 float subdomain_width = available_pixel_width - pixel_width_url_domain; 298 float subdomain_width = available_pixel_width - pixel_width_url_domain;
299 if (subdomain_width <= 0) 299 if (subdomain_width <= 0)
300 return base::string16(kEllipsisUTF16) + kDot + url_domain; 300 return base::string16(kEllipsisUTF16) + kDot + url_domain;
301 301
302 base::string16 elided_subdomain = ElideText( 302 const base::string16 elided_subdomain = ElideText(
303 url_subdomain, font_list, subdomain_width, gfx::ELIDE_AT_BEGINNING); 303 url_subdomain, font_list, subdomain_width, gfx::ELIDE_HEAD);
304 return elided_subdomain + url_domain; 304 return elided_subdomain + url_domain;
305 } 305 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/screen_capture_notification_ui_cocoa.mm ('k') | chrome/browser/ui/toolbar/back_forward_menu_model.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698