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 |