| Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
|
| index 86e046e8e68befe1b5724cffebb4c1d8ac95ba9f..4fab61f8e2a2e3e558ddc8d7a75ae0436bafe269 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
|
| @@ -118,6 +118,7 @@
|
|
|
| // Cache objects that should not be created frequently.
|
| private final RectF mCacheViewport = new RectF();
|
| + private final RectF mCacheVisibleViewport = new RectF();
|
| private DrawingInfo mProgressBarDrawingInfo;
|
|
|
| // If we've drawn at least one frame.
|
| @@ -203,7 +204,7 @@
|
| @Override
|
| public void onLayoutChange(View v, int left, int top, int right, int bottom,
|
| int oldLeft, int oldTop, int oldRight, int oldBottom) {
|
| - onViewportChanged();
|
| + propagateViewportToLayouts(right - left, bottom - top);
|
|
|
| // If there's an event that needs to occur after the keyboard is hidden, post
|
| // it as a delayed event. Otherwise this happens in the midst of the
|
| @@ -229,7 +230,7 @@
|
| */
|
| public void setLayoutManager(LayoutManager layoutManager) {
|
| mLayoutManager = layoutManager;
|
| - onViewportChanged();
|
| + propagateViewportToLayouts(getWidth(), getHeight());
|
| }
|
|
|
| /**
|
| @@ -452,13 +453,13 @@
|
| @Override
|
| public void onContentOffsetChanged(float offset) {
|
| mLastContentOffset = offset;
|
| - onViewportChanged();
|
| + propagateViewportToLayouts(getWidth(), getHeight());
|
| }
|
|
|
| @Override
|
| public void onVisibleContentOffsetChanged(float offset, boolean needsAnimate) {
|
| mLastVisibleContentOffset = offset;
|
| - onViewportChanged();
|
| + propagateViewportToLayouts(getWidth(), getHeight());
|
| if (needsAnimate) requestRender();
|
| }
|
|
|
| @@ -493,12 +494,27 @@
|
| }
|
| }
|
|
|
| - private void onViewportChanged() {
|
| + private void propagateViewportToLayouts(int contentWidth, int contentHeight) {
|
| + int heightMinusBrowserControls = contentHeight
|
| + - (getTopControlsHeightPixels() + getBottomControlsHeightPixels());
|
| + int bottomControlOffset = mFullscreenManager != null
|
| + ? (int) mFullscreenManager.getBottomControlOffset() : 0;
|
| + int viewportBottom =
|
| + contentHeight - (getBottomControlsHeightPixels() - bottomControlOffset);
|
| +
|
| + // The only time that mCacheViewport and mCacheVisibleViewport are different is when the
|
| + // browser has manipulated the browser controls offset.
|
| + mCacheViewport.set(0, (int) mLastContentOffset, contentWidth, viewportBottom);
|
| + mCacheVisibleViewport.set(0, (int) mLastVisibleContentOffset, contentWidth, viewportBottom);
|
| // TODO(changwan): check if this can be merged with setContentMotionEventOffsets.
|
| if (mTabVisible != null && mTabVisible.getContentViewCore() != null) {
|
| - mTabVisible.getContentViewCore().setSmartClipOffsets(0, (int) -mLastContentOffset);
|
| - }
|
| - if (mLayoutManager != null) mLayoutManager.onViewportChanged();
|
| + mTabVisible.getContentViewCore().setSmartClipOffsets(
|
| + (int) -mCacheViewport.left, (int) -mCacheViewport.top);
|
| + }
|
| + if (mLayoutManager != null) {
|
| + mLayoutManager.pushNewViewport(
|
| + mCacheViewport, mCacheVisibleViewport, heightMinusBrowserControls);
|
| + }
|
| }
|
|
|
| /**
|
| @@ -522,32 +538,6 @@
|
| }
|
|
|
| TraceEvent.end("CompositorViewHolder:layout");
|
| - }
|
| -
|
| - @Override
|
| - public void getWindowViewport(RectF outRect) {
|
| - outRect.set(0, 0, getWidth(), getHeight());
|
| - }
|
| -
|
| - @Override
|
| - public void getVisibleViewport(RectF outRect) {
|
| - // All of these values are in pixels.
|
| - float viewportTop = 0;
|
| - float bottomControlOffset = 0;
|
| - if (mFullscreenManager != null) {
|
| - viewportTop = mFullscreenManager.getTopVisibleContentOffset();
|
| - bottomControlOffset = mFullscreenManager.getBottomControlOffset();
|
| - }
|
| - float viewportBottom =
|
| - getHeight() - (getBottomControlsHeightPixels() - bottomControlOffset);
|
| -
|
| - outRect.set(0, viewportTop, getWidth(), viewportBottom);
|
| - }
|
| -
|
| - @Override
|
| - public float getHeightMinusBrowserControls() {
|
| - return getHeight() - (getTopControlsHeightPixels() + getBottomControlsHeightPixels());
|
| -
|
| }
|
|
|
| @Override
|
| @@ -624,7 +614,7 @@
|
| @Override
|
| protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
| if (changed) {
|
| - onViewportChanged();
|
| + propagateViewportToLayouts(r - l, b - t);
|
| }
|
| super.onLayout(changed, l, t, r, b);
|
|
|
| @@ -654,7 +644,7 @@
|
| mLastVisibleContentOffset = mFullscreenManager.getTopVisibleContentOffset();
|
| mFullscreenManager.addListener(this);
|
| }
|
| - onViewportChanged();
|
| + propagateViewportToLayouts(getWidth(), getHeight());
|
| }
|
|
|
| @Override
|
| @@ -691,7 +681,7 @@
|
| public float getOverlayTranslateY() {
|
| return areBrowserControlsPermanentlyHidden()
|
| ? getTopControlsHeightPixels()
|
| - : mLastVisibleContentOffset;
|
| + : mCacheVisibleViewport.top;
|
| }
|
|
|
| /**
|
|
|