Loading core/java/android/webkit/WebView.java +38 −29 Original line number Diff line number Diff line Loading @@ -535,9 +535,10 @@ public class WebView extends AbsoluteLayout static final int SET_ROOT_LAYER_MSG_ID = 124; static final int RETURN_LABEL = 125; static final int FIND_AGAIN = 126; static final int CENTER_FIT_RECT = 127; private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID; private static final int LAST_PACKAGE_MSG_ID = FIND_AGAIN; private static final int LAST_PACKAGE_MSG_ID = CENTER_FIT_RECT; static final String[] HandlerPrivateDebugString = { "REMEMBER_PASSWORD", // = 1; Loading Loading @@ -578,7 +579,8 @@ public class WebView extends AbsoluteLayout "IMMEDIATE_REPAINT_MSG_ID", // = 123; "SET_ROOT_LAYER_MSG_ID", // = 124; "RETURN_LABEL", // = 125; "FIND_AGAIN" // = 126; "FIND_AGAIN", // = 126; "CENTER_FIT_RECT" // = 127; }; // If the site doesn't use the viewport meta tag to specify the viewport, Loading Loading @@ -5737,49 +5739,50 @@ public class WebView extends AbsoluteLayout } /* * Maximize and center the view inside the WebView. If the zoom doesn't need * to be changed, do an animated scroll to center it. If the zoom needs to * be changed, find the zoom center and do a smooth zoom transition. * Maximize and center the rectangle, specified in the document coordinate * space, inside the WebView. If the zoom doesn't need to be changed, do an * animated scroll to center it. If the zoom needs to be changed, find the * zoom center and do a smooth zoom transition. */ private void centerPluginOnScreen(ViewManager.ChildView child) { private void centerFitRect(int docX, int docY, int docWidth, int docHeight) { int viewWidth = getViewWidth(); int viewHeight = getViewHeightWithTitle(); float scale = Math.min((float) viewWidth / child.width, (float) viewHeight / child.height); float scale = Math.min((float) viewWidth / docWidth, (float) viewHeight / docHeight); if (scale < mMinZoomScale) { scale = mMinZoomScale; } else if (scale > mMaxZoomScale) { scale = mMaxZoomScale; } if (Math.abs(scale - mActualScale) < MINIMUM_SCALE_INCREMENT) { pinScrollTo( contentToViewX(child.x + child.width / 2) - viewWidth / 2, contentToViewY(child.y + child.height / 2) - viewHeight / 2, pinScrollTo(contentToViewX(docX + docWidth / 2) - viewWidth / 2, contentToViewY(docY + docHeight / 2) - viewHeight / 2, true, 0); } else { int oldScreenX = contentToViewX(child.x) - mScrollX; int newPluginX = (int) (child.x * scale); int newPluginWidth = (int) (child.width * scale); int oldScreenX = contentToViewX(docX) - mScrollX; int rectViewX = (int) (docX * scale); int rectViewWidth = (int) (docWidth * scale); int newMaxWidth = (int) (mContentWidth * scale); int newScreenX = (viewWidth - newPluginWidth) / 2; int newScreenX = (viewWidth - rectViewWidth) / 2; // pin the newX to the WebView if (newScreenX > newPluginX) { newScreenX = newPluginX; } else if (newScreenX > (newMaxWidth - newPluginX - newPluginWidth)) { newScreenX = viewWidth - (newMaxWidth - newPluginX); if (newScreenX > rectViewX) { newScreenX = rectViewX; } else if (newScreenX > (newMaxWidth - rectViewX - rectViewWidth)) { newScreenX = viewWidth - (newMaxWidth - rectViewX); } mZoomCenterX = (oldScreenX * scale - newScreenX * mActualScale) / (scale - mActualScale); int oldScreenY = contentToViewY(child.y) - mScrollY; int newPluginY = (int) (child.y * scale) + getTitleHeight(); int newPluginHeight = (int) (child.height * scale); int newMaxHeight = (int) (mContentHeight * scale) + getTitleHeight(); int newScreenY = (viewHeight - newPluginHeight) / 2; int oldScreenY = contentToViewY(docY) - mScrollY; int rectViewY = (int) (docY * scale) + getTitleHeight(); int rectViewHeight = (int) (docHeight * scale); int newMaxHeight = (int) (mContentHeight * scale) + getTitleHeight(); int newScreenY = (viewHeight - rectViewHeight) / 2; // pin the newY to the WebView if (newScreenY > newPluginY) { newScreenY = newPluginY; } else if (newScreenY > (newMaxHeight - newPluginY - newPluginHeight)) { newScreenY = viewHeight - (newMaxHeight - newPluginY); if (newScreenY > rectViewY) { newScreenY = rectViewY; } else if (newScreenY > (newMaxHeight - rectViewY - rectViewHeight)) { newScreenY = viewHeight - (newMaxHeight - rectViewY); } mZoomCenterY = (oldScreenY * scale - newScreenY * mActualScale) / (scale - mActualScale); Loading Loading @@ -5825,7 +5828,7 @@ public class WebView extends AbsoluteLayout true); } else { mInZoomOverview = false; centerPluginOnScreen(plugin); centerFitRect(plugin.x, plugin.y, plugin.width, plugin.height); } return; } Loading Loading @@ -6642,6 +6645,12 @@ public class WebView extends AbsoluteLayout } break; case CENTER_FIT_RECT: Rect r = (Rect)msg.obj; mInZoomOverview = false; centerFitRect(r.left, r.top, r.width(), r.height()); break; default: super.handleMessage(msg); break; Loading core/java/android/webkit/WebViewCore.java +9 −0 Original line number Diff line number Diff line Loading @@ -2462,6 +2462,15 @@ final class WebViewCore { } } // called by JNI private void centerFitRect(int x, int y, int width, int height) { if (mWebView == null) { return; } mWebView.mPrivateHandler.obtainMessage(WebView.CENTER_FIT_RECT, new Rect(x, y, x + width, y + height)).sendToTarget(); } private native void nativePause(); private native void nativeResume(); private native void nativeFreeMemory(); Loading Loading
core/java/android/webkit/WebView.java +38 −29 Original line number Diff line number Diff line Loading @@ -535,9 +535,10 @@ public class WebView extends AbsoluteLayout static final int SET_ROOT_LAYER_MSG_ID = 124; static final int RETURN_LABEL = 125; static final int FIND_AGAIN = 126; static final int CENTER_FIT_RECT = 127; private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID; private static final int LAST_PACKAGE_MSG_ID = FIND_AGAIN; private static final int LAST_PACKAGE_MSG_ID = CENTER_FIT_RECT; static final String[] HandlerPrivateDebugString = { "REMEMBER_PASSWORD", // = 1; Loading Loading @@ -578,7 +579,8 @@ public class WebView extends AbsoluteLayout "IMMEDIATE_REPAINT_MSG_ID", // = 123; "SET_ROOT_LAYER_MSG_ID", // = 124; "RETURN_LABEL", // = 125; "FIND_AGAIN" // = 126; "FIND_AGAIN", // = 126; "CENTER_FIT_RECT" // = 127; }; // If the site doesn't use the viewport meta tag to specify the viewport, Loading Loading @@ -5737,49 +5739,50 @@ public class WebView extends AbsoluteLayout } /* * Maximize and center the view inside the WebView. If the zoom doesn't need * to be changed, do an animated scroll to center it. If the zoom needs to * be changed, find the zoom center and do a smooth zoom transition. * Maximize and center the rectangle, specified in the document coordinate * space, inside the WebView. If the zoom doesn't need to be changed, do an * animated scroll to center it. If the zoom needs to be changed, find the * zoom center and do a smooth zoom transition. */ private void centerPluginOnScreen(ViewManager.ChildView child) { private void centerFitRect(int docX, int docY, int docWidth, int docHeight) { int viewWidth = getViewWidth(); int viewHeight = getViewHeightWithTitle(); float scale = Math.min((float) viewWidth / child.width, (float) viewHeight / child.height); float scale = Math.min((float) viewWidth / docWidth, (float) viewHeight / docHeight); if (scale < mMinZoomScale) { scale = mMinZoomScale; } else if (scale > mMaxZoomScale) { scale = mMaxZoomScale; } if (Math.abs(scale - mActualScale) < MINIMUM_SCALE_INCREMENT) { pinScrollTo( contentToViewX(child.x + child.width / 2) - viewWidth / 2, contentToViewY(child.y + child.height / 2) - viewHeight / 2, pinScrollTo(contentToViewX(docX + docWidth / 2) - viewWidth / 2, contentToViewY(docY + docHeight / 2) - viewHeight / 2, true, 0); } else { int oldScreenX = contentToViewX(child.x) - mScrollX; int newPluginX = (int) (child.x * scale); int newPluginWidth = (int) (child.width * scale); int oldScreenX = contentToViewX(docX) - mScrollX; int rectViewX = (int) (docX * scale); int rectViewWidth = (int) (docWidth * scale); int newMaxWidth = (int) (mContentWidth * scale); int newScreenX = (viewWidth - newPluginWidth) / 2; int newScreenX = (viewWidth - rectViewWidth) / 2; // pin the newX to the WebView if (newScreenX > newPluginX) { newScreenX = newPluginX; } else if (newScreenX > (newMaxWidth - newPluginX - newPluginWidth)) { newScreenX = viewWidth - (newMaxWidth - newPluginX); if (newScreenX > rectViewX) { newScreenX = rectViewX; } else if (newScreenX > (newMaxWidth - rectViewX - rectViewWidth)) { newScreenX = viewWidth - (newMaxWidth - rectViewX); } mZoomCenterX = (oldScreenX * scale - newScreenX * mActualScale) / (scale - mActualScale); int oldScreenY = contentToViewY(child.y) - mScrollY; int newPluginY = (int) (child.y * scale) + getTitleHeight(); int newPluginHeight = (int) (child.height * scale); int newMaxHeight = (int) (mContentHeight * scale) + getTitleHeight(); int newScreenY = (viewHeight - newPluginHeight) / 2; int oldScreenY = contentToViewY(docY) - mScrollY; int rectViewY = (int) (docY * scale) + getTitleHeight(); int rectViewHeight = (int) (docHeight * scale); int newMaxHeight = (int) (mContentHeight * scale) + getTitleHeight(); int newScreenY = (viewHeight - rectViewHeight) / 2; // pin the newY to the WebView if (newScreenY > newPluginY) { newScreenY = newPluginY; } else if (newScreenY > (newMaxHeight - newPluginY - newPluginHeight)) { newScreenY = viewHeight - (newMaxHeight - newPluginY); if (newScreenY > rectViewY) { newScreenY = rectViewY; } else if (newScreenY > (newMaxHeight - rectViewY - rectViewHeight)) { newScreenY = viewHeight - (newMaxHeight - rectViewY); } mZoomCenterY = (oldScreenY * scale - newScreenY * mActualScale) / (scale - mActualScale); Loading Loading @@ -5825,7 +5828,7 @@ public class WebView extends AbsoluteLayout true); } else { mInZoomOverview = false; centerPluginOnScreen(plugin); centerFitRect(plugin.x, plugin.y, plugin.width, plugin.height); } return; } Loading Loading @@ -6642,6 +6645,12 @@ public class WebView extends AbsoluteLayout } break; case CENTER_FIT_RECT: Rect r = (Rect)msg.obj; mInZoomOverview = false; centerFitRect(r.left, r.top, r.width(), r.height()); break; default: super.handleMessage(msg); break; Loading
core/java/android/webkit/WebViewCore.java +9 −0 Original line number Diff line number Diff line Loading @@ -2462,6 +2462,15 @@ final class WebViewCore { } } // called by JNI private void centerFitRect(int x, int y, int width, int height) { if (mWebView == null) { return; } mWebView.mPrivateHandler.obtainMessage(WebView.CENTER_FIT_RECT, new Rect(x, y, x + width, y + height)).sendToTarget(); } private native void nativePause(); private native void nativeResume(); private native void nativeFreeMemory(); Loading