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