From 51b97011b73c10b832ea4ad10637f761802e125d Mon Sep 17 00:00:00 2001 From: Grace Kloba Date: Sun, 28 Mar 2010 15:49:23 -0700 Subject: [PATCH] cherry-pick 4a4f9886a789ece80f127397c1c7ad7f543b78fa into froyo Use the content width to calculate the zoom overview width. We used to use the minimum preferred width to calculate the overview width as it is what we use to define the viewport width. But some sites, like cbsnews, engadget, the content width will be slightly wider than the viewport width decided by the min preferred width. The result is we can still scroll a little bit in the overview mode. This issue is magnified when we introduce the overscroll feature. By using content width as zoom overview width, we will have content fit in the overview mode. But some sites, like "http://www.sfjazz.org/concerts/2010/spring/artists/towner.php" will be layout wider in the overview mode than it is in the zoom in state. This is a tradeoff. Fix http://b/issue?id=2551119 --- core/java/android/webkit/WebView.java | 19 +++++++++++-------- core/java/android/webkit/WebViewCore.java | 10 +--------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 59933d8e002c3..030290ff7de9e 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -6239,7 +6239,7 @@ public class WebView extends AbsoluteLayout case UPDATE_ZOOM_RANGE: { WebViewCore.RestoreState restoreState = (WebViewCore.RestoreState) msg.obj; - // mScrollX contains the new minPrefWidth + // mScrollX contains the new contentWidth updateZoomRange(restoreState, getViewWidth(), restoreState.mScrollX, false); break; @@ -6262,7 +6262,7 @@ public class WebView extends AbsoluteLayout boolean hasRestoreState = restoreState != null; if (hasRestoreState) { updateZoomRange(restoreState, viewSize.x, - draw.mMinPrefWidth, true); + draw.mWidthHeight.x, true); if (!mDrawHistory) { mInZoomOverview = false; @@ -6324,10 +6324,12 @@ public class WebView extends AbsoluteLayout // sMaxViewportWidth so that if the page doesn't behave // well, the WebView won't go insane. limit the lower // bound to match the default scale for mobile sites. + // we choose the content width to be mZoomOverviewWidth. + // this works for most of the sites. But some sites may + // cause the page layout wider than it needs. mZoomOverviewWidth = Math.min(sMaxViewportWidth, Math - .max((int) (viewWidth / mDefaultScale), Math - .max(draw.mMinPrefWidth, - draw.mViewPoint.x))); + .max((int) (viewWidth / mDefaultScale), + draw.mWidthHeight.x)); } if (!mMinZoomScaleFixed) { mMinZoomScale = (float) viewWidth / mZoomOverviewWidth; @@ -6976,12 +6978,13 @@ public class WebView extends AbsoluteLayout new InvokeListBox(array, enabledArray, selectedArray)); } + // viewWidth/contentWidth/updateZoomOverview are only used for mobile sites private void updateZoomRange(WebViewCore.RestoreState restoreState, - int viewWidth, int minPrefWidth, boolean updateZoomOverview) { + int viewWidth, int contentWidth, boolean updateZoomOverview) { if (restoreState.mMinScale == 0) { if (restoreState.mMobileSite) { - if (minPrefWidth > Math.max(0, viewWidth)) { - mMinZoomScale = (float) viewWidth / minPrefWidth; + if (contentWidth > Math.max(0, viewWidth)) { + mMinZoomScale = (float) viewWidth / contentWidth; mMinZoomScaleFixed = false; if (updateZoomOverview) { WebSettings settings = getSettings(); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 410227bbf3b4e..445e7ffac9270 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -1705,7 +1705,6 @@ final class WebViewCore { Region mInvalRegion; Point mViewPoint; Point mWidthHeight; - int mMinPrefWidth; RestoreState mRestoreState; // only non-null if it is for the first // picture set after the first layout boolean mFocusSizeChanged; @@ -1725,13 +1724,6 @@ final class WebViewCore { // layout. draw.mFocusSizeChanged = nativeFocusBoundsChanged(); draw.mViewPoint = new Point(mCurrentViewWidth, mCurrentViewHeight); - if (mSettings.getUseWideViewPort()) { - draw.mMinPrefWidth = Math.max( - mViewportWidth == -1 ? WebView.DEFAULT_VIEWPORT_WIDTH - : (mViewportWidth == 0 ? mCurrentViewWidth - : mViewportWidth), - nativeGetContentMinPrefWidth()); - } if (mRestoreState != null) { draw.mRestoreState = mRestoreState; mRestoreState = null; @@ -2085,7 +2077,7 @@ final class WebViewCore { restoreState.mDefaultScale = adjust; // as mViewportWidth is not 0, it is not mobile site. restoreState.mMobileSite = false; - // for non-mobile site, we don't need minPrefWidth, set it as 0 + // for non-mobile site, we don't need contentWidth, set it as 0 restoreState.mScrollX = 0; Message.obtain(mWebView.mPrivateHandler, WebView.UPDATE_ZOOM_RANGE, restoreState).sendToTarget();