OLD | NEW |
---|---|
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 "ui/gfx/render_text.h" | 5 #include "ui/gfx/render_text.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
72 EXPECT_EQ(expected[i], render_text->selection_model()); | 72 EXPECT_EQ(expected[i], render_text->selection_model()); |
73 render_text->MoveCursor(CHARACTER_BREAK, direction, false); | 73 render_text->MoveCursor(CHARACTER_BREAK, direction, false); |
74 } | 74 } |
75 // Check that cursoring is clamped at the line edge. | 75 // Check that cursoring is clamped at the line edge. |
76 EXPECT_EQ(expected.back(), render_text->selection_model()); | 76 EXPECT_EQ(expected.back(), render_text->selection_model()); |
77 // Check that it is the line edge. | 77 // Check that it is the line edge. |
78 render_text->MoveCursor(LINE_BREAK, direction, false); | 78 render_text->MoveCursor(LINE_BREAK, direction, false); |
79 EXPECT_EQ(expected.back(), render_text->selection_model()); | 79 EXPECT_EQ(expected.back(), render_text->selection_model()); |
80 } | 80 } |
81 | 81 |
82 #if defined(OS_WIN) | |
83 bool CheckLineIntegrity(const std::vector<internal::Line>& lines, | |
msw
2013/08/21 16:46:23
nit: add a comment about what it actually verifies
ckocagil
2013/08/23 21:45:34
Done.
| |
84 const ScopedVector<internal::TextRun>& runs) { | |
85 size_t previous_segment_line = 0; | |
86 const internal::LineSegment* previous_segment = NULL; | |
87 | |
88 for (size_t i = 0; i < lines.size(); ++i) | |
89 for (size_t j = 0; j < lines[i].segments.size(); ++j) { | |
90 const internal::LineSegment* const segment = &lines[i].segments[j]; | |
91 internal::TextRun* const run = runs[segment->run]; | |
92 | |
93 if (!previous_segment || runs[previous_segment->run] != run) { | |
94 previous_segment = 0; | |
msw
2013/08/21 16:46:23
What? Use NULL. Also, won't |previous_segment| *al
ckocagil
2013/08/23 21:45:34
Oops. Fixed the logic here and it uses NULL now. W
| |
95 } else { | |
96 if (!run->script_analysis.fRTL) { | |
97 if (previous_segment->x_pos.end() != segment->x_pos.start()) | |
98 return false; | |
msw
2013/08/21 16:46:23
Consider turning these into EXPECT_EQ or ASSERT_EQ
ckocagil
2013/08/23 21:45:34
Done.
| |
99 } else if (i != previous_segment_line) { | |
100 if (segment->x_pos.end() != previous_segment->x_pos.start()) | |
101 return false; | |
102 } | |
103 | |
104 previous_segment = segment; | |
105 previous_segment_line = i; | |
106 } | |
107 } | |
108 | |
109 return true; | |
110 } | |
111 #endif // defined(OS_WIN) | |
112 | |
82 } // namespace | 113 } // namespace |
83 | 114 |
84 class RenderTextTest : public testing::Test { | 115 class RenderTextTest : public testing::Test { |
85 }; | 116 }; |
86 | 117 |
87 TEST_F(RenderTextTest, DefaultStyle) { | 118 TEST_F(RenderTextTest, DefaultStyle) { |
88 // Check the default styles applied to new instances and adjusted text. | 119 // Check the default styles applied to new instances and adjusted text. |
89 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 120 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
90 EXPECT_TRUE(render_text->text().empty()); | 121 EXPECT_TRUE(render_text->text().empty()); |
91 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; | 122 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; |
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1287 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1318 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
1288 render_text->SetText(ASCIIToUTF16("abcdefg")); | 1319 render_text->SetText(ASCIIToUTF16("abcdefg")); |
1289 render_text->SetFontList(FontList("Arial, 13px")); | 1320 render_text->SetFontList(FontList("Arial, 13px")); |
1290 | 1321 |
1291 // Set display area's size equal to the font size. | 1322 // Set display area's size equal to the font size. |
1292 const Size font_size(render_text->GetContentWidth(), | 1323 const Size font_size(render_text->GetContentWidth(), |
1293 render_text->GetStringSize().height()); | 1324 render_text->GetStringSize().height()); |
1294 Rect display_rect(font_size); | 1325 Rect display_rect(font_size); |
1295 render_text->SetDisplayRect(display_rect); | 1326 render_text->SetDisplayRect(display_rect); |
1296 | 1327 |
1297 Vector2d offset = render_text->GetTextOffset(); | 1328 Vector2d offset = render_text->GetLineOffset(0); |
1298 EXPECT_TRUE(offset.IsZero()); | 1329 EXPECT_TRUE(offset.IsZero()); |
1299 | 1330 |
1300 // Set display area's size greater than font size. | 1331 // Set display area's size greater than font size. |
1301 const int kEnlargement = 2; | 1332 const int kEnlargement = 2; |
1302 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement); | 1333 display_rect.Inset(0, 0, -kEnlargement, -kEnlargement); |
1303 render_text->SetDisplayRect(display_rect); | 1334 render_text->SetDisplayRect(display_rect); |
1304 | 1335 |
1305 // Check the default horizontal and vertical alignment. | 1336 // Check the default horizontal and vertical alignment. |
1306 offset = render_text->GetTextOffset(); | 1337 offset = render_text->GetLineOffset(0); |
1307 EXPECT_EQ(kEnlargement / 2, offset.y()); | 1338 EXPECT_EQ(kEnlargement / 2, offset.y()); |
1308 EXPECT_EQ(0, offset.x()); | 1339 EXPECT_EQ(0, offset.x()); |
1309 | 1340 |
1310 // Check explicitly setting the horizontal alignment. | 1341 // Check explicitly setting the horizontal alignment. |
1311 render_text->SetHorizontalAlignment(ALIGN_LEFT); | 1342 render_text->SetHorizontalAlignment(ALIGN_LEFT); |
1312 offset = render_text->GetTextOffset(); | 1343 offset = render_text->GetLineOffset(0); |
1313 EXPECT_EQ(0, offset.x()); | 1344 EXPECT_EQ(0, offset.x()); |
1314 render_text->SetHorizontalAlignment(ALIGN_CENTER); | 1345 render_text->SetHorizontalAlignment(ALIGN_CENTER); |
1315 offset = render_text->GetTextOffset(); | 1346 offset = render_text->GetLineOffset(0); |
1316 EXPECT_EQ(kEnlargement / 2, offset.x()); | 1347 EXPECT_EQ(kEnlargement / 2, offset.x()); |
1317 render_text->SetHorizontalAlignment(ALIGN_RIGHT); | 1348 render_text->SetHorizontalAlignment(ALIGN_RIGHT); |
1318 offset = render_text->GetTextOffset(); | 1349 offset = render_text->GetLineOffset(0); |
1319 EXPECT_EQ(kEnlargement, offset.x()); | 1350 EXPECT_EQ(kEnlargement, offset.x()); |
1320 | 1351 |
1321 // Check explicitly setting the vertical alignment. | 1352 // Check explicitly setting the vertical alignment. |
1322 render_text->SetVerticalAlignment(ALIGN_TOP); | 1353 render_text->SetVerticalAlignment(ALIGN_TOP); |
1323 offset = render_text->GetTextOffset(); | 1354 offset = render_text->GetLineOffset(0); |
1324 EXPECT_EQ(0, offset.y()); | 1355 EXPECT_EQ(0, offset.y()); |
1325 render_text->SetVerticalAlignment(ALIGN_VCENTER); | 1356 render_text->SetVerticalAlignment(ALIGN_VCENTER); |
1326 offset = render_text->GetTextOffset(); | 1357 offset = render_text->GetLineOffset(0); |
1327 EXPECT_EQ(kEnlargement / 2, offset.y()); | 1358 EXPECT_EQ(kEnlargement / 2, offset.y()); |
1328 render_text->SetVerticalAlignment(ALIGN_BOTTOM); | 1359 render_text->SetVerticalAlignment(ALIGN_BOTTOM); |
1329 offset = render_text->GetTextOffset(); | 1360 offset = render_text->GetLineOffset(0); |
1330 EXPECT_EQ(kEnlargement, offset.y()); | 1361 EXPECT_EQ(kEnlargement, offset.y()); |
1331 | 1362 |
1332 SetRTL(was_rtl); | 1363 SetRTL(was_rtl); |
1333 } | 1364 } |
1334 | 1365 |
1335 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) { | 1366 TEST_F(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL) { |
1336 // This only checks the default horizontal alignment in RTL mode; all other | 1367 // This only checks the default horizontal alignment in RTL mode; all other |
1337 // GetTextOffset() attributes are checked by the test above. | 1368 // GetLineOffset(0) attributes are checked by the test above. |
1338 const bool was_rtl = base::i18n::IsRTL(); | 1369 const bool was_rtl = base::i18n::IsRTL(); |
1339 SetRTL(true); | 1370 SetRTL(true); |
1340 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1371 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
1341 render_text->SetText(ASCIIToUTF16("abcdefg")); | 1372 render_text->SetText(ASCIIToUTF16("abcdefg")); |
1342 render_text->SetFontList(FontList("Arial, 13px")); | 1373 render_text->SetFontList(FontList("Arial, 13px")); |
1343 const int kEnlargement = 2; | 1374 const int kEnlargement = 2; |
1344 const Size font_size(render_text->GetContentWidth() + kEnlargement, | 1375 const Size font_size(render_text->GetContentWidth() + kEnlargement, |
1345 render_text->GetStringSize().height()); | 1376 render_text->GetStringSize().height()); |
1346 Rect display_rect(font_size); | 1377 Rect display_rect(font_size); |
1347 render_text->SetDisplayRect(display_rect); | 1378 render_text->SetDisplayRect(display_rect); |
1348 Vector2d offset = render_text->GetTextOffset(); | 1379 Vector2d offset = render_text->GetLineOffset(0); |
1349 EXPECT_EQ(kEnlargement, offset.x()); | 1380 EXPECT_EQ(kEnlargement, offset.x()); |
1350 SetRTL(was_rtl); | 1381 SetRTL(was_rtl); |
1351 } | 1382 } |
1352 | 1383 |
1353 TEST_F(RenderTextTest, SameFontForParentheses) { | 1384 TEST_F(RenderTextTest, SameFontForParentheses) { |
1354 struct { | 1385 struct { |
1355 const char16 left_char; | 1386 const char16 left_char; |
1356 const char16 right_char; | 1387 const char16 right_char; |
1357 } punctuation_pairs[] = { | 1388 } punctuation_pairs[] = { |
1358 { '(', ')' }, | 1389 { '(', ')' }, |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1644 const int expected_width = render_text->GetStringSize().width(); | 1675 const int expected_width = render_text->GetStringSize().width(); |
1645 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD)); | 1676 render_text->MoveCursorTo(SelectionModel(ui::Range(0, 1), CURSOR_FORWARD)); |
1646 EXPECT_EQ(expected_width, render_text->GetStringSize().width()); | 1677 EXPECT_EQ(expected_width, render_text->GetStringSize().width()); |
1647 // Draw the text. It shouldn't hit any DCHECKs or crash. | 1678 // Draw the text. It shouldn't hit any DCHECKs or crash. |
1648 // See http://crbug.com/214150 | 1679 // See http://crbug.com/214150 |
1649 render_text->Draw(&canvas); | 1680 render_text->Draw(&canvas); |
1650 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); | 1681 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); |
1651 } | 1682 } |
1652 } | 1683 } |
1653 | 1684 |
1685 #if defined(OS_WIN) | |
1686 TEST_F(RenderTextTest, Multiline) { | |
msw
2013/08/21 16:46:23
Add some more tests for the approximate size and/o
ckocagil
2013/08/23 21:45:34
I added some new test cases. Note that I can't add
msw
2013/08/27 01:30:52
Hmm, I think base::i18n::BreakIterator should hand
ckocagil
2013/08/28 18:01:45
BreakIterator only gives positions that are suitab
| |
1687 const wchar_t* kTestStrings[] = { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl, | |
1688 kRtlLtr, kRtlLtrRtl }; | |
1689 | |
1690 scoped_ptr<RenderTextWin> render_text( | |
1691 static_cast<RenderTextWin*>(RenderText::CreateInstance())); | |
1692 render_text->SetDisplayRect(Rect()); | |
msw
2013/08/21 16:46:23
Why does this set an empty display rect? Wouldn't
ckocagil
2013/08/23 21:45:34
An empty (or 1-pixel wide) display rect forces Ren
msw
2013/08/27 01:30:52
Cool, 1px makes more sense; I figure 0px should pe
| |
1693 render_text->SetMultiline(true); | |
1694 Canvas canvas; | |
1695 | |
1696 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { | |
1697 render_text->SetText(WideToUTF16(kTestStrings[i])); | |
1698 render_text->Draw(&canvas); | |
1699 EXPECT_TRUE(CheckLineIntegrity(render_text->lines_, render_text->runs_)) << | |
1700 "For kTestStrings[" << i << "]"; | |
msw
2013/08/21 16:46:23
Use SCOPED_TRACE here too, instead of piping outpu
ckocagil
2013/08/23 21:45:34
Done.
| |
1701 } | |
1702 } | |
1703 #endif // defined(OS_WIN) | |
1704 | |
1654 } // namespace gfx | 1705 } // namespace gfx |
OLD | NEW |