| Index: ui/gfx/text_elider_unittest.cc
|
| diff --git a/ui/gfx/text_elider_unittest.cc b/ui/gfx/text_elider_unittest.cc
|
| index 2a90e5d73cbcca9366f4fa2eeab1a8246fb97284..6b1a4e31694899ff5f376e1ed6af5242a366d554 100644
|
| --- a/ui/gfx/text_elider_unittest.cc
|
| +++ b/ui/gfx/text_elider_unittest.cc
|
| @@ -13,6 +13,8 @@
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "ui/gfx/font.h"
|
| +#include "ui/gfx/font_list.h"
|
| +#include "ui/gfx/text_utils.h"
|
| #include "url/gurl.h"
|
|
|
| namespace gfx {
|
| @@ -41,36 +43,22 @@ struct TestData {
|
| };
|
|
|
| void RunUrlTest(Testcase* testcases, size_t num_testcases) {
|
| - static const gfx::Font font;
|
| + static const FontList font_list;
|
| for (size_t i = 0; i < num_testcases; ++i) {
|
| const GURL url(testcases[i].input);
|
| // Should we test with non-empty language list?
|
| // That's kinda redundant with net_util_unittests.
|
| + const float available_width =
|
| + GetStringWidthF(UTF8ToUTF16(testcases[i].output), font_list);
|
| EXPECT_EQ(UTF8ToUTF16(testcases[i].output),
|
| - ElideUrl(url, font,
|
| - font.GetStringWidth(UTF8ToUTF16(testcases[i].output)),
|
| - std::string()));
|
| + ElideUrl(url, font_list, available_width, std::string()));
|
| }
|
| }
|
|
|
| -gfx::Font GetTestingFont() {
|
| - gfx::Font font;
|
| -#if defined(OS_MACOSX)
|
| - // Use a specific font for certain tests on Mac.
|
| - // 1) Different Mac machines might be configured with different default font.
|
| - // The number of extra pixels needed to make ElideEmail/TestFilenameEliding
|
| - // tests work might vary per the default font.
|
| - // 2) This specific font helps expose the line width exceeding problem as in
|
| - // ElideRectangleTextCheckLineWidth.
|
| - font = gfx::Font("LucidaGrande", 12);
|
| -#endif
|
| - return font;
|
| -}
|
| -
|
| } // namespace
|
|
|
| -// TODO(ios): Complex eliding is off by one for some of those tests on iOS.
|
| -// See crbug.com/154019
|
| +// TODO(ios): This test fails on iOS because iOS version of GetStringWidthF
|
| +// that calls [NSString sizeWithFont] returns the rounded string width.
|
| #if defined(OS_IOS)
|
| #define MAYBE_ElideEmail DISABLED_ElideEmail
|
| #else
|
| @@ -121,22 +109,14 @@ TEST(TextEliderTest, MAYBE_ElideEmail) {
|
| {"mmmmm@llllllllll", "m" + kEllipsisStr + "@l" + kEllipsisStr},
|
| };
|
|
|
| - const gfx::Font font = GetTestingFont();
|
| + const FontList font_list;
|
| for (size_t i = 0; i < arraysize(testcases); ++i) {
|
| const string16 expected_output = UTF8ToUTF16(testcases[i].output);
|
| - int available_width = font.GetStringWidth(expected_output);
|
| -#if defined(OS_MACOSX)
|
| - // Give two extra pixels to offset the ceiling width returned by
|
| - // GetStringWidth on Mac. This workaround will no longer be needed once
|
| - // the floating point width is adopted (http://crbug.com/288987).
|
| - // Note that we need one more pixel than TestFilenameEliding because
|
| - // multiple strings are elided and we need to offset more.
|
| - available_width += 2;
|
| -#endif
|
| EXPECT_EQ(expected_output,
|
| - ElideEmail(UTF8ToUTF16(testcases[i].input),
|
| - font,
|
| - available_width));
|
| + ElideEmail(
|
| + UTF8ToUTF16(testcases[i].input),
|
| + font_list,
|
| + GetStringWidthF(expected_output, font_list)));
|
| }
|
| }
|
|
|
| @@ -153,7 +133,7 @@ TEST(TextEliderTest, ElideEmailMoreSpace) {
|
| "supermegalongusername@withasuperlonnnggggdomain.gouv.qc.ca",
|
| };
|
|
|
| - const gfx::Font font;
|
| + const Font font;
|
| for (size_t i = 0; i < arraysize(test_width_factors); ++i) {
|
| const int test_width = test_width_factors[i] *
|
| font.GetAverageCharacterWidth();
|
| @@ -199,23 +179,26 @@ TEST(TextEliderTest, TestTrailingEllipsisSlashEllipsisHack) {
|
| const std::string kEllipsisStr(kEllipsis);
|
|
|
| // Very little space, would cause double ellipsis.
|
| - gfx::Font font;
|
| + FontList font_list;
|
| GURL url("http://battersbox.com/directory/foo/peter_paul_and_mary.html");
|
| - int available_width = font.GetStringWidth(
|
| - UTF8ToUTF16("battersbox.com/" + kEllipsisStr + "/" + kEllipsisStr));
|
| + float available_width = GetStringWidthF(
|
| + UTF8ToUTF16("battersbox.com/" + kEllipsisStr + "/" + kEllipsisStr),
|
| + font_list);
|
|
|
| // Create the expected string, after elision. Depending on font size, the
|
| // directory might become /dir... or /di... or/d... - it never should be
|
| // shorter than that. (If it is, the font considers d... to be longer
|
| // than .../... - that should never happen).
|
| - ASSERT_GT(font.GetStringWidth(UTF8ToUTF16(kEllipsisStr + "/" + kEllipsisStr)),
|
| - font.GetStringWidth(UTF8ToUTF16("d" + kEllipsisStr)));
|
| + ASSERT_GT(GetStringWidthF(UTF8ToUTF16(kEllipsisStr + "/" + kEllipsisStr),
|
| + font_list),
|
| + GetStringWidthF(UTF8ToUTF16("d" + kEllipsisStr), font_list));
|
| GURL long_url("http://battersbox.com/directorynameisreallylongtoforcetrunc");
|
| - string16 expected = ElideUrl(long_url, font, available_width, std::string());
|
| + string16 expected =
|
| + ElideUrl(long_url, font_list, available_width, std::string());
|
| // Ensure that the expected result still contains part of the directory name.
|
| ASSERT_GT(expected.length(), std::string("battersbox.com/d").length());
|
| EXPECT_EQ(expected,
|
| - ElideUrl(url, font, available_width, std::string()));
|
| + ElideUrl(url, font_list, available_width, std::string()));
|
|
|
| // More space available - elide directories, partially elide filename.
|
| Testcase testcases[] = {
|
| @@ -288,8 +271,8 @@ TEST(TextEliderTest, TestFileURLEliding) {
|
| RunUrlTest(testcases, arraysize(testcases));
|
| }
|
|
|
| -// TODO(ios): Complex eliding is off by one for some of those tests on iOS.
|
| -// See crbug.com/154019
|
| +// TODO(ios): This test fails on iOS because iOS version of GetStringWidthF
|
| +// that calls [NSString sizeWithFont] returns the rounded string width.
|
| #if defined(OS_IOS)
|
| #define MAYBE_TestFilenameEliding DISABLED_TestFilenameEliding
|
| #else
|
| @@ -334,28 +317,22 @@ TEST(TextEliderTest, MAYBE_TestFilenameEliding) {
|
| "file.name.re" + kEllipsisStr + "emelylongext"}
|
| };
|
|
|
| - static const gfx::Font font = GetTestingFont();
|
| + static const FontList font_list;
|
| for (size_t i = 0; i < arraysize(testcases); ++i) {
|
| base::FilePath filepath(testcases[i].input);
|
| string16 expected = UTF8ToUTF16(testcases[i].output);
|
| expected = base::i18n::GetDisplayStringInLTRDirectionality(expected);
|
| - int available_width = font.GetStringWidth(UTF8ToUTF16(testcases[i].output));
|
| -#if defined(OS_MACOSX)
|
| - // Give one extra pixel to offset the ceiling width returned by
|
| - // GetStringWidth on Mac. This workaround will no longer be needed once
|
| - // the floating point width is adopted (http://crbug.com/288987).
|
| - available_width += 1;
|
| -#endif
|
| - EXPECT_EQ(expected, ElideFilename(filepath, font, available_width));
|
| + EXPECT_EQ(expected, ElideFilename(filepath, font_list,
|
| + GetStringWidthF(UTF8ToUTF16(testcases[i].output), font_list)));
|
| }
|
| }
|
|
|
| TEST(TextEliderTest, ElideTextTruncate) {
|
| - const gfx::Font font;
|
| - const int kTestWidth = font.GetStringWidth(ASCIIToUTF16("Test"));
|
| + const FontList font_list;
|
| + const float kTestWidth = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
|
| struct TestData {
|
| const char* input;
|
| - int width;
|
| + float width;
|
| const char* output;
|
| } cases[] = {
|
| { "", 0, "" },
|
| @@ -367,20 +344,21 @@ TEST(TextEliderTest, ElideTextTruncate) {
|
| };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - string16 result = ElideText(UTF8ToUTF16(cases[i].input), font,
|
| + string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
|
| cases[i].width, TRUNCATE_AT_END);
|
| EXPECT_EQ(cases[i].output, UTF16ToUTF8(result));
|
| }
|
| }
|
|
|
| TEST(TextEliderTest, ElideTextEllipsis) {
|
| - const gfx::Font font;
|
| - const int kTestWidth = font.GetStringWidth(ASCIIToUTF16("Test"));
|
| + const FontList font_list;
|
| + const float kTestWidth = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
|
| const char* kEllipsis = "\xE2\x80\xA6";
|
| - const int kEllipsisWidth = font.GetStringWidth(UTF8ToUTF16(kEllipsis));
|
| + const float kEllipsisWidth =
|
| + GetStringWidthF(UTF8ToUTF16(kEllipsis), font_list);
|
| struct TestData {
|
| const char* input;
|
| - int width;
|
| + float width;
|
| const char* output;
|
| } cases[] = {
|
| { "", 0, "" },
|
| @@ -392,7 +370,7 @@ TEST(TextEliderTest, ElideTextEllipsis) {
|
| };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - string16 result = ElideText(UTF8ToUTF16(cases[i].input), font,
|
| + string16 result = ElideText(UTF8ToUTF16(cases[i].input), font_list,
|
| cases[i].width, ELIDE_AT_END);
|
| EXPECT_EQ(cases[i].output, UTF16ToUTF8(result));
|
| }
|
| @@ -418,27 +396,27 @@ static void CheckSurrogatePairs(const string16& text,
|
| }
|
|
|
| TEST(TextEliderTest, ElideTextSurrogatePairs) {
|
| - const gfx::Font font;
|
| + const FontList font_list;
|
| // The below is 'MUSICAL SYMBOL G CLEF', which is represented in UTF-16 as
|
| // two characters forming a surrogate pair 0x0001D11E.
|
| const std::string kSurrogate = "\xF0\x9D\x84\x9E";
|
| const string16 kTestString =
|
| UTF8ToUTF16(kSurrogate + "ab" + kSurrogate + kSurrogate + "cd");
|
| - const int kTestStringWidth = font.GetStringWidth(kTestString);
|
| + const float kTestStringWidth = GetStringWidthF(kTestString, font_list);
|
| const char16 kSurrogateFirstChar = kTestString[0];
|
| const char16 kSurrogateSecondChar = kTestString[1];
|
| string16 result;
|
|
|
| // Elide |kTextString| to all possible widths and check that no instance of
|
| // |kSurrogate| was split in two.
|
| - for (int width = 0; width <= kTestStringWidth; width++) {
|
| - result = ElideText(kTestString, font, width, TRUNCATE_AT_END);
|
| + for (float width = 0; width <= kTestStringWidth; width++) {
|
| + result = ElideText(kTestString, font_list, width, TRUNCATE_AT_END);
|
| CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar);
|
|
|
| - result = ElideText(kTestString, font, width, ELIDE_AT_END);
|
| + result = ElideText(kTestString, font_list, width, ELIDE_AT_END);
|
| CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar);
|
|
|
| - result = ElideText(kTestString, font, width, ELIDE_IN_MIDDLE);
|
| + result = ElideText(kTestString, font_list, width, ELIDE_IN_MIDDLE);
|
| CheckSurrogatePairs(result, kSurrogateFirstChar, kSurrogateSecondChar);
|
| }
|
| }
|
| @@ -467,17 +445,19 @@ TEST(TextEliderTest, ElideTextLongStrings) {
|
| {data_scheme + million_a, long_string_end},
|
| };
|
|
|
| - const gfx::Font font;
|
| - int ellipsis_width = font.GetStringWidth(kEllipsisStr);
|
| + const FontList font_list;
|
| + float ellipsis_width = GetStringWidthF(kEllipsisStr, font_list);
|
| 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(testcases_end[i].output),
|
| - ELIDE_AT_END).size());
|
| + ElideText(
|
| + testcases_end[i].input,
|
| + font_list,
|
| + GetStringWidthF(testcases_end[i].output, font_list),
|
| + ELIDE_AT_END).size());
|
| EXPECT_EQ(kEllipsisStr,
|
| - ElideText(testcases_end[i].input, font, ellipsis_width,
|
| + ElideText(testcases_end[i].input, font_list, ellipsis_width,
|
| ELIDE_AT_END));
|
| }
|
|
|
| @@ -498,11 +478,13 @@ TEST(TextEliderTest, ElideTextLongStrings) {
|
| // Compare sizes rather than actual contents because if the test fails,
|
| // output is rather long.
|
| EXPECT_EQ(testcases_middle[i].output.size(),
|
| - ElideText(testcases_middle[i].input, font,
|
| - font.GetStringWidth(testcases_middle[i].output),
|
| - ELIDE_AT_END).size());
|
| + ElideText(
|
| + testcases_middle[i].input,
|
| + font_list,
|
| + GetStringWidthF(testcases_middle[i].output, font_list),
|
| + ELIDE_AT_END).size());
|
| EXPECT_EQ(kEllipsisStr,
|
| - ElideText(testcases_middle[i].input, font, ellipsis_width,
|
| + ElideText(testcases_middle[i].input, font_list, ellipsis_width,
|
| ELIDE_AT_END));
|
| }
|
| }
|
| @@ -580,13 +562,13 @@ TEST(TextEliderTest, ElideString) {
|
| }
|
|
|
| TEST(TextEliderTest, ElideRectangleText) {
|
| - const gfx::Font font;
|
| - const int line_height = font.GetHeight();
|
| - const int test_width = font.GetStringWidth(ASCIIToUTF16("Test"));
|
| + const FontList font_list;
|
| + const int line_height = font_list.GetHeight();
|
| + const float test_width = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
|
|
|
| struct TestData {
|
| const char* input;
|
| - int available_pixel_width;
|
| + float available_pixel_width;
|
| int available_pixel_height;
|
| bool truncated_y;
|
| const char* output;
|
| @@ -622,7 +604,7 @@ TEST(TextEliderTest, ElideRectangleText) {
|
| std::vector<string16> lines;
|
| EXPECT_EQ(cases[i].truncated_y ? INSUFFICIENT_SPACE_VERTICAL : 0,
|
| ElideRectangleText(UTF8ToUTF16(cases[i].input),
|
| - font,
|
| + font_list,
|
| cases[i].available_pixel_width,
|
| cases[i].available_pixel_height,
|
| TRUNCATE_LONG_WORDS,
|
| @@ -637,14 +619,14 @@ TEST(TextEliderTest, ElideRectangleText) {
|
| }
|
|
|
| TEST(TextEliderTest, ElideRectangleTextPunctuation) {
|
| - const gfx::Font font;
|
| - const int line_height = font.GetHeight();
|
| - const int test_width = font.GetStringWidth(ASCIIToUTF16("Test"));
|
| - const int test_t_width = font.GetStringWidth(ASCIIToUTF16("Test T"));
|
| + const FontList font_list;
|
| + const int line_height = font_list.GetHeight();
|
| + const float test_width = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
|
| + const float test_t_width = GetStringWidthF(ASCIIToUTF16("Test T"), font_list);
|
|
|
| struct TestData {
|
| const char* input;
|
| - int available_pixel_width;
|
| + float available_pixel_width;
|
| int available_pixel_height;
|
| bool wrap_words;
|
| bool truncated_x;
|
| @@ -662,7 +644,7 @@ TEST(TextEliderTest, ElideRectangleTextPunctuation) {
|
| (cases[i].wrap_words ? WRAP_LONG_WORDS : TRUNCATE_LONG_WORDS);
|
| EXPECT_EQ(cases[i].truncated_x ? INSUFFICIENT_SPACE_HORIZONTAL : 0,
|
| ElideRectangleText(UTF8ToUTF16(cases[i].input),
|
| - font,
|
| + font_list,
|
| cases[i].available_pixel_width,
|
| cases[i].available_pixel_height,
|
| wrap_behavior,
|
| @@ -677,15 +659,15 @@ TEST(TextEliderTest, ElideRectangleTextPunctuation) {
|
| }
|
|
|
| TEST(TextEliderTest, ElideRectangleTextLongWords) {
|
| - const gfx::Font font;
|
| + const FontList font_list;
|
| const int kAvailableHeight = 1000;
|
| const string16 kElidedTesting = UTF8ToUTF16(std::string("Tes") + kEllipsis);
|
| - const int elided_width = font.GetStringWidth(kElidedTesting);
|
| - const int test_width = font.GetStringWidth(ASCIIToUTF16("Test"));
|
| + const float elided_width = GetStringWidthF(kElidedTesting, font_list);
|
| + const float test_width = GetStringWidthF(ASCIIToUTF16("Test"), font_list);
|
|
|
| struct TestData {
|
| const char* input;
|
| - int available_pixel_width;
|
| + float available_pixel_width;
|
| WordWrapBehavior wrap_behavior;
|
| bool truncated_x;
|
| const char* output;
|
| @@ -723,7 +705,7 @@ TEST(TextEliderTest, ElideRectangleTextLongWords) {
|
| std::vector<string16> lines;
|
| EXPECT_EQ(cases[i].truncated_x ? INSUFFICIENT_SPACE_HORIZONTAL : 0,
|
| ElideRectangleText(UTF8ToUTF16(cases[i].input),
|
| - font,
|
| + font_list,
|
| cases[i].available_pixel_width,
|
| kAvailableHeight,
|
| cases[i].wrap_behavior,
|
| @@ -735,35 +717,30 @@ TEST(TextEliderTest, ElideRectangleTextLongWords) {
|
| }
|
| }
|
|
|
| -// TODO(ios): Complex eliding is off by one for some of those tests on iOS.
|
| -// See crbug.com/154019
|
| -#if defined(OS_IOS)
|
| -#define MAYBE_ElideRectangleTextCheckLineWidth \
|
| - DISABLED_ElideRectangleTextCheckLineWidth
|
| -#else
|
| -#define MAYBE_ElideRectangleTextCheckLineWidth ElideRectangleTextCheckLineWidth
|
| -#endif
|
| -
|
| // This test is to make sure that the width of each wrapped line does not
|
| // exceed the available width. On some platform like Mac, this test used to
|
| // fail because the truncated integer width is returned for the string
|
| // and the accumulation of the truncated values causes the elide function
|
| // to wrap incorrectly.
|
| -TEST(TextEliderTest, MAYBE_ElideRectangleTextCheckLineWidth) {
|
| - gfx::Font font = GetTestingFont();
|
| - const int kAvailableWidth = 235;
|
| +TEST(TextEliderTest, ElideRectangleTextCheckLineWidth) {
|
| + FontList font_list;
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| + // Use a specific font to expose the line width exceeding problem.
|
| + font_list = FontList(Font("LucidaGrande", 12));
|
| +#endif
|
| + const float kAvailableWidth = 235;
|
| const int kAvailableHeight = 1000;
|
| const char text[] = "that Russian place we used to go to after fencing";
|
| std::vector<string16> lines;
|
| EXPECT_EQ(0, ElideRectangleText(UTF8ToUTF16(text),
|
| - font,
|
| + font_list,
|
| kAvailableWidth,
|
| kAvailableHeight,
|
| WRAP_LONG_WORDS,
|
| &lines));
|
| ASSERT_EQ(2u, lines.size());
|
| - EXPECT_LE(font.GetStringWidth(lines[0]), kAvailableWidth);
|
| - EXPECT_LE(font.GetStringWidth(lines[1]), kAvailableWidth);
|
| + EXPECT_LE(GetStringWidthF(lines[0], font_list), kAvailableWidth);
|
| + EXPECT_LE(GetStringWidthF(lines[1], font_list), kAvailableWidth);
|
| }
|
|
|
| TEST(TextEliderTest, ElideRectangleString) {
|
|
|