diff options
author | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-16 16:03:56 +0000 |
---|---|---|
committer | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-16 16:03:56 +0000 |
commit | ef8a39cb5a4c86018524dccd90a32db227239a5e (patch) | |
tree | a13285dbd85dc4dfa57d044a71498f86d28872a5 /content/browser/renderer_host/ime_adapter_android.cc | |
parent | 8bde17a1679408f73567fcfd266927128328b45d (diff) | |
download | chromium_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.cc | 20 |
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, |