Commit 11579e37 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

webview: fix zoom control updating

As part of
https://chromium-review.googlesource.com/c/chromium/src/+/2225548
I removed an override of onScrollOffsetOrExtentChanged. It turns out
the code was relying on this to be called when the scale factor
changed so that the zoom-controls could be updated.

The fix is to update the zoom-controls when the scale factor
changes.

BUG=1116921
TEST=see bug

Change-Id: Iea87c23e9ea0e6b5934ee568f668388dde489ed6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2405645Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#806628}
parent 807aa8b6
...@@ -2089,10 +2089,16 @@ public class AwContents implements SmartClipProvider { ...@@ -2089,10 +2089,16 @@ public class AwContents implements SmartClipProvider {
return mSettings.supportsMultiTouchZoom(); return mSettings.supportsMultiTouchZoom();
} }
public View getZoomControlsForTest() { @VisibleForTesting
public View getZoomControlsViewForTest() {
return mZoomControls.getZoomControlsViewForTest(); return mZoomControls.getZoomControlsViewForTest();
} }
@VisibleForTesting
public AwZoomControls getZoomControlsForTest() {
return mZoomControls;
}
/** /**
* @see View#setOverScrollMode(int) * @see View#setOverScrollMode(int)
*/ */
...@@ -3551,6 +3557,7 @@ public class AwContents implements SmartClipProvider { ...@@ -3551,6 +3557,7 @@ public class AwContents implements SmartClipProvider {
mContentsClient.getCallbackHelper().postOnScaleChangedScaled( mContentsClient.getCallbackHelper().postOnScaleChangedScaled(
oldPageScaleFactor * dipScale, mPageScaleFactor * dipScale); oldPageScaleFactor * dipScale, mPageScaleFactor * dipScale);
} }
mZoomControls.updateZoomControls();
} }
private void saveWebArchiveInternal(String path, final Callback<String> callback) { private void saveWebArchiveInternal(String path, final Callback<String> callback) {
......
...@@ -10,17 +10,31 @@ import android.view.View; ...@@ -10,17 +10,31 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
class AwZoomControls { import androidx.annotation.VisibleForTesting;
// This class is visible purely for tests.
public class AwZoomControls {
private AwContents mAwContents; private AwContents mAwContents;
// It is advised to use getZoomController() where possible. // It is advised to use getZoomController() where possible.
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private android.widget.ZoomButtonsController mZoomButtonsController; private android.widget.ZoomButtonsController mZoomButtonsController;
private boolean mCanZoomIn;
private boolean mCanZoomOut;
AwZoomControls(AwContents awContents) { AwZoomControls(AwContents awContents) {
mAwContents = awContents; mAwContents = awContents;
} }
@VisibleForTesting
public boolean canZoomIn() {
return mCanZoomIn;
}
@VisibleForTesting
public boolean canZoomOut() {
return mCanZoomOut;
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void invokeZoomPicker() { public void invokeZoomPicker() {
android.widget.ZoomButtonsController zoomController = getZoomController(); android.widget.ZoomButtonsController zoomController = getZoomController();
...@@ -43,15 +57,15 @@ class AwZoomControls { ...@@ -43,15 +57,15 @@ class AwZoomControls {
if (zoomController == null) { if (zoomController == null) {
return; return;
} }
boolean canZoomIn = mAwContents.canZoomIn(); mCanZoomIn = mAwContents.canZoomIn();
boolean canZoomOut = mAwContents.canZoomOut(); mCanZoomOut = mAwContents.canZoomOut();
if (!canZoomIn && !canZoomOut) { if (!mCanZoomIn && !mCanZoomOut) {
// Hide the zoom in and out buttons if the page cannot zoom // Hide the zoom in and out buttons if the page cannot zoom
zoomController.getZoomControls().setVisibility(View.GONE); zoomController.getZoomControls().setVisibility(View.GONE);
} else { } else {
// Set each one individually, as a page may be able to zoom in or out // Set each one individually, as a page may be able to zoom in or out
zoomController.setZoomInEnabled(canZoomIn); zoomController.setZoomInEnabled(mCanZoomIn);
zoomController.setZoomOutEnabled(canZoomOut); zoomController.setZoomOutEnabled(mCanZoomOut);
} }
} }
......
...@@ -73,8 +73,18 @@ public class AwZoomTest { ...@@ -73,8 +73,18 @@ public class AwZoomTest {
return ThreadUtils.runOnUiThreadBlocking(() -> view.getVisibility()); return ThreadUtils.runOnUiThreadBlocking(() -> view.getVisibility());
} }
private View getZoomControlsOnUiThread() throws Throwable { private View getZoomControlsViewOnUiThread() throws Throwable {
return ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.getZoomControlsForTest()); return ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.getZoomControlsViewForTest());
}
private boolean canZoomInUsingZoomControls() throws Throwable {
return ThreadUtils.runOnUiThreadBlocking(
() -> mAwContents.getZoomControlsForTest().canZoomIn());
}
private boolean canZoomOutUsingZoomControls() throws Throwable {
return ThreadUtils.runOnUiThreadBlocking(
() -> mAwContents.getZoomControlsForTest().canZoomOut());
} }
private void invokeZoomPickerOnUiThread() { private void invokeZoomPickerOnUiThread() {
...@@ -214,17 +224,43 @@ public class AwZoomTest { ...@@ -214,17 +224,43 @@ public class AwZoomTest {
// With DisplayZoomControls set to false, attempts to display zoom // With DisplayZoomControls set to false, attempts to display zoom
// controls must be ignored. // controls must be ignored.
Assert.assertNull(getZoomControlsOnUiThread()); Assert.assertNull(getZoomControlsViewOnUiThread());
invokeZoomPickerOnUiThread(); invokeZoomPickerOnUiThread();
Assert.assertNull(getZoomControlsOnUiThread()); Assert.assertNull(getZoomControlsViewOnUiThread());
webSettings.setDisplayZoomControls(true); webSettings.setDisplayZoomControls(true);
Assert.assertNull(getZoomControlsOnUiThread()); Assert.assertNull(getZoomControlsViewOnUiThread());
invokeZoomPickerOnUiThread(); invokeZoomPickerOnUiThread();
View zoomControls = getZoomControlsOnUiThread(); View zoomControls = getZoomControlsViewOnUiThread();
Assert.assertEquals(View.VISIBLE, getVisibilityOnUiThread(zoomControls)); Assert.assertEquals(View.VISIBLE, getVisibilityOnUiThread(zoomControls));
} }
@Test
@SmallTest
@Feature({"AndroidWebView"})
public void testZoomControlsUiIsUpdatedOnChanges() throws Throwable {
AwSettings webSettings = mActivityTestRule.getAwSettingsOnUiThread(mAwContents);
webSettings.setDisplayZoomControls(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setUseWideViewPort(true);
Assert.assertFalse(canZoomInUsingZoomControls());
Assert.assertFalse(canZoomOutUsingZoomControls());
final float pageMinimumScale = 0.5f;
mActivityTestRule.loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getZoomableHtml(pageMinimumScale), "text/html", false);
waitForScaleToBecome(pageMinimumScale);
Assert.assertTrue(canZoomInUsingZoomControls());
Assert.assertFalse(canZoomOutUsingZoomControls());
zoomInOnUiThreadAndWait();
Assert.assertTrue(canZoomInUsingZoomControls());
Assert.assertTrue(canZoomOutUsingZoomControls());
zoomOutOnUiThreadAndWait();
Assert.assertTrue(canZoomInUsingZoomControls());
Assert.assertFalse(canZoomOutUsingZoomControls());
}
@Test @Test
@SmallTest @SmallTest
@Feature({"AndroidWebView"}) @Feature({"AndroidWebView"})
...@@ -239,9 +275,9 @@ public class AwZoomTest { ...@@ -239,9 +275,9 @@ public class AwZoomTest {
Assert.assertTrue(webSettings.supportZoom()); Assert.assertTrue(webSettings.supportZoom());
webSettings.setBuiltInZoomControls(true); webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(true); webSettings.setDisplayZoomControls(true);
Assert.assertNull(getZoomControlsOnUiThread()); Assert.assertNull(getZoomControlsViewOnUiThread());
invokeZoomPickerOnUiThread(); invokeZoomPickerOnUiThread();
View zoomControls = getZoomControlsOnUiThread(); View zoomControls = getZoomControlsViewOnUiThread();
Assert.assertEquals(View.GONE, getVisibilityOnUiThread(zoomControls)); Assert.assertEquals(View.GONE, getVisibilityOnUiThread(zoomControls));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment