Index: content/browser/renderer_host/ime_adapter_android.cc |
diff --git a/content/browser/renderer_host/ime_adapter_android.cc b/content/browser/renderer_host/ime_adapter_android.cc |
index bb8a938a2b37f261362f96e56819d518d5ee921f..38ff4a7a8f5698c0a3f42cb4781761c9f2c60a27 100644 |
--- a/content/browser/renderer_host/ime_adapter_android.cc |
+++ b/content/browser/renderer_host/ime_adapter_android.cc |
@@ -31,6 +31,8 @@ |
using base::android::AttachCurrentThread; |
using base::android::ConvertJavaStringToUTF16; |
using base::android::JavaParamRef; |
+using base::android::ScopedJavaLocalRef; |
+using base::WeakPtr; |
namespace content { |
namespace { |
@@ -63,6 +65,11 @@ bool RegisterImeAdapter(JNIEnv* env) { |
return RegisterNativesImpl(env); |
} |
+jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
+ ImeAdapterAndroid* adapter = new ImeAdapterAndroid(env, obj); |
+ return reinterpret_cast<intptr_t>(adapter); |
+} |
+ |
// Callback from Java to convert BackgroundColorSpan data to a |
// blink::WebCompositionUnderline instance, and append it to |underlines_ptr|. |
void AppendBackgroundColorSpan(JNIEnv*, |
@@ -105,16 +112,28 @@ void AppendUnderlineSpan(JNIEnv*, |
SK_ColorTRANSPARENT)); |
} |
-ImeAdapterAndroid::ImeAdapterAndroid(RenderWidgetHostViewAndroid* rwhva) |
- : rwhva_(rwhva) { |
- DCHECK(rwhva_); |
+ImeAdapterAndroid::ImeAdapterAndroid(JNIEnv* env, |
+ const JavaParamRef<jobject>& obj) { |
+ java_ime_adapter_ = JavaObjectWeakGlobalRef(env, obj); |
} |
-ImeAdapterAndroid::~ImeAdapterAndroid() { |
+void ImeAdapterAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
+ delete this; |
+} |
+ |
+void ImeAdapterAndroid::SetRenderWidgetHostViewAndroid( |
+ const WeakPtr<RenderWidgetHostViewAndroid> rwhva) { |
+ rwhva_.reset(); |
+ rwhva_ = rwhva; |
JNIEnv* env = AttachCurrentThread(); |
- base::android::ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); |
+ ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); |
if (!obj.is_null()) |
- Java_ImeAdapter_detach(env, obj); |
+ Java_ImeAdapter_onConnectedToRenderProcess(env, obj); |
+} |
+ |
+ImeAdapterAndroid::~ImeAdapterAndroid() { |
+ if (rwhva_) |
+ rwhva_->ConnectImeAdapter(nullptr); |
} |
bool ImeAdapterAndroid::SendKeyEvent( |
@@ -200,25 +219,18 @@ void ImeAdapterAndroid::FinishComposingText(JNIEnv* env, |
rwhi->ImeFinishComposingText(true); |
} |
-void ImeAdapterAndroid::AttachImeAdapter( |
- JNIEnv* env, |
- const JavaParamRef<jobject>& java_object) { |
- java_ime_adapter_ = JavaObjectWeakGlobalRef(env, java_object); |
-} |
- |
void ImeAdapterAndroid::CancelComposition() { |
- base::android::ScopedJavaLocalRef<jobject> obj = |
- java_ime_adapter_.get(AttachCurrentThread()); |
+ JNIEnv* env = AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); |
if (!obj.is_null()) |
- Java_ImeAdapter_cancelComposition(AttachCurrentThread(), obj); |
+ Java_ImeAdapter_cancelComposition(env, obj); |
} |
void ImeAdapterAndroid::FocusedNodeChanged(bool is_editable_node) { |
- base::android::ScopedJavaLocalRef<jobject> obj = |
- java_ime_adapter_.get(AttachCurrentThread()); |
+ JNIEnv* env = AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); |
if (!obj.is_null()) { |
- Java_ImeAdapter_focusedNodeChanged(AttachCurrentThread(), obj, |
- is_editable_node); |
+ Java_ImeAdapter_focusedNodeChanged(env, obj, is_editable_node); |
} |
} |
@@ -238,7 +250,7 @@ void ImeAdapterAndroid::SetEditableSelectionOffsets( |
void ImeAdapterAndroid::SetCharacterBounds( |
const std::vector<gfx::RectF>& character_bounds) { |
JNIEnv* env = AttachCurrentThread(); |
- base::android::ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); |
+ ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env); |
if (obj.is_null()) |
return; |
@@ -316,11 +328,6 @@ void ImeAdapterAndroid::RequestCursorUpdate( |
rwhi->GetRoutingID(), immediate_request, monitor_request)); |
} |
-void ImeAdapterAndroid::ResetImeAdapter(JNIEnv* env, |
- const JavaParamRef<jobject>&) { |
- java_ime_adapter_.reset(); |
-} |
- |
RenderWidgetHostImpl* ImeAdapterAndroid::GetFocusedWidget() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
return rwhva_->GetFocusedWidget(); |