15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.android_webview.test; 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.app.Activity; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.pm.ActivityInfo; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.View; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.ViewConfiguration; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.AwContents; 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.android_webview.AwSettings; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.ThreadUtils; 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)import org.chromium.base.test.util.DisabledTest; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.Feature; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.Criteria; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.concurrent.Callable; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A test suite for zooming-related methods and settings. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)public class AwZoomTest extends AwTestBase { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final long TEST_TIMEOUT_MS = 20000L; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final int CHECK_INTERVAL_MS = 100; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private TestAwContentsClient mContentsClient; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private AwContents mAwContents; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void setUp() throws Exception { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super.setUp(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentsClient = new TestAwContentsClient(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AwTestContainerView testContainerView = 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) createAwTestContainerViewOnMainSync(mContentsClient); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mAwContents = testContainerView.getAwContents(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private String getZoomableHtml() { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return "<html><head><meta name=\"viewport\" content=\"" + 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "width=device-width, minimum-scale=0.5, maximum-scale=2.0, initial-scale=0.5" + 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "\"/></head><body>Zoomable</body></html>"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private String getNonZoomableHtml() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This page can't be zoomed because its viewport fully occupies 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // view area and is explicitly made non user-scalable. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "<html><head>" + 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<meta name=\"viewport\" " + 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "content=\"width=device-width,height=device-height," + 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "initial-scale=1,maximum-scale=1,user-scalable=no\">" + 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</head><body>Non-zoomable</body></html>"; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean isMultiTouchZoomSupportedOnUiThread() throws Throwable { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Boolean call() throws Exception { 62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return mAwContents.isMultiTouchZoomSupported(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private int getVisibilityOnUiThread(final View view) throws Throwable { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return runTestOnUiThreadAndGetResult(new Callable<Integer>() { 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public Integer call() throws Exception { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return view.getVisibility(); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean canZoomInOnUiThread() throws Throwable { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Boolean call() throws Exception { 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return mAwContents.canZoomIn(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean canZoomOutOnUiThread() throws Throwable { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runTestOnUiThreadAndGetResult(new Callable<Boolean>() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Boolean call() throws Exception { 89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return mAwContents.canZoomOut(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private View getZoomControlsOnUiThread() throws Throwable { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runTestOnUiThreadAndGetResult(new Callable<View>() { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public View call() throws Exception { 98b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return mAwContents.getZoomControlsForTest(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void invokeZoomPickerOnUiThread() throws Throwable { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void run() { 107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mAwContents.invokeZoomPicker(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean zoomInOnUiThreadAndWait() throws Throwable { 113389f89184187a18e6314d543397f72960e900659Torne (Richard Coles) final float previousScale = getPixelScaleOnUiThread(mAwContents); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!runTestOnUiThreadAndGetResult(new Callable<Boolean>() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Boolean call() throws Exception { 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return mAwContents.zoomIn(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) })) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The zoom level is updated asynchronously. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return waitForScaleChange(previousScale); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean zoomOutOnUiThreadAndWait() throws Throwable { 126389f89184187a18e6314d543397f72960e900659Torne (Richard Coles) final float previousScale = getPixelScaleOnUiThread(mAwContents); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!runTestOnUiThreadAndGetResult(new Callable<Boolean>() { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Boolean call() throws Exception { 130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return mAwContents.zoomOut(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) })) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The zoom level is updated asynchronously. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return waitForScaleChange(previousScale); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean waitForScaleChange(final float previousScale) throws Throwable { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CriteriaHelper.pollForCriteria(new Criteria() { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isSatisfied() { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 143389f89184187a18e6314d543397f72960e900659Torne (Richard Coles) return previousScale != getPixelScaleOnUiThread(mAwContents); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (Throwable t) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t.printStackTrace(); 146389f89184187a18e6314d543397f72960e900659Torne (Richard Coles) fail("Failed to getPixelScaleOnUiThread: " + t.toString()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, TEST_TIMEOUT_MS, CHECK_INTERVAL_MS); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean waitUntilCanNotZoom() throws Throwable { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CriteriaHelper.pollForCriteria(new Criteria() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isSatisfied() { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !canZoomInOnUiThread() && !canZoomOutOnUiThread(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (Throwable t) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t.printStackTrace(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail("Failed to query canZoomIn/Out: " + t.toString()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, TEST_TIMEOUT_MS, CHECK_INTERVAL_MS); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void runMagnificationTest(boolean supportZoom) throws Throwable { 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int onScaleChangedCallCount = mContentsClient.getOnScaleChangedHelper().getCallCount(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getZoomableHtml(), "text/html", false); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount); 173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) getAwSettingsOnUiThread(mAwContents).setSupportZoom(supportZoom); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should be able to zoom in", canZoomInOnUiThread()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse("Should not be able to zoom out", canZoomOutOnUiThread()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (canZoomInOnUiThread()) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(zoomInOnUiThreadAndWait()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should be able to zoom out", canZoomOutOnUiThread()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (canZoomOutOnUiThread()) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(zoomOutOnUiThreadAndWait()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Should be able to zoom in", canZoomInOnUiThread()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /* 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @SmallTest 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Feature({"AndroidWebView"}) 191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) http://crbug.com/239144 192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) @DisabledTest 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testMagnification() throws Throwable { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runMagnificationTest(true); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // According to Android CTS test, zoomIn/Out must work 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even if supportZoom is turned off. 200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /* 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @SmallTest 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Feature({"AndroidWebView"}) 203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) http://crbug.com/239144 204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) @DisabledTest 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testMagnificationWithZoomSupportOff() throws Throwable { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runMagnificationTest(false); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView"}) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testZoomUsingMultiTouch() throws Throwable { 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AwSettings webSettings = getAwSettingsOnUiThread(mAwContents); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getZoomableHtml(), "text/html", false); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(webSettings.supportZoom()); 218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertFalse(webSettings.getBuiltInZoomControls()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(isMultiTouchZoomSupportedOnUiThread()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setBuiltInZoomControls(true); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(isMultiTouchZoomSupportedOnUiThread()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setSupportZoom(false); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(isMultiTouchZoomSupportedOnUiThread()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /* 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @SmallTest 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Feature({"AndroidWebView"}) 231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) http://crbug.com/239144 232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) @DisabledTest 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testZoomControls() throws Throwable { 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AwSettings webSettings = getAwSettingsOnUiThread(mAwContents); 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int onScaleChangedCallCount = mContentsClient.getOnScaleChangedHelper().getCallCount(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getZoomableHtml(), "text/html", false); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentsClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // It must be possible to zoom in (or zoom out) for zoom controls to be shown 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertTrue("Should be able to zoom in", canZoomInOnUiThread()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(webSettings.supportZoom()); 244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setBuiltInZoomControls(true); 245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setDisplayZoomControls(false); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With DisplayZoomControls set to false, attempts to display zoom 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // controls must be ignored. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNull(getZoomControlsOnUiThread()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invokeZoomPickerOnUiThread(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNull(getZoomControlsOnUiThread()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setDisplayZoomControls(true); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNull(getZoomControlsOnUiThread()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invokeZoomPickerOnUiThread(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View zoomControls = getZoomControlsOnUiThread(); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(View.VISIBLE, getVisibilityOnUiThread(zoomControls)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView"}) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testZoomControlsOnNonZoomableContent() throws Throwable { 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AwSettings webSettings = getAwSettingsOnUiThread(mAwContents); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getNonZoomableHtml(), "text/html", false); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ContentView must update itself according to the viewport setup. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waitUntilCanNotZoom(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(webSettings.supportZoom()); 271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setBuiltInZoomControls(true); 272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setDisplayZoomControls(true); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNull(getZoomControlsOnUiThread()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invokeZoomPickerOnUiThread(); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View zoomControls = getZoomControlsOnUiThread(); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertEquals(View.GONE, getVisibilityOnUiThread(zoomControls)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @SmallTest 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Feature({"AndroidWebView"}) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testZoomControlsOnOrientationChange() throws Throwable { 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AwSettings webSettings = getAwSettingsOnUiThread(mAwContents); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getZoomableHtml(), "text/html", false); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) assertTrue(webSettings.supportZoom()); 287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setBuiltInZoomControls(true); 288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) webSettings.setDisplayZoomControls(true); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invokeZoomPickerOnUiThread(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now force an orientation change, and try to display the zoom picker 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // again. Make sure that we don't crash when the ZoomPicker registers 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's receiver. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Activity activity = getActivity(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int orientation = activity.getRequestedOrientation(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) activity.setRequestedOrientation(orientation); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invokeZoomPickerOnUiThread(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may crash shortly (as the zoom picker has a short delay in it before 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it tries to register it's BroadcastReceiver), so sleep to verify we don't. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The delay is encoded in ZoomButtonsController#ZOOM_CONTROLS_TIMEOUT, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if that changes we may need to update this test. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Thread.sleep(ViewConfiguration.getZoomControlsTimeout()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 309