diff options
| -rw-r--r-- | core/java/android/webkit/WebSettings.java | 17 | ||||
| -rw-r--r-- | core/java/android/webkit/WebView.java | 57 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 12 |
3 files changed, 52 insertions, 34 deletions
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index e5813e6e3896..eeac1d268eaf 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -185,6 +185,7 @@ public class WebSettings { private boolean mSupportZoom = true; private boolean mBuiltInZoomControls = false; private boolean mAllowFileAccess = true; + private boolean mLoadWithOverviewMode = true; // Class to handle messages before WebCore is ready. private class EventHandler { @@ -427,6 +428,22 @@ public class WebSettings { } /** + * Set whether the WebView loads a page with overview mode. + * @hide Pending API council approval + */ + public void setLoadWithOverviewMode(boolean overview) { + mLoadWithOverviewMode = overview; + } + + /** + * Returns true if this WebView loads page with overview mode + * @hide Pending API council approval + */ + public boolean getLoadWithOverviewMode() { + return mLoadWithOverviewMode; + } + + /** * Store whether the WebView is saving form data. */ public void setSaveFormData(boolean save) { diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 444ef54d7bf5..2d87dd26d6ea 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -508,16 +508,13 @@ public class WebView extends AbsoluteLayout "REQUEST_KEYBOARD" // = 27; }; - // width which view is considered to be fully zoomed out - static final int ZOOM_OUT_WIDTH = 1008; - // default scale limit. Depending on the display density private static float DEFAULT_MAX_ZOOM_SCALE; private static float DEFAULT_MIN_ZOOM_SCALE; // scale limit, which can be set through viewport meta tag in the web page private float mMaxZoomScale; private float mMinZoomScale; - private boolean mMinZoomScaleFixed = false; + private boolean mMinZoomScaleFixed = true; // initial scale in percent. 0 means using default. private int mInitialScale = 0; @@ -529,7 +526,7 @@ public class WebView extends AbsoluteLayout boolean mInZoomOverview = false; // ideally mZoomOverviewWidth should be mContentWidth. But sites like espn, // engadget always have wider mContentWidth no matter what viewport size is. - int mZoomOverviewWidth = 0; + int mZoomOverviewWidth = WebViewCore.DEFAULT_VIEWPORT_WIDTH; float mLastScale; // default scale. Depending on the display density. @@ -3686,9 +3683,8 @@ public class WebView extends AbsoluteLayout // update mMinZoomScale if the minimum zoom scale is not fixed if (!mMinZoomScaleFixed) { mMinZoomScale = (float) getViewWidth() - / Math.max(ZOOM_OUT_WIDTH, mDrawHistory ? mHistoryPicture - .getWidth() : (mZoomOverviewWidth > 0 ? - mZoomOverviewWidth : mContentWidth)); + / (mDrawHistory ? mHistoryPicture.getWidth() + : mZoomOverviewWidth); } // we always force, in case our height changed, in which case we still @@ -4564,10 +4560,18 @@ public class WebView extends AbsoluteLayout public boolean zoomOut() { // TODO: alternatively we can disallow this during draw history mode switchOutDrawHistory(); - // Center zooming to the center of the screen. - mZoomCenterX = getViewWidth() * .5f; - mZoomCenterY = getViewHeight() * .5f; - return zoomWithPreview(mActualScale * 0.8f); + float scale = mActualScale * 0.8f; + if (scale < (mMinZoomScale + 0.1f) && WebView.ENABLE_DOUBLETAP_ZOOM + && mWebViewCore.getSettings().getUseWideViewPort()) { + // when zoom out to min scale, switch to overview mode + doDoubleTap(); + return true; + } else { + // Center zooming to the center of the screen. + mZoomCenterX = getViewWidth() * .5f; + mZoomCenterY = getViewHeight() * .5f; + return zoomWithPreview(scale); + } } private void updateSelection() { @@ -4666,14 +4670,6 @@ public class WebView extends AbsoluteLayout mZoomCenterY = mLastTouchY; mInZoomOverview = !mInZoomOverview; if (mInZoomOverview) { - float newScale = (float) getViewWidth() - / (mZoomOverviewWidth > 0 ? mZoomOverviewWidth - : mContentWidth); - if (Math.abs(newScale - mActualScale) < 0.01) { - mInZoomOverview = !mInZoomOverview; - // as it is already full screen, do nothing. - return; - } if (getSettings().getBuiltInZoomControls()) { if (mZoomButtonsController.isVisible()) { mZoomButtonsController.setVisible(false); @@ -4686,7 +4682,7 @@ public class WebView extends AbsoluteLayout mZoomControls.hide(); } } - zoomWithPreview(newScale); + zoomWithPreview((float) getViewWidth() / mZoomOverviewWidth); } else { // mLastTouchX and mLastTouchY are the point in the current viewport int contentX = viewToContent((int) mLastTouchX + mScrollX); @@ -4992,14 +4988,14 @@ public class WebView extends AbsoluteLayout case SPAWN_SCROLL_TO_MSG_ID: spawnContentScrollTo(msg.arg1, msg.arg2); break; - case NEW_PICTURE_MSG_ID: + case NEW_PICTURE_MSG_ID: { + WebSettings settings = mWebViewCore.getSettings(); // called for new content final int viewWidth = getViewWidth(); final WebViewCore.DrawData draw = (WebViewCore.DrawData) msg.obj; final Point viewSize = draw.mViewPoint; - boolean useWideViewport = - mWebViewCore.getSettings().getUseWideViewPort(); + boolean useWideViewport = settings.getUseWideViewPort(); WebViewCore.RestoreState restoreState = draw.mRestoreState; if (restoreState != null) { mInZoomOverview = false; @@ -5017,7 +5013,8 @@ public class WebView extends AbsoluteLayout mMaxZoomScale = restoreState.mMaxScale; } if (useWideViewport && restoreState.mViewScale == 0) { - mInZoomOverview = ENABLE_DOUBLETAP_ZOOM; + mInZoomOverview = ENABLE_DOUBLETAP_ZOOM + && settings.getLoadWithOverviewMode(); } setNewZoomScale(mLastScale, false); setContentScrollTo(restoreState.mScrollX, @@ -5050,21 +5047,19 @@ public class WebView extends AbsoluteLayout draw.mViewPoint.x); } if (!mMinZoomScaleFixed) { - mMinZoomScale = (float) viewWidth - / Math.max(ZOOM_OUT_WIDTH, - mZoomOverviewWidth > 0 ? mZoomOverviewWidth - : mContentWidth); + mMinZoomScale = (float) viewWidth / mZoomOverviewWidth; } if (!mDrawHistory && mInZoomOverview) { // fit the content width to the current view. Ignore // the rounding error case. if (Math.abs((viewWidth * mInvActualScale) - mZoomOverviewWidth) > 1) { - zoomWithPreview((float) viewWidth - / mZoomOverviewWidth); + setNewZoomScale((float) viewWidth + / mZoomOverviewWidth, false); } } break; + } case WEBCORE_INITIALIZED_MSG_ID: // nativeCreate sets mNativeClass to a non-zero value nativeCreate(msg.arg1); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index ff4e736ecdf2..86b0843fb75c 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -105,6 +105,10 @@ final class WebViewCore { private int mWebkitScrollX = 0; private int mWebkitScrollY = 0; + // If the site doesn't use viewport meta tag to specify the viewport, use + // DEFAULT_VIEWPORT_WIDTH as default viewport width + static final int DEFAULT_VIEWPORT_WIDTH = 800; + // The thread name used to identify the WebCore thread and for use in // debugging other classes that require operation within the WebCore thread. /* package */ static final String THREAD_NAME = "WebViewCoreThread"; @@ -1419,7 +1423,7 @@ final class WebViewCore { if (mViewportWidth == -1) { if (mSettings.getLayoutAlgorithm() == WebSettings.LayoutAlgorithm.NORMAL) { - width = WebView.ZOOM_OUT_WIDTH; + width = DEFAULT_VIEWPORT_WIDTH; } else { /* * if a page's minimum preferred width is wider than the @@ -1433,7 +1437,8 @@ final class WebViewCore { * In the worse case, the native width will be adjusted when * next zoom or screen orientation change happens. */ - width = Math.max(w, nativeGetContentMinPrefWidth()); + width = Math.max(w, Math.max(DEFAULT_VIEWPORT_WIDTH, + nativeGetContentMinPrefWidth())); } } else { width = Math.max(w, mViewportWidth); @@ -1530,7 +1535,8 @@ final class WebViewCore { // layout. draw.mViewPoint = new Point(mCurrentViewWidth, mCurrentViewHeight); if (WebView.ENABLE_DOUBLETAP_ZOOM && mSettings.getUseWideViewPort()) { - draw.mMinPrefWidth = nativeGetContentMinPrefWidth(); + draw.mMinPrefWidth = Math.max(DEFAULT_VIEWPORT_WIDTH, + nativeGetContentMinPrefWidth()); } if (mRestoreState != null) { draw.mRestoreState = mRestoreState; |