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