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 {
return mSettings.supportsMultiTouchZoom();
}
public View getZoomControlsForTest() {
@VisibleForTesting
public View getZoomControlsViewForTest() {
return mZoomControls.getZoomControlsViewForTest();
}
@VisibleForTesting
public AwZoomControls getZoomControlsForTest() {
return mZoomControls;
}
/**
* @see View#setOverScrollMode(int)
*/
......@@ -3551,6 +3557,7 @@ public class AwContents implements SmartClipProvider {
mContentsClient.getCallbackHelper().postOnScaleChangedScaled(
oldPageScaleFactor * dipScale, mPageScaleFactor * dipScale);
}
mZoomControls.updateZoomControls();
}
private void saveWebArchiveInternal(String path, final Callback<String> callback) {
......
......@@ -10,17 +10,31 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
class AwZoomControls {
import androidx.annotation.VisibleForTesting;
// This class is visible purely for tests.
public class AwZoomControls {
private AwContents mAwContents;
// It is advised to use getZoomController() where possible.
@SuppressWarnings("deprecation")
private android.widget.ZoomButtonsController mZoomButtonsController;
private boolean mCanZoomIn;
private boolean mCanZoomOut;
AwZoomControls(AwContents awContents) {
mAwContents = awContents;
}
@VisibleForTesting
public boolean canZoomIn() {
return mCanZoomIn;
}
@VisibleForTesting
public boolean canZoomOut() {
return mCanZoomOut;
}
@SuppressWarnings("deprecation")
public void invokeZoomPicker() {
android.widget.ZoomButtonsController zoomController = getZoomController();
......@@ -43,15 +57,15 @@ class AwZoomControls {
if (zoomController == null) {
return;
}
boolean canZoomIn = mAwContents.canZoomIn();
boolean canZoomOut = mAwContents.canZoomOut();
if (!canZoomIn && !canZoomOut) {
mCanZoomIn = mAwContents.canZoomIn();
mCanZoomOut = mAwContents.canZoomOut();
if (!mCanZoomIn && !mCanZoomOut) {
// Hide the zoom in and out buttons if the page cannot zoom
zoomController.getZoomControls().setVisibility(View.GONE);
} else {
// Set each one individually, as a page may be able to zoom in or out
zoomController.setZoomInEnabled(canZoomIn);
zoomController.setZoomOutEnabled(canZoomOut);
zoomController.setZoomInEnabled(mCanZoomIn);
zoomController.setZoomOutEnabled(mCanZoomOut);
}
}
......
......@@ -73,8 +73,18 @@ public class AwZoomTest {
return ThreadUtils.runOnUiThreadBlocking(() -> view.getVisibility());
}
private View getZoomControlsOnUiThread() throws Throwable {
return ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.getZoomControlsForTest());
private View getZoomControlsViewOnUiThread() throws Throwable {
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() {
......@@ -214,17 +224,43 @@ public class AwZoomTest {
// With DisplayZoomControls set to false, attempts to display zoom
// controls must be ignored.
Assert.assertNull(getZoomControlsOnUiThread());
Assert.assertNull(getZoomControlsViewOnUiThread());
invokeZoomPickerOnUiThread();
Assert.assertNull(getZoomControlsOnUiThread());
Assert.assertNull(getZoomControlsViewOnUiThread());
webSettings.setDisplayZoomControls(true);
Assert.assertNull(getZoomControlsOnUiThread());
Assert.assertNull(getZoomControlsViewOnUiThread());
invokeZoomPickerOnUiThread();
View zoomControls = getZoomControlsOnUiThread();
View zoomControls = getZoomControlsViewOnUiThread();
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
@SmallTest
@Feature({"AndroidWebView"})
......@@ -239,9 +275,9 @@ public class AwZoomTest {
Assert.assertTrue(webSettings.supportZoom());
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(true);
Assert.assertNull(getZoomControlsOnUiThread());
Assert.assertNull(getZoomControlsViewOnUiThread());
invokeZoomPickerOnUiThread();
View zoomControls = getZoomControlsOnUiThread();
View zoomControls = getZoomControlsViewOnUiThread();
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