Chromium Code Reviews| 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/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/i18n/break_iterator.h" | 10 #include "base/i18n/break_iterator.h" |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 | 243 |
| 244 TEST_F(RenderTextTest, ObscuredText) { | 244 TEST_F(RenderTextTest, ObscuredText) { |
| 245 const base::string16 seuss = ASCIIToUTF16("hop on pop"); | 245 const base::string16 seuss = ASCIIToUTF16("hop on pop"); |
| 246 const base::string16 no_seuss = ASCIIToUTF16("**********"); | 246 const base::string16 no_seuss = ASCIIToUTF16("**********"); |
| 247 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 247 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 248 | 248 |
| 249 // GetLayoutText() returns asterisks when the obscured bit is set. | 249 // GetLayoutText() returns asterisks when the obscured bit is set. |
| 250 render_text->SetText(seuss); | 250 render_text->SetText(seuss); |
| 251 render_text->SetObscured(true); | 251 render_text->SetObscured(true); |
| 252 EXPECT_EQ(seuss, render_text->text()); | 252 EXPECT_EQ(seuss, render_text->text()); |
| 253 EXPECT_EQ(no_seuss, render_text->GetLayoutText()); | 253 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); |
| 254 render_text->SetObscured(false); | 254 render_text->SetObscured(false); |
| 255 EXPECT_EQ(seuss, render_text->text()); | 255 EXPECT_EQ(seuss, render_text->text()); |
| 256 EXPECT_EQ(seuss, render_text->GetLayoutText()); | 256 EXPECT_EQ(seuss, render_text->GetDisplayText()); |
| 257 | 257 |
| 258 render_text->SetObscured(true); | 258 render_text->SetObscured(true); |
| 259 | 259 |
| 260 // Surrogate pairs are counted as one code point. | 260 // Surrogate pairs are counted as one code point. |
| 261 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; | 261 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; |
| 262 render_text->SetText(invalid_surrogates); | 262 render_text->SetText(invalid_surrogates); |
| 263 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetLayoutText()); | 263 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText()); |
| 264 const base::char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; | 264 const base::char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; |
| 265 render_text->SetText(valid_surrogates); | 265 render_text->SetText(valid_surrogates); |
| 266 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetLayoutText()); | 266 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText()); |
| 267 EXPECT_EQ(0U, render_text->cursor_position()); | 267 EXPECT_EQ(0U, render_text->cursor_position()); |
| 268 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 268 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 269 EXPECT_EQ(2U, render_text->cursor_position()); | 269 EXPECT_EQ(2U, render_text->cursor_position()); |
| 270 | 270 |
| 271 // Test index conversion and cursor validity with a valid surrogate pair. | 271 // Test index conversion and cursor validity with a valid surrogate pair. |
| 272 EXPECT_EQ(0U, render_text->TextIndexToLayoutIndex(0U)); | 272 EXPECT_EQ(0U, render_text->TextIndexToDisplayIndex(0U)); |
| 273 EXPECT_EQ(1U, render_text->TextIndexToLayoutIndex(1U)); | 273 EXPECT_EQ(1U, render_text->TextIndexToDisplayIndex(1U)); |
| 274 EXPECT_EQ(1U, render_text->TextIndexToLayoutIndex(2U)); | 274 EXPECT_EQ(1U, render_text->TextIndexToDisplayIndex(2U)); |
| 275 EXPECT_EQ(0U, render_text->LayoutIndexToTextIndex(0U)); | 275 EXPECT_EQ(0U, render_text->DisplayIndexToTextIndex(0U)); |
| 276 EXPECT_EQ(2U, render_text->LayoutIndexToTextIndex(1U)); | 276 EXPECT_EQ(2U, render_text->DisplayIndexToTextIndex(1U)); |
| 277 EXPECT_TRUE(render_text->IsValidCursorIndex(0U)); | 277 EXPECT_TRUE(render_text->IsValidCursorIndex(0U)); |
| 278 EXPECT_FALSE(render_text->IsValidCursorIndex(1U)); | 278 EXPECT_FALSE(render_text->IsValidCursorIndex(1U)); |
| 279 EXPECT_TRUE(render_text->IsValidCursorIndex(2U)); | 279 EXPECT_TRUE(render_text->IsValidCursorIndex(2U)); |
| 280 | 280 |
| 281 // FindCursorPosition() should not return positions between a surrogate pair. | 281 // FindCursorPosition() should not return positions between a surrogate pair. |
| 282 render_text->SetDisplayRect(Rect(0, 0, 20, 20)); | 282 render_text->SetDisplayRect(Rect(0, 0, 20, 20)); |
| 283 EXPECT_EQ(render_text->FindCursorPosition(Point(0, 0)).caret_pos(), 0U); | 283 EXPECT_EQ(render_text->FindCursorPosition(Point(0, 0)).caret_pos(), 0U); |
| 284 EXPECT_EQ(render_text->FindCursorPosition(Point(20, 0)).caret_pos(), 2U); | 284 EXPECT_EQ(render_text->FindCursorPosition(Point(20, 0)).caret_pos(), 2U); |
| 285 for (int x = -1; x <= 20; ++x) { | 285 for (int x = -1; x <= 20; ++x) { |
| 286 SelectionModel selection = render_text->FindCursorPosition(Point(x, 0)); | 286 SelectionModel selection = render_text->FindCursorPosition(Point(x, 0)); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 305 } | 305 } |
| 306 | 306 |
| 307 TEST_F(RenderTextTest, RevealObscuredText) { | 307 TEST_F(RenderTextTest, RevealObscuredText) { |
| 308 const base::string16 seuss = ASCIIToUTF16("hop on pop"); | 308 const base::string16 seuss = ASCIIToUTF16("hop on pop"); |
| 309 const base::string16 no_seuss = ASCIIToUTF16("**********"); | 309 const base::string16 no_seuss = ASCIIToUTF16("**********"); |
| 310 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 310 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 311 | 311 |
| 312 render_text->SetText(seuss); | 312 render_text->SetText(seuss); |
| 313 render_text->SetObscured(true); | 313 render_text->SetObscured(true); |
| 314 EXPECT_EQ(seuss, render_text->text()); | 314 EXPECT_EQ(seuss, render_text->text()); |
| 315 EXPECT_EQ(no_seuss, render_text->GetLayoutText()); | 315 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); |
| 316 | 316 |
| 317 // Valid reveal index and new revealed index clears previous one. | 317 // Valid reveal index and new revealed index clears previous one. |
| 318 render_text->RenderText::SetObscuredRevealIndex(0); | 318 render_text->RenderText::SetObscuredRevealIndex(0); |
| 319 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetLayoutText()); | 319 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetDisplayText()); |
| 320 render_text->RenderText::SetObscuredRevealIndex(1); | 320 render_text->RenderText::SetObscuredRevealIndex(1); |
| 321 EXPECT_EQ(ASCIIToUTF16("*o********"), render_text->GetLayoutText()); | 321 EXPECT_EQ(ASCIIToUTF16("*o********"), render_text->GetDisplayText()); |
| 322 render_text->RenderText::SetObscuredRevealIndex(2); | 322 render_text->RenderText::SetObscuredRevealIndex(2); |
| 323 EXPECT_EQ(ASCIIToUTF16("**p*******"), render_text->GetLayoutText()); | 323 EXPECT_EQ(ASCIIToUTF16("**p*******"), render_text->GetDisplayText()); |
| 324 | 324 |
| 325 // Invalid reveal index. | 325 // Invalid reveal index. |
| 326 render_text->RenderText::SetObscuredRevealIndex(-1); | 326 render_text->RenderText::SetObscuredRevealIndex(-1); |
| 327 EXPECT_EQ(no_seuss, render_text->GetLayoutText()); | 327 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); |
| 328 render_text->RenderText::SetObscuredRevealIndex(seuss.length() + 1); | 328 render_text->RenderText::SetObscuredRevealIndex(seuss.length() + 1); |
| 329 EXPECT_EQ(no_seuss, render_text->GetLayoutText()); | 329 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); |
| 330 | 330 |
| 331 // SetObscured clears the revealed index. | 331 // SetObscured clears the revealed index. |
| 332 render_text->RenderText::SetObscuredRevealIndex(0); | 332 render_text->RenderText::SetObscuredRevealIndex(0); |
| 333 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetLayoutText()); | 333 EXPECT_EQ(ASCIIToUTF16("h*********"), render_text->GetDisplayText()); |
| 334 render_text->SetObscured(false); | 334 render_text->SetObscured(false); |
| 335 EXPECT_EQ(seuss, render_text->GetLayoutText()); | 335 EXPECT_EQ(seuss, render_text->GetDisplayText()); |
| 336 render_text->SetObscured(true); | 336 render_text->SetObscured(true); |
| 337 EXPECT_EQ(no_seuss, render_text->GetLayoutText()); | 337 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); |
| 338 | 338 |
| 339 // SetText clears the revealed index. | 339 // SetText clears the revealed index. |
| 340 render_text->SetText(ASCIIToUTF16("new")); | 340 render_text->SetText(ASCIIToUTF16("new")); |
| 341 EXPECT_EQ(ASCIIToUTF16("***"), render_text->GetLayoutText()); | 341 EXPECT_EQ(ASCIIToUTF16("***"), render_text->GetDisplayText()); |
| 342 render_text->RenderText::SetObscuredRevealIndex(2); | 342 render_text->RenderText::SetObscuredRevealIndex(2); |
| 343 EXPECT_EQ(ASCIIToUTF16("**w"), render_text->GetLayoutText()); | 343 EXPECT_EQ(ASCIIToUTF16("**w"), render_text->GetDisplayText()); |
| 344 render_text->SetText(ASCIIToUTF16("new longer")); | 344 render_text->SetText(ASCIIToUTF16("new longer")); |
| 345 EXPECT_EQ(ASCIIToUTF16("**********"), render_text->GetLayoutText()); | 345 EXPECT_EQ(ASCIIToUTF16("**********"), render_text->GetDisplayText()); |
| 346 | 346 |
| 347 // Text with invalid surrogates. | 347 // Text with invalid surrogates. |
| 348 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 'h', 'o', 'p', 0}; | 348 const base::char16 invalid_surrogates[] = {0xDC00, 0xD800, 'h', 'o', 'p', 0}; |
| 349 render_text->SetText(invalid_surrogates); | 349 render_text->SetText(invalid_surrogates); |
| 350 EXPECT_EQ(ASCIIToUTF16("*****"), render_text->GetLayoutText()); | 350 EXPECT_EQ(ASCIIToUTF16("*****"), render_text->GetDisplayText()); |
| 351 render_text->RenderText::SetObscuredRevealIndex(0); | 351 render_text->RenderText::SetObscuredRevealIndex(0); |
| 352 const base::char16 invalid_expect_0[] = {0xDC00, '*', '*', '*', '*', 0}; | 352 const base::char16 invalid_expect_0[] = {0xDC00, '*', '*', '*', '*', 0}; |
| 353 EXPECT_EQ(invalid_expect_0, render_text->GetLayoutText()); | 353 EXPECT_EQ(invalid_expect_0, render_text->GetDisplayText()); |
| 354 render_text->RenderText::SetObscuredRevealIndex(1); | 354 render_text->RenderText::SetObscuredRevealIndex(1); |
| 355 const base::char16 invalid_expect_1[] = {'*', 0xD800, '*', '*', '*', 0}; | 355 const base::char16 invalid_expect_1[] = {'*', 0xD800, '*', '*', '*', 0}; |
| 356 EXPECT_EQ(invalid_expect_1, render_text->GetLayoutText()); | 356 EXPECT_EQ(invalid_expect_1, render_text->GetDisplayText()); |
| 357 render_text->RenderText::SetObscuredRevealIndex(2); | 357 render_text->RenderText::SetObscuredRevealIndex(2); |
| 358 EXPECT_EQ(ASCIIToUTF16("**h**"), render_text->GetLayoutText()); | 358 EXPECT_EQ(ASCIIToUTF16("**h**"), render_text->GetDisplayText()); |
| 359 | 359 |
| 360 // Text with valid surrogates before and after the reveal index. | 360 // Text with valid surrogates before and after the reveal index. |
| 361 const base::char16 valid_surrogates[] = | 361 const base::char16 valid_surrogates[] = |
| 362 {0xD800, 0xDC00, 'h', 'o', 'p', 0xD800, 0xDC00, 0}; | 362 {0xD800, 0xDC00, 'h', 'o', 'p', 0xD800, 0xDC00, 0}; |
| 363 render_text->SetText(valid_surrogates); | 363 render_text->SetText(valid_surrogates); |
| 364 EXPECT_EQ(ASCIIToUTF16("*****"), render_text->GetLayoutText()); | 364 EXPECT_EQ(ASCIIToUTF16("*****"), render_text->GetDisplayText()); |
| 365 render_text->RenderText::SetObscuredRevealIndex(0); | 365 render_text->RenderText::SetObscuredRevealIndex(0); |
| 366 const base::char16 valid_expect_0_and_1[] = | 366 const base::char16 valid_expect_0_and_1[] = |
| 367 {0xD800, 0xDC00, '*', '*', '*', '*', 0}; | 367 {0xD800, 0xDC00, '*', '*', '*', '*', 0}; |
| 368 EXPECT_EQ(valid_expect_0_and_1, render_text->GetLayoutText()); | 368 EXPECT_EQ(valid_expect_0_and_1, render_text->GetDisplayText()); |
| 369 render_text->RenderText::SetObscuredRevealIndex(1); | 369 render_text->RenderText::SetObscuredRevealIndex(1); |
| 370 EXPECT_EQ(valid_expect_0_and_1, render_text->GetLayoutText()); | 370 EXPECT_EQ(valid_expect_0_and_1, render_text->GetDisplayText()); |
| 371 render_text->RenderText::SetObscuredRevealIndex(2); | 371 render_text->RenderText::SetObscuredRevealIndex(2); |
| 372 EXPECT_EQ(ASCIIToUTF16("*h***"), render_text->GetLayoutText()); | 372 EXPECT_EQ(ASCIIToUTF16("*h***"), render_text->GetDisplayText()); |
| 373 render_text->RenderText::SetObscuredRevealIndex(5); | 373 render_text->RenderText::SetObscuredRevealIndex(5); |
| 374 const base::char16 valid_expect_5_and_6[] = | 374 const base::char16 valid_expect_5_and_6[] = |
| 375 {'*', '*', '*', '*', 0xD800, 0xDC00, 0}; | 375 {'*', '*', '*', '*', 0xD800, 0xDC00, 0}; |
| 376 EXPECT_EQ(valid_expect_5_and_6, render_text->GetLayoutText()); | 376 EXPECT_EQ(valid_expect_5_and_6, render_text->GetDisplayText()); |
| 377 render_text->RenderText::SetObscuredRevealIndex(6); | 377 render_text->RenderText::SetObscuredRevealIndex(6); |
| 378 EXPECT_EQ(valid_expect_5_and_6, render_text->GetLayoutText()); | 378 EXPECT_EQ(valid_expect_5_and_6, render_text->GetDisplayText()); |
| 379 } | 379 } |
| 380 | 380 |
| 381 TEST_F(RenderTextTest, ElidedText) { | 381 TEST_F(RenderTextTest, ElidedText) { |
| 382 // TODO(skanuj) : Add more test cases for following | 382 // TODO(skanuj) : Add more test cases for following |
| 383 // - RenderText styles. | 383 // - RenderText styles. |
| 384 // - Cross interaction of truncate, elide and obscure. | 384 // - Cross interaction of truncate, elide and obscure. |
| 385 // - ElideText tests from text_elider.cc. | 385 // - ElideText tests from text_elider.cc. |
| 386 struct { | 386 struct { |
| 387 const wchar_t* text; | 387 const wchar_t* text; |
| 388 const wchar_t* layout_text; | 388 const wchar_t* layout_text; |
|
msw
2015/02/13 22:19:05
ping nit: rename this |display_text|
oshima
2015/02/13 23:24:11
Done.
| |
| 389 const bool elision_expected; | 389 const bool elision_expected; |
| 390 } cases[] = { | 390 } cases[] = { |
| 391 // Strings shorter than the elision width should be laid out in full. | 391 // Strings shorter than the elision width should be laid out in full. |
| 392 { L"", L"" , false }, | 392 { L"", L"" , false }, |
| 393 { L"M", L"" , false }, | 393 { L"M", L"" , false }, |
| 394 { L" . ", L" . " , false }, | 394 { L" . ", L" . " , false }, |
| 395 { kWeak, kWeak , false }, | 395 { kWeak, kWeak , false }, |
| 396 { kLtr, kLtr , false }, | 396 { kLtr, kLtr , false }, |
| 397 { kLtrRtl, kLtrRtl , false }, | 397 { kLtrRtl, kLtrRtl , false }, |
| 398 { kLtrRtlLtr, kLtrRtlLtr, false }, | 398 { kLtrRtlLtr, kLtrRtlLtr, false }, |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 422 | 422 |
| 423 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); | 423 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); |
| 424 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); | 424 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); |
| 425 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); | 425 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); |
| 426 | 426 |
| 427 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 427 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 428 render_text->SetFontList(FontList("serif, Sans serif, 12px")); | 428 render_text->SetFontList(FontList("serif, Sans serif, 12px")); |
| 429 render_text->SetElideBehavior(ELIDE_TAIL); | 429 render_text->SetElideBehavior(ELIDE_TAIL); |
| 430 | 430 |
| 431 for (size_t i = 0; i < arraysize(cases); i++) { | 431 for (size_t i = 0; i < arraysize(cases); i++) { |
| 432 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "] '%ls'", i, | |
| 433 cases[i].text)); | |
| 434 | |
| 432 // Compute expected width | 435 // Compute expected width |
| 433 expected_render_text->SetText(WideToUTF16(cases[i].layout_text)); | 436 expected_render_text->SetText(WideToUTF16(cases[i].layout_text)); |
| 434 int expected_width = expected_render_text->GetContentWidth(); | 437 int expected_width = expected_render_text->GetContentWidth(); |
| 435 | 438 |
| 436 base::string16 input = WideToUTF16(cases[i].text); | 439 base::string16 input = WideToUTF16(cases[i].text); |
| 437 // Extend the input text to ensure that it is wider than the layout_text, | 440 // Extend the input text to ensure that it is wider than the layout_text, |
| 438 // and so it will get elided. | 441 // and so it will get elided. |
| 439 if (cases[i].elision_expected) | 442 if (cases[i].elision_expected) |
| 440 input.append(WideToUTF16(L" MMMMMMMMMMM")); | 443 input.append(WideToUTF16(L" MMMMMMMMMMM")); |
| 441 | |
| 442 render_text->SetText(input); | 444 render_text->SetText(input); |
| 443 render_text->SetDisplayRect(Rect(0, 0, expected_width, 100)); | 445 render_text->SetDisplayRect(Rect(0, 0, expected_width, 100)); |
| 444 EXPECT_EQ(input, render_text->text()) | 446 EXPECT_EQ(input, render_text->text()); |
| 445 << "->For case " << i << ": " << cases[i].text << "\n"; | 447 EXPECT_EQ(WideToUTF16(cases[i].layout_text), render_text->GetDisplayText()); |
| 446 EXPECT_EQ(WideToUTF16(cases[i].layout_text), render_text->GetLayoutText()) | |
| 447 << "->For case " << i << ": " << cases[i].text << "\n"; | |
| 448 expected_render_text->SetText(base::string16()); | 448 expected_render_text->SetText(base::string16()); |
| 449 } | 449 } |
| 450 } | 450 } |
| 451 | 451 |
| 452 TEST_F(RenderTextTest, ElidedObscuredText) { | 452 TEST_F(RenderTextTest, ElidedObscuredText) { |
| 453 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); | 453 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); |
| 454 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); | 454 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); |
| 455 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); | 455 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); |
| 456 expected_render_text->SetText(WideToUTF16(L"**\x2026")); | 456 expected_render_text->SetText(WideToUTF16(L"**\x2026")); |
| 457 | 457 |
| 458 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 458 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 459 render_text->SetFontList(FontList("serif, Sans serif, 12px")); | 459 render_text->SetFontList(FontList("serif, Sans serif, 12px")); |
| 460 render_text->SetElideBehavior(ELIDE_TAIL); | 460 render_text->SetElideBehavior(ELIDE_TAIL); |
| 461 render_text->SetDisplayRect( | 461 render_text->SetDisplayRect( |
| 462 Rect(0, 0, expected_render_text->GetContentWidth(), 100)); | 462 Rect(0, 0, expected_render_text->GetContentWidth(), 100)); |
| 463 render_text->SetObscured(true); | 463 render_text->SetObscured(true); |
| 464 render_text->SetText(WideToUTF16(L"abcdef")); | 464 render_text->SetText(WideToUTF16(L"abcdef")); |
| 465 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text()); | 465 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text()); |
| 466 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetLayoutText()); | 466 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetDisplayText()); |
| 467 } | 467 } |
| 468 | 468 |
| 469 TEST_F(RenderTextTest, TruncatedText) { | 469 TEST_F(RenderTextTest, TruncatedText) { |
| 470 struct { | 470 struct { |
| 471 const wchar_t* text; | 471 const wchar_t* text; |
| 472 const wchar_t* layout_text; | 472 const wchar_t* layout_text; |
| 473 } cases[] = { | 473 } cases[] = { |
| 474 // Strings shorter than the truncation length should be laid out in full. | 474 // Strings shorter than the truncation length should be laid out in full. |
| 475 { L"", L"" }, | 475 { L"", L"" }, |
| 476 { kWeak, kWeak }, | 476 { kWeak, kWeak }, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 499 { L"0123\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" }, | 499 { L"0123\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" }, |
| 500 { L"01234\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" }, | 500 { L"01234\x05e9\x05bc\x05c1\x05b8", L"0123\x2026" }, |
| 501 { L"012\xF0\x9D\x84\x9E", L"012\xF0\x2026" }, | 501 { L"012\xF0\x9D\x84\x9E", L"012\xF0\x2026" }, |
| 502 }; | 502 }; |
| 503 | 503 |
| 504 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 504 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 505 render_text->set_truncate_length(5); | 505 render_text->set_truncate_length(5); |
| 506 for (size_t i = 0; i < arraysize(cases); i++) { | 506 for (size_t i = 0; i < arraysize(cases); i++) { |
| 507 render_text->SetText(WideToUTF16(cases[i].text)); | 507 render_text->SetText(WideToUTF16(cases[i].text)); |
| 508 EXPECT_EQ(WideToUTF16(cases[i].text), render_text->text()); | 508 EXPECT_EQ(WideToUTF16(cases[i].text), render_text->text()); |
| 509 EXPECT_EQ(WideToUTF16(cases[i].layout_text), render_text->GetLayoutText()) | 509 EXPECT_EQ(WideToUTF16(cases[i].layout_text), render_text->GetDisplayText()) |
| 510 << "For case " << i << ": " << cases[i].text; | 510 << "For case " << i << ": " << cases[i].text; |
| 511 } | 511 } |
| 512 } | 512 } |
| 513 | 513 |
| 514 TEST_F(RenderTextTest, TruncatedObscuredText) { | 514 TEST_F(RenderTextTest, TruncatedObscuredText) { |
| 515 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 515 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 516 render_text->set_truncate_length(3); | 516 render_text->set_truncate_length(3); |
| 517 render_text->SetObscured(true); | 517 render_text->SetObscured(true); |
| 518 render_text->SetText(WideToUTF16(L"abcdef")); | 518 render_text->SetText(WideToUTF16(L"abcdef")); |
| 519 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text()); | 519 EXPECT_EQ(WideToUTF16(L"abcdef"), render_text->text()); |
| 520 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetLayoutText()); | 520 EXPECT_EQ(WideToUTF16(L"**\x2026"), render_text->GetDisplayText()); |
| 521 } | 521 } |
| 522 | 522 |
| 523 TEST_F(RenderTextTest, TruncatedCursorMovementLTR) { | 523 TEST_F(RenderTextTest, TruncatedCursorMovementLTR) { |
| 524 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 524 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 525 render_text->set_truncate_length(2); | 525 render_text->set_truncate_length(2); |
| 526 render_text->SetText(WideToUTF16(L"abcd")); | 526 render_text->SetText(WideToUTF16(L"abcd")); |
| 527 | 527 |
| 528 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); | 528 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); |
| 529 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 529 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 530 EXPECT_EQ(SelectionModel(4, CURSOR_FORWARD), render_text->selection_model()); | 530 EXPECT_EQ(SelectionModel(4, CURSOR_FORWARD), render_text->selection_model()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 569 | 569 |
| 570 expected.clear(); | 570 expected.clear(); |
| 571 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); | 571 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); |
| 572 // The cursor hops over the elided text to preceeding text. | 572 // The cursor hops over the elided text to preceeding text. |
| 573 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); | 573 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 574 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); | 574 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 575 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); | 575 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 576 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); | 576 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); |
| 577 } | 577 } |
| 578 | 578 |
| 579 TEST_F(RenderTextTest, GetTextDirection) { | 579 TEST_F(RenderTextTest, GetDisplayTextDirection) { |
| 580 struct { | 580 struct { |
| 581 const wchar_t* text; | 581 const wchar_t* text; |
| 582 const base::i18n::TextDirection text_direction; | 582 const base::i18n::TextDirection text_direction; |
| 583 } cases[] = { | 583 } cases[] = { |
| 584 // Blank strings and those with no/weak directionality default to LTR. | 584 // Blank strings and those with no/weak directionality default to LTR. |
| 585 { L"", base::i18n::LEFT_TO_RIGHT }, | 585 { L"", base::i18n::LEFT_TO_RIGHT }, |
| 586 { kWeak, base::i18n::LEFT_TO_RIGHT }, | 586 { kWeak, base::i18n::LEFT_TO_RIGHT }, |
| 587 // Strings that begin with strong LTR characters. | 587 // Strings that begin with strong LTR characters. |
| 588 { kLtr, base::i18n::LEFT_TO_RIGHT }, | 588 { kLtr, base::i18n::LEFT_TO_RIGHT }, |
| 589 { kLtrRtl, base::i18n::LEFT_TO_RIGHT }, | 589 { kLtrRtl, base::i18n::LEFT_TO_RIGHT }, |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 600 for (size_t i = 0; i < 2; ++i) { | 600 for (size_t i = 0; i < 2; ++i) { |
| 601 // Toggle the application default text direction (to try each direction). | 601 // Toggle the application default text direction (to try each direction). |
| 602 SetRTL(!base::i18n::IsRTL()); | 602 SetRTL(!base::i18n::IsRTL()); |
| 603 const base::i18n::TextDirection ui_direction = base::i18n::IsRTL() ? | 603 const base::i18n::TextDirection ui_direction = base::i18n::IsRTL() ? |
| 604 base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT; | 604 base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT; |
| 605 | 605 |
| 606 // Ensure that directionality modes yield the correct text directions. | 606 // Ensure that directionality modes yield the correct text directions. |
| 607 for (size_t j = 0; j < arraysize(cases); j++) { | 607 for (size_t j = 0; j < arraysize(cases); j++) { |
| 608 render_text->SetText(WideToUTF16(cases[j].text)); | 608 render_text->SetText(WideToUTF16(cases[j].text)); |
| 609 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT); | 609 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT); |
| 610 EXPECT_EQ(render_text->GetTextDirection(), cases[j].text_direction); | 610 EXPECT_EQ(render_text->GetDisplayTextDirection(),cases[j].text_direction); |
| 611 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_UI); | 611 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_UI); |
| 612 EXPECT_EQ(render_text->GetTextDirection(), ui_direction); | 612 EXPECT_EQ(render_text->GetDisplayTextDirection(), ui_direction); |
| 613 render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_LTR); | 613 render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_LTR); |
| 614 EXPECT_EQ(render_text->GetTextDirection(), base::i18n::LEFT_TO_RIGHT); | 614 EXPECT_EQ(render_text->GetDisplayTextDirection(), |
| 615 base::i18n::LEFT_TO_RIGHT); | |
| 615 render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_RTL); | 616 render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_RTL); |
| 616 EXPECT_EQ(render_text->GetTextDirection(), base::i18n::RIGHT_TO_LEFT); | 617 EXPECT_EQ(render_text->GetDisplayTextDirection(), |
| 618 base::i18n::RIGHT_TO_LEFT); | |
| 617 } | 619 } |
| 618 } | 620 } |
| 619 | 621 |
| 620 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); | 622 EXPECT_EQ(was_rtl, base::i18n::IsRTL()); |
| 621 | 623 |
| 622 // Ensure that text changes update the direction for DIRECTIONALITY_FROM_TEXT. | 624 // Ensure that text changes update the direction for DIRECTIONALITY_FROM_TEXT. |
| 623 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT); | 625 render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT); |
| 624 render_text->SetText(WideToUTF16(kLtr)); | 626 render_text->SetText(WideToUTF16(kLtr)); |
| 625 EXPECT_EQ(render_text->GetTextDirection(), base::i18n::LEFT_TO_RIGHT); | 627 EXPECT_EQ(render_text->GetDisplayTextDirection(), base::i18n::LEFT_TO_RIGHT); |
| 626 render_text->SetText(WideToUTF16(kRtl)); | 628 render_text->SetText(WideToUTF16(kRtl)); |
| 627 EXPECT_EQ(render_text->GetTextDirection(), base::i18n::RIGHT_TO_LEFT); | 629 EXPECT_EQ(render_text->GetDisplayTextDirection(), base::i18n::RIGHT_TO_LEFT); |
| 628 } | 630 } |
| 629 | 631 |
| 630 TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) { | 632 TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) { |
| 631 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 633 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 632 | 634 |
| 633 // Pure LTR. | 635 // Pure LTR. |
| 634 render_text->SetText(ASCIIToUTF16("abc")); | 636 render_text->SetText(ASCIIToUTF16("abc")); |
| 635 // |expected| saves the expected SelectionModel when moving cursor from left | 637 // |expected| saves the expected SelectionModel when moving cursor from left |
| 636 // to right. | 638 // to right. |
| 637 std::vector<SelectionModel> expected; | 639 std::vector<SelectionModel> expected; |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1360 | 1362 |
| 1361 TEST_F(RenderTextTest, MinLineHeight) { | 1363 TEST_F(RenderTextTest, MinLineHeight) { |
| 1362 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1364 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 1363 | 1365 |
| 1364 render_text->SetText(ASCIIToUTF16("Hello!")); | 1366 render_text->SetText(ASCIIToUTF16("Hello!")); |
| 1365 SizeF default_size = render_text->GetStringSizeF(); | 1367 SizeF default_size = render_text->GetStringSizeF(); |
| 1366 ASSERT_NE(0, default_size.height()); | 1368 ASSERT_NE(0, default_size.height()); |
| 1367 ASSERT_NE(0, default_size.width()); | 1369 ASSERT_NE(0, default_size.width()); |
| 1368 | 1370 |
| 1369 render_text->SetMinLineHeight(default_size.height() / 2); | 1371 render_text->SetMinLineHeight(default_size.height() / 2); |
| 1370 // MacOSX does not recompute the bounds properly, so invoke ResetLayout() | |
| 1371 // explicitly. | |
| 1372 // TODO(mukai): fix this. | |
| 1373 render_text->ResetLayout(); | |
| 1374 EXPECT_EQ(default_size.ToString(), render_text->GetStringSizeF().ToString()); | 1372 EXPECT_EQ(default_size.ToString(), render_text->GetStringSizeF().ToString()); |
| 1375 | 1373 |
| 1376 render_text->SetMinLineHeight(default_size.height() * 2); | 1374 render_text->SetMinLineHeight(default_size.height() * 2); |
| 1377 render_text->ResetLayout(); | |
| 1378 SizeF taller_size = render_text->GetStringSizeF(); | 1375 SizeF taller_size = render_text->GetStringSizeF(); |
| 1379 EXPECT_EQ(default_size.height() * 2, taller_size.height()); | 1376 EXPECT_EQ(default_size.height() * 2, taller_size.height()); |
| 1380 EXPECT_EQ(default_size.width(), taller_size.width()); | 1377 EXPECT_EQ(default_size.width(), taller_size.width()); |
| 1381 } | 1378 } |
| 1382 | 1379 |
| 1383 TEST_F(RenderTextTest, SetFontList) { | 1380 TEST_F(RenderTextTest, SetFontList) { |
| 1384 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1381 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 1385 render_text->SetFontList(FontList("Arial,Symbol, 13px")); | 1382 render_text->SetFontList(FontList("Arial,Symbol, 13px")); |
| 1386 const std::vector<Font>& fonts = render_text->font_list().GetFonts(); | 1383 const std::vector<Font>& fonts = render_text->font_list().GetFonts(); |
| 1387 ASSERT_EQ(2U, fonts.size()); | 1384 ASSERT_EQ(2U, fonts.size()); |
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1996 continue; | 1993 continue; |
| 1997 | 1994 |
| 1998 for (size_t j = 0; j < kTestStrings[i].lines_count; ++j) { | 1995 for (size_t j = 0; j < kTestStrings[i].lines_count; ++j) { |
| 1999 SCOPED_TRACE(base::StringPrintf("Line %" PRIuS "", j)); | 1996 SCOPED_TRACE(base::StringPrintf("Line %" PRIuS "", j)); |
| 2000 VerifyLineSegments(kTestStrings[i].line_char_ranges[j], | 1997 VerifyLineSegments(kTestStrings[i].line_char_ranges[j], |
| 2001 render_text.lines_[j].segments); | 1998 render_text.lines_[j].segments); |
| 2002 } | 1999 } |
| 2003 } | 2000 } |
| 2004 } | 2001 } |
| 2005 | 2002 |
| 2003 // Make sure that multiline mode ignores elide behavior. | |
| 2004 TEST_F(RenderTextTest, Multiline_IgnoreElide) { | |
| 2005 const wchar_t kTestString[] = | |
| 2006 L"very very very long string xxxxxxxxxxxxxxxxxxxxxxxxxx"; | |
| 2007 const wchar_t kEllipsis[] = L"\x2026"; | |
| 2008 | |
| 2009 RenderTextHarfBuzz render_text; | |
| 2010 render_text.SetElideBehavior(ELIDE_TAIL); | |
| 2011 render_text.SetDisplayRect(Rect(20, 1000)); | |
| 2012 render_text.SetText(base::WideToUTF16(kTestString)); | |
| 2013 EXPECT_NE(base::string16::npos, | |
| 2014 render_text.GetDisplayText().find(base::WideToUTF16(kEllipsis))); | |
| 2015 | |
| 2016 render_text.SetMultiline(true); | |
| 2017 EXPECT_EQ(base::string16::npos, | |
| 2018 render_text.GetDisplayText().find(base::WideToUTF16(kEllipsis))); | |
| 2019 } | |
| 2020 | |
| 2006 TEST_F(RenderTextTest, NewlineWithoutMultilineFlag) { | 2021 TEST_F(RenderTextTest, NewlineWithoutMultilineFlag) { |
| 2007 const wchar_t* kTestStrings[] = { | 2022 const wchar_t* kTestStrings[] = { |
| 2008 L"abc\ndef", L"a \n b ", L"ab\n", L"a\n\nb", L"\nab", L"\n", | 2023 L"abc\ndef", L"a \n b ", L"ab\n", L"a\n\nb", L"\nab", L"\n", |
| 2009 }; | 2024 }; |
| 2010 | 2025 |
| 2011 RenderTextHarfBuzz render_text; | 2026 RenderTextHarfBuzz render_text; |
| 2012 render_text.SetDisplayRect(Rect(200, 1000)); | 2027 render_text.SetDisplayRect(Rect(200, 1000)); |
| 2013 Canvas canvas; | 2028 Canvas canvas; |
| 2014 | 2029 |
| 2015 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { | 2030 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2090 }; | 2105 }; |
| 2091 | 2106 |
| 2092 RenderTextHarfBuzz render_text; | 2107 RenderTextHarfBuzz render_text; |
| 2093 | 2108 |
| 2094 for (size_t i = 0; i < arraysize(cases); ++i) { | 2109 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 2095 SCOPED_TRACE(base::StringPrintf("Case %" PRIuS, i)); | 2110 SCOPED_TRACE(base::StringPrintf("Case %" PRIuS, i)); |
| 2096 | 2111 |
| 2097 base::string16 text = WideToUTF16(cases[i]); | 2112 base::string16 text = WideToUTF16(cases[i]); |
| 2098 render_text.SetText(text); | 2113 render_text.SetText(text); |
| 2099 render_text.EnsureLayout(); | 2114 render_text.EnsureLayout(); |
| 2100 ASSERT_EQ(1U, render_text.runs_.size()); | 2115 internal::TextRunList* run_list = render_text.GetRunList(); |
| 2101 internal::TextRunHarfBuzz* run = render_text.runs_[0]; | 2116 ASSERT_EQ(1U, run_list->size()); |
| 2117 internal::TextRunHarfBuzz* run = run_list->runs()[0]; | |
| 2102 | 2118 |
| 2103 base::i18n::BreakIterator* iter = render_text.grapheme_iterator_.get(); | 2119 base::i18n::BreakIterator* iter = render_text.grapheme_iterator_.get(); |
| 2104 auto first_grapheme_bounds = run->GetGraphemeBounds(iter, 0); | 2120 auto first_grapheme_bounds = run->GetGraphemeBounds(iter, 0); |
| 2105 EXPECT_EQ(first_grapheme_bounds, run->GetGraphemeBounds(iter, 1)); | 2121 EXPECT_EQ(first_grapheme_bounds, run->GetGraphemeBounds(iter, 1)); |
| 2106 auto second_grapheme_bounds = run->GetGraphemeBounds(iter, 2); | 2122 auto second_grapheme_bounds = run->GetGraphemeBounds(iter, 2); |
| 2107 EXPECT_EQ(first_grapheme_bounds.second, second_grapheme_bounds.first); | 2123 EXPECT_EQ(first_grapheme_bounds.second, second_grapheme_bounds.first); |
| 2108 } | 2124 } |
| 2109 } | 2125 } |
| 2110 | 2126 |
| 2111 // Test the partition of a multi-grapheme cluster into grapheme ranges. | 2127 // Test the partition of a multi-grapheme cluster into grapheme ranges. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2163 } | 2179 } |
| 2164 } | 2180 } |
| 2165 } | 2181 } |
| 2166 | 2182 |
| 2167 TEST_F(RenderTextTest, HarfBuzz_RunDirection) { | 2183 TEST_F(RenderTextTest, HarfBuzz_RunDirection) { |
| 2168 RenderTextHarfBuzz render_text; | 2184 RenderTextHarfBuzz render_text; |
| 2169 const base::string16 mixed = | 2185 const base::string16 mixed = |
| 2170 WideToUTF16(L"\x05D0\x05D1" L"1234" L"\x05D2\x05D3"); | 2186 WideToUTF16(L"\x05D0\x05D1" L"1234" L"\x05D2\x05D3"); |
| 2171 render_text.SetText(mixed); | 2187 render_text.SetText(mixed); |
| 2172 render_text.EnsureLayout(); | 2188 render_text.EnsureLayout(); |
| 2173 ASSERT_EQ(3U, render_text.runs_.size()); | 2189 internal::TextRunList* run_list = render_text.GetRunList(); |
| 2174 EXPECT_TRUE(render_text.runs_[0]->is_rtl); | 2190 ASSERT_EQ(3U, run_list->size()); |
| 2175 EXPECT_FALSE(render_text.runs_[1]->is_rtl); | 2191 EXPECT_TRUE(run_list->runs()[0]->is_rtl); |
| 2176 EXPECT_TRUE(render_text.runs_[2]->is_rtl); | 2192 EXPECT_FALSE(run_list->runs()[1]->is_rtl); |
| 2193 EXPECT_TRUE(run_list->runs()[2]->is_rtl); | |
| 2177 } | 2194 } |
| 2178 | 2195 |
| 2179 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByUnicodeBlocks) { | 2196 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByUnicodeBlocks) { |
| 2180 RenderTextHarfBuzz render_text; | 2197 RenderTextHarfBuzz render_text; |
| 2181 | 2198 |
| 2182 // The '\x25B6' "play character" should break runs. http://crbug.com/278913 | 2199 // The '\x25B6' "play character" should break runs. http://crbug.com/278913 |
| 2183 render_text.SetText(WideToUTF16(L"x\x25B6y")); | 2200 render_text.SetText(WideToUTF16(L"x\x25B6y")); |
| 2184 render_text.EnsureLayout(); | 2201 render_text.EnsureLayout(); |
| 2185 ASSERT_EQ(3U, render_text.runs_.size()); | 2202 internal::TextRunList* run_list = render_text.GetRunList(); |
| 2186 EXPECT_EQ(Range(0, 1), render_text.runs_[0]->range); | 2203 ASSERT_EQ(3U, run_list->size()); |
| 2187 EXPECT_EQ(Range(1, 2), render_text.runs_[1]->range); | 2204 EXPECT_EQ(Range(0, 1), run_list->runs()[0]->range); |
| 2188 EXPECT_EQ(Range(2, 3), render_text.runs_[2]->range); | 2205 EXPECT_EQ(Range(1, 2), run_list->runs()[1]->range); |
| 2206 EXPECT_EQ(Range(2, 3), run_list->runs()[2]->range); | |
| 2189 | 2207 |
| 2190 render_text.SetText(WideToUTF16(L"x \x25B6 y")); | 2208 render_text.SetText(WideToUTF16(L"x \x25B6 y")); |
| 2191 render_text.EnsureLayout(); | 2209 render_text.EnsureLayout(); |
| 2192 ASSERT_EQ(3U, render_text.runs_.size()); | 2210 run_list = render_text.GetRunList(); |
| 2193 EXPECT_EQ(Range(0, 2), render_text.runs_[0]->range); | 2211 ASSERT_EQ(3U, run_list->size()); |
| 2194 EXPECT_EQ(Range(2, 3), render_text.runs_[1]->range); | 2212 EXPECT_EQ(Range(0, 2), run_list->runs()[0]->range); |
| 2195 EXPECT_EQ(Range(3, 5), render_text.runs_[2]->range); | 2213 EXPECT_EQ(Range(2, 3), run_list->runs()[1]->range); |
| 2214 EXPECT_EQ(Range(3, 5), run_list->runs()[2]->range); | |
| 2196 } | 2215 } |
| 2197 | 2216 |
| 2198 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByEmoji) { | 2217 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByEmoji) { |
| 2199 RenderTextHarfBuzz render_text; | 2218 RenderTextHarfBuzz render_text; |
| 2200 | 2219 |
| 2201 // \xF0\x9F\x98\x81 (U+1F601) is smile icon emoji. \xE2\x9C\xA8 (U+2728) is | 2220 // \xF0\x9F\x98\x81 (U+1F601) is smile icon emoji. \xE2\x9C\xA8 (U+2728) is |
| 2202 // a sparkle icon. Both can be drawn with color emoji fonts, so runs should be | 2221 // a sparkle icon. Both can be drawn with color emoji fonts, so runs should be |
| 2203 // separated. See crbug.com/448909 | 2222 // separated. See crbug.com/448909 |
| 2204 render_text.SetText(UTF8ToUTF16("x\xF0\x9F\x98\x81y\xE2\x9C\xA8")); | 2223 render_text.SetText(UTF8ToUTF16("x\xF0\x9F\x98\x81y\xE2\x9C\xA8")); |
| 2205 render_text.EnsureLayout(); | 2224 render_text.EnsureLayout(); |
| 2206 ASSERT_EQ(4U, render_text.runs_.size()); | 2225 internal::TextRunList* run_list = render_text.GetRunList(); |
| 2207 EXPECT_EQ(Range(0, 1), render_text.runs_[0]->range); | 2226 ASSERT_EQ(4U, run_list->size()); |
| 2227 EXPECT_EQ(Range(0, 1), run_list->runs()[0]->range); | |
| 2208 // The length is 2 since U+1F601 is represented as a surrogate pair in UTF16. | 2228 // The length is 2 since U+1F601 is represented as a surrogate pair in UTF16. |
| 2209 EXPECT_EQ(Range(1, 3), render_text.runs_[1]->range); | 2229 EXPECT_EQ(Range(1, 3), run_list->runs()[1]->range); |
| 2210 EXPECT_EQ(Range(3, 4), render_text.runs_[2]->range); | 2230 EXPECT_EQ(Range(3, 4), run_list->runs()[2]->range); |
| 2211 EXPECT_EQ(Range(4, 5), render_text.runs_[3]->range); | 2231 EXPECT_EQ(Range(4, 5), run_list->runs()[3]->range); |
| 2212 } | 2232 } |
| 2213 | 2233 |
| 2214 TEST_F(RenderTextTest, GlyphBounds) { | 2234 TEST_F(RenderTextTest, GlyphBounds) { |
| 2215 const wchar_t* kTestStrings[] = { | 2235 const wchar_t* kTestStrings[] = { |
| 2216 L"asdf 1234 qwer", L"\x0647\x0654", L"\x0645\x0631\x062D\x0628\x0627" | 2236 L"asdf 1234 qwer", L"\x0647\x0654", L"\x0645\x0631\x062D\x0628\x0627" |
| 2217 }; | 2237 }; |
| 2218 scoped_ptr<RenderText> render_text(new RenderTextHarfBuzz); | 2238 scoped_ptr<RenderText> render_text(new RenderTextHarfBuzz); |
| 2219 | 2239 |
| 2220 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { | 2240 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
| 2221 render_text->SetText(WideToUTF16(kTestStrings[i])); | 2241 render_text->SetText(WideToUTF16(kTestStrings[i])); |
| 2222 render_text->EnsureLayout(); | 2242 render_text->EnsureLayout(); |
| 2223 | 2243 |
| 2224 for (size_t j = 0; j < render_text->text().length(); ++j) | 2244 for (size_t j = 0; j < render_text->text().length(); ++j) |
| 2225 EXPECT_FALSE(render_text->GetGlyphBounds(j).is_empty()); | 2245 EXPECT_FALSE(render_text->GetGlyphBounds(j).is_empty()); |
| 2226 } | 2246 } |
| 2227 } | 2247 } |
| 2228 | 2248 |
| 2229 // Ensure that shaping with a non-existent font does not cause a crash. | 2249 // Ensure that shaping with a non-existent font does not cause a crash. |
| 2230 TEST_F(RenderTextTest, HarfBuzz_NonExistentFont) { | 2250 TEST_F(RenderTextTest, HarfBuzz_NonExistentFont) { |
| 2231 RenderTextHarfBuzz render_text; | 2251 RenderTextHarfBuzz render_text; |
| 2232 render_text.SetText(ASCIIToUTF16("test")); | 2252 render_text.SetText(ASCIIToUTF16("test")); |
| 2233 render_text.EnsureLayout(); | 2253 render_text.EnsureLayout(); |
| 2234 ASSERT_EQ(1U, render_text.runs_.size()); | 2254 internal::TextRunList* run_list = render_text.GetRunList(); |
| 2235 internal::TextRunHarfBuzz* run = render_text.runs_[0]; | 2255 ASSERT_EQ(1U, run_list->size()); |
| 2256 internal::TextRunHarfBuzz* run = run_list->runs()[0]; | |
| 2236 render_text.ShapeRunWithFont( | 2257 render_text.ShapeRunWithFont( |
| 2237 run, "TheFontThatDoesntExist", FontRenderParams()); | 2258 render_text.text(), "TheFontThatDoesntExist", FontRenderParams(), run); |
| 2238 } | 2259 } |
| 2239 | 2260 |
| 2240 // Ensure an empty run returns sane values to queries. | 2261 // Ensure an empty run returns sane values to queries. |
| 2241 TEST_F(RenderTextTest, HarfBuzz_EmptyRun) { | 2262 TEST_F(RenderTextTest, HarfBuzz_EmptyRun) { |
| 2242 internal::TextRunHarfBuzz run; | 2263 internal::TextRunHarfBuzz run; |
| 2243 const base::string16 kString = ASCIIToUTF16("abcdefgh"); | 2264 const base::string16 kString = ASCIIToUTF16("abcdefgh"); |
| 2244 scoped_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator( | 2265 scoped_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator( |
| 2245 kString, base::i18n::BreakIterator::BREAK_CHARACTER)); | 2266 kString, base::i18n::BreakIterator::BREAK_CHARACTER)); |
| 2246 ASSERT_TRUE(iter->Init()); | 2267 ASSERT_TRUE(iter->Init()); |
| 2247 | 2268 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 2260 // Ensure a string fits in a display rect with a width equal to the string's. | 2281 // Ensure a string fits in a display rect with a width equal to the string's. |
| 2261 TEST_F(RenderTextTest, StringFitsOwnWidth) { | 2282 TEST_F(RenderTextTest, StringFitsOwnWidth) { |
| 2262 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 2283 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 2263 const base::string16 kString = ASCIIToUTF16("www.example.com"); | 2284 const base::string16 kString = ASCIIToUTF16("www.example.com"); |
| 2264 | 2285 |
| 2265 render_text->SetText(kString); | 2286 render_text->SetText(kString); |
| 2266 render_text->ApplyStyle(BOLD, true, Range(0, 3)); | 2287 render_text->ApplyStyle(BOLD, true, Range(0, 3)); |
| 2267 render_text->SetElideBehavior(ELIDE_TAIL); | 2288 render_text->SetElideBehavior(ELIDE_TAIL); |
| 2268 | 2289 |
| 2269 render_text->SetDisplayRect(Rect(0, 0, 500, 100)); | 2290 render_text->SetDisplayRect(Rect(0, 0, 500, 100)); |
| 2270 EXPECT_EQ(kString, render_text->GetLayoutText()); | 2291 EXPECT_EQ(kString, render_text->GetDisplayText()); |
| 2271 render_text->SetDisplayRect(Rect(0, 0, render_text->GetContentWidth(), 100)); | 2292 render_text->SetDisplayRect(Rect(0, 0, render_text->GetContentWidth(), 100)); |
| 2272 EXPECT_EQ(kString, render_text->GetLayoutText()); | 2293 EXPECT_EQ(kString, render_text->GetDisplayText()); |
| 2273 } | 2294 } |
| 2274 | 2295 |
| 2275 // TODO(derat): Figure out why this fails on Windows: http://crbug.com/427184 | 2296 // TODO(derat): Figure out why this fails on Windows: http://crbug.com/427184 |
| 2276 #if !defined(OS_WIN) | 2297 #if !defined(OS_WIN) |
| 2277 // Ensure that RenderText examines all of the fonts in its FontList before | 2298 // Ensure that RenderText examines all of the fonts in its FontList before |
| 2278 // falling back to other fonts. | 2299 // falling back to other fonts. |
| 2279 TEST_F(RenderTextTest, HarfBuzz_FontListFallback) { | 2300 TEST_F(RenderTextTest, HarfBuzz_FontListFallback) { |
| 2280 // Double-check that the requested fonts are present. | 2301 // Double-check that the requested fonts are present. |
| 2281 FontList font_list("Arial, Symbol, 12px"); | 2302 FontList font_list("Arial, Symbol, 12px"); |
| 2282 const std::vector<Font>& fonts = font_list.GetFonts(); | 2303 const std::vector<Font>& fonts = font_list.GetFonts(); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 2305 PlatformFontWin* font_win = new PlatformFontWin("Meiryo", 12); | 2326 PlatformFontWin* font_win = new PlatformFontWin("Meiryo", 12); |
| 2306 // Japanese name for Meiryo. This name won't be found in the system's linked | 2327 // Japanese name for Meiryo. This name won't be found in the system's linked |
| 2307 // fonts, forcing RTHB to try the Uniscribe font and its fallbacks. | 2328 // fonts, forcing RTHB to try the Uniscribe font and its fallbacks. |
| 2308 font_win->font_ref_->font_name_ = WideToUTF8(L"\x30e1\x30a4\x30ea\x30aa"); | 2329 font_win->font_ref_->font_name_ = WideToUTF8(L"\x30e1\x30a4\x30ea\x30aa"); |
| 2309 FontList font_list((Font(font_win))); | 2330 FontList font_list((Font(font_win))); |
| 2310 | 2331 |
| 2311 render_text.SetFontList(font_list); | 2332 render_text.SetFontList(font_list); |
| 2312 // Korean character "han". | 2333 // Korean character "han". |
| 2313 render_text.SetText(WideToUTF16(L"\xd55c")); | 2334 render_text.SetText(WideToUTF16(L"\xd55c")); |
| 2314 render_text.EnsureLayout(); | 2335 render_text.EnsureLayout(); |
| 2315 ASSERT_EQ(1U, render_text.runs_.size()); | 2336 internal::TextRunList* run_list = render_text.GetRunList(); |
| 2316 EXPECT_EQ(0U, render_text.runs_[0]->CountMissingGlyphs()); | 2337 ASSERT_EQ(1U, run_list->size()); |
| 2338 EXPECT_EQ(0U, run_list->runs()[0]->CountMissingGlyphs()); | |
| 2317 } | 2339 } |
| 2318 #endif // defined(OS_WIN) | 2340 #endif // defined(OS_WIN) |
| 2319 | 2341 |
| 2320 // Ensure that the width reported by RenderText is sufficient for drawing. Draws | 2342 // Ensure that the width reported by RenderText is sufficient for drawing. Draws |
| 2321 // to a canvas and checks whether any pixel beyond the width is colored. | 2343 // to a canvas and checks whether any pixel beyond the width is colored. |
| 2322 TEST_F(RenderTextTest, TextDoesntClip) { | 2344 TEST_F(RenderTextTest, TextDoesntClip) { |
| 2323 const wchar_t* kTestStrings[] = { L"Save", L"Remove", L"TEST", L"W", L"WWW" }; | 2345 const wchar_t* kTestStrings[] = { L"Save", L"Remove", L"TEST", L"W", L"WWW" }; |
| 2324 const Size kCanvasSize(300, 50); | 2346 const Size kCanvasSize(300, 50); |
| 2325 const int kTestWidth = 10; | 2347 const int kTestWidth = 10; |
| 2326 | 2348 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2383 base::StringToLowerASCII(fonts[0].GetActualFontNameForTesting())); | 2405 base::StringToLowerASCII(fonts[0].GetActualFontNameForTesting())); |
| 2384 | 2406 |
| 2385 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); | 2407 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
| 2386 render_text->SetDisplayRect(Rect(0, 0, 25, 25)); | 2408 render_text->SetDisplayRect(Rect(0, 0, 25, 25)); |
| 2387 render_text->SetFontList(font_list); | 2409 render_text->SetFontList(font_list); |
| 2388 EXPECT_GT(render_text->GetBaseline(), font_list.GetBaseline()); | 2410 EXPECT_GT(render_text->GetBaseline(), font_list.GetBaseline()); |
| 2389 } | 2411 } |
| 2390 #endif | 2412 #endif |
| 2391 | 2413 |
| 2392 } // namespace gfx | 2414 } // namespace gfx |
| OLD | NEW |