diff options
| author | 2011-02-02 14:09:34 -0500 | |
|---|---|---|
| committer | 2011-02-09 12:42:55 -0500 | |
| commit | fa8be1cccca57f9433c3fafa50e3be3f31b44fb1 (patch) | |
| tree | 1156a2bcff95c1cb0482e1f46d2d798208100932 | |
| parent | b6dd088a3bd8cf9855bc0212900d12da17c95486 (diff) | |
Call window.onscroll event at the end of scrolling.
Remove some old cruft code that isn't necessary anymore. We almost always send
the scroll event to webkit except when restoring the scroll position when going
back.
I have verified that the scroll position is restored when going between pages
and that gmail receives the final scroll position.
Bug: 3187015
Change-Id: I0b1dfd1096d44247729bdd13bdad908310c2f19a
| -rw-r--r-- | core/java/android/webkit/WebView.java | 71 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 78 |
2 files changed, 37 insertions, 112 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 88bb9fceb7ae..9ac91ace9559 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -636,13 +636,7 @@ public class WebView extends AbsoluteLayout /* * Package message ids */ - //! arg1=x, arg2=y static final int SCROLL_TO_MSG_ID = 101; - static final int SCROLL_BY_MSG_ID = 102; - //! arg1=x, arg2=y - static final int SPAWN_SCROLL_TO_MSG_ID = 103; - //! arg1=x, arg2=y - static final int SYNC_SCROLL_TO_MSG_ID = 104; static final int NEW_PICTURE_MSG_ID = 105; static final int UPDATE_TEXT_ENTRY_MSG_ID = 106; static final int WEBCORE_INITIALIZED_MSG_ID = 107; @@ -698,9 +692,9 @@ public class WebView extends AbsoluteLayout static final String[] HandlerPackageDebugString = { "SCROLL_TO_MSG_ID", // = 101; - "SCROLL_BY_MSG_ID", // = 102; - "SPAWN_SCROLL_TO_MSG_ID", // = 103; - "SYNC_SCROLL_TO_MSG_ID", // = 104; + "102", // = 102; + "103", // = 103; + "104", // = 104; "NEW_PICTURE_MSG_ID", // = 105; "UPDATE_TEXT_ENTRY_MSG_ID", // = 106; "WEBCORE_INITIALIZED_MSG_ID", // = 107; @@ -748,7 +742,9 @@ public class WebView extends AbsoluteLayout // initial scale in percent. 0 means using default. private int mInitialScaleInPercent = 0; - private boolean mUserScroll = false; + // Whether or not a scroll event should be sent to webkit. This is only set + // to false when restoring the scroll position. + private boolean mSendScrollEvent = true; private int mSnapScrollMode = SNAP_NONE; private static final int SNAP_NONE = 0; @@ -2055,7 +2051,6 @@ public class WebView extends AbsoluteLayout } else { y = -h / 2; } - mUserScroll = true; return mScroller.isFinished() ? pinScrollBy(0, y, true, 0) : extendScroll(y); } @@ -2081,7 +2076,6 @@ public class WebView extends AbsoluteLayout } else { y = h / 2; } - mUserScroll = true; return mScroller.isFinished() ? pinScrollBy(0, y, true, 0) : extendScroll(y); } @@ -2515,7 +2509,7 @@ public class WebView extends AbsoluteLayout Point pos = new Point(rect.left, rect.top); mWebViewCore.removeMessages(EventHub.SET_SCROLL_OFFSET); mWebViewCore.sendMessage(EventHub.SET_SCROLL_OFFSET, - nativeMoveGeneration(), mUserScroll ? 1 : 0, pos); + nativeMoveGeneration(), mSendScrollEvent ? 1 : 0, pos); mLastVisibleRectSent = rect; mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS); } @@ -3183,6 +3177,9 @@ public class WebView extends AbsoluteLayout if (!mSelectingText) { WebViewCore.resumeUpdatePicture(mWebViewCore); } + if (oldX != mScrollX || oldY != mScrollY) { + sendOurVisibleRect(); + } } } else { super.computeScroll(); @@ -4161,9 +4158,6 @@ public class WebView extends AbsoluteLayout mScrollX = pinLocX(mScrollX); mScrollY = pinLocY(mScrollY); if (oldScrollX != mScrollX || oldScrollY != mScrollY) { - mUserScroll = false; - mWebViewCore.sendMessage(EventHub.SYNC_SCROLL, oldScrollX, - oldScrollY); onScrollChanged(mScrollX, mScrollY, oldScrollX, oldScrollY); } else { sendOurVisibleRect(); @@ -5704,7 +5698,6 @@ public class WebView extends AbsoluteLayout mHeldMotionless = MOTIONLESS_FALSE; } mLastTouchTime = eventTime; - mUserScroll = true; } doDrag(deltaX, deltaY); @@ -6405,7 +6398,6 @@ public class WebView extends AbsoluteLayout if (xMove != 0 || yMove != 0) { pinScrollBy(xMove, yMove, true, 0); } - mUserScroll = true; } } @@ -7156,20 +7148,10 @@ public class WebView extends AbsoluteLayout doShortPress(); break; } - case SCROLL_BY_MSG_ID: - setContentScrollBy(msg.arg1, msg.arg2, (Boolean) msg.obj); - break; - case SYNC_SCROLL_TO_MSG_ID: - if (mUserScroll) { - // if user has scrolled explicitly, don't sync the - // scroll position any more - mUserScroll = false; - break; - } - setContentScrollTo(msg.arg1, msg.arg2); - break; - case SCROLL_TO_MSG_ID: - if (((Boolean) msg.obj).booleanValue()) { + case SCROLL_TO_MSG_ID: { + // arg1 = animate, arg2 = onlyIfImeIsShowing + // obj = Point(x, y) + if (msg.arg2 == 1) { // This scroll is intended to bring the textfield into // view, but is only necessary if the IME is showing InputMethodManager imm = InputMethodManager.peekInstance(); @@ -7179,18 +7161,14 @@ public class WebView extends AbsoluteLayout break; } } - if (setContentScrollTo(msg.arg1, msg.arg2)) { - // if we can't scroll to the exact position due to pin, - // send a message to WebCore to re-scroll when we get a - // new picture - mUserScroll = false; - mWebViewCore.sendMessage(EventHub.SYNC_SCROLL, - msg.arg1, msg.arg2); + final Point p = (Point) msg.obj; + if (msg.arg1 == 1) { + spawnContentScrollTo(p.x, p.y); + } else { + setContentScrollTo(p.x, p.y); } break; - case SPAWN_SCROLL_TO_MSG_ID: - spawnContentScrollTo(msg.arg1, msg.arg2); - break; + } case UPDATE_ZOOM_RANGE: { WebViewCore.ViewState viewState = (WebViewCore.ViewState) msg.obj; // mScrollX contains the new minPrefWidth @@ -7203,7 +7181,6 @@ public class WebView extends AbsoluteLayout } case NEW_PICTURE_MSG_ID: { // called for new content - mUserScroll = false; final WebViewCore.DrawData draw = (WebViewCore.DrawData) msg.obj; setBaseLayer(draw.mBaseLayer, draw.mInvalRegion.getBounds()); final Point viewSize = draw.mViewSize; @@ -7214,7 +7191,14 @@ public class WebView extends AbsoluteLayout mLastWidthSent = 0; mZoomManager.onFirstLayout(draw); if (!mDrawHistory) { + // Do not send the scroll event for this particular + // scroll message. Note that a scroll event may + // still be fired if the user scrolls before the + // message can be handled. + mSendScrollEvent = false; setContentScrollTo(viewState.mScrollX, viewState.mScrollY); + mSendScrollEvent = true; + // As we are on a new page, remove the WebTextView. This // is necessary for page loads driven by webkit, and in // particular when the user was on a password field, so @@ -8140,7 +8124,6 @@ public class WebView extends AbsoluteLayout + contentCursorRingBounds); } requestRectangleOnScreen(viewCursorRingBounds); - mUserScroll = true; return keyHandled; } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index a9102e935d3d..42889cbf81ab 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -124,9 +124,6 @@ final class WebViewCore { private int mRestoredX = 0; private int mRestoredY = 0; - private int mWebkitScrollX = 0; - private int mWebkitScrollY = 0; - private DeviceMotionAndOrientationManager mDeviceMotionAndOrientationManager = new DeviceMotionAndOrientationManager(this); private DeviceMotionService mDeviceMotionService; @@ -868,7 +865,7 @@ final class WebViewCore { "SAVE_DOCUMENT_STATE", // = 128; "129", // = 129; "WEBKIT_DRAW", // = 130; - "SYNC_SCROLL", // = 131; + "131", // = 131; "POST_URL", // = 132; "SPLIT_PICTURE_SET", // = 133; "CLEAR_CONTENT", // = 134; @@ -926,7 +923,6 @@ final class WebViewCore { static final int SAVE_DOCUMENT_STATE = 128; static final int WEBKIT_DRAW = 130; - static final int SYNC_SCROLL = 131; static final int POST_URL = 132; static final int SPLIT_PICTURE_SET = 133; static final int CLEAR_CONTENT = 134; @@ -1184,7 +1180,8 @@ final class WebViewCore { // note: these are in document coordinates // (inv-zoom) Point pt = (Point) msg.obj; - nativeSetScrollOffset(msg.arg1, msg.arg2, pt.x, pt.y); + nativeSetScrollOffset(msg.arg1, msg.arg2 == 1, + pt.x, pt.y); break; case SET_GLOBAL_BOUNDS: @@ -1476,11 +1473,6 @@ final class WebViewCore { data.mAllow, data.mRemember); break; - case SYNC_SCROLL: - mWebkitScrollX = msg.arg1; - mWebkitScrollY = msg.arg2; - break; - case SPLIT_PICTURE_SET: nativeSplitContent(msg.arg1); mWebView.mPrivateHandler.obtainMessage( @@ -1496,9 +1488,7 @@ final class WebViewCore { break; case MESSAGE_RELAY: - if (msg.obj instanceof Message) { - ((Message) msg.obj).sendToTarget(); - } + ((Message) msg.obj).sendToTarget(); break; case POPULATE_VISITED_LINKS: @@ -2002,13 +1992,6 @@ final class WebViewCore { if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw NEW_PICTURE_MSG_ID"); Message.obtain(mWebView.mPrivateHandler, WebView.NEW_PICTURE_MSG_ID, draw).sendToTarget(); - if (mWebkitScrollX != 0 || mWebkitScrollY != 0) { - // as we have the new picture, try to sync the scroll position - Message.obtain(mWebView.mPrivateHandler, - WebView.SYNC_SCROLL_TO_MSG_ID, mWebkitScrollX, - mWebkitScrollY).sendToTarget(); - mWebkitScrollX = mWebkitScrollY = 0; - } } } @@ -2111,50 +2094,8 @@ final class WebViewCore { } // called by JNI - private void contentScrollBy(int dx, int dy, boolean animate) { - if (!mBrowserFrame.firstLayoutDone()) { - // Will this happen? If yes, we need to do something here. - return; - } - if (mWebView != null) { - Message msg = Message.obtain(mWebView.mPrivateHandler, - WebView.SCROLL_BY_MSG_ID, dx, dy, Boolean.valueOf(animate)); - if (mDrawIsScheduled) { - mEventHub.sendMessage(Message.obtain(null, - EventHub.MESSAGE_RELAY, msg)); - } else { - msg.sendToTarget(); - } - } - } - - // called by JNI - private void contentScrollTo(int x, int y, boolean onlyIfImeIsShowing) { - if (!mBrowserFrame.firstLayoutDone()) { - /* - * WebKit restore state will be called before didFirstLayout(), - * remember the position as it has to be applied after restoring - * zoom factor which is controlled by screenWidth. - */ - mRestoredX = x; - mRestoredY = y; - return; - } - if (mWebView != null) { - Message msg = Message.obtain(mWebView.mPrivateHandler, - WebView.SCROLL_TO_MSG_ID, x, y, - Boolean.valueOf(onlyIfImeIsShowing)); - if (mDrawIsScheduled) { - mEventHub.sendMessage(Message.obtain(null, - EventHub.MESSAGE_RELAY, msg)); - } else { - msg.sendToTarget(); - } - } - } - - // called by JNI - private void contentSpawnScrollTo(int x, int y) { + private void contentScrollTo(int x, int y, boolean animate, + boolean onlyIfImeIsShowing) { if (!mBrowserFrame.firstLayoutDone()) { /* * WebKit restore state will be called before didFirstLayout(), @@ -2167,7 +2108,8 @@ final class WebViewCore { } if (mWebView != null) { Message msg = Message.obtain(mWebView.mPrivateHandler, - WebView.SPAWN_SCROLL_TO_MSG_ID, x, y); + WebView.SCROLL_TO_MSG_ID, animate ? 1 : 0, + onlyIfImeIsShowing ? 1 : 0, new Point(x, y)); if (mDrawIsScheduled) { mEventHub.sendMessage(Message.obtain(null, EventHub.MESSAGE_RELAY, msg)); @@ -2244,7 +2186,7 @@ final class WebViewCore { } // reset the scroll position, the restored offset and scales - mWebkitScrollX = mWebkitScrollY = mRestoredX = mRestoredY = 0; + mRestoredX = mRestoredY = 0; mRestoredScale = mRestoredTextWrapScale = 0; } @@ -2506,7 +2448,7 @@ final class WebViewCore { private native void nativeScrollFocusedTextInput(float xPercent, int y); // these must be in document space (i.e. not scaled/zoomed). - private native void nativeSetScrollOffset(int gen, int userScrolled, int dx, int dy); + private native void nativeSetScrollOffset(int gen, boolean sendScrollEvent, int dx, int dy); private native void nativeSetGlobalBounds(int x, int y, int w, int h); |