15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ime_adapter_android.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <android/input.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/scoped_java_ref.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_android.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ImeAdapter_jni.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h" 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertJavaStringToUTF16; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps a java KeyEvent into a NativeWebKeyboardEvent. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |java_key_event| is used to maintain a globalref for KeyEvent. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |action| will help determine the WebInputEvent type. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type, |modifiers|, |time_ms|, |key_code|, |unicode_char| is used to create 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKeyboardEvent. |key_code| is also needed ad need to treat the enter key 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as a key press of character \r. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWebKeyboardEvent NativeWebKeyboardEventFromKeyEvent( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jobject java_key_event, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int action, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int modifiers, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long time_ms, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_code, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_system_key, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int unicode_char) { 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::Type type = blink::WebInputEvent::Undefined; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (action == AKEY_EVENT_ACTION_DOWN) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) type = blink::WebInputEvent::RawKeyDown; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (action == AKEY_EVENT_ACTION_UP) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) type = blink::WebInputEvent::KeyUp; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NativeWebKeyboardEvent(java_key_event, type, modifiers, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_ms, key_code, unicode_char, is_system_key); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterImeAdapter(JNIEnv* env) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!RegisterNativesImpl(env)) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_ImeAdapter_initializeWebInputEvents(env, 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::RawKeyDown, 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::KeyUp, 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::Char, 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::ShiftKey, 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::AltKey, 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::ControlKey, 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::CapsLockOn, 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::NumLockOn); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_ImeAdapter_initializeTextInputTypes( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_NONE, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_TEXT, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_TEXT_AREA, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_PASSWORD, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_SEARCH, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_URL, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_EMAIL, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_TELEPHONE, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_NUMBER, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImeAdapterAndroid::ImeAdapterAndroid(RenderWidgetHostViewAndroid* rwhva) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : rwhva_(rwhva) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImeAdapterAndroid::~ImeAdapterAndroid() { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::android::ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!obj.is_null()) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_ImeAdapter_detach(env, obj.obj()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImeAdapterAndroid::SendSyntheticKeyEvent(JNIEnv*, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jobject, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long time_ms, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_code, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int text) { 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NativeWebKeyboardEvent event(static_cast<blink::WebInputEvent::Type>(type), 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 /* modifiers */, time_ms / 1000.0, key_code, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text, false /* is_system_key */); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhva_->SendKeyEvent(event); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImeAdapterAndroid::SendKeyEvent(JNIEnv* env, jobject, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jobject original_key_event, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int action, int modifiers, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long time_ms, int key_code, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_system_key, int unicode_char) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWebKeyboardEvent event = NativeWebKeyboardEventFromKeyEvent( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env, original_key_event, action, modifiers, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_ms, key_code, is_system_key, unicode_char); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool key_down_text_insertion = 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event.type == blink::WebInputEvent::RawKeyDown && event.text[0]; 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If we are going to follow up with a synthetic Char event, then that's the 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // one we expect to test if it's handled or unhandled, so skip handling the 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // "real" event in the browser. 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.skip_in_browser = key_down_text_insertion; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhva_->SendKeyEvent(event); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (key_down_text_insertion) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a Char event, but without an os_event since we don't want to 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // roundtrip back to java such synthetic event. 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NativeWebKeyboardEvent char_event(blink::WebInputEvent::Char, modifiers, 1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch time_ms, key_code, unicode_char, 1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch is_system_key); 1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch char_event.skip_in_browser = key_down_text_insertion; 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rwhva_->SendKeyEvent(char_event); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::SetComposingText(JNIEnv* env, jobject, jstring text, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_cursor_pos) { 135c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text16 = ConvertJavaStringToUTF16(env, text); 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<blink::WebCompositionUnderline> underlines; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underlines.push_back( 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCompositionUnderline(0, text16.length(), SK_ColorBLACK, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new_cursor_position is as described in the Android API for 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InputConnection#setComposingText, whereas the parameters for 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ImeSetComposition are relative to the start of the composition. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_cursor_pos > 0) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_cursor_pos = text16.length() + new_cursor_pos - 1; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhi->ImeSetComposition(text16, underlines, new_cursor_pos, new_cursor_pos); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImeAdapterAndroid::CommitText(JNIEnv* env, jobject, jstring text) { 154c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text16 = ConvertJavaStringToUTF16(env, text); 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) rwhi->ImeConfirmComposition(text16, gfx::Range::InvalidRange(), false); 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ImeAdapterAndroid::FinishComposingText(JNIEnv* env, jobject) { 163c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!rwhi) 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rwhi->ImeConfirmComposition(base::string16(), gfx::Range::InvalidRange(), 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) true); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImeAdapterAndroid::AttachImeAdapter(JNIEnv* env, jobject java_object) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) java_ime_adapter_ = JavaObjectWeakGlobalRef(env, java_object); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImeAdapterAndroid::CancelComposition() { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::android::ScopedJavaLocalRef<jobject> obj = 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) java_ime_adapter_.get(AttachCurrentThread()); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!obj.is_null()) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_ImeAdapter_cancelComposition(AttachCurrentThread(), obj.obj()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::SetEditableSelectionOffsets(JNIEnv*, jobject, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start, int end) { 184c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhi->Send(new ViewMsg_SetEditableSelectionOffsets(rwhi->GetRoutingID(), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start, end)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::SetComposingRegion(JNIEnv*, jobject, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start, int end) { 194c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<blink::WebCompositionUnderline> underlines; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underlines.push_back( 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCompositionUnderline(0, end - start, SK_ColorBLACK, false)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhi->Send(new ViewMsg_SetCompositionFromExistingText( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhi->GetRoutingID(), start, end, underlines)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::DeleteSurroundingText(JNIEnv*, jobject, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int before, int after) { 208c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhi->Send(new ViewMsg_ExtendSelectionAndDelete(rwhi->GetRoutingID(), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) before, after)); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::Unselect(JNIEnv* env, jobject) { 217c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rwhi->Unselect(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::SelectAll(JNIEnv* env, jobject) { 225c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rwhi->SelectAll(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::Cut(JNIEnv* env, jobject) { 233c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rwhi->Cut(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::Copy(JNIEnv* env, jobject) { 241c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rwhi->Copy(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImeAdapterAndroid::Paste(JNIEnv* env, jobject) { 249c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHostImpl* rwhi = GetRenderWidgetHostImpl(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rwhi) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rwhi->Paste(); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ImeAdapterAndroid::ResetImeAdapter(JNIEnv* env, jobject) { 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) java_ime_adapter_.reset(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 260c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochRenderWidgetHostImpl* ImeAdapterAndroid::GetRenderWidgetHostImpl() { 261c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch DCHECK(rwhva_); 262c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch RenderWidgetHost* rwh = rwhva_->GetRenderWidgetHost(); 263c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (!rwh) 264c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return NULL; 265c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 266c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return RenderWidgetHostImpl::From(rwh); 267c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch} 268c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 270