diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-04 20:46:14 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-04 20:46:14 +0000 |
commit | 13658c4b2835a3155efa6eb2c3c6ff8fef2b7fa5 (patch) | |
tree | ada8d64cbd2fd12c7248cca648e47ebd63e6462a /app | |
parent | cd4857b64f3e3b10ebfa3f44c38af0dc7376d5bb (diff) | |
download | chromium_src-13658c4b2835a3155efa6eb2c3c6ff8fef2b7fa5.zip chromium_src-13658c4b2835a3155efa6eb2c3c6ff8fef2b7fa5.tar.gz chromium_src-13658c4b2835a3155efa6eb2c3c6ff8fef2b7fa5.tar.bz2 |
Change Font.GetStringWidth() to take string16 instead of wstring.
do a bunch of string fixes along the way.
BUG=none
TEST=trybots
Review URL: http://codereview.chromium.org/5985007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@70440 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app')
-rw-r--r-- | app/text_elider.cc | 69 | ||||
-rw-r--r-- | app/text_elider_unittest.cc | 13 |
2 files changed, 40 insertions, 42 deletions
diff --git a/app/text_elider.cc b/app/text_elider.cc index 855e3c3..c4052aa 100644 --- a/app/text_elider.cc +++ b/app/text_elider.cc @@ -19,9 +19,10 @@ #include "net/base/net_util.h" #include "net/base/registry_controlled_domain.h" + namespace { -const wchar_t kEllipsis[] = L"\x2026"; +const char* kEllipsis = "\xE2\x80\xA6"; // Cuts |text| to be |length| characters long. If |cut_in_middle| is true, the // middle of the string is removed to leave equal-length pieces from the @@ -29,12 +30,13 @@ const wchar_t kEllipsis[] = L"\x2026"; // and only the beginning remains. If |insert_ellipsis| is true, then an // ellipsis character will by inserted at the cut point. string16 CutString(const string16& text, - size_t length, - bool cut_in_middle, - bool insert_ellipsis) { + size_t length, + bool cut_in_middle, + bool insert_ellipsis) { // TODO(tony): This is wrong, it might split the string in the middle of a // surrogate pair. - const string16 kInsert = WideToUTF16(insert_ellipsis ? kEllipsis : L""); + const string16 kInsert = insert_ellipsis ? UTF8ToUTF16(kEllipsis) : + ASCIIToUTF16(""); if (!cut_in_middle) return text.substr(0, length) + kInsert; // We put the extra character, if any, before the cut. @@ -74,7 +76,7 @@ string16 ElideUrl(const GURL& url, // Now start eliding url_string to fit within available pixel width. // Fist pass - check to see whether entire url_string fits. - int pixel_width_url_string = font.GetStringWidth(UTF16ToWideHack(url_string)); + int pixel_width_url_string = font.GetStringWidth(url_string); if (available_pixel_width >= pixel_width_url_string) return url_string; @@ -86,8 +88,7 @@ string16 ElideUrl(const GURL& url, // Return general elided text if url minus the query fits. string16 url_minus_query = url_string.substr(0, path_start_index + path_len); - if (available_pixel_width >= - font.GetStringWidth(UTF16ToWideHack(url_minus_query))) + if (available_pixel_width >= font.GetStringWidth(url_minus_query)) return ElideText(url_string, font, available_pixel_width, false); // Get Host. @@ -135,17 +136,15 @@ string16 ElideUrl(const GURL& url, } // Second Pass - remove scheme - the rest fits. - int pixel_width_url_host = font.GetStringWidth(UTF16ToWideHack(url_host)); - int pixel_width_url_path = font.GetStringWidth(UTF16ToWideHack( - url_path_query_etc)); + int pixel_width_url_host = font.GetStringWidth(url_host); + int pixel_width_url_path = font.GetStringWidth(url_path_query_etc); if (available_pixel_width >= pixel_width_url_host + pixel_width_url_path) return url_host + url_path_query_etc; // Third Pass: Subdomain, domain and entire path fits. - int pixel_width_url_domain = font.GetStringWidth(UTF16ToWideHack(url_domain)); - int pixel_width_url_subdomain = font.GetStringWidth(UTF16ToWideHack( - url_subdomain)); + int pixel_width_url_domain = font.GetStringWidth(url_domain); + int pixel_width_url_subdomain = font.GetStringWidth(url_subdomain); if (available_pixel_width >= pixel_width_url_subdomain + pixel_width_url_domain + pixel_width_url_path) @@ -153,12 +152,13 @@ string16 ElideUrl(const GURL& url, // Query element. string16 url_query; - const int kPixelWidthDotsTrailer = font.GetStringWidth(kEllipsis); + const int kPixelWidthDotsTrailer = + font.GetStringWidth(UTF8ToUTF16(kEllipsis)); if (parsed.query.is_nonempty()) { url_query = UTF8ToUTF16("?") + url_string.substr(parsed.query.begin); if (available_pixel_width >= (pixel_width_url_subdomain + pixel_width_url_domain + pixel_width_url_path - - font.GetStringWidth(UTF16ToWideHack(url_query)))) { + font.GetStringWidth(url_query))) { return ElideText(url_subdomain + url_domain + url_path_query_etc, font, available_pixel_width, false); } @@ -193,17 +193,14 @@ string16 ElideUrl(const GURL& url, } // Start eliding the path and replacing elements by "../". - static const string16 kEllipsisAndSlash = WideToUTF16(kEllipsis) + - kForwardSlash; - int pixel_width_url_filename = font.GetStringWidth(UTF16ToWideHack( - url_filename)); - int pixel_width_dot_dot_slash = font.GetStringWidth(UTF16ToWideHack( - kEllipsisAndSlash)); - int pixel_width_slash = font.GetStringWidth(L"/"); + const string16 kEllipsisAndSlash = UTF8ToUTF16(kEllipsis) + kForwardSlash; + int pixel_width_url_filename = font.GetStringWidth(url_filename); + int pixel_width_dot_dot_slash = font.GetStringWidth(kEllipsisAndSlash); + int pixel_width_slash = font.GetStringWidth(ASCIIToUTF16("/")); int pixel_width_url_path_elements[kMaxNumberOfUrlPathElementsAllowed]; for (size_t i = 0; i < url_path_number_of_elements; ++i) { pixel_width_url_path_elements[i] = - font.GetStringWidth(UTF16ToWideHack(url_path_elements.at(i))); + font.GetStringWidth(url_path_elements.at(i)); } // Check with both subdomain and domain. @@ -282,14 +279,16 @@ string16 ElideUrl(const GURL& url, // Return elided domain/../filename anyway. string16 final_elided_url_string(url_elided_domain); - int url_elided_domain_width = font.GetStringWidth(UTF16ToWideHack( - url_elided_domain)); + int url_elided_domain_width = font.GetStringWidth(url_elided_domain); + + // A hack to prevent trailing "../...". if ((available_pixel_width - url_elided_domain_width) > pixel_width_dot_dot_slash + kPixelWidthDotsTrailer + - font.GetStringWidth(L"UV")) // A hack to prevent trailing "../...". + font.GetStringWidth(ASCIIToUTF16("UV"))) { final_elided_url_string += elided_path; - else + } else { final_elided_url_string += url_path; + } return ElideText(final_elided_url_string, font, available_pixel_width, false); } @@ -310,7 +309,7 @@ string16 ElideFilename(const FilePath& filename, filename.BaseName().RemoveExtension().value())); #endif - int full_width = font.GetStringWidth(UTF16ToWideHack(filename_utf16)); + int full_width = font.GetStringWidth(filename_utf16); if (full_width <= available_pixel_width) return base::i18n::GetDisplayStringInLTRDirectionality(filename_utf16); @@ -320,8 +319,8 @@ string16 ElideFilename(const FilePath& filename, return base::i18n::GetDisplayStringInLTRDirectionality(elided_name); } - int ext_width = font.GetStringWidth(UTF16ToWideHack(extension)); - int root_width = font.GetStringWidth(UTF16ToWideHack(rootname)); + int ext_width = font.GetStringWidth(extension); + int root_width = font.GetStringWidth(rootname); // We may have trimmed the path. if (root_width + ext_width <= available_pixel_width) { @@ -345,7 +344,7 @@ string16 ElideText(const string16& text, if (text.empty()) return text; - int current_text_pixel_width = font.GetStringWidth(UTF16ToWideHack(text)); + int current_text_pixel_width = font.GetStringWidth(text); // Pango will return 0 width for absurdly long strings. Cut the string in // half and try again. @@ -363,7 +362,7 @@ string16 ElideText(const string16& text, if (current_text_pixel_width <= available_pixel_width) return text; - if (font.GetStringWidth(kEllipsis) > available_pixel_width) + if (font.GetStringWidth(UTF8ToUTF16(kEllipsis)) > available_pixel_width) return string16(); // Use binary search to compute the elided text. @@ -372,8 +371,8 @@ string16 ElideText(const string16& text, for (size_t guess = (lo + hi) / 2; guess != lo; guess = (lo + hi) / 2) { // We check the length of the whole desired string at once to ensure we // handle kerning/ligatures/etc. correctly. - int guess_length = font.GetStringWidth(UTF16ToWideHack( - CutString(text, guess, elide_in_middle, true))); + int guess_length = font.GetStringWidth( + CutString(text, guess, elide_in_middle, true)); // Check again that we didn't hit a Pango width overflow. If so, cut the // current string in half and start over. if (guess_length <= 0) { diff --git a/app/text_elider_unittest.cc b/app/text_elider_unittest.cc index ab1a73f..7d0cbda 100644 --- a/app/text_elider_unittest.cc +++ b/app/text_elider_unittest.cc @@ -44,7 +44,8 @@ void RunTest(Testcase* testcases, size_t num_testcases) { // Should we test with non-empty language list? // That's kinda redundant with net_util_unittests. EXPECT_EQ(WideToUTF16(testcases[i].output), - ElideUrl(url, font, font.GetStringWidth(testcases[i].output), + ElideUrl(url, font, + font.GetStringWidth(WideToUTF16(testcases[i].output)), std::wstring())); } } @@ -183,7 +184,7 @@ TEST(TextEliderTest, TestFilenameEliding) { expected = base::i18n::GetDisplayStringInLTRDirectionality(expected); EXPECT_EQ(expected, ElideFilename(filepath, font, - font.GetStringWidth(testcases[i].output))); + font.GetStringWidth(WideToUTF16(testcases[i].output)))); } } @@ -212,14 +213,13 @@ TEST(TextEliderTest, ElideTextLongStrings) { }; const gfx::Font font; - int ellipsis_width = font.GetStringWidth(UTF16ToWideHack(kEllipsisStr)); + int ellipsis_width = font.GetStringWidth(kEllipsisStr); for (size_t i = 0; i < arraysize(testcases_end); ++i) { // Compare sizes rather than actual contents because if the test fails, // output is rather long. EXPECT_EQ(testcases_end[i].output.size(), ElideText(testcases_end[i].input, font, - font.GetStringWidth(UTF16ToWideHack( - testcases_end[i].output)), + font.GetStringWidth(testcases_end[i].output), false).size()); EXPECT_EQ(kEllipsisStr, ElideText(testcases_end[i].input, font, ellipsis_width, false)); @@ -243,8 +243,7 @@ TEST(TextEliderTest, ElideTextLongStrings) { // output is rather long. EXPECT_EQ(testcases_middle[i].output.size(), ElideText(testcases_middle[i].input, font, - font.GetStringWidth(UTF16ToWideHack( - testcases_middle[i].output)), + font.GetStringWidth(testcases_middle[i].output), false).size()); EXPECT_EQ(kEllipsisStr, ElideText(testcases_middle[i].input, font, ellipsis_width, |