cherry-pick 4a4f9886a7 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
This commit is contained in:
Grace Kloba
2010-03-28 15:49:23 -07:00
parent 7c3006f53a
commit 51b97011b7
2 changed files with 12 additions and 17 deletions

View File

@@ -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();

View File

@@ -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();