Index: content/browser/android/popup_touch_handle_drawable.cc |
diff --git a/content/browser/android/popup_touch_handle_drawable.cc b/content/browser/android/popup_touch_handle_drawable.cc |
index aef23f8fb0f9696f94bcf038d5320cd64fa345c6..7791ddfe452faf63e9b81d2133e810f86057b0f1 100644 |
--- a/content/browser/android/popup_touch_handle_drawable.cc |
+++ b/content/browser/android/popup_touch_handle_drawable.cc |
@@ -4,59 +4,89 @@ |
#include "content/browser/android/popup_touch_handle_drawable.h" |
+#include "content/public/browser/android/content_view_core.h" |
#include "jni/PopupTouchHandleDrawable_jni.h" |
namespace content { |
-PopupTouchHandleDrawable::PopupTouchHandleDrawable( |
- base::android::ScopedJavaLocalRef<jobject> drawable, |
- float dpi_scale) |
- : dpi_scale_(dpi_scale), drawable_(drawable) { |
- DCHECK(drawable.obj()); |
+// static |
+scoped_ptr<PopupTouchHandleDrawable> PopupTouchHandleDrawable::Create( |
+ ContentViewCore* content_view_core) { |
+ DCHECK(content_view_core); |
+ base::android::ScopedJavaLocalRef<jobject> content_view_core_obj = |
+ content_view_core->GetJavaObject(); |
+ if (content_view_core_obj.is_null()) |
+ return nullptr; |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ base::android::ScopedJavaLocalRef<jobject> drawable_obj( |
+ Java_PopupTouchHandleDrawable_create(env, content_view_core_obj.obj())); |
+ return scoped_ptr<PopupTouchHandleDrawable>(new PopupTouchHandleDrawable( |
+ env, drawable_obj.obj(), content_view_core->GetDpiScale())); |
+} |
+ |
+PopupTouchHandleDrawable::PopupTouchHandleDrawable(JNIEnv* env, |
+ jobject obj, |
+ float dpi_scale) |
+ : java_ref_(env, obj), dpi_scale_(dpi_scale) { |
+ DCHECK(!java_ref_.is_empty()); |
} |
PopupTouchHandleDrawable::~PopupTouchHandleDrawable() { |
- // Explicitly disabling ensures that any external references to the Java |
- // object are cleared, allowing it to be GC'ed in a timely fashion. |
- SetEnabled(false); |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
+ if (!obj.is_null()) |
+ Java_PopupTouchHandleDrawable_destroy(env, obj.obj()); |
} |
void PopupTouchHandleDrawable::SetEnabled(bool enabled) { |
JNIEnv* env = base::android::AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
+ if (obj.is_null()) |
+ return; |
if (enabled) |
- Java_PopupTouchHandleDrawable_show(env, drawable_.obj()); |
+ Java_PopupTouchHandleDrawable_show(env, obj.obj()); |
else |
- Java_PopupTouchHandleDrawable_hide(env, drawable_.obj()); |
+ Java_PopupTouchHandleDrawable_hide(env, obj.obj()); |
} |
void PopupTouchHandleDrawable::SetOrientation( |
ui::TouchHandleOrientation orientation) { |
JNIEnv* env = base::android::AttachCurrentThread(); |
- jobject obj = drawable_.obj(); |
- Java_PopupTouchHandleDrawable_setOrientation(env, obj, |
- static_cast<int>(orientation)); |
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
+ if (!obj.is_null()) { |
+ Java_PopupTouchHandleDrawable_setOrientation(env, obj.obj(), |
+ static_cast<int>(orientation)); |
+ } |
} |
void PopupTouchHandleDrawable::SetAlpha(float alpha) { |
JNIEnv* env = base::android::AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
bool visible = alpha > 0; |
- Java_PopupTouchHandleDrawable_setVisible(env, drawable_.obj(), visible); |
+ if (!obj.is_null()) |
+ Java_PopupTouchHandleDrawable_setVisible(env, obj.obj(), visible); |
} |
void PopupTouchHandleDrawable::SetFocus(const gfx::PointF& position) { |
const gfx::PointF position_pix = gfx::ScalePoint(position, dpi_scale_); |
JNIEnv* env = base::android::AttachCurrentThread(); |
- Java_PopupTouchHandleDrawable_setFocus( |
- env, drawable_.obj(), position_pix.x(), position_pix.y()); |
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
+ if (!obj.is_null()) { |
+ Java_PopupTouchHandleDrawable_setFocus(env, obj.obj(), position_pix.x(), |
+ position_pix.y()); |
+ } |
} |
gfx::RectF PopupTouchHandleDrawable::GetVisibleBounds() const { |
JNIEnv* env = base::android::AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
+ if (obj.is_null()) |
+ return gfx::RectF(); |
gfx::RectF unscaled_rect( |
- Java_PopupTouchHandleDrawable_getPositionX(env, drawable_.obj()), |
- Java_PopupTouchHandleDrawable_getPositionY(env, drawable_.obj()), |
- Java_PopupTouchHandleDrawable_getVisibleWidth(env, drawable_.obj()), |
- Java_PopupTouchHandleDrawable_getVisibleHeight(env, drawable_.obj())); |
+ Java_PopupTouchHandleDrawable_getPositionX(env, obj.obj()), |
+ Java_PopupTouchHandleDrawable_getPositionY(env, obj.obj()), |
+ Java_PopupTouchHandleDrawable_getVisibleWidth(env, obj.obj()), |
+ Java_PopupTouchHandleDrawable_getVisibleHeight(env, obj.obj())); |
return gfx::ScaleRect(unscaled_rect, 1.f / dpi_scale_); |
} |