summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host/ime_adapter_android.cc
diff options
context:
space:
mode:
authorjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-16 16:03:56 +0000
committerjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-16 16:03:56 +0000
commitef8a39cb5a4c86018524dccd90a32db227239a5e (patch)
treea13285dbd85dc4dfa57d044a71498f86d28872a5 /content/browser/renderer_host/ime_adapter_android.cc
parent8bde17a1679408f73567fcfd266927128328b45d (diff)
downloadchromium_src-ef8a39cb5a4c86018524dccd90a32db227239a5e.zip
chromium_src-ef8a39cb5a4c86018524dccd90a32db227239a5e.tar.gz
chromium_src-ef8a39cb5a4c86018524dccd90a32db227239a5e.tar.bz2
Don't leak ContentViewCores via ImeAdapter
The existing strong ref from native to java forms a GC root which thwarts GC of ImeAdapter.java or any object referenced by it, which includes ContentViewCore by dint of ViewEmbedder subclass being a non-static inner class of CVC and hence binding it. This is problematic for WebView as it requires reliable finalizer based cleanup of CVC. BUG=b/7697692 Review URL: https://chromiumcodereview.appspot.com/12666007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188584 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/ime_adapter_android.cc')
-rw-r--r--content/browser/renderer_host/ime_adapter_android.cc20
1 files changed, 11 insertions, 9 deletions
diff --git a/content/browser/renderer_host/ime_adapter_android.cc b/content/browser/renderer_host/ime_adapter_android.cc
index c5c4ad8..3eab2b0 100644
--- a/content/browser/renderer_host/ime_adapter_android.cc
+++ b/content/browser/renderer_host/ime_adapter_android.cc
@@ -8,6 +8,7 @@
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
@@ -87,16 +88,14 @@ bool RegisterImeAdapter(JNIEnv* env) {
}
ImeAdapterAndroid::ImeAdapterAndroid(RenderWidgetHostViewAndroid* rwhva)
- : rwhva_(rwhva),
- java_ime_adapter_(NULL) {
+ : rwhva_(rwhva) {
}
ImeAdapterAndroid::~ImeAdapterAndroid() {
- if (java_ime_adapter_) {
- JNIEnv* env = base::android::AttachCurrentThread();
- Java_ImeAdapter_detach(env, java_ime_adapter_);
- env->DeleteGlobalRef(java_ime_adapter_);
- }
+ JNIEnv* env = AttachCurrentThread();
+ base::android::ScopedJavaLocalRef<jobject> obj = java_ime_adapter_.get(env);
+ if (!obj.is_null())
+ Java_ImeAdapter_detach(env, obj.obj());
}
bool ImeAdapterAndroid::SendSyntheticKeyEvent(JNIEnv*,
@@ -175,11 +174,14 @@ void ImeAdapterAndroid::CommitText(JNIEnv* env, jobject, jstring text) {
}
void ImeAdapterAndroid::AttachImeAdapter(JNIEnv* env, jobject java_object) {
- java_ime_adapter_ = AttachCurrentThread()->NewGlobalRef(java_object);
+ java_ime_adapter_ = JavaObjectWeakGlobalRef(env, java_object);
}
void ImeAdapterAndroid::CancelComposition() {
- Java_ImeAdapter_cancelComposition(AttachCurrentThread(), java_ime_adapter_);
+ base::android::ScopedJavaLocalRef<jobject> obj =
+ java_ime_adapter_.get(AttachCurrentThread());
+ if (!obj.is_null())
+ Java_ImeAdapter_cancelComposition(AttachCurrentThread(), obj.obj());
}
void ImeAdapterAndroid::SetEditableSelectionOffsets(JNIEnv*, jobject,