Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <cstring> | 5 #include <cstring> |
| 6 | 6 |
| 7 #include "base/i18n/char_iterator.h" | 7 #include "base/i18n/char_iterator.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chromeos/dbus/dbus_thread_manager.h" | 10 #include "chromeos/dbus/dbus_thread_manager.h" |
| 11 #include "chromeos/dbus/ibus/ibus_text.h" | 11 #include "chromeos/dbus/ibus/ibus_text.h" |
| 12 #include "chromeos/dbus/ibus/mock_ibus_client.h" | 12 #include "chromeos/dbus/ibus/mock_ibus_client.h" |
| 13 #include "chromeos/dbus/ibus/mock_ibus_input_context_client.h" | 13 #include "chromeos/dbus/ibus/mock_ibus_input_context_client.h" |
| 14 #include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h" | 14 #include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "ui/base/ime/input_method_delegate.h" | 16 #include "ui/base/ime/input_method_delegate.h" |
| 17 #include "ui/base/ime/input_method_ibus.h" | 17 #include "ui/base/ime/input_method_ibus.h" |
| 18 #include "ui/base/ime/text_input_client.h" | 18 #include "ui/base/ime/text_input_client.h" |
| 19 #include "ui/gfx/rect.h" | 19 #include "ui/gfx/rect.h" |
| 20 | 20 |
| 21 namespace ui { | 21 namespace ui { |
| 22 namespace { | 22 namespace { |
| 23 const int kCreateInputContextMaxTrialCount = 10; | |
| 23 | 24 |
| 24 uint32 GetOffsetInUTF16(const std::string& utf8_string, uint32 utf8_offset) { | 25 uint32 GetOffsetInUTF16(const std::string& utf8_string, uint32 utf8_offset) { |
| 25 string16 utf16_string = UTF8ToUTF16(utf8_string); | 26 string16 utf16_string = UTF8ToUTF16(utf8_string); |
| 26 DCHECK_LT(utf8_offset, utf16_string.size()); | 27 DCHECK_LT(utf8_offset, utf16_string.size()); |
| 27 base::i18n::UTF16CharIterator char_iterator(&utf16_string); | 28 base::i18n::UTF16CharIterator char_iterator(&utf16_string); |
| 28 for (size_t i = 0; i < utf8_offset; ++i) | 29 for (size_t i = 0; i < utf8_offset; ++i) |
| 29 char_iterator.Advance(); | 30 char_iterator.Advance(); |
| 30 return char_iterator.array_pos(); | 31 return char_iterator.array_pos(); |
| 31 } | 32 } |
| 32 | 33 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 }; | 71 }; |
| 71 | 72 |
| 72 class CreateInputContextNoResponseHandler { | 73 class CreateInputContextNoResponseHandler { |
| 73 public: | 74 public: |
| 74 void Run(const std::string& client_name, | 75 void Run(const std::string& client_name, |
| 75 const chromeos::IBusClient::CreateInputContextCallback& callback, | 76 const chromeos::IBusClient::CreateInputContextCallback& callback, |
| 76 const chromeos::IBusClient::ErrorCallback& error_callback) { | 77 const chromeos::IBusClient::ErrorCallback& error_callback) { |
| 77 } | 78 } |
| 78 }; | 79 }; |
| 79 | 80 |
| 80 class CreateInputContextDelayFailHandler { | 81 class CreateInputContextDelayHandler { |
| 81 public: | 82 public: |
| 82 ~CreateInputContextDelayFailHandler() { | 83 explicit CreateInputContextDelayHandler(const dbus::ObjectPath& object_path) |
| 83 error_callback_.Run(); | 84 : object_path_(object_path) { |
| 84 } | 85 } |
| 85 | 86 |
| 86 void Run(const std::string& client_name, | 87 void Run(const std::string& client_name, |
| 87 const chromeos::IBusClient::CreateInputContextCallback& callback, | 88 const chromeos::IBusClient::CreateInputContextCallback& callback, |
| 88 const chromeos::IBusClient::ErrorCallback& error_callback) { | 89 const chromeos::IBusClient::ErrorCallback& error_callback) { |
| 90 callback_ = callback; | |
| 89 error_callback_ = error_callback; | 91 error_callback_ = error_callback; |
| 90 } | 92 } |
| 91 | 93 |
| 94 void RunCallback(bool success) { | |
| 95 if (success) { | |
|
Yusuke Sato
2012/08/07 20:03:44
remove {}
Seigo Nonaka
2012/08/08 04:32:52
Done.
| |
| 96 callback_.Run(object_path_); | |
| 97 } else { | |
|
Yusuke Sato
2012/08/07 20:03:44
remove }{
Seigo Nonaka
2012/08/08 04:32:52
Done.
| |
| 98 error_callback_.Run(); | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 private: | |
| 103 dbus::ObjectPath object_path_; | |
| 104 chromeos::IBusClient::CreateInputContextCallback callback_; | |
| 92 chromeos::IBusClient::ErrorCallback error_callback_; | 105 chromeos::IBusClient::ErrorCallback error_callback_; |
| 93 }; | 106 }; |
|
Yusuke Sato
2012/08/07 20:03:44
disallow copy&assign
Seigo Nonaka
2012/08/08 04:32:52
Done.
| |
| 94 | 107 |
| 95 class InputMethodIBusTest : public internal::InputMethodDelegate, | 108 class InputMethodIBusTest : public internal::InputMethodDelegate, |
| 96 public testing::Test, | 109 public testing::Test, |
| 97 public TextInputClient { | 110 public TextInputClient { |
| 98 public: | 111 public: |
| 99 InputMethodIBusTest() { | 112 InputMethodIBusTest() { |
| 100 ResetFlags(); | 113 ResetFlags(); |
| 101 } | 114 } |
| 102 | 115 |
| 103 virtual ~InputMethodIBusTest() { | 116 virtual ~InputMethodIBusTest() { |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 246 | 259 |
| 247 // Variables that will be returned from the ui::TextInputClient functions. | 260 // Variables that will be returned from the ui::TextInputClient functions. |
| 248 TextInputType input_type_; | 261 TextInputType input_type_; |
| 249 bool can_compose_inline_; | 262 bool can_compose_inline_; |
| 250 gfx::Rect caret_bounds_; | 263 gfx::Rect caret_bounds_; |
| 251 | 264 |
| 252 // Variables for mock dbus connections. | 265 // Variables for mock dbus connections. |
| 253 chromeos::MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_; | 266 chromeos::MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_; |
| 254 chromeos::MockIBusClient* mock_ibus_client_; | 267 chromeos::MockIBusClient* mock_ibus_client_; |
| 255 chromeos::MockIBusInputContextClient* mock_ibus_input_context_client_; | 268 chromeos::MockIBusInputContextClient* mock_ibus_input_context_client_; |
| 256 }; | 269 }; |
|
Yusuke Sato
2012/08/07 20:03:44
disallow copy&assign
Seigo Nonaka
2012/08/08 04:32:52
Done.
| |
| 257 | 270 |
| 258 // Tests public APIs in ui::InputMethod first. | 271 // Tests public APIs in ui::InputMethod first. |
| 259 | 272 |
| 260 TEST_F(InputMethodIBusTest, GetInputLocale) { | 273 TEST_F(InputMethodIBusTest, GetInputLocale) { |
| 261 // ui::InputMethodIBus does not support the API. | 274 // ui::InputMethodIBus does not support the API. |
| 262 ime_->Init(true); | 275 ime_->Init(true); |
| 263 EXPECT_EQ("", ime_->GetInputLocale()); | 276 EXPECT_EQ("", ime_->GetInputLocale()); |
| 264 } | 277 } |
| 265 | 278 |
| 266 TEST_F(InputMethodIBusTest, GetInputTextDirection) { | 279 TEST_F(InputMethodIBusTest, GetInputTextDirection) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 351 TEST_F(InputMethodIBusTest, InitiallyConnected) { | 364 TEST_F(InputMethodIBusTest, InitiallyConnected) { |
| 352 SetCreateContextSuccessHandler(); | 365 SetCreateContextSuccessHandler(); |
| 353 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 366 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 354 ime_->Init(true); | 367 ime_->Init(true); |
| 355 // An input context should be created immediately since is_connected_ is true. | 368 // An input context should be created immediately since is_connected_ is true. |
| 356 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 369 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 357 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); | 370 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 358 // However, since the current text input type is 'NONE' (the default), FocusIn | 371 // However, since the current text input type is 'NONE' (the default), FocusIn |
| 359 // shouldn't be called. | 372 // shouldn't be called. |
| 360 EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); | 373 EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); |
| 374 EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 361 } | 375 } |
| 362 | 376 |
| 363 // Create ui::InputMethodIBus, then start ibus-daemon. | 377 // Create ui::InputMethodIBus, then start ibus-daemon. |
| 364 TEST_F(InputMethodIBusTest, InitiallyDisconnected) { | 378 TEST_F(InputMethodIBusTest, InitiallyDisconnected) { |
| 365 SetCreateContextSuccessHandler(); | 379 SetCreateContextSuccessHandler(); |
| 366 ime_->Init(true); | 380 ime_->Init(true); |
| 367 // A context shouldn't be created since the daemon is not running. | 381 // A context shouldn't be created since the daemon is not running. |
| 368 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); | 382 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); |
| 369 // Start the daemon. | 383 // Start the daemon. |
| 370 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 384 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 371 ime_->OnConnected(); | 385 ime_->OnConnected(); |
| 372 // A context should be created upon the signal delivery. | 386 // A context should be created upon the signal delivery. |
| 373 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 387 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 374 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); | 388 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 375 EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); | 389 EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); |
| 390 EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 376 } | 391 } |
| 377 | 392 |
| 378 // Confirm that ui::InputMethodIBus does not crash on "disconnected" signal | 393 // Confirm that ui::InputMethodIBus does not crash on "disconnected" signal |
| 379 // delivery. | 394 // delivery. |
| 380 TEST_F(InputMethodIBusTest, Disconnect) { | 395 TEST_F(InputMethodIBusTest, Disconnect) { |
| 381 SetCreateContextSuccessHandler(); | 396 SetCreateContextSuccessHandler(); |
| 382 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 397 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 383 ime_->Init(true); | 398 ime_->Init(true); |
| 384 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 399 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 385 // Currently we can't shutdown IBusBus connection except in | 400 // Currently we can't shutdown IBusBus connection except in |
| 386 // DBusThreadManager's shutting down. So set ibus_bus_ as NULL to emulate | 401 // DBusThreadManager's shutting down. So set ibus_bus_ as NULL to emulate |
| 387 // dynamical shutting down. | 402 // dynamical shutting down. |
| 388 mock_dbus_thread_manager_->set_ibus_bus(NULL); | 403 mock_dbus_thread_manager_->set_ibus_bus(NULL); |
| 389 ime_->OnDisconnected(); | 404 ime_->OnDisconnected(); |
| 405 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 390 } | 406 } |
| 391 | 407 |
| 392 // Confirm that ui::InputMethodIBus re-creates an input context when ibus-daemon | 408 // Confirm that ui::InputMethodIBus re-creates an input context when ibus-daemon |
| 393 // restarts. | 409 // restarts. |
| 394 TEST_F(InputMethodIBusTest, DisconnectThenReconnect) { | 410 TEST_F(InputMethodIBusTest, DisconnectThenReconnect) { |
| 395 SetCreateContextSuccessHandler(); | 411 SetCreateContextSuccessHandler(); |
| 396 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 412 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 397 ime_->Init(true); | 413 ime_->Init(true); |
| 398 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 414 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 399 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); | 415 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 400 EXPECT_EQ(0, | 416 EXPECT_EQ(0, |
| 401 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); | 417 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); |
| 402 mock_dbus_thread_manager_->set_ibus_bus(NULL); | 418 mock_dbus_thread_manager_->set_ibus_bus(NULL); |
| 403 ime_->OnDisconnected(); | 419 ime_->OnDisconnected(); |
| 420 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 404 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 421 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 405 ime_->OnConnected(); | 422 ime_->OnConnected(); |
| 406 // Check if the old context is deleted. | 423 // Check if the old context is deleted. |
| 407 EXPECT_EQ(1, | 424 EXPECT_EQ(1, |
| 408 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); | 425 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); |
| 409 // Check if a new context is created. | 426 // Check if a new context is created. |
| 410 EXPECT_EQ(2, mock_ibus_client_->create_input_context_call_count()); | 427 EXPECT_EQ(2, mock_ibus_client_->create_input_context_call_count()); |
| 411 EXPECT_EQ(2, mock_ibus_input_context_client_->set_capabilities_call_count()); | 428 EXPECT_EQ(2, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 429 EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 412 } | 430 } |
| 413 | 431 |
| 414 // Confirm that ui::InputMethodIBus does not crash even if NULL context is | 432 // Confirm that ui::InputMethodIBus does not crash even if NULL context is |
| 415 // passed. | 433 // passed. |
| 416 // TODO(yusukes): Currently, ui::InputMethodIBus does not try to create ic once | 434 // TODO(yusukes): Currently, ui::InputMethodIBus does not try to create ic once |
| 417 // it fails (unless ibus sends the "connected" signal to Chrome again). It might | 435 // it fails (unless ibus sends the "connected" signal to Chrome again). It might |
| 418 // be better to add some retry logic. Will revisit later. | 436 // be better to add some retry logic. Will revisit later. |
| 419 TEST_F(InputMethodIBusTest, CreateContextFail) { | 437 TEST_F(InputMethodIBusTest, CreateContextFail) { |
| 420 CreateInputContextFailHandler create_input_context_handler; | 438 CreateInputContextFailHandler create_input_context_handler; |
| 421 mock_ibus_client_->set_create_input_context_handler(base::Bind( | 439 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| 422 &CreateInputContextFailHandler::Run, | 440 &CreateInputContextFailHandler::Run, |
| 423 base::Unretained(&create_input_context_handler))); | 441 base::Unretained(&create_input_context_handler))); |
| 424 | 442 |
| 425 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 443 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 426 ime_->Init(true); | 444 ime_->Init(true); |
| 427 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 445 // InputMethodIBus tries several times if the CreateInputContext method call |
| 446 // is failed. | |
| 447 EXPECT_EQ(kCreateInputContextMaxTrialCount, | |
| 448 mock_ibus_client_->create_input_context_call_count()); | |
| 428 // |set_capabilities_call_count()| should be zero since a context is not | 449 // |set_capabilities_call_count()| should be zero since a context is not |
| 429 // created yet. | 450 // created yet. |
| 430 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | 451 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 452 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 431 } | 453 } |
| 432 | 454 |
| 433 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon does not | 455 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon does not |
| 434 // respond. | 456 // respond. |
| 435 TEST_F(InputMethodIBusTest, CreateContextNoResp) { | 457 TEST_F(InputMethodIBusTest, CreateContextNoResp) { |
| 436 CreateInputContextNoResponseHandler create_input_context_handler; | 458 CreateInputContextNoResponseHandler create_input_context_handler; |
| 437 mock_ibus_client_->set_create_input_context_handler(base::Bind( | 459 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| 438 &CreateInputContextNoResponseHandler::Run, | 460 &CreateInputContextNoResponseHandler::Run, |
| 439 base::Unretained(&create_input_context_handler))); | 461 base::Unretained(&create_input_context_handler))); |
| 440 | 462 |
| 441 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 463 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 442 ime_->Init(true); | 464 ime_->Init(true); |
| 443 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 465 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 444 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | 466 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 467 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 445 } | 468 } |
| 446 | 469 |
| 447 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds | 470 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| 448 // after ui::InputMethodIBus is deleted. See comments in ~MockIBusClient() as | 471 // after ui::InputMethodIBus is deleted. |
| 449 // well. | 472 TEST_F(InputMethodIBusTest, CreateContextFailDelayed) { |
| 450 TEST_F(InputMethodIBusTest, CreateContextDelayed) { | 473 CreateInputContextDelayHandler create_input_context_handler( |
| 451 CreateInputContextDelayFailHandler create_input_context_handler; | 474 dbus::ObjectPath("Sample object path")); |
| 452 mock_ibus_client_->set_create_input_context_handler(base::Bind( | 475 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| 453 &CreateInputContextDelayFailHandler::Run, | 476 &CreateInputContextDelayHandler::Run, |
| 454 base::Unretained(&create_input_context_handler))); | 477 base::Unretained(&create_input_context_handler))); |
| 455 | 478 |
| 456 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 479 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 457 ime_->Init(true); | 480 ime_->Init(true); |
| 458 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 481 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 459 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | 482 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 460 // After this line, the destructor for |ime_| will run first. Then, the | 483 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 461 // destructor for the handler will run. In the latter function, a new input | 484 |
| 462 // context will be created and passed to InitOrAbandonInputContext(). | 485 ime_->SetFocusedTextInputClient(NULL); |
| 486 ime_.reset(); | |
| 487 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 488 | |
| 489 create_input_context_handler.RunCallback(false); | |
| 490 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | |
| 491 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | |
| 492 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 493 } | |
| 494 | |
| 495 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds | |
| 496 // after ui::InputMethodIBus is deleted. | |
| 497 TEST_F(InputMethodIBusTest, CreateContextSuccessDelayed) { | |
| 498 CreateInputContextDelayHandler create_input_context_handler( | |
| 499 dbus::ObjectPath("Sample object path")); | |
| 500 mock_ibus_client_->set_create_input_context_handler(base::Bind( | |
| 501 &CreateInputContextDelayHandler::Run, | |
| 502 base::Unretained(&create_input_context_handler))); | |
| 503 | |
| 504 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | |
| 505 ime_->Init(true); | |
| 506 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | |
| 507 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | |
| 508 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 509 | |
| 510 ime_->SetFocusedTextInputClient(NULL); | |
| 511 ime_.reset(); | |
| 512 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 513 | |
| 514 create_input_context_handler.RunCallback(true); | |
| 515 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | |
| 516 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | |
| 517 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 518 } | |
| 519 | |
| 520 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds | |
| 521 // after disconnected from ibus-daemon. | |
| 522 TEST_F(InputMethodIBusTest, CreateContextSuccessDelayedAfterDisconnection) { | |
| 523 CreateInputContextDelayHandler create_input_context_handler( | |
| 524 dbus::ObjectPath("Sample object path")); | |
| 525 mock_ibus_client_->set_create_input_context_handler(base::Bind( | |
| 526 &CreateInputContextDelayHandler::Run, | |
| 527 base::Unretained(&create_input_context_handler))); | |
| 528 | |
| 529 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | |
| 530 ime_->Init(true); | |
| 531 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | |
| 532 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | |
| 533 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 534 | |
| 535 ime_->OnDisconnected(); | |
| 536 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 537 | |
| 538 create_input_context_handler.RunCallback(true); | |
| 539 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | |
| 540 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | |
| 541 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 542 } | |
| 543 | |
| 544 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds | |
| 545 // after disconnected from ibus-daemon. | |
| 546 TEST_F(InputMethodIBusTest, CreateContextFailDelayedAfterDisconnection) { | |
| 547 CreateInputContextDelayHandler create_input_context_handler( | |
| 548 dbus::ObjectPath("Sample object path")); | |
| 549 mock_ibus_client_->set_create_input_context_handler(base::Bind( | |
| 550 &CreateInputContextDelayHandler::Run, | |
| 551 base::Unretained(&create_input_context_handler))); | |
| 552 | |
| 553 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | |
| 554 ime_->Init(true); | |
| 555 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | |
| 556 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | |
| 557 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 558 | |
| 559 ime_->OnDisconnected(); | |
| 560 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 561 | |
| 562 create_input_context_handler.RunCallback(false); | |
| 563 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | |
| 564 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | |
| 565 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); | |
| 463 } | 566 } |
| 464 | 567 |
| 465 // Confirm that IBusClient::FocusIn is called on "connected" if input_type_ is | 568 // Confirm that IBusClient::FocusIn is called on "connected" if input_type_ is |
| 466 // TEXT. | 569 // TEXT. |
| 467 TEST_F(InputMethodIBusTest, FocusIn_Text) { | 570 TEST_F(InputMethodIBusTest, FocusIn_Text) { |
| 468 SetCreateContextSuccessHandler(); | 571 SetCreateContextSuccessHandler(); |
| 469 ime_->Init(true); | 572 ime_->Init(true); |
| 470 // A context shouldn't be created since the daemon is not running. | 573 // A context shouldn't be created since the daemon is not running. |
| 471 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); | 574 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); |
| 472 EXPECT_EQ(0U, on_input_method_changed_call_count_); | 575 EXPECT_EQ(0U, on_input_method_changed_call_count_); |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 771 composition_text.underlines[0].start_offset); | 874 composition_text.underlines[0].start_offset); |
| 772 EXPECT_EQ(GetOffsetInUTF16(kSampleText, selection.end_index), | 875 EXPECT_EQ(GetOffsetInUTF16(kSampleText, selection.end_index), |
| 773 composition_text.underlines[0].end_offset); | 876 composition_text.underlines[0].end_offset); |
| 774 EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color); | 877 EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color); |
| 775 EXPECT_TRUE(composition_text.underlines[0].thick); | 878 EXPECT_TRUE(composition_text.underlines[0].thick); |
| 776 } | 879 } |
| 777 | 880 |
| 778 // TODO(nona): Write more tests, especially for key event functions. | 881 // TODO(nona): Write more tests, especially for key event functions. |
| 779 | 882 |
| 780 } // namespace ui | 883 } // namespace ui |
| OLD | NEW |