OSDN Git Service

Consolidate scrolling methods.
authorPatrick Scott <phanna@android.com>
Fri, 4 Feb 2011 11:44:22 +0000 (06:44 -0500)
committerPatrick Scott <phanna@android.com>
Wed, 9 Feb 2011 17:46:46 +0000 (12:46 -0500)
Call through to a single java function to scroll the page.  Always use scrollTo
so that there isn't a problem with using scrollBy on an old or out-of-sync
scroll position.

Bug: 3187015
Change-Id: I4a75256687e53ed18c1f73970e9032f476b81859

WebKit/android/jni/WebViewCore.cpp
WebKit/android/jni/WebViewCore.h
WebKit/android/plugins/PluginWidgetAndroid.cpp

index f48510f..10bc3af 100644 (file)
@@ -250,9 +250,7 @@ struct WebViewCoreFields {
 
 struct WebViewCore::JavaGlue {
     jweak       m_obj;
-    jmethodID   m_spawnScrollTo;
     jmethodID   m_scrollTo;
-    jmethodID   m_scrollBy;
     jmethodID   m_contentDraw;
     jmethodID   m_layersDraw;
     jmethodID   m_requestListBox;
@@ -349,9 +347,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
     jclass clazz = env->GetObjectClass(javaWebViewCore);
     m_javaGlue = new JavaGlue;
     m_javaGlue->m_obj = env->NewWeakGlobalRef(javaWebViewCore);
-    m_javaGlue->m_spawnScrollTo = GetJMethod(env, clazz, "contentSpawnScrollTo", "(II)V");
-    m_javaGlue->m_scrollTo = GetJMethod(env, clazz, "contentScrollTo", "(IIZ)V");
-    m_javaGlue->m_scrollBy = GetJMethod(env, clazz, "contentScrollBy", "(IIZ)V");
+    m_javaGlue->m_scrollTo = GetJMethod(env, clazz, "contentScrollTo", "(IIZZ)V");
     m_javaGlue->m_contentDraw = GetJMethod(env, clazz, "contentDraw", "()V");
     m_javaGlue->m_layersDraw = GetJMethod(env, clazz, "layersDraw", "()V");
     m_javaGlue->m_requestListBox = GetJMethod(env, clazz, "requestListBox", "([Ljava/lang/String;[I[I)V");
@@ -948,11 +944,8 @@ void WebViewCore::scrollTo(int x, int y, bool animate)
 //    LOGD("WebViewCore::scrollTo(%d %d)\n", x, y);
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    if (animate)
-        env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_spawnScrollTo, x, y);
-    else
-        env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_scrollTo,
-                x, y, m_onlyScrollIfImeIsShowing);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_scrollTo,
+            x, y, animate, m_onlyScrollIfImeIsShowing);
     checkException(env);
 }
 
@@ -974,16 +967,6 @@ void WebViewCore::viewInvalidate(const WebCore::IntRect& rect)
     checkException(env);
 }
 
-void WebViewCore::scrollBy(int dx, int dy, bool animate)
-{
-    if (!(dx | dy))
-        return;
-    JNIEnv* env = JSC::Bindings::getJNIEnv();
-    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_scrollBy,
-        dx, dy, animate);
-    checkException(env);
-}
-
 void WebViewCore::contentDraw()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
@@ -1154,13 +1137,14 @@ void WebViewCore::doMaxScroll(CacheBuilder::Direction dir)
     default:
         LOG_ASSERT(0, "unexpected focus selector");
     }
-    this->scrollBy(dx, dy, true);
+    WebCore::FrameView* view = m_mainFrame->view();
+    this->scrollTo(view->scrollX() + dx, view->scrollY() + dy, true);
 }
 
