| 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 "base/bind_helpers.h" | 5 #include "base/bind_helpers.h" |
| 6 #include "chrome/browser/extensions/extension_browsertest.h" | 6 #include "chrome/browser/extensions/extension_browsertest.h" |
| 7 #include "chrome/browser/extensions/extension_test_message_listener.h" | 7 #include "chrome/browser/extensions/extension_test_message_listener.h" |
| 8 #include "chrome/common/extensions/background_info.h" | 8 #include "chrome/common/extensions/background_info.h" |
| 9 #include "chromeos/dbus/ibus/ibus_text.h" | 9 #include "chromeos/dbus/ibus/ibus_text.h" |
| 10 #include "chromeos/ime/component_extension_ime_manager.h" | 10 #include "chromeos/ime/component_extension_ime_manager.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 namespace input_method { | 22 namespace input_method { |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 const char kIdentityIMEID[] = | 25 const char kIdentityIMEID[] = |
| 26 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpIdentityIME"; | 26 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpIdentityIME"; |
| 27 const char kToUpperIMEID[] = | 27 const char kToUpperIMEID[] = |
| 28 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpToUpperIME"; | 28 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpToUpperIME"; |
| 29 const char kAPIArgumentIMEID[] = | 29 const char kAPIArgumentIMEID[] = |
| 30 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpAPIArgumentIME"; | 30 "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpAPIArgumentIME"; |
| 31 | 31 |
| 32 const uint32 kAltKeyMask = 1 << 3; | |
| 33 const uint32 kCtrlKeyMask = 1 << 2; | |
| 34 const uint32 kShiftKeyMask = 1 << 0; | |
| 35 const uint32 kCapsLockMask = 1 << 1; | |
| 36 | |
| 37 // InputMethod extension should work on 1)normal extension, 2)normal extension | 32 // InputMethod extension should work on 1)normal extension, 2)normal extension |
| 38 // in incognito mode 3)component extension. | 33 // in incognito mode 3)component extension. |
| 39 enum TestType { | 34 enum TestType { |
| 40 kTestTypeNormal = 0, | 35 kTestTypeNormal = 0, |
| 41 kTestTypeIncognito = 1, | 36 kTestTypeIncognito = 1, |
| 42 kTestTypeComponent = 2, | 37 kTestTypeComponent = 2, |
| 43 }; | 38 }; |
| 44 | 39 |
| 45 class InputMethodEngineIBusBrowserTest | 40 class InputMethodEngineIBusBrowserTest |
| 46 : public ExtensionBrowserTest, | 41 : public ExtensionBrowserTest, |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 | 177 |
| 183 // onFocus event should be fired if FocusIn function is called. | 178 // onFocus event should be fired if FocusIn function is called. |
| 184 ExtensionTestMessageListener focus_listener("onFocus", false);; | 179 ExtensionTestMessageListener focus_listener("onFocus", false);; |
| 185 engine_handler->FocusIn(ibus::TEXT_INPUT_TYPE_TEXT); | 180 engine_handler->FocusIn(ibus::TEXT_INPUT_TYPE_TEXT); |
| 186 ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); | 181 ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); |
| 187 ASSERT_TRUE(focus_listener.was_satisfied()); | 182 ASSERT_TRUE(focus_listener.was_satisfied()); |
| 188 | 183 |
| 189 // onKeyEvent should be fired if ProcessKeyEvent is called. | 184 // onKeyEvent should be fired if ProcessKeyEvent is called. |
| 190 KeyEventDoneCallback callback(false); // EchoBackIME doesn't consume keys. | 185 KeyEventDoneCallback callback(false); // EchoBackIME doesn't consume keys. |
| 191 ExtensionTestMessageListener keyevent_listener("onKeyEvent", false); | 186 ExtensionTestMessageListener keyevent_listener("onKeyEvent", false); |
| 187 /* |
| 192 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 188 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. |
| 193 0x26, // KeyCode for 'a'. | 189 0x26, // KeyCode for 'a'. |
| 194 0, // No modifiers. | 190 0, // No modifiers. |
| 195 base::Bind(&KeyEventDoneCallback::Run, | 191 base::Bind(&KeyEventDoneCallback::Run, |
| 196 base::Unretained(&callback))); | 192 base::Unretained(&callback))); |
| 193 */ |
| 194 engine_handler->ProcessKeyEvent("a", // KeySym |
| 195 "KeyA", // KeyCode for 'a' |
| 196 true, // is_key_down |
| 197 false, // is_alt_down |
| 198 false, // is_ctrl_down |
| 199 false, // is_shift_down |
| 200 false, // is_caps_lock_down |
| 201 base::Bind(&KeyEventDoneCallback::Run, |
| 202 base::Unretained(&callback))); |
| 203 |
| 197 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 204 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 198 ASSERT_TRUE(keyevent_listener.was_satisfied()); | 205 ASSERT_TRUE(keyevent_listener.was_satisfied()); |
| 199 callback.WaitUntilCalled(); | 206 callback.WaitUntilCalled(); |
| 200 | 207 |
| 201 // onSurroundingTextChange should be fired if SetSurroundingText is called. | 208 // onSurroundingTextChange should be fired if SetSurroundingText is called. |
| 202 ExtensionTestMessageListener surrounding_text_listener( | 209 ExtensionTestMessageListener surrounding_text_listener( |
| 203 "onSurroundingTextChanged", false); | 210 "onSurroundingTextChanged", false); |
| 204 engine_handler->SetSurroundingText("text", // Surrounding text. | 211 engine_handler->SetSurroundingText("text", // Surrounding text. |
| 205 0, // focused position. | 212 0, // focused position. |
| 206 1); // anchor position. | 213 1); // anchor position. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 engine_handler->Enable(); | 272 engine_handler->Enable(); |
| 266 engine_handler->FocusIn(ibus::TEXT_INPUT_TYPE_TEXT); | 273 engine_handler->FocusIn(ibus::TEXT_INPUT_TYPE_TEXT); |
| 267 | 274 |
| 268 { | 275 { |
| 269 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:No"); | 276 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:No"); |
| 270 KeyEventDoneCallback callback(false); | 277 KeyEventDoneCallback callback(false); |
| 271 const std::string expected_value = | 278 const std::string expected_value = |
| 272 "onKeyEvent:keydown:a:KeyA:false:false:false:false"; | 279 "onKeyEvent:keydown:a:KeyA:false:false:false:false"; |
| 273 ExtensionTestMessageListener keyevent_listener(expected_value, false); | 280 ExtensionTestMessageListener keyevent_listener(expected_value, false); |
| 274 | 281 |
| 275 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 282 engine_handler->ProcessKeyEvent("a", // KeySym |
| 276 0x26, // KeyCode for 'a'. | 283 "KeyA", // KeyCode for 'a' |
| 277 0, // No modifiers. | 284 true, // is_key_down |
| 285 false, // is_alt_down |
| 286 false, // is_ctrl_down |
| 287 false, // is_shift_down |
| 288 false, // is_caps_lock_down |
| 278 base::Bind(&KeyEventDoneCallback::Run, | 289 base::Bind(&KeyEventDoneCallback::Run, |
| 279 base::Unretained(&callback))); | 290 base::Unretained(&callback))); |
| 280 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 291 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 281 EXPECT_TRUE(keyevent_listener.was_satisfied()); | 292 EXPECT_TRUE(keyevent_listener.was_satisfied()); |
| 282 callback.WaitUntilCalled(); | 293 callback.WaitUntilCalled(); |
| 283 } | 294 } |
| 284 { | 295 { |
| 285 SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:No, Shift:No, Caps:No"); | 296 SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:No, Shift:No, Caps:No"); |
| 286 KeyEventDoneCallback callback(false); | 297 KeyEventDoneCallback callback(false); |
| 287 const std::string expected_value = | 298 const std::string expected_value = |
| 288 "onKeyEvent:keydown:a:KeyA:true:false:false:false"; | 299 "onKeyEvent:keydown:a:KeyA:true:false:false:false"; |
| 289 ExtensionTestMessageListener keyevent_listener(expected_value, false); | 300 ExtensionTestMessageListener keyevent_listener(expected_value, false); |
| 290 | 301 |
| 291 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 302 engine_handler->ProcessKeyEvent("a", // KeySym |
| 292 0x26, // KeyCode for 'a'. | 303 "KeyA", // KeyCode for 'a' |
| 293 kCtrlKeyMask, | 304 true, // is_key_down |
| 305 false, // is_alt_down |
| 306 true, // is_ctrl_down |
| 307 false, // is_shift_down |
| 308 false, // is_caps_lock_down |
| 294 base::Bind(&KeyEventDoneCallback::Run, | 309 base::Bind(&KeyEventDoneCallback::Run, |
| 295 base::Unretained(&callback))); | 310 base::Unretained(&callback))); |
| 296 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 311 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 297 EXPECT_TRUE(keyevent_listener.was_satisfied()); | 312 EXPECT_TRUE(keyevent_listener.was_satisfied()); |
| 298 callback.WaitUntilCalled(); | 313 callback.WaitUntilCalled(); |
| 299 } | 314 } |
| 300 { | 315 { |
| 301 SCOPED_TRACE("KeyDown, Ctrl:No, alt:Yes, Shift:No, Caps:No"); | 316 SCOPED_TRACE("KeyDown, Ctrl:No, alt:Yes, Shift:No, Caps:No"); |
| 302 KeyEventDoneCallback callback(false); | 317 KeyEventDoneCallback callback(false); |
| 303 const std::string expected_value = | 318 const std::string expected_value = |
| 304 "onKeyEvent:keydown:a:KeyA:false:true:false:false"; | 319 "onKeyEvent:keydown:a:KeyA:false:true:false:false"; |
| 305 ExtensionTestMessageListener keyevent_listener(expected_value, false); | 320 ExtensionTestMessageListener keyevent_listener(expected_value, false); |
| 306 | 321 |
| 307 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 322 engine_handler->ProcessKeyEvent("a", // KeySym |
| 308 0x26, // KeyCode for 'a'. | 323 "KeyA", // KeyCode for 'a' |
| 309 kAltKeyMask, | 324 true, // is_key_down |
| 325 true, // is_alt_down |
| 326 false, // is_ctrl_down |
| 327 false, // is_shift_down |
| 328 false, // is_caps_lock_down |
| 310 base::Bind(&KeyEventDoneCallback::Run, | 329 base::Bind(&KeyEventDoneCallback::Run, |
| 311 base::Unretained(&callback))); | 330 base::Unretained(&callback))); |
| 312 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 331 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 313 EXPECT_TRUE(keyevent_listener.was_satisfied()); | 332 EXPECT_TRUE(keyevent_listener.was_satisfied()); |
| 314 callback.WaitUntilCalled(); | 333 callback.WaitUntilCalled(); |
| 315 } | 334 } |
| 316 { | 335 { |
| 317 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:No"); | 336 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:No"); |
| 318 KeyEventDoneCallback callback(false); | 337 KeyEventDoneCallback callback(false); |
| 319 const std::string expected_value = | 338 const std::string expected_value = |
| 320 "onKeyEvent:keydown:a:KeyA:false:false:true:false"; | 339 "onKeyEvent:keydown:a:KeyA:false:false:true:false"; |
| 321 ExtensionTestMessageListener keyevent_listener(expected_value, false); | 340 ExtensionTestMessageListener keyevent_listener(expected_value, false); |
| 322 | 341 |
| 323 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 342 engine_handler->ProcessKeyEvent("a", // KeySym |
| 324 0x26, // KeyCode for 'a'. | 343 "KeyA", // KeyCode for 'a' |
| 325 kShiftKeyMask, | 344 true, // is_key_down |
| 345 false, // is_alt_down |
| 346 false, // is_ctrl_down |
| 347 true, // is_shift_down |
| 348 false, // is_caps_lock_down |
| 326 base::Bind(&KeyEventDoneCallback::Run, | 349 base::Bind(&KeyEventDoneCallback::Run, |
| 327 base::Unretained(&callback))); | 350 base::Unretained(&callback))); |
| 328 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 351 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 329 EXPECT_TRUE(keyevent_listener.was_satisfied()); | 352 EXPECT_TRUE(keyevent_listener.was_satisfied()); |
| 330 callback.WaitUntilCalled(); | 353 callback.WaitUntilCalled(); |
| 331 } | 354 } |
| 332 { | 355 { |
| 333 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:Yes"); | 356 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:Yes"); |
| 334 KeyEventDoneCallback callback(false); | 357 KeyEventDoneCallback callback(false); |
| 335 const std::string expected_value = | 358 const std::string expected_value = |
| 336 "onKeyEvent:keydown:a:KeyA:false:false:false:true"; | 359 "onKeyEvent:keydown:a:KeyA:false:false:false:true"; |
| 337 ExtensionTestMessageListener keyevent_listener(expected_value, false); | 360 ExtensionTestMessageListener keyevent_listener(expected_value, false); |
| 338 | 361 |
| 339 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 362 engine_handler->ProcessKeyEvent("a", // KeySym |
| 340 0x26, // KeyCode for 'a'. | 363 "KeyA", // KeyCode for 'a' |
| 341 kCapsLockMask, | 364 true, // is_key_down |
| 365 false, // is_alt_down |
| 366 false, // is_ctrl_down |
| 367 false, // is_shift_down |
| 368 true, // is_caps_lock_down |
| 342 base::Bind(&KeyEventDoneCallback::Run, | 369 base::Bind(&KeyEventDoneCallback::Run, |
| 343 base::Unretained(&callback))); | 370 base::Unretained(&callback))); |
| 344 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 371 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 345 EXPECT_TRUE(keyevent_listener.was_satisfied()); | 372 EXPECT_TRUE(keyevent_listener.was_satisfied()); |
| 346 callback.WaitUntilCalled(); | 373 callback.WaitUntilCalled(); |
| 347 } | 374 } |
| 348 { | 375 { |
| 349 SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:Yes, Shift:No, Caps:No"); | 376 SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:Yes, Shift:No, Caps:No"); |
| 350 KeyEventDoneCallback callback(false); | 377 KeyEventDoneCallback callback(false); |
| 351 const std::string expected_value = | 378 const std::string expected_value = |
| 352 "onKeyEvent:keydown:a:KeyA:true:true:false:false"; | 379 "onKeyEvent:keydown:a:KeyA:true:true:false:false"; |
| 353 ExtensionTestMessageListener keyevent_listener(expected_value, false); | 380 ExtensionTestMessageListener keyevent_listener(expected_value, false); |
| 354 | 381 |
| 355 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 382 engine_handler->ProcessKeyEvent("a", // KeySym |
| 356 0x26, // KeyCode for 'a'. | 383 "KeyA", // KeyCode for 'a' |
| 357 kAltKeyMask | kCtrlKeyMask, | 384 true, // is_key_down |
| 385 true, // is_alt_down |
| 386 true, // is_ctrl_down |
| 387 false, // is_shift_down |
| 388 false, // is_caps_lock_down |
| 358 base::Bind(&KeyEventDoneCallback::Run, | 389 base::Bind(&KeyEventDoneCallback::Run, |
| 359 base::Unretained(&callback))); | 390 base::Unretained(&callback))); |
| 360 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 391 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 361 EXPECT_TRUE(keyevent_listener.was_satisfied()); | 392 EXPECT_TRUE(keyevent_listener.was_satisfied()); |
| 362 callback.WaitUntilCalled(); | 393 callback.WaitUntilCalled(); |
| 363 } | 394 } |
| 364 { | 395 { |
| 365 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:Yes"); | 396 SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:Yes"); |
| 366 KeyEventDoneCallback callback(false); | 397 KeyEventDoneCallback callback(false); |
| 367 const std::string expected_value = | 398 const std::string expected_value = |
| 368 "onKeyEvent:keydown:a:KeyA:false:false:true:true"; | 399 "onKeyEvent:keydown:a:KeyA:false:false:true:true"; |
| 369 ExtensionTestMessageListener keyevent_listener(expected_value, false); | 400 ExtensionTestMessageListener keyevent_listener(expected_value, false); |
| 370 | 401 |
| 371 engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. | 402 engine_handler->ProcessKeyEvent("a", // KeySym |
| 372 0x26, // KeyCode for 'a'. | 403 "KeyA", // KeyCode for 'a' |
| 373 kShiftKeyMask | kCapsLockMask, | 404 true, // is_key_down |
| 405 false, // is_alt_down |
| 406 false, // is_ctrl_down |
| 407 true, // is_shift_down |
| 408 true, // is_caps_lock_down |
| 374 base::Bind(&KeyEventDoneCallback::Run, | 409 base::Bind(&KeyEventDoneCallback::Run, |
| 375 base::Unretained(&callback))); | 410 base::Unretained(&callback))); |
| 376 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); | 411 ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); |
| 377 EXPECT_TRUE(keyevent_listener.was_satisfied()); | 412 EXPECT_TRUE(keyevent_listener.was_satisfied()); |
| 378 callback.WaitUntilCalled(); | 413 callback.WaitUntilCalled(); |
| 379 } | 414 } |
| 380 // TODO(nona): Add browser tests for other API as well. | 415 // TODO(nona): Add browser tests for other API as well. |
| 381 { | 416 { |
| 382 SCOPED_TRACE("commitText test"); | 417 SCOPED_TRACE("commitText test"); |
| 383 mock_input_context->Reset(); | 418 mock_input_context->Reset(); |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 mock_input_context->last_delete_surrounding_text_arg().length); | 830 mock_input_context->last_delete_surrounding_text_arg().length); |
| 796 } | 831 } |
| 797 IBusBridge::Get()->SetInputContextHandler(NULL); | 832 IBusBridge::Get()->SetInputContextHandler(NULL); |
| 798 IBusBridge::Get()->SetCandidateWindowHandler(NULL); | 833 IBusBridge::Get()->SetCandidateWindowHandler(NULL); |
| 799 IBusBridge::Get()->SetPropertyHandler(NULL); | 834 IBusBridge::Get()->SetPropertyHandler(NULL); |
| 800 } | 835 } |
| 801 | 836 |
| 802 } // namespace | 837 } // namespace |
| 803 } // namespace input_method | 838 } // namespace input_method |
| 804 } // namespace chromeos | 839 } // namespace chromeos |
| OLD | NEW |