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: { case UPDATE_ZOOM_RANGE: {
WebViewCore.RestoreState restoreState WebViewCore.RestoreState restoreState
= (WebViewCore.RestoreState) msg.obj; = (WebViewCore.RestoreState) msg.obj;
// mScrollX contains the new minPrefWidth // mScrollX contains the new contentWidth
updateZoomRange(restoreState, getViewWidth(), updateZoomRange(restoreState, getViewWidth(),
restoreState.mScrollX, false); restoreState.mScrollX, false);
break; break;
@@ -6262,7 +6262,7 @@ public class WebView extends AbsoluteLayout
boolean hasRestoreState = restoreState != null; boolean hasRestoreState = restoreState != null;
if (hasRestoreState) { if (hasRestoreState) {
updateZoomRange(restoreState, viewSize.x, updateZoomRange(restoreState, viewSize.x,
draw.mMinPrefWidth, true); draw.mWidthHeight.x, true);
if (!mDrawHistory) { if (!mDrawHistory) {
mInZoomOverview = false; mInZoomOverview = false;
@@ -6324,10 +6324,12 @@ public class WebView extends AbsoluteLayout
// sMaxViewportWidth so that if the page doesn't behave // sMaxViewportWidth so that if the page doesn't behave
// well, the WebView won't go insane. limit the lower // well, the WebView won't go insane. limit the lower
// bound to match the default scale for mobile sites. // 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 mZoomOverviewWidth = Math.min(sMaxViewportWidth, Math
.max((int) (viewWidth / mDefaultScale), Math .max((int) (viewWidth / mDefaultScale),
.max(draw.mMinPrefWidth, draw.mWidthHeight.x));
draw.mViewPoint.x)));
} }
if (!mMinZoomScaleFixed) { if (!mMinZoomScaleFixed) {
mMinZoomScale = (float) viewWidth / mZoomOverviewWidth; mMinZoomScale = (float) viewWidth / mZoomOverviewWidth;
@@ -6976,12 +6978,13 @@ public class WebView extends AbsoluteLayout
new InvokeListBox(array, enabledArray, selectedArray)); new InvokeListBox(array, enabledArray, selectedArray));
} }
// viewWidth/contentWidth/updateZoomOverview are only used for mobile sites
private void updateZoomRange(WebViewCore.RestoreState restoreState, private void updateZoomRange(WebViewCore.RestoreState restoreState,
int viewWidth, int minPrefWidth, boolean updateZoomOverview) { int viewWidth, int contentWidth, boolean updateZoomOverview) {
if (restoreState.mMinScale == 0) { if (restoreState.mMinScale == 0) {
if (restoreState.mMobileSite) { if (restoreState.mMobileSite) {
if (minPrefWidth > Math.max(0, viewWidth)) { if (contentWidth > Math.max(0, viewWidth)) {
mMinZoomScale = (float) viewWidth / minPrefWidth; mMinZoomScale = (float) viewWidth / contentWidth;
mMinZoomScaleFixed = false; mMinZoomScaleFixed = false;
if (updateZoomOverview) { if (updateZoomOverview) {
WebSettings settings = getSettings(); WebSettings settings = getSettings();

View File

@@ -1705,7 +1705,6 @@ final class WebViewCore {
Region mInvalRegion; Region mInvalRegion;
Point mViewPoint; Point mViewPoint;
Point mWidthHeight; Point mWidthHeight;
int mMinPrefWidth;
RestoreState mRestoreState; // only non-null if it is for the first RestoreState mRestoreState; // only non-null if it is for the first
// picture set after the first layout // picture set after the first layout
boolean mFocusSizeChanged; boolean mFocusSizeChanged;
@@ -1725,13 +1724,6 @@ final class WebViewCore {
// layout. // layout.
draw.mFocusSizeChanged = nativeFocusBoundsChanged(); draw.mFocusSizeChanged = nativeFocusBoundsChanged();
draw.mViewPoint = new Point(mCurrentViewWidth, mCurrentViewHeight); 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) { if (mRestoreState != null) {
draw.mRestoreState = mRestoreState; draw.mRestoreState = mRestoreState;
mRestoreState = null; mRestoreState = null;
@@ -2085,7 +2077,7 @@ final class WebViewCore {
restoreState.mDefaultScale = adjust; restoreState.mDefaultScale = adjust;
// as mViewportWidth is not 0, it is not mobile site. // as mViewportWidth is not 0, it is not mobile site.
restoreState.mMobileSite = false; 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; restoreState.mScrollX = 0;
Message.obtain(mWebView.mPrivateHandler, Message.obtain(mWebView.mPrivateHandler,
WebView.UPDATE_ZOOM_RANGE, restoreState).sendToTarget(); WebView.UPDATE_ZOOM_RANGE, restoreState).sendToTarget();