-void WebViewCore::setScrollOffset(int moveGeneration, int userScrolled, int dx, int dy)
+void WebViewCore::setScrollOffset(int moveGeneration, bool sendScrollEvent, int dx, int dy)
 {
-    DBG_NAV_LOGD("{%d,%d} m_scrollOffset=(%d,%d), userScrolled=%d", dx, dy,
-        m_scrollOffsetX, m_scrollOffsetY, userScrolled);
+    DBG_NAV_LOGD("{%d,%d} m_scrollOffset=(%d,%d), sendScrollEvent=%d", dx, dy,
+        m_scrollOffsetX, m_scrollOffsetY, sendScrollEvent);
     if (m_scrollOffsetX != dx || m_scrollOffsetY != dy) {
         m_scrollOffsetX = dx;
         m_scrollOffsetY = dy;
@@ -1169,9 +1153,8 @@ void WebViewCore::setScrollOffset(int moveGeneration, int userScrolled, int dx,
         // testing work correctly.
         m_mainFrame->view()->platformWidget()->setLocation(m_scrollOffsetX,
                 m_scrollOffsetY);
-        if (userScrolled) {
+        if (sendScrollEvent)
             m_mainFrame->eventHandler()->sendScrollEvent();
-        }
 
         // Update history item to reflect the new scroll position.
         // This also helps save the history information when the browser goes to
@@ -3756,7 +3739,7 @@ static void SetSize(JNIEnv *env, jobject obj, jint width, jint height,
             screenWidth, screenHeight, anchorX, anchorY, ignoreHeight);
 }
 
-static void SetScrollOffset(JNIEnv *env, jobject obj, jint gen, jint userScrolled, jint x, jint y)
+static void SetScrollOffset(JNIEnv *env, jobject obj, jint gen, jboolean sendScrollEvent, jint x, jint y)
 {
 #ifdef ANDROID_INSTRUMENT
     TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
@@ -3764,7 +3747,7 @@ static void SetScrollOffset(JNIEnv *env, jobject obj, jint gen, jint userScrolle
     WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
     LOG_ASSERT(viewImpl, "need viewImpl");
 
-    viewImpl->setScrollOffset(gen, userScrolled, x, y);
+    viewImpl->setScrollOffset(gen, sendScrollEvent, x, y);
 }
 
 static void SetGlobalBounds(JNIEnv *env, jobject obj, jint x, jint y, jint h,
@@ -4416,7 +4399,7 @@ static JNINativeMethod gJavaWebViewCoreMethods[] = {
         (void*) SendListBoxChoice },
     { "nativeSetSize", "(IIIFIIIIZ)V",
         (void*) SetSize },
-    { "nativeSetScrollOffset", "(IIII)V",
+    { "nativeSetScrollOffset", "(IZII)V",
         (void*) SetScrollOffset },
     { "nativeSetGlobalBounds", "(IIII)V",
         (void*) SetGlobalBounds },
index 5820dc5..1b81f36 100644 (file)
@@ -149,14 +149,6 @@ namespace android {
         void scrollTo(int x, int y, bool animate = false);
 
         /**
-         * Scroll to the point x,y relative to the current position.
-         * @param x The relative x position.
-         * @param y The relative y position.
-         * @param animate If it is true, animate to the new scroll position
-         */
-        void scrollBy(int x, int y, bool animate);
-
-        /**
          * Record the invalid rectangle
          */
         void contentInvalidate(const WebCore::IntRect &rect);
@@ -311,7 +303,7 @@ namespace android {
             WebCore::Frame* frame, int x, int y);
 
         // set the scroll amount that webview.java is currently showing
-        void setScrollOffset(int moveGeneration, int userScrolled, int dx, int dy);
+        void setScrollOffset(int moveGeneration, bool sendScrollEvent, int dx, int dy);
 
         void setGlobalBounds(int x, int y, int h, int v);
 
index a02047b..06506ba 100644 (file)
@@ -587,7 +587,7 @@ void PluginWidgetAndroid::scrollToVisiblePluginRect() {
 #if DEBUG_VISIBLE_RECTS
     PLUGIN_LOG("%s call scrollBy (%d,%d)", __FUNCTION__, deltaX, deltaY);
 #endif
-    core->scrollBy(deltaX, deltaY, true);
+    core->scrollTo(rectCenterX, rectCenterY, true);
 }
 
 void PluginWidgetAndroid::requestFullScreen() {