Index: android_webview/java/src/org/chromium/android_webview/AwContents.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java |
index 8cd952007905542e1c33edeb0666402fdd7b9b9f..4255cc52bb61bf594346eceac1d21f9acbd373ec 100644 |
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java |
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java |
@@ -92,6 +92,14 @@ public class AwContents { |
*/ |
public interface InternalAccessDelegate extends ContentViewCore.InternalAccessDelegate { |
/** |
+ * @see View#onScrollChanged(int, int, int, int) |
+ * |
+ * TODO(mkosiba): WebViewClassic calls this, AwContents doesn't. Check if there |
+ * are any cases we're missing, if not - remove. |
+ */ |
+ void onScrollChanged(int lPix, int tPix, int oldlPix, int oldtPix); |
+ |
+ /** |
* @see View#setMeasuredDimension(int, int) |
*/ |
void setMeasuredDimension(int measuredWidth, int measuredHeight); |
@@ -119,6 +127,7 @@ public class AwContents { |
private final InterceptNavigationDelegateImpl mInterceptNavigationDelegate; |
private final InternalAccessDelegate mInternalAccessAdapter; |
private final AwLayoutSizer mLayoutSizer; |
+ private final AwScrollOffsetManager mScrollOffsetManager; |
private final AwZoomControls mZoomControls; |
// This can be accessed on any thread after construction. See AwContentsIoThreadClient. |
private final AwSettings mSettings; |
@@ -280,6 +289,30 @@ public class AwContents { |
} |
//-------------------------------------------------------------------------------------------- |
+ private class AwScrollOffsetManagerDelegate implements AwScrollOffsetManager.Delegate { |
+ @Override |
+ public boolean scrollContainerViewTo(int x, int y) { |
+ mContainerView.scrollTo(x, y); |
+ return (x == mContainerView.getScrollX() && y == mContainerView.getScrollY()); |
+ } |
+ |
+ @Override |
+ public void scrollNativeTo(int x, int y) { |
+ nativeScrollTo(mNativeAwContents, x, y); |
+ } |
+ |
+ @Override |
+ public int getContainerViewScrollX() { |
+ return mContainerView.getScrollX(); |
+ } |
+ |
+ @Override |
+ public int getContainerViewScrollY() { |
+ return mContainerView.getScrollY(); |
+ } |
+ } |
+ |
+ //-------------------------------------------------------------------------------------------- |
private class AwPinchGestureStateListener implements ContentViewCore.PinchGestureStateListener { |
@Override |
public void onPinchGestureStart() { |
@@ -384,6 +417,7 @@ public class AwContents { |
mSettings.setDefaultVideoPosterURL( |
mDefaultVideoPosterRequestHandler.getDefaultVideoPosterURL()); |
mContentsClient.setDIPScale(mDIPScale); |
+ mScrollOffsetManager = new AwScrollOffsetManager(new AwScrollOffsetManagerDelegate()); |
setNewAwContents(nativeInit(browserContext)); |
} |
@@ -421,6 +455,7 @@ public class AwContents { |
mIoThreadClient, mInterceptNavigationDelegate); |
mContentsClient.installWebContentsObserver(mContentViewCore); |
mSettings.setWebContents(nativeWebContents); |
+ nativeSetDipScale(mNativeAwContents, (float) mDIPScale); |
} |
/** |
@@ -547,6 +582,13 @@ public class AwContents { |
return (int) Math.ceil(mContentViewCore.getContentWidthCss()); |
} |
+ /** |
+ * Called by the embedder when the scroll offset of the containing view has changed. |
+ */ |
+ public void onContainerViewScrollChanged(int l, int t, int oldl, int oldt) { |
+ mScrollOffsetManager.onContainerViewScrollChanged(l, t); |
+ } |
+ |
public Picture capturePicture() { |
return nativeCapturePicture(mNativeAwContents); |
} |
@@ -1389,6 +1431,11 @@ public class AwContents { |
mLayoutSizer.onPageScaleChanged(pageScaleFactor); |
} |
+ @CalledByNative |
+ private void scrollContainerViewTo(int x, int y) { |
+ mScrollOffsetManager.scrollContainerViewTo(x, y); |
+ } |
+ |
// ------------------------------------------------------------------------------------------- |
// Helper methods |
// ------------------------------------------------------------------------------------------- |
@@ -1475,10 +1522,12 @@ public class AwContents { |
private native void nativeUpdateLastHitTestData(int nativeAwContents); |
private native void nativeOnSizeChanged(int nativeAwContents, int w, int h, int ow, int oh); |
+ private native void nativeScrollTo(int nativeAwContents, int x, int y); |
private native void nativeSetWindowViewVisibility(int nativeAwContents, boolean windowVisible, |
boolean viewVisible); |
private native void nativeOnAttachedToWindow(int nativeAwContents, int w, int h); |
private native void nativeOnDetachedFromWindow(int nativeAwContents); |
+ private native void nativeSetDipScale(int nativeAwContents, float dipScale); |
// Returns null if save state fails. |
private native byte[] nativeGetOpaqueState(int nativeAwContents); |