Bug 707571 (part 4) - Use mininum-scale and maximum-scale from <meta name="viewport"> [r=kats]

This commit is contained in:
Matt Brubeck 2012-05-18 08:24:27 -07:00
parent a3928422a4
commit dd1a410b01
5 changed files with 73 additions and 6 deletions

View File

@ -677,6 +677,8 @@ abstract public class GeckoApp
tab.removeTransientDoorHangers();
tab.setAllowZoom(true);
tab.setDefaultZoom(0);
tab.setMinZoom(0);
tab.setMaxZoom(0);
tab.setHasTouchListeners(false);
tab.setCheckerboardColor(Color.WHITE);
@ -1010,11 +1012,15 @@ abstract public class GeckoApp
return;
tab.setAllowZoom(message.getBoolean("allowZoom"));
tab.setDefaultZoom((float) message.getDouble("defaultZoom"));
tab.setMinZoom((float) message.getDouble("minZoom"));
tab.setMaxZoom((float) message.getDouble("maxZoom"));
// Sync up the LayerController and the tab if the tab's currently displayed.
LayerController controller = getLayerController();
if (controller != null && Tabs.getInstance().isSelectedTab(tab)) {
controller.setAllowZoom(tab.getAllowZoom());
controller.setDefaultZoom(tab.getDefaultZoom());
controller.setMinZoom(tab.getMinZoom());
controller.setMaxZoom(tab.getMaxZoom());
}
} else if (event.equals("Tab:HasTouchListener")) {
int tabId = message.getInt("tabID");

View File

@ -88,6 +88,8 @@ public final class Tab {
private boolean mHasTouchListeners;
private boolean mAllowZoom;
private float mDefaultZoom;
private float mMinZoom;
private float mMaxZoom;
private ArrayList<View> mPluginViews;
private HashMap<Object, Layer> mPluginLayers;
private ContentResolver mContentResolver;
@ -302,6 +304,22 @@ public final class Tab {
return mDefaultZoom;
}
public void setMinZoom(float aValue) {
mMinZoom = aValue;
}
public float getMinZoom() {
return mMinZoom;
}
public void setMaxZoom(float aValue) {
mMaxZoom = aValue;
}
public float getMaxZoom() {
return mMaxZoom;
}
public void setHasTouchListeners(boolean aValue) {
mHasTouchListeners = aValue;
}

View File

@ -93,6 +93,8 @@ public class LayerController {
private boolean mAllowZoom;
private float mDefaultZoom;
private float mMinZoom;
private float mMaxZoom;
private boolean mForceRedraw;
@ -369,4 +371,20 @@ public class LayerController {
public float getDefaultZoom() {
return mDefaultZoom;
}
public void setMinZoom(float aValue) {
mMinZoom = aValue;
}
public float getMinZoom() {
return mMinZoom;
}
public void setMaxZoom(float aValue) {
mMaxZoom = aValue;
}
public float getMaxZoom() {
return mMaxZoom;
}
}

View File

@ -817,6 +817,11 @@ public class PanZoomController
float minZoomFactor = 0.0f;
float maxZoomFactor = MAX_ZOOM;
if (mController.getMinZoom() > 0)
minZoomFactor = mController.getMinZoom();
if (mController.getMaxZoom() > 0)
maxZoomFactor = mController.getMaxZoom();
if (!mController.getAllowZoom()) {
// If allowZoom is false, clamp to the default zoom level.
maxZoomFactor = minZoomFactor = mController.getDefaultZoom();
@ -928,13 +933,31 @@ public class PanZoomController
synchronized (mController) {
float newZoomFactor = mController.getZoomFactor() * spanRatio;
if (newZoomFactor >= MAX_ZOOM) {
// apply resistance when zooming past MAX_ZOOM,
// such that it asymptotically reaches MAX_ZOOM + 1.0
float minZoomFactor = 0.0f;
float maxZoomFactor = MAX_ZOOM;
if (mController.getMinZoom() > 0)
minZoomFactor = mController.getMinZoom();
if (mController.getMaxZoom() > 0)
maxZoomFactor = mController.getMaxZoom();
if (newZoomFactor < minZoomFactor) {
// apply resistance when zooming past minZoomFactor,
// such that it asymptotically reaches minZoomFactor / 2.0
// but never exceeds that
float excessZoom = newZoomFactor - MAX_ZOOM;
final float rate = 0.5f; // controls how quickly we approach the limit
float excessZoom = minZoomFactor - newZoomFactor;
excessZoom = 1.0f - (float)Math.exp(-excessZoom * rate);
newZoomFactor = minZoomFactor * (1.0f - excessZoom / 2.0f);
}
if (newZoomFactor > maxZoomFactor) {
// apply resistance when zooming past maxZoomFactor,
// such that it asymptotically reaches maxZoomFactor + 1.0
// but never exceeds that
float excessZoom = newZoomFactor - maxZoomFactor;
excessZoom = 1.0f - (float)Math.exp(-excessZoom);
newZoomFactor = MAX_ZOOM + excessZoom;
newZoomFactor = maxZoomFactor + excessZoom;
}
mController.scrollBy(new PointF(mLastZoomFocus.x - detector.getFocusX(),

View File

@ -2455,6 +2455,8 @@ Tab.prototype = {
type: "Tab:ViewportMetadata",
allowZoom: this.metadata.allowZoom,
defaultZoom: this.metadata.defaultZoom || 0,
minZoom: this.metadata.minZoom || 0,
maxZoom: this.metadata.maxZoom || 0,
tabID: this.id
}});
},
@ -3696,7 +3698,7 @@ var ViewportHandler = {
scale = this.clamp(scale, kViewportMinScale, kViewportMaxScale);
minScale = this.clamp(minScale, kViewportMinScale, kViewportMaxScale);
maxScale = this.clamp(maxScale, kViewportMinScale, kViewportMaxScale);
maxScale = this.clamp(maxScale, minScale, kViewportMaxScale);
// If initial scale is 1.0 and width is not set, assume width=device-width
let autoSize = (widthStr == "device-width" ||