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