Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
index 561c165b60f2c86a6f85b863d47b8af4410740b7..16335a0b4b47ccdfab270d44da8bfed8c0162b00 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
@@ -230,7 +230,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
// The anchor view should not go outside the bounds of the ContainerView. |
int leftMargin = Math.round(x * scale); |
- int topMargin = Math.round(mRenderCoordinates.getContentOffsetYPix() + y * scale); |
+ int topMargin = Math.round(mRenderCoordinates.getTopControlsShownYPix() + y * scale); |
int scaledWidth = Math.round(width * scale); |
// ContentViewCore currently only supports these two container view types. |
if (containerView instanceof FrameLayout) { |
@@ -504,6 +504,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
private int mPhysicalBackingWidthPix; |
private int mPhysicalBackingHeightPix; |
private int mTopControlsHeightPix; |
+ private int mBottomControlsHeightPix; |
private boolean mTopControlsShrinkBlinkSize; |
// Cached copy of all positions and scales as reported by the renderer. |
@@ -701,6 +702,15 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
} |
/** |
+ * Sets the height of the bottom controls. If necessary, triggers a renderer resize. |
+ */ |
+ public void setBottomControlsHeight(int bottomControlHeightPix) { |
+ if (mBottomControlsHeightPix == bottomControlHeightPix) return; |
+ mBottomControlsHeightPix = bottomControlHeightPix; |
+ if (mNativeContentViewCore != 0) nativeWasResized(mNativeContentViewCore); |
+ } |
+ |
+ /** |
* Returns a delegate that can be used to add and remove views from the current |
* container view. Clients can safely hold to instances of this class as it handles the |
* replacement of container views transparently. |
@@ -1099,6 +1109,11 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
return mTopControlsHeightPix; |
} |
+ @CalledByNative |
+ public int getBottomControlsHeightPix() { |
+ return mBottomControlsHeightPix; |
+ } |
+ |
/** |
* @return Current device scale factor (maps DIP pixels to physical pixels). |
*/ |
@@ -2131,7 +2146,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
// The selection coordinates are relative to the content viewport, but we need |
// coordinates relative to the containing View. |
outRect.set(mSelectionRect); |
- outRect.offset(0, (int) mRenderCoordinates.getContentOffsetYPix()); |
+ outRect.offset(0, (int) mRenderCoordinates.getTopControlsShownYPix()); |
} |
@Override |
@@ -2377,7 +2392,8 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor, |
float contentWidth, float contentHeight, |
float viewportWidth, float viewportHeight, |
- float controlsOffsetYCss, float contentOffsetYCss, |
+ float topControlsHeightDp, float topControlsShownRatio, |
+ float bottomControlsHeightDp, float bottomControlsShownRatio, |
boolean isMobileOptimizedHint, |
boolean hasInsertionMarker, boolean isInsertionMarkerVisible, |
float insertionMarkerHorizontal, float insertionMarkerTop, |
@@ -2391,7 +2407,9 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
mViewportWidthPix / (deviceScale * pageScaleFactor)); |
contentHeight = Math.max(contentHeight, |
mViewportHeightPix / (deviceScale * pageScaleFactor)); |
- final float contentOffsetYPix = mRenderCoordinates.fromDipToPix(contentOffsetYCss); |
+ final float topBarShownPix = topControlsHeightDp * deviceScale * topControlsShownRatio; |
+ final float bottomBarShownPix = bottomControlsHeightDp * deviceScale |
+ * bottomControlsShownRatio; |
final boolean contentSizeChanged = |
contentWidth != mRenderCoordinates.getContentWidthCss() |
@@ -2405,8 +2423,10 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
pageScaleChanged |
|| scrollOffsetX != mRenderCoordinates.getScrollX() |
|| scrollOffsetY != mRenderCoordinates.getScrollY(); |
- final boolean contentOffsetChanged = |
- contentOffsetYPix != mRenderCoordinates.getContentOffsetYPix(); |
+ final boolean topBarChanged = topBarShownPix != mRenderCoordinates |
+ .getTopControlsShownYPix(); |
+ final boolean bottomBarChanged = bottomBarShownPix != mRenderCoordinates |
+ .getBottomControlsShownYPix(); |
final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; |
final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChanged; |
@@ -2426,9 +2446,9 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
contentWidth, contentHeight, |
viewportWidth, viewportHeight, |
pageScaleFactor, minPageScaleFactor, maxPageScaleFactor, |
- contentOffsetYPix); |
+ topBarShownPix, bottomBarShownPix); |
- if (scrollChanged || contentOffsetChanged) { |
+ if (scrollChanged || topBarChanged) { |
for (mGestureStateListenersIterator.rewind(); |
mGestureStateListenersIterator.hasNext();) { |
mGestureStateListenersIterator.next().onScrollOffsetOrExtentChanged( |
@@ -2439,11 +2459,14 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); |
- // Update offsets for fullscreen. |
- final float controlsOffsetPix = controlsOffsetYCss * deviceScale; |
- // TODO(aelias): Remove last argument after downstream removes it. |
- getContentViewClient().onOffsetsForFullscreenChanged( |
- controlsOffsetPix, contentOffsetYPix); |
+ if (topBarChanged) { |
+ float topBarTranslate = topBarShownPix - topControlsHeightDp * deviceScale; |
+ getContentViewClient().onTopControlsChanged(topBarTranslate, topBarShownPix); |
+ } |
+ if (bottomBarChanged) { |
+ float bottomBarTranslate = bottomControlsHeightDp * deviceScale - bottomBarShownPix; |
+ getContentViewClient().onBottomControlsChanged(bottomBarTranslate, bottomBarShownPix); |
+ } |
if (mBrowserAccessibilityManager != null) { |
mBrowserAccessibilityManager.notifyFrameInfoInitialized(); |
@@ -2654,11 +2677,11 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
} |
if (!mHasInsertion || !canPaste()) return false; |
- final float contentOffsetYPix = mRenderCoordinates.getContentOffsetYPix(); |
+ final float topControlsShown = mRenderCoordinates.getTopControlsShownYPix(); |
PastePopupMenu pastePopupMenu = getPastePopup(); |
if (pastePopupMenu == null) return false; |
try { |
- pastePopupMenu.show(x, (int) (y + contentOffsetYPix)); |
+ pastePopupMenu.show(x, (int) (y + topControlsShown)); |
} catch (WindowManager.BadTokenException e) { |
return false; |
} |
@@ -3111,7 +3134,7 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen |
Rect boundsInParent = new Rect(left, top, left + width, top + height); |
if (node.isRootNode) { |
// Offset of the web content relative to the View. |
- boundsInParent.offset(0, (int) mRenderCoordinates.getContentOffsetYPix()); |
+ boundsInParent.offset(0, (int) mRenderCoordinates.getTopControlsShownYPix()); |
if (!ignoreScrollOffset) { |
boundsInParent.offset(-(int) mRenderCoordinates.getScrollXPix(), |
-(int) mRenderCoordinates.getScrollYPix()); |