diff options
-rw-r--r-- | chrome/android/java/src/org/chromium/chrome/browser/ChromeWebContentsDelegateAndroid.java | 34 | ||||
-rw-r--r-- | chrome/browser/android/chrome_web_contents_delegate_android.cc | 135 |
2 files changed, 82 insertions, 87 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWebContentsDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWebContentsDelegateAndroid.java index f7abbc8..546f302 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWebContentsDelegateAndroid.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWebContentsDelegateAndroid.java @@ -4,6 +4,9 @@ package org.chromium.chrome.browser; +import android.graphics.Rect; +import android.graphics.RectF; + import org.chromium.base.CalledByNative; import org.chromium.components.web_contents_delegate_android.WebContentsDelegateAndroid; @@ -22,4 +25,35 @@ public class ChromeWebContentsDelegateAndroid extends WebContentsDelegateAndroid @CalledByNative public void onFindMatchRectsAvailable(FindMatchRectsDetails result) { } + + // Helper functions used to create types that are part of the public interface + @CalledByNative + private static Rect createRect(int x, int y, int right, int bottom) { + return new Rect(x, y, right, bottom); + } + + @CalledByNative + private static RectF createRectF(float x, float y, float right, float bottom) { + return new RectF(x, y, right, bottom); + } + + @CalledByNative + private static FindNotificationDetails createFindNotificationDetails( + int numberOfMatches, Rect rendererSelectionRect, + int activeMatchOrdinal, boolean finalUpdate) { + return new FindNotificationDetails(numberOfMatches, rendererSelectionRect, + activeMatchOrdinal, finalUpdate); + } + + @CalledByNative + private static FindMatchRectsDetails createFindMatchRectsDetails( + int version, int numRects, RectF activeRect) { + return new FindMatchRectsDetails(version, new RectF[numRects], activeRect); + } + + @CalledByNative + private static void setMatchRectByIndex( + FindMatchRectsDetails findMatchRectsDetails, int index, RectF rect) { + findMatchRectsDetails.rects[index] = rect; + } } diff --git a/chrome/browser/android/chrome_web_contents_delegate_android.cc b/chrome/browser/android/chrome_web_contents_delegate_android.cc index 4ed5621..56f993d 100644 --- a/chrome/browser/android/chrome_web_contents_delegate_android.cc +++ b/chrome/browser/android/chrome_web_contents_delegate_android.cc @@ -33,9 +33,6 @@ #include "chrome/browser/pepper_broker_infobar_delegate.h" #endif -using base::android::AttachCurrentThread; -using base::android::GetClass; -using base::android::MethodID; using base::android::ScopedJavaLocalRef; using content::FileChooserParams; using content::NavigationController; @@ -44,28 +41,6 @@ using content::WebContents; namespace { -// Convenience method to create Android rects. -// RectType should be either gfx::Rect or gfx::RectF. -template <typename RectType> -ScopedJavaLocalRef<jobject> CreateAndroidRect( - JNIEnv* env, - const ScopedJavaLocalRef<jclass>& clazz, - const jmethodID& constructor, - const RectType& rect) { - - ScopedJavaLocalRef<jobject> rect_object( - env, - env->NewObject(clazz.obj(), - constructor, - rect.x(), - rect.y(), - rect.right(), - rect.bottom())); - - DCHECK(!rect_object.is_null()); - return rect_object; -} - NavigationEntry* GetActiveEntry(WebContents* web_contents) { return web_contents->GetController().GetActiveEntry(); } @@ -82,6 +57,29 @@ bool IsActiveNavigationGoogleSearch(WebContents* web_contents) { return StartsWithASCII(entry->GetURL().spec(), search_url.spec(), false); } +ScopedJavaLocalRef<jobject> CreateJavaRectF( + JNIEnv* env, + const gfx::RectF& rect) { + return ScopedJavaLocalRef<jobject>( + Java_ChromeWebContentsDelegateAndroid_createRectF(env, + rect.x(), + rect.y(), + rect.right(), + rect.bottom())); +} + +ScopedJavaLocalRef<jobject> CreateJavaRect( + JNIEnv* env, + const gfx::Rect& rect) { + return ScopedJavaLocalRef<jobject>( + Java_ChromeWebContentsDelegateAndroid_createRect( + env, + static_cast<int>(rect.x()), + static_cast<int>(rect.y()), + static_cast<int>(rect.right()), + static_cast<int>(rect.bottom()))); +} + } // anonymous namespace namespace chrome { @@ -163,37 +161,22 @@ void ChromeWebContentsDelegateAndroid::FindReply( void ChromeWebContentsDelegateAndroid::OnFindResultAvailable( WebContents* web_contents, const FindNotificationDetails* find_result) { - JNIEnv* env = AttachCurrentThread(); + JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); if (obj.is_null()) return; - // Create the selection rect. - ScopedJavaLocalRef<jclass> rect_clazz = - GetClass(env, "android/graphics/Rect"); - - jmethodID rect_constructor = MethodID::Get<MethodID::TYPE_INSTANCE>( - env, rect_clazz.obj(), "<init>", "(IIII)V"); - - ScopedJavaLocalRef<jobject> selection_rect = CreateAndroidRect( - env, rect_clazz, rect_constructor, find_result->selection_rect()); + ScopedJavaLocalRef<jobject> selection_rect = CreateJavaRect( + env, find_result->selection_rect()); // Create the details object. - ScopedJavaLocalRef<jclass> details_clazz = - GetClass(env, "org/chromium/chrome/browser/FindNotificationDetails"); - - jmethodID details_constructor = MethodID::Get<MethodID::TYPE_INSTANCE>( - env, details_clazz.obj(), "<init>", "(ILandroid/graphics/Rect;IZ)V"); - - ScopedJavaLocalRef<jobject> details_object( - env, - env->NewObject(details_clazz.obj(), - details_constructor, - find_result->number_of_matches(), - selection_rect.obj(), - find_result->active_match_ordinal(), - find_result->final_update())); - DCHECK(!details_object.is_null()); + ScopedJavaLocalRef<jobject> details_object = + Java_ChromeWebContentsDelegateAndroid_createFindNotificationDetails( + env, + find_result->number_of_matches(), + selection_rect.obj(), + find_result->active_match_ordinal(), + find_result->final_update()); Java_ChromeWebContentsDelegateAndroid_onFindResultAvailable( env, @@ -212,50 +195,28 @@ void ChromeWebContentsDelegateAndroid::FindMatchRectsReply( content::Source<WebContents>(web_contents), content::Details<FindMatchRectsDetails>(&match_rects)); - JNIEnv* env = AttachCurrentThread(); + JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); if (obj.is_null()) return; - // Create the rects. - ScopedJavaLocalRef<jclass> rect_clazz = - GetClass(env, "android/graphics/RectF"); - - jmethodID rect_constructor = MethodID::Get<MethodID::TYPE_INSTANCE>( - env, rect_clazz.obj(), "<init>", "(FFFF)V"); - - ScopedJavaLocalRef<jobjectArray> jrects(env, env->NewObjectArray( - match_rects.rects().size(), rect_clazz.obj(), NULL)); - + // Create the details object. + ScopedJavaLocalRef<jobject> details_object = + Java_ChromeWebContentsDelegateAndroid_createFindMatchRectsDetails( + env, + match_rects.version(), + match_rects.rects().size(), + CreateJavaRectF(env, match_rects.active_rect()).obj()); + + // Add the rects for (size_t i = 0; i < match_rects.rects().size(); ++i) { - env->SetObjectArrayElement( - jrects.obj(), i, - CreateAndroidRect(env, - rect_clazz, - rect_constructor, - match_rects.rects()[i]).obj()); + Java_ChromeWebContentsDelegateAndroid_setMatchRectByIndex( + env, + details_object.obj(), + i, + CreateJavaRectF(env, match_rects.rects()[i]).obj()); } - ScopedJavaLocalRef<jobject> jactive_rect = CreateAndroidRect( - env, rect_clazz, rect_constructor, match_rects.active_rect()); - - // Create the details object. - ScopedJavaLocalRef<jclass> details_clazz = - GetClass(env, "org/chromium/chrome/browser/FindMatchRectsDetails"); - - jmethodID details_constructor = MethodID::Get<MethodID::TYPE_INSTANCE>( - env, details_clazz.obj(), "<init>", - "(I[Landroid/graphics/RectF;Landroid/graphics/RectF;)V"); - - ScopedJavaLocalRef<jobject> details_object( - env, - env->NewObject(details_clazz.obj(), - details_constructor, - match_rects.version(), - jrects.obj(), - jactive_rect.obj())); - DCHECK(!details_object.is_null()); - Java_ChromeWebContentsDelegateAndroid_onFindMatchRectsAvailable( env, obj.obj(), |