OSDN Git Service

DO NOT MERGE. Pass an extra boolean with scrollTo message.
authorLeon Scroggins <scroggo@google.com>
Tue, 1 Feb 2011 16:02:25 +0000 (11:02 -0500)
committerLeon Scroggins <scroggo@google.com>
Wed, 2 Feb 2011 20:05:21 +0000 (15:05 -0500)
Bug:3411564

When the size changes, add a boolean to the scroll
message to only honor the scroll in the case that
the IME is actually showing.

Requires a change to frameworks/base.

Already submitted to master.

Change-Id: I35612dcecfddaa0623dc8f414229703c6a97191b

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

index 8361c17..b329e3b 100644 (file)
@@ -342,6 +342,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
 #endif
     m_isPaused = false;
     m_screenOnCounter = 0;
+    m_onlyScrollIfImeIsShowing = false;
 
     LOG_ASSERT(m_mainFrame, "Uh oh, somehow a frameview was made without an initial frame!");
 
@@ -349,7 +350,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
     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", "(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_contentDraw = GetJMethod(env, clazz, "contentDraw", "()V");
     m_javaGlue->m_layersDraw = GetJMethod(env, clazz, "layersDraw", "()V");
@@ -947,9 +948,11 @@ void WebViewCore::scrollTo(int x, int y, bool animate)
 //    LOGD("WebViewCore::scrollTo(%d %d)\n", x, y);
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    env->CallVoidMethod(m_javaGlue->object(env).get(),
-            animate ? m_javaGlue->m_spawnScrollTo : m_javaGlue->m_scrollTo,
-            x, y);
+    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);
     checkException(env);
 }
 
@@ -1322,8 +1325,11 @@ void WebViewCore::setSizeScreenWidthAndScale(int width, int height,
     // If this was in response to touching a textfield and showing the IME,
     // the IME may now cover textfield.  Bring it back into view.
     // If the scale changed, however, this was the result of a zoom.
-    if (oldScale == m_scale)
+    if (oldScale == m_scale && osh > screenHeight) {
+        m_onlyScrollIfImeIsShowing = true;
         revealSelection();
+        m_onlyScrollIfImeIsShowing = false;
+    }
     // update the currently visible screen as perceived by the plugin
     sendPluginVisibleScreen();
 }
index 1457089..5820dc5 100644 (file)
@@ -610,6 +610,9 @@ namespace android {
         int m_blurringNodePointer;
         int m_lastFocusedSelStart;
         int m_lastFocusedSelEnd;
+        // Pass along with a scroll message to tell the UI thread to only
+        // scroll the page if the IME is showing.
+        bool m_onlyScrollIfImeIsShowing;
         PictureSet m_content; // the set of pictures to draw
         SkRegion m_addInval; // the accumulated inval region (not yet drawn)
         SkRegion m_rebuildInval; // the accumulated region for rebuilt pictures