Bug 716403 - Use setContentDocumentFixedPositionMargins in Android's browser.js. r=kats

This uses the aforementioned method on nsIDOMWindowUtils to make sure layout's
idea of the fixed position margins matches those used in the compositor.
This commit is contained in:
Chris Lord 2013-03-06 16:56:00 +00:00
parent bc3cb980a1
commit 866dd7b942
3 changed files with 41 additions and 1 deletions

View File

@ -552,6 +552,10 @@ public class GeckoEvent {
sb.append("{ \"x\" : ").append(metrics.viewportRectLeft)
.append(", \"y\" : ").append(metrics.viewportRectTop)
.append(", \"zoom\" : ").append(metrics.zoomFactor)
.append(", \"fixedMarginLeft\" : ").append(metrics.fixedLayerMarginLeft)
.append(", \"fixedMarginTop\" : ").append(metrics.fixedLayerMarginTop)
.append(", \"fixedMarginRight\" : ").append(metrics.fixedLayerMarginRight)
.append(", \"fixedMarginBottom\" : ").append(metrics.fixedLayerMarginBottom)
.append(", \"displayPort\" :").append(displayPort.toJSON())
.append('}');
event.mCharactersExtra = sb.toString();

View File

@ -261,6 +261,20 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget
ImmutableViewportMetrics metrics = getViewportMetrics();
ImmutableViewportMetrics clampedMetrics = metrics.clamp();
// See if we need to alter the fixed margins - Fixed margins would
// otherwise be set even when the document is in overscroll and they're
// unnecessary.
if ((metrics.fixedLayerMarginLeft > 0 && metrics.viewportRectLeft < metrics.pageRectLeft) ||
(metrics.fixedLayerMarginTop > 0 && metrics.viewportRectTop < metrics.pageRectTop) ||
(metrics.fixedLayerMarginRight > 0 && metrics.viewportRectRight > metrics.pageRectRight) ||
(metrics.fixedLayerMarginBottom > 0 && metrics.viewportRectBottom > metrics.pageRectBottom)) {
clampedMetrics = clampedMetrics.setFixedLayerMargins(
Math.max(0, metrics.fixedLayerMarginLeft + Math.min(0, metrics.viewportRectLeft - metrics.pageRectLeft)),
Math.max(0, metrics.fixedLayerMarginTop + Math.min(0, metrics.viewportRectTop - metrics.pageRectTop)),
Math.max(0, metrics.fixedLayerMarginRight + Math.min(0, (metrics.pageRectRight - metrics.viewportRectRight))),
Math.max(0, metrics.fixedLayerMarginBottom + Math.min(0, (metrics.pageRectBottom - metrics.viewportRectBottom))));
}
if (displayPort == null) {
displayPort = DisplayPortCalculator.calculate(metrics, mPanZoomController.getVelocityVector());
}
@ -363,7 +377,8 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget
newMetrics = newMetrics.clampWithMargins();
}
setViewportMetrics(newMetrics, false);
mForceRedraw = true;
setViewportMetrics(newMetrics, true);
mView.requestRender();
}

View File

@ -2803,6 +2803,10 @@ function Tab(aURL, aParams) {
this.showProgress = true;
this._zoom = 1.0;
this._drawZoom = 1.0;
this._fixedMarginLeft = 0;
this._fixedMarginTop = 0;
this._fixedMarginRight = 0;
this._fixedMarginBottom = 0;
this.userScrollPos = { x: 0, y: 0 };
this.viewportExcludesHorizontalMargins = true;
this.viewportExcludesVerticalMargins = true;
@ -3339,6 +3343,19 @@ Tab.prototype = {
if (aViewport.displayPort)
this.setDisplayPort(aViewport.displayPort);
// Store fixed margins for later retrieval in getViewport.
this._fixedMarginLeft = aViewport.fixedMarginLeft;
this._fixedMarginTop = aViewport.fixedMarginTop;
this._fixedMarginRight = aViewport.fixedMarginRight;
this._fixedMarginBottom = aViewport.fixedMarginBottom;
let dwi = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
dwi.setContentDocumentFixedPositionMargins(
aViewport.fixedMarginTop / aViewport.zoom,
aViewport.fixedMarginRight / aViewport.zoom,
aViewport.fixedMarginBottom / aViewport.zoom,
aViewport.fixedMarginLeft / aViewport.zoom);
Services.obs.notifyObservers(null, "after-viewport-change", "");
},
@ -3379,6 +3396,10 @@ Tab.prototype = {
cssPageTop: 0,
cssPageRight: screenW / this._zoom,
cssPageBottom: screenH / this._zoom,
fixedMarginLeft: this._fixedMarginLeft,
fixedMarginTop: this._fixedMarginTop,
fixedMarginRight: this._fixedMarginRight,
fixedMarginBottom: this._fixedMarginBottom,
zoom: this._zoom,
};