| 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 "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/base/l10n/l10n_util.h" | 10 #include "ui/base/l10n/l10n_util.h" |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 EXPECT_EQ(1U, render_text->style_ranges().size()); | 280 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 281 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); | 281 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); |
| 282 } | 282 } |
| 283 | 283 |
| 284 void TestVisualCursorMotionInObscuredField(RenderText* render_text, | 284 void TestVisualCursorMotionInObscuredField(RenderText* render_text, |
| 285 const string16& text, | 285 const string16& text, |
| 286 bool select) { | 286 bool select) { |
| 287 render_text->SetText(text); | 287 render_text->SetText(text); |
| 288 int len = text.length(); | 288 int len = text.length(); |
| 289 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, select); | 289 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, select); |
| 290 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | 290 EXPECT_EQ(SelectionModel(ui::Range(select ? 0 : len, len), CURSOR_FORWARD), |
| 291 select ? 0 : len, len, len - 1, SelectionModel::TRAILING))); | 291 render_text->selection_model()); |
| 292 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, select); | 292 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, select); |
| 293 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | 293 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); |
| 294 0, 0, SelectionModel::LEADING))); | |
| 295 for (int j = 1; j <= len; ++j) { | 294 for (int j = 1; j <= len; ++j) { |
| 296 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, select); | 295 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, select); |
| 297 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | 296 EXPECT_EQ(SelectionModel(ui::Range(select ? 0 : j, j), CURSOR_BACKWARD), |
| 298 select ? 0 : j, j, j - 1, SelectionModel::TRAILING))); | 297 render_text->selection_model()); |
| 299 } | 298 } |
| 300 for (int j = len - 1; j >= 0; --j) { | 299 for (int j = len - 1; j >= 0; --j) { |
| 301 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, select); | 300 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, select); |
| 302 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | 301 EXPECT_EQ(SelectionModel(ui::Range(select ? 0 : j, j), CURSOR_FORWARD), |
| 303 select ? 0 : j, j, j, SelectionModel::LEADING))); | 302 render_text->selection_model()); |
| 304 } | 303 } |
| 305 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, select); | 304 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, select); |
| 306 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | 305 EXPECT_EQ(SelectionModel(ui::Range(select ? 0 : len, len), CURSOR_FORWARD), |
| 307 select ? 0 : len, len, len - 1, SelectionModel::TRAILING))); | 306 render_text->selection_model()); |
| 308 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, select); | 307 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, select); |
| 309 EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel( | 308 EXPECT_EQ(SelectionModel(0, CURSOR_BACKWARD), render_text->selection_model()); |
| 310 0, 0, SelectionModel::LEADING))); | |
| 311 } | 309 } |
| 312 | 310 |
| 313 TEST_F(RenderTextTest, PasswordCensorship) { | 311 TEST_F(RenderTextTest, PasswordCensorship) { |
| 314 const string16 seuss = ASCIIToUTF16("hop on pop"); | 312 const string16 seuss = ASCIIToUTF16("hop on pop"); |
| 315 const string16 no_seuss = ASCIIToUTF16("**********"); | 313 const string16 no_seuss = ASCIIToUTF16("**********"); |
| 316 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 314 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 317 | 315 |
| 318 // GetObscuredText returns asterisks when the obscured bit is set. | 316 // GetObscuredText returns asterisks when the obscured bit is set. |
| 319 render_text->SetText(seuss); | 317 render_text->SetText(seuss); |
| 320 render_text->SetObscured(true); | 318 render_text->SetObscured(true); |
| 321 EXPECT_EQ(seuss, render_text->text()); | 319 EXPECT_EQ(seuss, render_text->text()); |
| 322 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); | 320 EXPECT_EQ(no_seuss, render_text->GetDisplayText()); |
| 323 render_text->SetObscured(false); | 321 render_text->SetObscured(false); |
| 324 EXPECT_EQ(seuss, render_text->text()); | 322 EXPECT_EQ(seuss, render_text->text()); |
| 325 EXPECT_EQ(seuss, render_text->GetDisplayText()); | 323 EXPECT_EQ(seuss, render_text->GetDisplayText()); |
| 326 | 324 |
| 327 // TODO(benrg): No Windows implementation yet. | 325 // TODO(benrg): No Windows implementation yet. |
| 328 #if !defined(OS_WIN) | 326 #if !defined(OS_WIN) |
| 329 | 327 |
| 330 render_text->SetObscured(true); | 328 render_text->SetObscured(true); |
| 331 | 329 |
| 332 // Surrogate pairs are counted as one code point. | 330 // Surrogate pairs are counted as one code point. |
| 333 const char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; | 331 const char16 invalid_surrogates[] = {0xDC00, 0xD800, 0}; |
| 334 render_text->SetText(invalid_surrogates); | 332 render_text->SetText(invalid_surrogates); |
| 335 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText()); | 333 EXPECT_EQ(ASCIIToUTF16("**"), render_text->GetDisplayText()); |
| 336 const char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; | 334 const char16 valid_surrogates[] = {0xD800, 0xDC00, 0}; |
| 337 render_text->SetText(valid_surrogates); | 335 render_text->SetText(valid_surrogates); |
| 338 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText()); | 336 EXPECT_EQ(ASCIIToUTF16("*"), render_text->GetDisplayText()); |
| 339 EXPECT_EQ(0U, render_text->GetCursorPosition()); | 337 EXPECT_EQ(0U, render_text->cursor_position()); |
| 340 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 338 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 341 EXPECT_EQ(2U, render_text->GetCursorPosition()); | 339 EXPECT_EQ(2U, render_text->cursor_position()); |
| 342 | 340 |
| 343 // Cursoring is independent of the underlying characters when the text is | 341 // Cursoring is independent of the underlying characters when the text is |
| 344 // obscured. | 342 // obscured. |
| 345 const wchar_t* const texts[] = { | 343 const wchar_t* const texts[] = { |
| 346 L"hop on pop", // word boundaries | 344 L"hop on pop", // word boundaries |
| 347 L"ab \x5D0\x5D1" L"12", // bidi embedding level of 2 | 345 L"ab \x5D0\x5D1" L"12", // bidi embedding level of 2 |
| 348 L"\x5D0\x5D1" L"12", // RTL paragraph direction on Linux | 346 L"\x5D0\x5D1" L"12", // RTL paragraph direction on Linux |
| 349 L"\x5D0\x5D1" // pure RTL | 347 L"\x5D0\x5D1" // pure RTL |
| 350 }; | 348 }; |
| 351 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(texts); ++i) { | 349 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(texts); ++i) { |
| 352 string16 text = WideToUTF16(texts[i]); | 350 string16 text = WideToUTF16(texts[i]); |
| 353 TestVisualCursorMotionInObscuredField(render_text.get(), text, false); | 351 TestVisualCursorMotionInObscuredField(render_text.get(), text, false); |
| 354 TestVisualCursorMotionInObscuredField(render_text.get(), text, true); | 352 TestVisualCursorMotionInObscuredField(render_text.get(), text, true); |
| 355 } | 353 } |
| 356 #endif // !defined(OS_WIN) | 354 #endif // !defined(OS_WIN) |
| 357 } | 355 } |
| 358 | 356 |
| 359 void RunMoveCursorLeftRightTest(RenderText* render_text, | 357 void RunMoveCursorLeftRightTest(RenderText* render_text, |
| 360 const std::vector<SelectionModel>& expected, | 358 const std::vector<SelectionModel>& expected, |
| 361 bool move_right) { | 359 VisualCursorDirection direction) { |
| 362 for (int i = 0; i < static_cast<int>(expected.size()); ++i) { | 360 for (size_t i = 0; i < expected.size(); ++i) { |
| 363 SelectionModel sel = expected[i]; | 361 EXPECT_EQ(expected[i], render_text->selection_model()); |
| 364 EXPECT_TRUE(render_text->selection_model().Equals(sel)); | 362 render_text->MoveCursor(CHARACTER_BREAK, direction, false); |
| 365 if (move_right) | |
| 366 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | |
| 367 else | |
| 368 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | |
| 369 } | 363 } |
| 370 | 364 // Check that cursoring is clamped at the line edge. |
| 371 SelectionModel sel = expected[expected.size() - 1]; | 365 EXPECT_EQ(expected.back(), render_text->selection_model()); |
| 372 if (move_right) | 366 // Check that it is the line edge. |
| 373 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 367 render_text->MoveCursor(LINE_BREAK, direction, false); |
| 374 else | 368 EXPECT_EQ(expected.back(), render_text->selection_model()); |
| 375 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); | |
| 376 EXPECT_TRUE(render_text->selection_model().Equals(sel)); | |
| 377 } | 369 } |
| 378 | 370 |
| 379 TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) { | 371 TEST_F(RenderTextTest, MoveCursorLeftRightInLtr) { |
| 380 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 372 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 381 | 373 |
| 382 // Pure LTR. | 374 // Pure LTR. |
| 383 render_text->SetText(ASCIIToUTF16("abc")); | 375 render_text->SetText(ASCIIToUTF16("abc")); |
| 384 // |expected| saves the expected SelectionModel when moving cursor from left | 376 // |expected| saves the expected SelectionModel when moving cursor from left |
| 385 // to right. | 377 // to right. |
| 386 std::vector<SelectionModel> expected; | 378 std::vector<SelectionModel> expected; |
| 387 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 379 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 388 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 380 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 389 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 381 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 390 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 382 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 391 // The last element is to test the clamped line ends. | 383 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 392 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 384 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); |
| 393 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | |
| 394 | 385 |
| 395 expected.clear(); | 386 expected.clear(); |
| 396 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 387 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 397 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 388 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 398 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 389 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 399 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 390 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 400 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 391 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 401 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | 392 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); |
| 402 } | 393 } |
| 403 | 394 |
| 404 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtl) { | 395 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtl) { |
| 405 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 396 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 406 // LTR-RTL | 397 // LTR-RTL |
| 407 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | 398 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); |
| 408 // The last one is the expected END position. | 399 // The last one is the expected END position. |
| 409 std::vector<SelectionModel> expected; | 400 std::vector<SelectionModel> expected; |
| 410 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 401 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 411 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 402 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 412 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 403 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 413 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 404 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 414 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | 405 expected.push_back(SelectionModel(5, CURSOR_FORWARD)); |
| 415 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | 406 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); |
| 416 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | 407 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 417 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | 408 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); |
| 418 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | 409 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); |
| 419 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | |
| 420 | 410 |
| 421 expected.clear(); | 411 expected.clear(); |
| 422 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | 412 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); |
| 423 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | 413 expected.push_back(SelectionModel(4, CURSOR_BACKWARD)); |
| 424 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | 414 expected.push_back(SelectionModel(5, CURSOR_BACKWARD)); |
| 425 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | 415 expected.push_back(SelectionModel(6, CURSOR_BACKWARD)); |
| 426 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 416 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 427 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 417 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 428 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 418 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 429 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 419 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 430 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | 420 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); |
| 431 } | 421 } |
| 432 | 422 |
| 433 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtlLtr) { | 423 TEST_F(RenderTextTest, MoveCursorLeftRightInLtrRtlLtr) { |
| 434 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 424 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 435 // LTR-RTL-LTR. | 425 // LTR-RTL-LTR. |
| 436 render_text->SetText(WideToUTF16(L"a"L"\x05d1"L"b")); | 426 render_text->SetText(WideToUTF16(L"a"L"\x05d1"L"b")); |
| 437 std::vector<SelectionModel> expected; | 427 std::vector<SelectionModel> expected; |
| 438 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 428 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 439 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 429 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 440 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 430 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 441 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 431 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 442 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 432 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 443 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | 433 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); |
| 444 | 434 |
| 445 expected.clear(); | 435 expected.clear(); |
| 446 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 436 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 447 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 437 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 448 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 438 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 449 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 439 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 450 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 440 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 451 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | 441 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); |
| 452 } | 442 } |
| 453 | 443 |
| 454 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) { | 444 TEST_F(RenderTextTest, MoveCursorLeftRightInRtl) { |
| 455 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 445 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 456 // Pure RTL. | 446 // Pure RTL. |
| 457 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); | 447 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); |
| 458 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 448 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 459 std::vector<SelectionModel> expected; | 449 std::vector<SelectionModel> expected; |
| 460 | 450 |
| 461 #if defined(OS_LINUX) | 451 #if defined(OS_LINUX) |
| 462 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 452 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 463 #else | 453 #else |
| 464 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING)); | 454 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 465 #endif | 455 #endif |
| 466 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 456 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 467 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 457 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 468 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 458 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 469 #if defined(OS_LINUX) | 459 #if defined(OS_LINUX) |
| 470 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 460 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 471 #else | 461 #else |
| 472 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | 462 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 473 // TODO(xji): expected (0, 2, TRAILING), actual (3, 0, LEADING). | |
| 474 // cursor moves from leftmost to rightmost. | |
| 475 // expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | |
| 476 #endif | 463 #endif |
| 477 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | 464 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); |
| 478 | 465 |
| 479 expected.clear(); | 466 expected.clear(); |
| 480 | 467 |
| 481 #if defined(OS_LINUX) | 468 #if defined(OS_LINUX) |
| 482 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 469 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 483 #else | 470 #else |
| 484 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | 471 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 485 #endif | 472 #endif |
| 486 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 473 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 487 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 474 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 488 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 475 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 489 #if defined(OS_LINUX) | 476 #if defined(OS_LINUX) |
| 490 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 477 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 491 #else | 478 #else |
| 492 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING)); | 479 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 493 expected.push_back(SelectionModel(3, 0, SelectionModel::LEADING)); | |
| 494 #endif | 480 #endif |
| 495 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | 481 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); |
| 496 } | 482 } |
| 497 | 483 |
| 498 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) { | 484 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtr) { |
| 499 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 485 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 500 // RTL-LTR | 486 // RTL-LTR |
| 501 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc")); | 487 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc")); |
| 502 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 488 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 503 std::vector<SelectionModel> expected; | 489 std::vector<SelectionModel> expected; |
| 504 #if defined(OS_LINUX) | 490 #if defined(OS_LINUX) |
| 505 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 491 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 506 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 492 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 507 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 493 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 508 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 494 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 509 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | 495 expected.push_back(SelectionModel(5, CURSOR_FORWARD)); |
| 510 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | 496 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); |
| 511 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | 497 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 512 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | 498 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); |
| 513 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
| 514 #else | 499 #else |
| 515 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | 500 expected.push_back(SelectionModel(6, CURSOR_BACKWARD)); |
| 516 expected.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | 501 expected.push_back(SelectionModel(5, CURSOR_FORWARD)); |
| 517 expected.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | 502 expected.push_back(SelectionModel(4, CURSOR_FORWARD)); |
| 518 expected.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | 503 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 519 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 504 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 520 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 505 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 521 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 506 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 522 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | 507 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 523 // TODO(xji): expected (0, 2, TRAILING), actual (3, 0, LEADING). | |
| 524 // cursor moves from leftmost to middle. | |
| 525 // expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | |
| 526 #endif | 508 #endif |
| 527 | 509 |
| 528 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | 510 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); |
| 529 | 511 |
| 530 expected.clear(); | 512 expected.clear(); |
| 531 #if defined(OS_LINUX) | 513 #if defined(OS_LINUX) |
| 532 expected.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | 514 expected.push_back(SelectionModel(6, CURSOR_FORWARD)); |
| 533 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | 515 expected.push_back(SelectionModel(4, CURSOR_BACKWARD)); |
| 534 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | 516 expected.push_back(SelectionModel(5, CURSOR_BACKWARD)); |
| 535 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | 517 expected.push_back(SelectionModel(6, CURSOR_BACKWARD)); |
| 536 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 518 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 537 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 519 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 538 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 520 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 539 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 521 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 540 #else | 522 #else |
| 541 expected.push_back(SelectionModel(0, 2, SelectionModel::TRAILING)); | 523 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 542 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 524 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 543 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 525 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 544 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 526 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 545 expected.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | 527 expected.push_back(SelectionModel(4, CURSOR_BACKWARD)); |
| 546 expected.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | 528 expected.push_back(SelectionModel(5, CURSOR_BACKWARD)); |
| 547 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | 529 expected.push_back(SelectionModel(6, CURSOR_BACKWARD)); |
| 548 expected.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
| 549 #endif | 530 #endif |
| 550 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | 531 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); |
| 551 } | 532 } |
| 552 | 533 |
| 553 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) { | 534 TEST_F(RenderTextTest, MoveCursorLeftRightInRtlLtrRtl) { |
| 554 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 535 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 555 // RTL-LTR-RTL. | 536 // RTL-LTR-RTL. |
| 556 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1")); | 537 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1")); |
| 557 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 538 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 558 std::vector<SelectionModel> expected; | 539 std::vector<SelectionModel> expected; |
| 559 #if defined(OS_LINUX) | 540 #if defined(OS_LINUX) |
| 560 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 541 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 561 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 542 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 562 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 543 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 563 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 544 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 564 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 545 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 565 #else | 546 #else |
| 566 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING)); | 547 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 567 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 548 expected.push_back(SelectionModel(3, CURSOR_BACKWARD)); |
| 568 expected.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | 549 expected.push_back(SelectionModel(1, CURSOR_FORWARD)); |
| 569 expected.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | 550 expected.push_back(SelectionModel(1, CURSOR_BACKWARD)); |
| 570 expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING)); | 551 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 571 // TODO(xji): expected (0, 0, TRAILING), actual (2, 1, LEADING). | |
| 572 // cursor moves from leftmost to middle. | |
| 573 // expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING)); | |
| 574 #endif | 552 #endif |
| 575 RunMoveCursorLeftRightTest(render_text.get(), expected, false); | 553 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_LEFT); |
| 576 | 554 |
| 577 expected.clear(); | 555 expected.clear(); |
| 578 #if defined(OS_LINUX) | 556 #if defined(OS_LINUX) |
| 579 expected.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | 557 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 580 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 558 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 581 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 559 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 582 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 560 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 583 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 561 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 584 #else | 562 #else |
| 585 expected.push_back(SelectionModel(0, 0, SelectionModel::TRAILING)); | 563 expected.push_back(SelectionModel(0, CURSOR_BACKWARD)); |
| 586 expected.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | 564 expected.push_back(SelectionModel(0, CURSOR_FORWARD)); |
| 587 expected.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | 565 expected.push_back(SelectionModel(2, CURSOR_BACKWARD)); |
| 588 expected.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | 566 expected.push_back(SelectionModel(2, CURSOR_FORWARD)); |
| 589 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING)); | 567 expected.push_back(SelectionModel(3, CURSOR_FORWARD)); |
| 590 expected.push_back(SelectionModel(3, 2, SelectionModel::LEADING)); | |
| 591 #endif | 568 #endif |
| 592 RunMoveCursorLeftRightTest(render_text.get(), expected, true); | 569 RunMoveCursorLeftRightTest(render_text.get(), expected, CURSOR_RIGHT); |
| 593 } | 570 } |
| 594 | 571 |
| 595 // TODO(xji): temporarily disable in platform Win since the complex script | 572 // TODO(xji): temporarily disable in platform Win since the complex script |
| 596 // characters turned into empty square due to font regression. So, not able | 573 // characters turned into empty square due to font regression. So, not able |
| 597 // to test 2 characters belong to the same grapheme. | 574 // to test 2 characters belong to the same grapheme. |
| 598 #if defined(OS_LINUX) | 575 #if defined(OS_LINUX) |
| 599 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) { | 576 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) { |
| 600 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 577 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 601 | 578 |
| 602 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915")); | 579 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915")); |
| 603 EXPECT_EQ(0U, render_text->GetCursorPosition()); | 580 EXPECT_EQ(0U, render_text->cursor_position()); |
| 604 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 581 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 605 EXPECT_EQ(2U, render_text->GetCursorPosition()); | 582 EXPECT_EQ(2U, render_text->cursor_position()); |
| 606 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 583 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 607 EXPECT_EQ(4U, render_text->GetCursorPosition()); | 584 EXPECT_EQ(4U, render_text->cursor_position()); |
| 608 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 585 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 609 EXPECT_EQ(5U, render_text->GetCursorPosition()); | 586 EXPECT_EQ(5U, render_text->cursor_position()); |
| 610 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 587 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 611 EXPECT_EQ(5U, render_text->GetCursorPosition()); | 588 EXPECT_EQ(5U, render_text->cursor_position()); |
| 612 | 589 |
| 613 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 590 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 614 EXPECT_EQ(4U, render_text->GetCursorPosition()); | 591 EXPECT_EQ(4U, render_text->cursor_position()); |
| 615 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 592 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 616 EXPECT_EQ(2U, render_text->GetCursorPosition()); | 593 EXPECT_EQ(2U, render_text->cursor_position()); |
| 617 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 594 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 618 EXPECT_EQ(0U, render_text->GetCursorPosition()); | 595 EXPECT_EQ(0U, render_text->cursor_position()); |
| 619 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 596 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 620 EXPECT_EQ(0U, render_text->GetCursorPosition()); | 597 EXPECT_EQ(0U, render_text->cursor_position()); |
| 621 } | 598 } |
| 622 #endif | 599 #endif |
| 623 | 600 |
| 624 TEST_F(RenderTextTest, GraphemePositions) { | 601 TEST_F(RenderTextTest, GraphemePositions) { |
| 625 // LTR 2-character grapheme, LTR abc, LTR 2-character grapheme. | 602 // LTR 2-character grapheme, LTR abc, LTR 2-character grapheme. |
| 626 const string16 kText1 = WideToUTF16(L"\x0915\x093f"L"abc"L"\x0915\x093f"); | 603 const string16 kText1 = WideToUTF16(L"\x0915\x093f"L"abc"L"\x0915\x093f"); |
| 627 | 604 |
| 628 // LTR ab, LTR 2-character grapheme, LTR cd. | 605 // LTR ab, LTR 2-character grapheme, LTR cd. |
| 629 const string16 kText2 = WideToUTF16(L"ab"L"\x0915\x093f"L"cd"); | 606 const string16 kText2 = WideToUTF16(L"ab"L"\x0915\x093f"L"cd"); |
| 630 | 607 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 EXPECT_EQ(cases[i].expected_next, next); | 651 EXPECT_EQ(cases[i].expected_next, next); |
| 675 EXPECT_TRUE(render_text->IsCursorablePosition(next)); | 652 EXPECT_TRUE(render_text->IsCursorablePosition(next)); |
| 676 | 653 |
| 677 size_t previous = render_text->IndexOfAdjacentGrapheme(cases[i].index, | 654 size_t previous = render_text->IndexOfAdjacentGrapheme(cases[i].index, |
| 678 CURSOR_BACKWARD); | 655 CURSOR_BACKWARD); |
| 679 EXPECT_EQ(cases[i].expected_previous, previous); | 656 EXPECT_EQ(cases[i].expected_previous, previous); |
| 680 EXPECT_TRUE(render_text->IsCursorablePosition(previous)); | 657 EXPECT_TRUE(render_text->IsCursorablePosition(previous)); |
| 681 } | 658 } |
| 682 } | 659 } |
| 683 | 660 |
| 684 TEST_F(RenderTextTest, SelectionModels) { | 661 TEST_F(RenderTextTest, EdgeSelectionModels) { |
| 685 // Simple Latin text. | 662 // Simple Latin text. |
| 686 const string16 kLatin = WideToUTF16(L"abc"); | 663 const string16 kLatin = WideToUTF16(L"abc"); |
| 687 // LTR 2-character grapheme. | 664 // LTR 2-character grapheme. |
| 688 const string16 kLTRGrapheme = WideToUTF16(L"\x0915\x093f"); | 665 const string16 kLTRGrapheme = WideToUTF16(L"\x0915\x093f"); |
| 689 // LTR 2-character grapheme, LTR a, LTR 2-character grapheme. | 666 // LTR 2-character grapheme, LTR a, LTR 2-character grapheme. |
| 690 const string16 kHindiLatin = WideToUTF16(L"\x0915\x093f"L"a"L"\x0915\x093f"); | 667 const string16 kHindiLatin = WideToUTF16(L"\x0915\x093f"L"a"L"\x0915\x093f"); |
| 691 // RTL 2-character grapheme. | 668 // RTL 2-character grapheme. |
| 692 const string16 kRTLGrapheme = WideToUTF16(L"\x05e0\x05b8"); | 669 const string16 kRTLGrapheme = WideToUTF16(L"\x05e0\x05b8"); |
| 693 // RTL 2-character grapheme, LTR a, RTL 2-character grapheme. | 670 // RTL 2-character grapheme, LTR a, RTL 2-character grapheme. |
| 694 const string16 kHebrewLatin = WideToUTF16(L"\x05e0\x05b8"L"a"L"\x05e0\x05b8"); | 671 const string16 kHebrewLatin = WideToUTF16(L"\x05e0\x05b8"L"a"L"\x05e0\x05b8"); |
| 695 | 672 |
| 696 struct { | 673 struct { |
| 697 string16 text; | 674 string16 text; |
| 698 size_t expected_left_end_caret; | 675 base::i18n::TextDirection expected_text_direction; |
| 699 SelectionModel::CaretPlacement expected_left_end_placement; | |
| 700 size_t expected_right_end_caret; | |
| 701 SelectionModel::CaretPlacement expected_right_end_placement; | |
| 702 } cases[] = { | 676 } cases[] = { |
| 703 { string16(), 0, SelectionModel::LEADING, 0, SelectionModel::LEADING }, | 677 { string16(), base::i18n::LEFT_TO_RIGHT }, |
| 704 { kLatin, 0, SelectionModel::LEADING, 2, SelectionModel::TRAILING }, | 678 { kLatin, base::i18n::LEFT_TO_RIGHT }, |
| 705 { kLTRGrapheme, 0, SelectionModel::LEADING, 0, SelectionModel::TRAILING }, | 679 { kLTRGrapheme, base::i18n::LEFT_TO_RIGHT }, |
| 706 { kHindiLatin, 0, SelectionModel::LEADING, 3, SelectionModel::TRAILING }, | 680 { kHindiLatin, base::i18n::LEFT_TO_RIGHT }, |
| 707 { kRTLGrapheme, 0, SelectionModel::TRAILING, 0, SelectionModel::LEADING }, | 681 { kRTLGrapheme, base::i18n::RIGHT_TO_LEFT }, |
| 708 #if defined(OS_LINUX) | 682 #if defined(OS_LINUX) |
| 709 // On Linux, the whole string is displayed RTL, rather than individual runs. | 683 // On Linux, the whole string is displayed RTL, rather than individual runs. |
| 710 { kHebrewLatin, 3, SelectionModel::TRAILING, 0, SelectionModel::LEADING }, | 684 { kHebrewLatin, base::i18n::RIGHT_TO_LEFT }, |
| 711 #else | 685 #else |
| 712 { kHebrewLatin, 0, SelectionModel::TRAILING, 3, SelectionModel::LEADING }, | 686 { kHebrewLatin, base::i18n::LEFT_TO_RIGHT }, |
| 713 #endif | 687 #endif |
| 714 }; | 688 }; |
| 715 | 689 |
| 716 // TODO(asvitkine): Disable tests that fail on XP bots due to lack of complete | 690 // TODO(asvitkine): Disable tests that fail on XP bots due to lack of complete |
| 717 // font support for some scripts - http://crbug.com/106450 | 691 // font support for some scripts - http://crbug.com/106450 |
| 718 #if defined(OS_WIN) | 692 #if defined(OS_WIN) |
| 719 if (base::win::GetVersion() < base::win::VERSION_VISTA) | 693 if (base::win::GetVersion() < base::win::VERSION_VISTA) |
| 720 return; | 694 return; |
| 721 #endif | 695 #endif |
| 722 | 696 |
| 723 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 697 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 724 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { | 698 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { |
| 725 render_text->SetText(cases[i].text); | 699 render_text->SetText(cases[i].text); |
| 700 bool ltr = (cases[i].expected_text_direction == base::i18n::LEFT_TO_RIGHT); |
| 726 | 701 |
| 727 SelectionModel model = render_text->EdgeSelectionModel(CURSOR_LEFT); | 702 SelectionModel start_edge = |
| 728 EXPECT_EQ(cases[i].expected_left_end_caret, model.caret_pos()); | 703 render_text->EdgeSelectionModel(ltr ? CURSOR_LEFT : CURSOR_RIGHT); |
| 729 EXPECT_TRUE(render_text->IsCursorablePosition(model.caret_pos())); | 704 EXPECT_EQ(start_edge, SelectionModel(0, CURSOR_BACKWARD)); |
| 730 EXPECT_EQ(cases[i].expected_left_end_placement, model.caret_placement()); | |
| 731 | 705 |
| 732 model = render_text->EdgeSelectionModel(CURSOR_RIGHT); | 706 SelectionModel end_edge = |
| 733 EXPECT_EQ(cases[i].expected_right_end_caret, model.caret_pos()); | 707 render_text->EdgeSelectionModel(ltr ? CURSOR_RIGHT : CURSOR_LEFT); |
| 734 EXPECT_TRUE(render_text->IsCursorablePosition(model.caret_pos())); | 708 EXPECT_EQ(end_edge, SelectionModel(cases[i].text.length(), CURSOR_FORWARD)); |
| 735 EXPECT_EQ(cases[i].expected_right_end_placement, model.caret_placement()); | |
| 736 } | 709 } |
| 737 } | 710 } |
| 738 | 711 |
| 739 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) { | 712 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) { |
| 740 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 713 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 741 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | 714 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); |
| 742 // Left arrow on select ranging (6, 4). | 715 // Left arrow on select ranging (6, 4). |
| 743 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 716 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 744 EXPECT_EQ(6U, render_text->GetCursorPosition()); | 717 EXPECT_EQ(ui::Range(6), render_text->selection()); |
| 745 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 718 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 746 EXPECT_EQ(4U, render_text->GetCursorPosition()); | 719 EXPECT_EQ(ui::Range(4), render_text->selection()); |
| 747 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 720 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 748 EXPECT_EQ(5U, render_text->GetCursorPosition()); | 721 EXPECT_EQ(ui::Range(5), render_text->selection()); |
| 749 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 722 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 750 EXPECT_EQ(6U, render_text->GetCursorPosition()); | 723 EXPECT_EQ(ui::Range(6), render_text->selection()); |
| 751 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, true); | 724 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, true); |
| 752 EXPECT_EQ(6U, render_text->GetSelectionStart()); | 725 EXPECT_EQ(ui::Range(6, 5), render_text->selection()); |
| 753 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 754 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, true); | 726 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, true); |
| 755 EXPECT_EQ(6U, render_text->GetSelectionStart()); | 727 EXPECT_EQ(ui::Range(6, 4), render_text->selection()); |
| 756 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
| 757 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 728 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 758 EXPECT_EQ(6U, render_text->GetCursorPosition()); | 729 EXPECT_EQ(ui::Range(6), render_text->selection()); |
| 759 | 730 |
| 760 // Right arrow on select ranging (4, 6). | 731 // Right arrow on select ranging (4, 6). |
| 761 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); | 732 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); |
| 762 EXPECT_EQ(0U, render_text->GetCursorPosition()); | 733 EXPECT_EQ(ui::Range(0), render_text->selection()); |
| 763 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 734 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 764 EXPECT_EQ(1U, render_text->GetCursorPosition()); | 735 EXPECT_EQ(ui::Range(1), render_text->selection()); |
| 765 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 736 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 766 EXPECT_EQ(2U, render_text->GetCursorPosition()); | 737 EXPECT_EQ(ui::Range(2), render_text->selection()); |
| 767 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 738 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 768 EXPECT_EQ(3U, render_text->GetCursorPosition()); | 739 EXPECT_EQ(ui::Range(3), render_text->selection()); |
| 769 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 740 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 770 EXPECT_EQ(5U, render_text->GetCursorPosition()); | 741 EXPECT_EQ(ui::Range(5), render_text->selection()); |
| 771 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 742 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 772 EXPECT_EQ(4U, render_text->GetCursorPosition()); | 743 EXPECT_EQ(ui::Range(4), render_text->selection()); |
| 773 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true); | 744 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true); |
| 774 EXPECT_EQ(4U, render_text->GetSelectionStart()); | 745 EXPECT_EQ(ui::Range(4, 5), render_text->selection()); |
| 775 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 776 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true); | 746 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, true); |
| 777 EXPECT_EQ(4U, render_text->GetSelectionStart()); | 747 EXPECT_EQ(ui::Range(4, 6), render_text->selection()); |
| 778 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
| 779 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 748 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 780 EXPECT_EQ(4U, render_text->GetCursorPosition()); | 749 EXPECT_EQ(ui::Range(4), render_text->selection()); |
| 781 } | 750 } |
| 782 | 751 |
| 783 // TODO(xji): Make these work on Windows. | 752 // TODO(xji): Make these work on Windows. |
| 784 #if defined(OS_LINUX) | 753 #if defined(OS_LINUX) |
| 785 void MoveLeftRightByWordVerifier(RenderText* render_text, | 754 void MoveLeftRightByWordVerifier(RenderText* render_text, |
| 786 const wchar_t* str) { | 755 const wchar_t* str) { |
| 787 render_text->SetText(WideToUTF16(str)); | 756 render_text->SetText(WideToUTF16(str)); |
| 788 | 757 |
| 789 // Test moving by word from left ro right. | 758 // Test moving by word from left ro right. |
| 790 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); | 759 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); |
| 791 bool first_word = true; | 760 bool first_word = true; |
| 792 while (true) { | 761 while (true) { |
| 793 // First, test moving by word from a word break position, such as from | 762 // First, test moving by word from a word break position, such as from |
| 794 // "|abc def" to "abc| def". | 763 // "|abc def" to "abc| def". |
| 795 SelectionModel start = render_text->selection_model(); | 764 SelectionModel start = render_text->selection_model(); |
| 796 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 765 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 797 SelectionModel end = render_text->selection_model(); | 766 SelectionModel end = render_text->selection_model(); |
| 798 if (end.Equals(start)) // reach the end. | 767 if (end == start) // reach the end. |
| 799 break; | 768 break; |
| 800 | 769 |
| 801 // For testing simplicity, each word is a 3-character word. | 770 // For testing simplicity, each word is a 3-character word. |
| 802 int num_of_character_moves = first_word ? 3 : 4; | 771 int num_of_character_moves = first_word ? 3 : 4; |
| 803 first_word = false; | 772 first_word = false; |
| 804 render_text->MoveCursorTo(start); | 773 render_text->MoveCursorTo(start); |
| 805 for (int j = 0; j < num_of_character_moves; ++j) | 774 for (int j = 0; j < num_of_character_moves; ++j) |
| 806 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 775 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 807 EXPECT_TRUE(render_text->selection_model().Equals(end)); | 776 EXPECT_EQ(end, render_text->selection_model()); |
| 808 | 777 |
| 809 // Then, test moving by word from positions inside the word, such as from | 778 // Then, test moving by word from positions inside the word, such as from |
| 810 // "a|bc def" to "abc| def", and from "ab|c def" to "abc| def". | 779 // "a|bc def" to "abc| def", and from "ab|c def" to "abc| def". |
| 811 for (int j = 1; j < num_of_character_moves; ++j) { | 780 for (int j = 1; j < num_of_character_moves; ++j) { |
| 812 render_text->MoveCursorTo(start); | 781 render_text->MoveCursorTo(start); |
| 813 for (int k = 0; k < j; ++k) | 782 for (int k = 0; k < j; ++k) |
| 814 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); | 783 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_RIGHT, false); |
| 815 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 784 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 816 EXPECT_TRUE(render_text->selection_model().Equals(end)); | 785 EXPECT_EQ(end, render_text->selection_model()); |
| 817 } | 786 } |
| 818 } | 787 } |
| 819 | 788 |
| 820 // Test moving by word from right to left. | 789 // Test moving by word from right to left. |
| 821 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 790 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 822 first_word = true; | 791 first_word = true; |
| 823 while (true) { | 792 while (true) { |
| 824 SelectionModel start = render_text->selection_model(); | 793 SelectionModel start = render_text->selection_model(); |
| 825 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); | 794 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); |
| 826 SelectionModel end = render_text->selection_model(); | 795 SelectionModel end = render_text->selection_model(); |
| 827 if (end.Equals(start)) // reach the end. | 796 if (end == start) // reach the end. |
| 828 break; | 797 break; |
| 829 | 798 |
| 830 int num_of_character_moves = first_word ? 3 : 4; | 799 int num_of_character_moves = first_word ? 3 : 4; |
| 831 first_word = false; | 800 first_word = false; |
| 832 render_text->MoveCursorTo(start); | 801 render_text->MoveCursorTo(start); |
| 833 for (int j = 0; j < num_of_character_moves; ++j) | 802 for (int j = 0; j < num_of_character_moves; ++j) |
| 834 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 803 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 835 EXPECT_TRUE(render_text->selection_model().Equals(end)); | 804 EXPECT_EQ(end, render_text->selection_model()); |
| 836 | 805 |
| 837 for (int j = 1; j < num_of_character_moves; ++j) { | 806 for (int j = 1; j < num_of_character_moves; ++j) { |
| 838 render_text->MoveCursorTo(start); | 807 render_text->MoveCursorTo(start); |
| 839 for (int k = 0; k < j; ++k) | 808 for (int k = 0; k < j; ++k) |
| 840 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); | 809 render_text->MoveCursor(CHARACTER_BREAK, CURSOR_LEFT, false); |
| 841 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); | 810 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); |
| 842 EXPECT_TRUE(render_text->selection_model().Equals(end)); | 811 EXPECT_EQ(end, render_text->selection_model()); |
| 843 } | 812 } |
| 844 } | 813 } |
| 845 } | 814 } |
| 846 | 815 |
| 847 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText) { | 816 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText) { |
| 848 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 817 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 849 | 818 |
| 850 // For testing simplicity, each word is a 3-character word. | 819 // For testing simplicity, each word is a 3-character word. |
| 851 std::vector<const wchar_t*> test; | 820 std::vector<const wchar_t*> test; |
| 852 test.push_back(L"abc"); | 821 test.push_back(L"abc"); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 882 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText_TestEndOfText) { | 851 TEST_F(RenderTextTest, MoveLeftRightByWordInBidiText_TestEndOfText) { |
| 883 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 852 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 884 | 853 |
| 885 render_text->SetText(WideToUTF16(L"ab\x05E1")); | 854 render_text->SetText(WideToUTF16(L"ab\x05E1")); |
| 886 // Moving the cursor by word from "abC|" to the left should return "|abC". | 855 // Moving the cursor by word from "abC|" to the left should return "|abC". |
| 887 // But since end of text is always treated as a word break, it returns | 856 // But since end of text is always treated as a word break, it returns |
| 888 // position "ab|C". | 857 // position "ab|C". |
| 889 // TODO(xji): Need to make it work as expected. | 858 // TODO(xji): Need to make it work as expected. |
| 890 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 859 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 891 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); | 860 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); |
| 892 // EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel(0))); | 861 // EXPECT_EQ(SelectionModel(), render_text->selection_model()); |
| 893 | 862 |
| 894 // Moving the cursor by word from "|abC" to the right returns "abC|". | 863 // Moving the cursor by word from "|abC" to the right returns "abC|". |
| 895 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); | 864 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); |
| 896 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 865 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 897 EXPECT_TRUE(render_text->selection_model().Equals( | 866 EXPECT_EQ(SelectionModel(3, CURSOR_FORWARD), render_text->selection_model()); |
| 898 SelectionModel(3, 2, SelectionModel::LEADING))); | |
| 899 | 867 |
| 900 render_text->SetText(WideToUTF16(L"\x05E1\x05E2"L"a")); | 868 render_text->SetText(WideToUTF16(L"\x05E1\x05E2"L"a")); |
| 901 // For logical text "BCa", moving the cursor by word from "aCB|" to the left | 869 // For logical text "BCa", moving the cursor by word from "aCB|" to the left |
| 902 // returns "|aCB". | 870 // returns "|aCB". |
| 903 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); | 871 render_text->MoveCursor(LINE_BREAK, CURSOR_RIGHT, false); |
| 904 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); | 872 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); |
| 905 EXPECT_TRUE(render_text->selection_model().Equals( | 873 EXPECT_EQ(SelectionModel(3, CURSOR_FORWARD), render_text->selection_model()); |
| 906 SelectionModel(3, 2, SelectionModel::LEADING))); | |
| 907 | 874 |
| 908 // Moving the cursor by word from "|aCB" to the right should return "aCB|". | 875 // Moving the cursor by word from "|aCB" to the right should return "aCB|". |
| 909 // But since end of text is always treated as a word break, it returns | 876 // But since end of text is always treated as a word break, it returns |
| 910 // position "a|CB". | 877 // position "a|CB". |
| 911 // TODO(xji): Need to make it work as expected. | 878 // TODO(xji): Need to make it work as expected. |
| 912 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); | 879 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); |
| 913 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 880 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 914 // EXPECT_TRUE(render_text->selection_model().Equals(SelectionModel(0))); | 881 // EXPECT_EQ(SelectionModel(), render_text->selection_model()); |
| 915 } | 882 } |
| 916 | 883 |
| 917 TEST_F(RenderTextTest, MoveLeftRightByWordInTextWithMultiSpaces) { | 884 TEST_F(RenderTextTest, MoveLeftRightByWordInTextWithMultiSpaces) { |
| 918 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 885 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 919 render_text->SetText(WideToUTF16(L"abc def")); | 886 render_text->SetText(WideToUTF16(L"abc def")); |
| 920 render_text->MoveCursorTo(SelectionModel(5)); | 887 render_text->MoveCursorTo(SelectionModel(5, CURSOR_FORWARD)); |
| 921 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 888 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 922 EXPECT_EQ(11U, render_text->GetCursorPosition()); | 889 EXPECT_EQ(11U, render_text->cursor_position()); |
| 923 | 890 |
| 924 render_text->MoveCursorTo(SelectionModel(5)); | 891 render_text->MoveCursorTo(SelectionModel(5, CURSOR_FORWARD)); |
| 925 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); | 892 render_text->MoveCursor(WORD_BREAK, CURSOR_LEFT, false); |
| 926 EXPECT_EQ(0U, render_text->GetCursorPosition()); | 893 EXPECT_EQ(0U, render_text->cursor_position()); |
| 927 } | 894 } |
| 928 | 895 |
| 929 TEST_F(RenderTextTest, MoveLeftRightByWordInChineseText) { | 896 TEST_F(RenderTextTest, MoveLeftRightByWordInChineseText) { |
| 930 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 897 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 931 render_text->SetText(WideToUTF16(L"\x6211\x4EEC\x53BB\x516C\x56ED\x73A9")); | 898 render_text->SetText(WideToUTF16(L"\x6211\x4EEC\x53BB\x516C\x56ED\x73A9")); |
| 932 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); | 899 render_text->MoveCursor(LINE_BREAK, CURSOR_LEFT, false); |
| 933 EXPECT_EQ(0U, render_text->GetCursorPosition()); | 900 EXPECT_EQ(0U, render_text->cursor_position()); |
| 934 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 901 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 935 EXPECT_EQ(2U, render_text->GetCursorPosition()); | 902 EXPECT_EQ(2U, render_text->cursor_position()); |
| 936 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 903 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 937 EXPECT_EQ(3U, render_text->GetCursorPosition()); | 904 EXPECT_EQ(3U, render_text->cursor_position()); |
| 938 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 905 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 939 EXPECT_EQ(5U, render_text->GetCursorPosition()); | 906 EXPECT_EQ(5U, render_text->cursor_position()); |
| 940 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 907 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 941 EXPECT_EQ(6U, render_text->GetCursorPosition()); | 908 EXPECT_EQ(6U, render_text->cursor_position()); |
| 942 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); | 909 render_text->MoveCursor(WORD_BREAK, CURSOR_RIGHT, false); |
| 943 EXPECT_EQ(6U, render_text->GetCursorPosition()); | 910 EXPECT_EQ(6U, render_text->cursor_position()); |
| 944 } | 911 } |
| 945 | 912 |
| 946 TEST_F(RenderTextTest, StringWidthTest) { | 913 TEST_F(RenderTextTest, StringWidthTest) { |
| 947 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 914 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 948 render_text->SetText(UTF8ToUTF16("Hello World")); | 915 render_text->SetText(UTF8ToUTF16("Hello World")); |
| 949 | 916 |
| 950 // Check that width is valid | 917 // Check that width is valid |
| 951 int width = render_text->GetStringWidth(); | 918 int width = render_text->GetStringSize().width(); |
| 952 EXPECT_GT(width, 0); | 919 EXPECT_GT(width, 0); |
| 953 | 920 |
| 954 // Apply a bold style and check that the new width is greater. | 921 // Apply a bold style and check that the new width is greater. |
| 955 StyleRange bold; | 922 StyleRange bold; |
| 956 bold.font_style |= gfx::Font::BOLD; | 923 bold.font_style |= gfx::Font::BOLD; |
| 957 render_text->set_default_style(bold); | 924 render_text->set_default_style(bold); |
| 958 render_text->ApplyDefaultStyle(); | 925 render_text->ApplyDefaultStyle(); |
| 959 EXPECT_GT(render_text->GetStringWidth(), width); | 926 EXPECT_GT(render_text->GetStringSize().width(), width); |
| 960 } | 927 } |
| 961 | 928 |
| 962 #endif | 929 #endif |
| 963 | 930 |
| 964 TEST_F(RenderTextTest, CursorBoundsInReplacementMode) { | 931 TEST_F(RenderTextTest, CursorBoundsInReplacementMode) { |
| 965 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 932 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 966 render_text->SetText(ASCIIToUTF16("abcdefg")); | 933 render_text->SetText(ASCIIToUTF16("abcdefg")); |
| 967 render_text->SetDisplayRect(Rect(100, 17)); | 934 render_text->SetDisplayRect(Rect(100, 17)); |
| 968 SelectionModel sel_b(1); | 935 SelectionModel sel_b(1, CURSOR_FORWARD); |
| 969 SelectionModel sel_c(2); | 936 SelectionModel sel_c(2, CURSOR_FORWARD); |
| 970 Rect cursor_around_b = render_text->GetCursorBounds(sel_b, false); | 937 Rect cursor_around_b = render_text->GetCursorBounds(sel_b, false); |
| 971 Rect cursor_before_b = render_text->GetCursorBounds(sel_b, true); | 938 Rect cursor_before_b = render_text->GetCursorBounds(sel_b, true); |
| 972 Rect cursor_before_c = render_text->GetCursorBounds(sel_c, true); | 939 Rect cursor_before_c = render_text->GetCursorBounds(sel_c, true); |
| 973 EXPECT_EQ(cursor_around_b.x(), cursor_before_b.x()); | 940 EXPECT_EQ(cursor_around_b.x(), cursor_before_b.x()); |
| 974 EXPECT_EQ(cursor_around_b.right(), cursor_before_c.x()); | 941 EXPECT_EQ(cursor_around_b.right(), cursor_before_c.x()); |
| 975 } | 942 } |
| 976 | 943 |
| 977 TEST_F(RenderTextTest, OriginForSkiaDrawing) { | 944 TEST_F(RenderTextTest, OriginForSkiaDrawing) { |
| 978 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 945 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 979 render_text->SetText(ASCIIToUTF16("abcdefg")); | 946 render_text->SetText(ASCIIToUTF16("abcdefg")); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 993 render_text->SetDisplayRect(display_rect); | 960 render_text->SetDisplayRect(display_rect); |
| 994 | 961 |
| 995 origin = render_text->GetOriginForSkiaDrawing(); | 962 origin = render_text->GetOriginForSkiaDrawing(); |
| 996 EXPECT_EQ(origin.x(), 0); | 963 EXPECT_EQ(origin.x(), 0); |
| 997 EXPECT_EQ(origin.y(), 14); | 964 EXPECT_EQ(origin.y(), 14); |
| 998 } | 965 } |
| 999 | 966 |
| 1000 TEST_F(RenderTextTest, DisplayRectShowsCursorLTR) { | 967 TEST_F(RenderTextTest, DisplayRectShowsCursorLTR) { |
| 1001 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 968 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 1002 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg")); | 969 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg")); |
| 1003 render_text->MoveCursorTo(SelectionModel(render_text->text().length())); | 970 render_text->MoveCursorTo(SelectionModel(render_text->text().length(), |
| 1004 int width = render_text->GetStringWidth(); | 971 CURSOR_FORWARD)); |
| 972 int width = render_text->GetStringSize().width(); |
| 1005 | 973 |
| 1006 // Ensure that the cursor is placed at the width of its preceding text. | 974 // Ensure that the cursor is placed at the width of its preceding text. |
| 1007 render_text->SetDisplayRect(Rect(width + 10, 1)); | 975 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1008 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); | 976 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); |
| 1009 | 977 |
| 1010 // Ensure that shrinking the display rectangle keeps the cursor in view. | 978 // Ensure that shrinking the display rectangle keeps the cursor in view. |
| 1011 render_text->SetDisplayRect(Rect(width - 10, 1)); | 979 render_text->SetDisplayRect(Rect(width - 10, 1)); |
| 1012 EXPECT_EQ(render_text->display_rect().width() - 1, | 980 EXPECT_EQ(render_text->display_rect().width() - 1, |
| 1013 render_text->GetUpdatedCursorBounds().x()); | 981 render_text->GetUpdatedCursorBounds().x()); |
| 1014 | 982 |
| 1015 // Ensure that the text will pan to fill its expanding display rectangle. | 983 // Ensure that the text will pan to fill its expanding display rectangle. |
| 1016 render_text->SetDisplayRect(Rect(width - 5, 1)); | 984 render_text->SetDisplayRect(Rect(width - 5, 1)); |
| 1017 EXPECT_EQ(render_text->display_rect().width() - 1, | 985 EXPECT_EQ(render_text->display_rect().width() - 1, |
| 1018 render_text->GetUpdatedCursorBounds().x()); | 986 render_text->GetUpdatedCursorBounds().x()); |
| 1019 | 987 |
| 1020 // Ensure that a sufficiently large display rectangle shows all the text. | 988 // Ensure that a sufficiently large display rectangle shows all the text. |
| 1021 render_text->SetDisplayRect(Rect(width + 10, 1)); | 989 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1022 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); | 990 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); |
| 1023 | 991 |
| 1024 // Repeat the test with RTL text. | 992 // Repeat the test with RTL text. |
| 1025 render_text->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7" | 993 render_text->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7" |
| 1026 L"\x5d8\x5d9\x5da\x5db\x5dc\x5dd\x5de\x5df")); | 994 L"\x5d8\x5d9\x5da\x5db\x5dc\x5dd\x5de\x5df")); |
| 1027 render_text->MoveCursorTo(SelectionModel(0)); | 995 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); |
| 1028 width = render_text->GetStringWidth(); | 996 width = render_text->GetStringSize().width(); |
| 1029 | 997 |
| 1030 // Ensure that the cursor is placed at the width of its preceding text. | 998 // Ensure that the cursor is placed at the width of its preceding text. |
| 1031 render_text->SetDisplayRect(Rect(width + 10, 1)); | 999 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1032 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); | 1000 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); |
| 1033 | 1001 |
| 1034 // Ensure that shrinking the display rectangle keeps the cursor in view. | 1002 // Ensure that shrinking the display rectangle keeps the cursor in view. |
| 1035 render_text->SetDisplayRect(Rect(width - 10, 1)); | 1003 render_text->SetDisplayRect(Rect(width - 10, 1)); |
| 1036 EXPECT_EQ(render_text->display_rect().width() - 1, | 1004 EXPECT_EQ(render_text->display_rect().width() - 1, |
| 1037 render_text->GetUpdatedCursorBounds().x()); | 1005 render_text->GetUpdatedCursorBounds().x()); |
| 1038 | 1006 |
| 1039 // Ensure that the text will pan to fill its expanding display rectangle. | 1007 // Ensure that the text will pan to fill its expanding display rectangle. |
| 1040 render_text->SetDisplayRect(Rect(width - 5, 1)); | 1008 render_text->SetDisplayRect(Rect(width - 5, 1)); |
| 1041 EXPECT_EQ(render_text->display_rect().width() - 1, | 1009 EXPECT_EQ(render_text->display_rect().width() - 1, |
| 1042 render_text->GetUpdatedCursorBounds().x()); | 1010 render_text->GetUpdatedCursorBounds().x()); |
| 1043 | 1011 |
| 1044 // Ensure that a sufficiently large display rectangle shows all the text. | 1012 // Ensure that a sufficiently large display rectangle shows all the text. |
| 1045 render_text->SetDisplayRect(Rect(width + 10, 1)); | 1013 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1046 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); | 1014 EXPECT_EQ(width, render_text->GetUpdatedCursorBounds().x()); |
| 1047 } | 1015 } |
| 1048 | 1016 |
| 1049 TEST_F(RenderTextTest, DisplayRectShowsCursorRTL) { | 1017 TEST_F(RenderTextTest, DisplayRectShowsCursorRTL) { |
| 1050 // Set the locale to Hebrew for RTL UI. | 1018 // Set the locale to Hebrew for RTL UI. |
| 1051 std::string locale = l10n_util::GetApplicationLocale(""); | 1019 std::string locale = l10n_util::GetApplicationLocale(""); |
| 1052 base::i18n::SetICUDefaultLocale("he"); | 1020 base::i18n::SetICUDefaultLocale("he"); |
| 1053 | 1021 |
| 1054 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | 1022 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 1055 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg")); | 1023 render_text->SetText(WideToUTF16(L"abcdefghijklmnopqrstuvwxzyabcdefg")); |
| 1056 render_text->MoveCursorTo(SelectionModel(0)); | 1024 render_text->MoveCursorTo(SelectionModel(0, CURSOR_FORWARD)); |
| 1057 int width = render_text->GetStringWidth(); | 1025 int width = render_text->GetStringSize().width(); |
| 1058 | 1026 |
| 1059 // Ensure that the cursor is placed at the width of its preceding text. | 1027 // Ensure that the cursor is placed at the width of its preceding text. |
| 1060 render_text->SetDisplayRect(Rect(width + 10, 1)); | 1028 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1061 EXPECT_EQ(render_text->display_rect().width() - width - 1, | 1029 EXPECT_EQ(render_text->display_rect().width() - width - 1, |
| 1062 render_text->GetUpdatedCursorBounds().x()); | 1030 render_text->GetUpdatedCursorBounds().x()); |
| 1063 | 1031 |
| 1064 // Ensure that shrinking the display rectangle keeps the cursor in view. | 1032 // Ensure that shrinking the display rectangle keeps the cursor in view. |
| 1065 render_text->SetDisplayRect(Rect(width - 10, 1)); | 1033 render_text->SetDisplayRect(Rect(width - 10, 1)); |
| 1066 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); | 1034 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); |
| 1067 | 1035 |
| 1068 // Ensure that the text will pan to fill its expanding display rectangle. | 1036 // Ensure that the text will pan to fill its expanding display rectangle. |
| 1069 render_text->SetDisplayRect(Rect(width - 5, 1)); | 1037 render_text->SetDisplayRect(Rect(width - 5, 1)); |
| 1070 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); | 1038 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); |
| 1071 | 1039 |
| 1072 // Ensure that a sufficiently large display rectangle shows all the text. | 1040 // Ensure that a sufficiently large display rectangle shows all the text. |
| 1073 render_text->SetDisplayRect(Rect(width + 10, 1)); | 1041 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1074 EXPECT_EQ(render_text->display_rect().width() - width - 1, | 1042 EXPECT_EQ(render_text->display_rect().width() - width - 1, |
| 1075 render_text->GetUpdatedCursorBounds().x()); | 1043 render_text->GetUpdatedCursorBounds().x()); |
| 1076 | 1044 |
| 1077 // Repeat the test with RTL text. | 1045 // Repeat the test with RTL text. |
| 1078 render_text->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7" | 1046 render_text->SetText(WideToUTF16(L"\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7" |
| 1079 L"\x5d8\x5d9\x5da\x5db\x5dc\x5dd\x5de\x5df")); | 1047 L"\x5d8\x5d9\x5da\x5db\x5dc\x5dd\x5de\x5df")); |
| 1080 render_text->MoveCursorTo(SelectionModel(render_text->text().length())); | 1048 render_text->MoveCursorTo(SelectionModel(render_text->text().length(), |
| 1081 width = render_text->GetStringWidth(); | 1049 CURSOR_FORWARD)); |
| 1050 width = render_text->GetStringSize().width(); |
| 1082 | 1051 |
| 1083 // Ensure that the cursor is placed at the width of its preceding text. | 1052 // Ensure that the cursor is placed at the width of its preceding text. |
| 1084 render_text->SetDisplayRect(Rect(width + 10, 1)); | 1053 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1085 EXPECT_EQ(render_text->display_rect().width() - width - 1, | 1054 EXPECT_EQ(render_text->display_rect().width() - width - 1, |
| 1086 render_text->GetUpdatedCursorBounds().x()); | 1055 render_text->GetUpdatedCursorBounds().x()); |
| 1087 | 1056 |
| 1088 // Ensure that shrinking the display rectangle keeps the cursor in view. | 1057 // Ensure that shrinking the display rectangle keeps the cursor in view. |
| 1089 render_text->SetDisplayRect(Rect(width - 10, 1)); | 1058 render_text->SetDisplayRect(Rect(width - 10, 1)); |
| 1090 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); | 1059 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); |
| 1091 | 1060 |
| 1092 // Ensure that the text will pan to fill its expanding display rectangle. | 1061 // Ensure that the text will pan to fill its expanding display rectangle. |
| 1093 render_text->SetDisplayRect(Rect(width - 5, 1)); | 1062 render_text->SetDisplayRect(Rect(width - 5, 1)); |
| 1094 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); | 1063 EXPECT_EQ(0, render_text->GetUpdatedCursorBounds().x()); |
| 1095 | 1064 |
| 1096 // Ensure that a sufficiently large display rectangle shows all the text. | 1065 // Ensure that a sufficiently large display rectangle shows all the text. |
| 1097 render_text->SetDisplayRect(Rect(width + 10, 1)); | 1066 render_text->SetDisplayRect(Rect(width + 10, 1)); |
| 1098 EXPECT_EQ(render_text->display_rect().width() - width - 1, | 1067 EXPECT_EQ(render_text->display_rect().width() - width - 1, |
| 1099 render_text->GetUpdatedCursorBounds().x()); | 1068 render_text->GetUpdatedCursorBounds().x()); |
| 1100 | 1069 |
| 1101 // Reset locale. | 1070 // Reset locale. |
| 1102 base::i18n::SetICUDefaultLocale(locale); | 1071 base::i18n::SetICUDefaultLocale(locale); |
| 1103 } | 1072 } |
| 1104 | 1073 |
| 1105 } // namespace gfx | 1074 } // namespace gfx |
| OLD | NEW |