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 18 matching lines...) Expand all Loading... |
51 | 52 |
52 void Run(const std::string& client_name, | 53 void Run(const std::string& client_name, |
53 const chromeos::IBusClient::CreateInputContextCallback& callback, | 54 const chromeos::IBusClient::CreateInputContextCallback& callback, |
54 const chromeos::IBusClient::ErrorCallback& error_callback) { | 55 const chromeos::IBusClient::ErrorCallback& error_callback) { |
55 EXPECT_EQ("chrome", client_name); | 56 EXPECT_EQ("chrome", client_name); |
56 callback.Run(object_path_); | 57 callback.Run(object_path_); |
57 } | 58 } |
58 | 59 |
59 private: | 60 private: |
60 dbus::ObjectPath object_path_; | 61 dbus::ObjectPath object_path_; |
| 62 |
| 63 DISALLOW_COPY_AND_ASSIGN(CreateInputContextSuccessHandler); |
61 }; | 64 }; |
62 | 65 |
63 class CreateInputContextFailHandler { | 66 class CreateInputContextFailHandler { |
64 public: | 67 public: |
| 68 CreateInputContextFailHandler() {} |
65 void Run(const std::string& client_name, | 69 void Run(const std::string& client_name, |
66 const chromeos::IBusClient::CreateInputContextCallback& callback, | 70 const chromeos::IBusClient::CreateInputContextCallback& callback, |
67 const chromeos::IBusClient::ErrorCallback& error_callback) { | 71 const chromeos::IBusClient::ErrorCallback& error_callback) { |
68 error_callback.Run(); | 72 error_callback.Run(); |
69 } | 73 } |
| 74 |
| 75 private: |
| 76 DISALLOW_COPY_AND_ASSIGN(CreateInputContextFailHandler); |
70 }; | 77 }; |
71 | 78 |
72 class CreateInputContextNoResponseHandler { | 79 class CreateInputContextNoResponseHandler { |
73 public: | 80 public: |
| 81 CreateInputContextNoResponseHandler() {} |
74 void Run(const std::string& client_name, | 82 void Run(const std::string& client_name, |
75 const chromeos::IBusClient::CreateInputContextCallback& callback, | 83 const chromeos::IBusClient::CreateInputContextCallback& callback, |
76 const chromeos::IBusClient::ErrorCallback& error_callback) { | 84 const chromeos::IBusClient::ErrorCallback& error_callback) { |
77 } | 85 } |
| 86 |
| 87 private: |
| 88 DISALLOW_COPY_AND_ASSIGN(CreateInputContextNoResponseHandler); |
78 }; | 89 }; |
79 | 90 |
80 class CreateInputContextDelayFailHandler { | 91 class CreateInputContextDelayHandler { |
81 public: | 92 public: |
82 ~CreateInputContextDelayFailHandler() { | 93 explicit CreateInputContextDelayHandler(const dbus::ObjectPath& object_path) |
83 error_callback_.Run(); | 94 : object_path_(object_path) { |
84 } | 95 } |
85 | 96 |
86 void Run(const std::string& client_name, | 97 void Run(const std::string& client_name, |
87 const chromeos::IBusClient::CreateInputContextCallback& callback, | 98 const chromeos::IBusClient::CreateInputContextCallback& callback, |
88 const chromeos::IBusClient::ErrorCallback& error_callback) { | 99 const chromeos::IBusClient::ErrorCallback& error_callback) { |
| 100 callback_ = callback; |
89 error_callback_ = error_callback; | 101 error_callback_ = error_callback; |
90 } | 102 } |
91 | 103 |
| 104 void RunCallback(bool success) { |
| 105 if (success) |
| 106 callback_.Run(object_path_); |
| 107 else |
| 108 error_callback_.Run(); |
| 109 } |
| 110 |
| 111 private: |
| 112 dbus::ObjectPath object_path_; |
| 113 chromeos::IBusClient::CreateInputContextCallback callback_; |
92 chromeos::IBusClient::ErrorCallback error_callback_; | 114 chromeos::IBusClient::ErrorCallback error_callback_; |
| 115 |
| 116 DISALLOW_COPY_AND_ASSIGN(CreateInputContextDelayHandler); |
93 }; | 117 }; |
94 | 118 |
95 class InputMethodIBusTest : public internal::InputMethodDelegate, | 119 class InputMethodIBusTest : public internal::InputMethodDelegate, |
96 public testing::Test, | 120 public testing::Test, |
97 public TextInputClient { | 121 public TextInputClient { |
98 public: | 122 public: |
99 InputMethodIBusTest() { | 123 InputMethodIBusTest() { |
100 ResetFlags(); | 124 ResetFlags(); |
101 } | 125 } |
102 | 126 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 | 270 |
247 // Variables that will be returned from the ui::TextInputClient functions. | 271 // Variables that will be returned from the ui::TextInputClient functions. |
248 TextInputType input_type_; | 272 TextInputType input_type_; |
249 bool can_compose_inline_; | 273 bool can_compose_inline_; |
250 gfx::Rect caret_bounds_; | 274 gfx::Rect caret_bounds_; |
251 | 275 |
252 // Variables for mock dbus connections. | 276 // Variables for mock dbus connections. |
253 chromeos::MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_; | 277 chromeos::MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_; |
254 chromeos::MockIBusClient* mock_ibus_client_; | 278 chromeos::MockIBusClient* mock_ibus_client_; |
255 chromeos::MockIBusInputContextClient* mock_ibus_input_context_client_; | 279 chromeos::MockIBusInputContextClient* mock_ibus_input_context_client_; |
| 280 |
| 281 DISALLOW_COPY_AND_ASSIGN(InputMethodIBusTest); |
256 }; | 282 }; |
257 | 283 |
258 // Tests public APIs in ui::InputMethod first. | 284 // Tests public APIs in ui::InputMethod first. |
259 | 285 |
260 TEST_F(InputMethodIBusTest, GetInputLocale) { | 286 TEST_F(InputMethodIBusTest, GetInputLocale) { |
261 // ui::InputMethodIBus does not support the API. | 287 // ui::InputMethodIBus does not support the API. |
262 ime_->Init(true); | 288 ime_->Init(true); |
263 EXPECT_EQ("", ime_->GetInputLocale()); | 289 EXPECT_EQ("", ime_->GetInputLocale()); |
264 } | 290 } |
265 | 291 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 TEST_F(InputMethodIBusTest, InitiallyConnected) { | 377 TEST_F(InputMethodIBusTest, InitiallyConnected) { |
352 SetCreateContextSuccessHandler(); | 378 SetCreateContextSuccessHandler(); |
353 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 379 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
354 ime_->Init(true); | 380 ime_->Init(true); |
355 // An input context should be created immediately since is_connected_ is true. | 381 // An input context should be created immediately since is_connected_ is true. |
356 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 382 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
357 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); | 383 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 | 384 // However, since the current text input type is 'NONE' (the default), FocusIn |
359 // shouldn't be called. | 385 // shouldn't be called. |
360 EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); | 386 EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); |
| 387 EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
361 } | 388 } |
362 | 389 |
363 // Create ui::InputMethodIBus, then start ibus-daemon. | 390 // Create ui::InputMethodIBus, then start ibus-daemon. |
364 TEST_F(InputMethodIBusTest, InitiallyDisconnected) { | 391 TEST_F(InputMethodIBusTest, InitiallyDisconnected) { |
365 SetCreateContextSuccessHandler(); | 392 SetCreateContextSuccessHandler(); |
366 ime_->Init(true); | 393 ime_->Init(true); |
367 // A context shouldn't be created since the daemon is not running. | 394 // A context shouldn't be created since the daemon is not running. |
368 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); | 395 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); |
369 // Start the daemon. | 396 // Start the daemon. |
370 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 397 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
371 ime_->OnConnected(); | 398 ime_->OnConnected(); |
372 // A context should be created upon the signal delivery. | 399 // A context should be created upon the signal delivery. |
373 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 400 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
374 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); | 401 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()); | 402 EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); |
| 403 EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
376 } | 404 } |
377 | 405 |
378 // Confirm that ui::InputMethodIBus does not crash on "disconnected" signal | 406 // Confirm that ui::InputMethodIBus does not crash on "disconnected" signal |
379 // delivery. | 407 // delivery. |
380 TEST_F(InputMethodIBusTest, Disconnect) { | 408 TEST_F(InputMethodIBusTest, Disconnect) { |
381 SetCreateContextSuccessHandler(); | 409 SetCreateContextSuccessHandler(); |
382 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 410 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
383 ime_->Init(true); | 411 ime_->Init(true); |
384 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 412 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
385 // Currently we can't shutdown IBusBus connection except in | 413 // Currently we can't shutdown IBusBus connection except in |
386 // DBusThreadManager's shutting down. So set ibus_bus_ as NULL to emulate | 414 // DBusThreadManager's shutting down. So set ibus_bus_ as NULL to emulate |
387 // dynamical shutting down. | 415 // dynamical shutting down. |
388 mock_dbus_thread_manager_->set_ibus_bus(NULL); | 416 mock_dbus_thread_manager_->set_ibus_bus(NULL); |
389 ime_->OnDisconnected(); | 417 ime_->OnDisconnected(); |
| 418 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
390 } | 419 } |
391 | 420 |
392 // Confirm that ui::InputMethodIBus re-creates an input context when ibus-daemon | 421 // Confirm that ui::InputMethodIBus re-creates an input context when ibus-daemon |
393 // restarts. | 422 // restarts. |
394 TEST_F(InputMethodIBusTest, DisconnectThenReconnect) { | 423 TEST_F(InputMethodIBusTest, DisconnectThenReconnect) { |
395 SetCreateContextSuccessHandler(); | 424 SetCreateContextSuccessHandler(); |
396 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 425 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
397 ime_->Init(true); | 426 ime_->Init(true); |
398 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 427 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
399 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); | 428 EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); |
400 EXPECT_EQ(0, | 429 EXPECT_EQ(0, |
401 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); | 430 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); |
402 mock_dbus_thread_manager_->set_ibus_bus(NULL); | 431 mock_dbus_thread_manager_->set_ibus_bus(NULL); |
403 ime_->OnDisconnected(); | 432 ime_->OnDisconnected(); |
| 433 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
404 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 434 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
405 ime_->OnConnected(); | 435 ime_->OnConnected(); |
406 // Check if the old context is deleted. | 436 // Check if the old context is deleted. |
407 EXPECT_EQ(1, | 437 EXPECT_EQ(1, |
408 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); | 438 mock_ibus_input_context_client_->reset_object_proxy_call_caount()); |
409 // Check if a new context is created. | 439 // Check if a new context is created. |
410 EXPECT_EQ(2, mock_ibus_client_->create_input_context_call_count()); | 440 EXPECT_EQ(2, mock_ibus_client_->create_input_context_call_count()); |
411 EXPECT_EQ(2, mock_ibus_input_context_client_->set_capabilities_call_count()); | 441 EXPECT_EQ(2, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 442 EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
412 } | 443 } |
413 | 444 |
414 // Confirm that ui::InputMethodIBus does not crash even if NULL context is | 445 // Confirm that ui::InputMethodIBus does not crash even if NULL context is |
415 // passed. | 446 // passed. |
416 // TODO(yusukes): Currently, ui::InputMethodIBus does not try to create ic once | 447 // 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 | 448 // it fails (unless ibus sends the "connected" signal to Chrome again). It might |
418 // be better to add some retry logic. Will revisit later. | 449 // be better to add some retry logic. Will revisit later. |
419 TEST_F(InputMethodIBusTest, CreateContextFail) { | 450 TEST_F(InputMethodIBusTest, CreateContextFail) { |
420 CreateInputContextFailHandler create_input_context_handler; | 451 CreateInputContextFailHandler create_input_context_handler; |
421 mock_ibus_client_->set_create_input_context_handler(base::Bind( | 452 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
422 &CreateInputContextFailHandler::Run, | 453 &CreateInputContextFailHandler::Run, |
423 base::Unretained(&create_input_context_handler))); | 454 base::Unretained(&create_input_context_handler))); |
424 | 455 |
425 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 456 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
426 ime_->Init(true); | 457 ime_->Init(true); |
427 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 458 // InputMethodIBus tries several times if the CreateInputContext method call |
| 459 // is failed. |
| 460 EXPECT_EQ(kCreateInputContextMaxTrialCount, |
| 461 mock_ibus_client_->create_input_context_call_count()); |
428 // |set_capabilities_call_count()| should be zero since a context is not | 462 // |set_capabilities_call_count()| should be zero since a context is not |
429 // created yet. | 463 // created yet. |
430 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | 464 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 465 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
431 } | 466 } |
432 | 467 |
433 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon does not | 468 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon does not |
434 // respond. | 469 // respond. |
435 TEST_F(InputMethodIBusTest, CreateContextNoResp) { | 470 TEST_F(InputMethodIBusTest, CreateContextNoResp) { |
436 CreateInputContextNoResponseHandler create_input_context_handler; | 471 CreateInputContextNoResponseHandler create_input_context_handler; |
437 mock_ibus_client_->set_create_input_context_handler(base::Bind( | 472 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
438 &CreateInputContextNoResponseHandler::Run, | 473 &CreateInputContextNoResponseHandler::Run, |
439 base::Unretained(&create_input_context_handler))); | 474 base::Unretained(&create_input_context_handler))); |
440 | 475 |
441 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 476 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
442 ime_->Init(true); | 477 ime_->Init(true); |
443 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 478 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
444 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | 479 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 480 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
445 } | 481 } |
446 | 482 |
447 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds | 483 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
448 // after ui::InputMethodIBus is deleted. See comments in ~MockIBusClient() as | 484 // after ui::InputMethodIBus is deleted. |
449 // well. | 485 TEST_F(InputMethodIBusTest, CreateContextFailDelayed) { |
450 TEST_F(InputMethodIBusTest, CreateContextDelayed) { | 486 CreateInputContextDelayHandler create_input_context_handler( |
451 CreateInputContextDelayFailHandler create_input_context_handler; | 487 dbus::ObjectPath("Sample object path")); |
452 mock_ibus_client_->set_create_input_context_handler(base::Bind( | 488 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
453 &CreateInputContextDelayFailHandler::Run, | 489 &CreateInputContextDelayHandler::Run, |
454 base::Unretained(&create_input_context_handler))); | 490 base::Unretained(&create_input_context_handler))); |
455 | 491 |
456 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); | 492 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
457 ime_->Init(true); | 493 ime_->Init(true); |
458 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); | 494 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
459 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); | 495 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 | 496 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
461 // destructor for the handler will run. In the latter function, a new input | 497 |
462 // context will be created and passed to InitOrAbandonInputContext(). | 498 ime_->SetFocusedTextInputClient(NULL); |
| 499 ime_.reset(); |
| 500 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 501 |
| 502 create_input_context_handler.RunCallback(false); |
| 503 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 504 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 505 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 506 } |
| 507 |
| 508 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| 509 // after ui::InputMethodIBus is deleted. |
| 510 TEST_F(InputMethodIBusTest, CreateContextSuccessDelayed) { |
| 511 CreateInputContextDelayHandler create_input_context_handler( |
| 512 dbus::ObjectPath("Sample object path")); |
| 513 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| 514 &CreateInputContextDelayHandler::Run, |
| 515 base::Unretained(&create_input_context_handler))); |
| 516 |
| 517 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 518 ime_->Init(true); |
| 519 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 520 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 521 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 522 |
| 523 ime_->SetFocusedTextInputClient(NULL); |
| 524 ime_.reset(); |
| 525 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 526 |
| 527 create_input_context_handler.RunCallback(true); |
| 528 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 529 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 530 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 531 } |
| 532 |
| 533 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| 534 // after disconnected from ibus-daemon. |
| 535 TEST_F(InputMethodIBusTest, CreateContextSuccessDelayedAfterDisconnection) { |
| 536 CreateInputContextDelayHandler create_input_context_handler( |
| 537 dbus::ObjectPath("Sample object path")); |
| 538 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| 539 &CreateInputContextDelayHandler::Run, |
| 540 base::Unretained(&create_input_context_handler))); |
| 541 |
| 542 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 543 ime_->Init(true); |
| 544 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 545 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 546 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 547 |
| 548 ime_->OnDisconnected(); |
| 549 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 550 |
| 551 create_input_context_handler.RunCallback(true); |
| 552 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 553 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 554 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 555 } |
| 556 |
| 557 // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| 558 // after disconnected from ibus-daemon. |
| 559 TEST_F(InputMethodIBusTest, CreateContextFailDelayedAfterDisconnection) { |
| 560 CreateInputContextDelayHandler create_input_context_handler( |
| 561 dbus::ObjectPath("Sample object path")); |
| 562 mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| 563 &CreateInputContextDelayHandler::Run, |
| 564 base::Unretained(&create_input_context_handler))); |
| 565 |
| 566 chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| 567 ime_->Init(true); |
| 568 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 569 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 570 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 571 |
| 572 ime_->OnDisconnected(); |
| 573 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| 574 |
| 575 create_input_context_handler.RunCallback(false); |
| 576 EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| 577 EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| 578 EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
463 } | 579 } |
464 | 580 |
465 // Confirm that IBusClient::FocusIn is called on "connected" if input_type_ is | 581 // Confirm that IBusClient::FocusIn is called on "connected" if input_type_ is |
466 // TEXT. | 582 // TEXT. |
467 TEST_F(InputMethodIBusTest, FocusIn_Text) { | 583 TEST_F(InputMethodIBusTest, FocusIn_Text) { |
468 SetCreateContextSuccessHandler(); | 584 SetCreateContextSuccessHandler(); |
469 ime_->Init(true); | 585 ime_->Init(true); |
470 // A context shouldn't be created since the daemon is not running. | 586 // A context shouldn't be created since the daemon is not running. |
471 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); | 587 EXPECT_EQ(0, mock_ibus_client_->create_input_context_call_count()); |
472 EXPECT_EQ(0U, on_input_method_changed_call_count_); | 588 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); | 887 composition_text.underlines[0].start_offset); |
772 EXPECT_EQ(GetOffsetInUTF16(kSampleText, selection.end_index), | 888 EXPECT_EQ(GetOffsetInUTF16(kSampleText, selection.end_index), |
773 composition_text.underlines[0].end_offset); | 889 composition_text.underlines[0].end_offset); |
774 EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color); | 890 EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color); |
775 EXPECT_TRUE(composition_text.underlines[0].thick); | 891 EXPECT_TRUE(composition_text.underlines[0].thick); |
776 } | 892 } |
777 | 893 |
778 // TODO(nona): Write more tests, especially for key event functions. | 894 // TODO(nona): Write more tests, especially for key event functions. |
779 | 895 |
780 } // namespace ui | 896 } // namespace ui |
OLD | NEW |