1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 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.content.Context;
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport android.graphics.Point;
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport android.net.http.SslError;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Build;
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.os.SystemClock;
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.MediumTest;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest;
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport android.view.WindowManager;
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import android.webkit.JavascriptInterface;
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport android.webkit.ValueCallback;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.webkit.WebSettings;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.apache.http.Header;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.apache.http.HttpRequest;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.AwContents;
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient.ShouldInterceptRequestParams;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.AwSettings;
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import org.chromium.android_webview.AwSettings.LayoutAlgorithm;
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)import org.chromium.android_webview.AwWebResourceResponse;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.test.util.CommonResources;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.test.util.ImagePageGenerator;
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.chromium.android_webview.test.util.VideoTestUtil;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.android_webview.test.util.VideoTestWebServer;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.DisabledTest;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.Feature;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.TestFileUtil;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.UrlUtils;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.CallbackHelper;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.HistoryUtils;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.content_public.browser.WebContents;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.net.test.util.TestWebServer;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.ui.gfx.DeviceDisplayInfo;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)import java.io.File;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import java.util.concurrent.Callable;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.TimeUnit;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.regex.Matcher;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.regex.Pattern;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * A test suite for AwSettings class. The key objective is to verify that each
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * settings applies either to each individual view or to all views of the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * application
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class AwSettingsTest extends AwTestBase {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static final boolean ENABLED = true;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static final boolean DISABLED = false;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * A helper class for testing a particular preference from AwSettings.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The generic type T is the type of the setting. Usually, to test an
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * effect of the preference, JS code is executed that sets document's title.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * In this case, requiresJsEnabled constructor argument must be set to true.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    abstract class AwSettingsTestHelper<T> {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected final AwContents mAwContents;
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        protected final Context mContext;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected final TestAwContentsClient mContentViewClient;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        protected final AwSettings mAwSettings;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwSettingsTestHelper(AwTestContainerView containerView,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             TestAwContentsClient contentViewClient,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             boolean requiresJsEnabled) throws Throwable {
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            mAwContents = containerView.getAwContents();
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            mContext = containerView.getContext();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mContentViewClient = contentViewClient;
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            mAwSettings = AwSettingsTest.this.getAwSettingsOnUiThread(mAwContents);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (requiresJsEnabled) {
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mAwSettings.setJavaScriptEnabled(true);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void ensureSettingHasAlteredValue() throws Throwable {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ensureSettingHasValue(getAlteredValue());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void ensureSettingHasInitialValue() throws Throwable {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ensureSettingHasValue(getInitialValue());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void setAlteredSettingValue() throws Throwable {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            setCurrentValue(getAlteredValue());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void setInitialSettingValue() throws Throwable {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            setCurrentValue(getInitialValue());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected abstract T getAlteredValue();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected abstract T getInitialValue();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected abstract T getCurrentValue();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected abstract void setCurrentValue(T value) throws Throwable;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected abstract void doEnsureSettingHasValue(T value) throws Throwable;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        protected String getTitleOnUiThread() throws Exception {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return AwSettingsTest.this.getTitleOnUiThread(mAwContents);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void loadDataSync(String data) throws Throwable {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AwSettingsTest.this.loadDataSync(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mAwContents,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mContentViewClient.getOnPageFinishedHelper(),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                data,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "text/html",
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                false);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void loadUrlSync(String url) throws Throwable {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AwSettingsTest.this.loadUrlSync(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mAwContents,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mContentViewClient.getOnPageFinishedHelper(),
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                url);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void loadUrlSyncAndExpectError(String url) throws Throwable {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AwSettingsTest.this.loadUrlSyncAndExpectError(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mAwContents,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mContentViewClient.getOnPageFinishedHelper(),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mContentViewClient.getOnReceivedErrorHelper(),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                url);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        protected String executeJavaScriptAndWaitForResult(String script) throws Exception {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return AwSettingsTest.this.executeJavaScriptAndWaitForResult(
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    mAwContents, mContentViewClient, script);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private void ensureSettingHasValue(T value) throws Throwable {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(value, getCurrentValue());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            doEnsureSettingHasValue(value);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsJavaScriptTestHelper extends AwSettingsTestHelper<Boolean> {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String JS_ENABLED_STRING = "JS Enabled";
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String JS_DISABLED_STRING = "JS Disabled";
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwSettingsJavaScriptTestHelper(AwTestContainerView containerView,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       TestAwContentsClient contentViewClient) throws Throwable {
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, false);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getJavaScriptEnabled();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setJavaScriptEnabled(value);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(getData());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value == ENABLED ? JS_ENABLED_STRING : JS_DISABLED_STRING,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getData() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "<html><head><title>" + JS_DISABLED_STRING + "</title>"
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    + "</head><body onload=\"document.title='" + JS_ENABLED_STRING
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    + "';\"></body></html>";
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In contrast to AwSettingsJavaScriptTestHelper, doesn't reload the page when testing
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // JavaScript state.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsJavaScriptDynamicTestHelper extends AwSettingsJavaScriptTestHelper {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsJavaScriptDynamicTestHelper(
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Load the page.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            super.doEnsureSettingHasValue(getInitialValue());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String oldTitle = getTitleOnUiThread();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String newTitle = oldTitle + "_modified";
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            executeJavaScriptAndWaitForResult(getScript(newTitle));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(value == ENABLED ? newTitle : oldTitle, getTitleOnUiThread());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getScript(String title) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "document.title='" + title + "';";
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsPluginsTestHelper extends AwSettingsTestHelper<Boolean> {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String PLUGINS_ENABLED_STRING = "Embed";
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String PLUGINS_DISABLED_STRING = "NoEmbed";
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwSettingsPluginsTestHelper(AwTestContainerView containerView,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    TestAwContentsClient contentViewClient) throws Throwable {
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getPluginsEnabled();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setPluginsEnabled(value);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(getData());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value == ENABLED ? PLUGINS_ENABLED_STRING : PLUGINS_DISABLED_STRING,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getData() {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "<html><body onload=\"document.title = document.body.innerText;\">"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    + "<noembed>No</noembed><span>Embed</span></body></html>";
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsStandardFontFamilyTestHelper extends AwSettingsTestHelper<String> {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsStandardFontFamilyTestHelper(
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getAlteredValue() {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "cursive";
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getInitialValue() {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "sans-serif";
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getCurrentValue() {
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getStandardFontFamily();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(String value) {
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setStandardFontFamily(value);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(String value) throws Throwable {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(getData());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(value, getTitleOnUiThread());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getData() {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "<html><body onload=\"document.title = " +
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "getComputedStyle(document.body).getPropertyValue('font-family');\">"
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    + "</body></html>";
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsDefaultFontSizeTestHelper extends AwSettingsTestHelper<Integer> {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsDefaultFontSizeTestHelper(
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Integer getAlteredValue() {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return 42;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Integer getInitialValue() {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return 16;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Integer getCurrentValue() {
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getDefaultFontSize();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Integer value) {
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setDefaultFontSize(value);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Integer value) throws Throwable {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(getData());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(value.toString() + "px", getTitleOnUiThread());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getData() {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "<html><body onload=\"document.title = " +
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "getComputedStyle(document.body).getPropertyValue('font-size');\">"
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    + "</body></html>";
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsLoadImagesAutomaticallyTestHelper extends AwSettingsTestHelper<Boolean> {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private ImagePageGenerator mGenerator;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsLoadImagesAutomaticallyTestHelper(
341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ImagePageGenerator generator) throws Throwable {
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mGenerator = generator;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getLoadsImagesAutomatically();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setLoadsImagesAutomatically(value);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(mGenerator.getPageSource());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(value == ENABLED ?
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ImagePageGenerator.IMAGE_LOADED_STRING :
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ImagePageGenerator.IMAGE_NOT_LOADED_STRING,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         getTitleOnUiThread());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    class AwSettingsImagesEnabledHelper extends AwSettingsTestHelper<Boolean> {
380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        AwSettingsImagesEnabledHelper(
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                TestAwContentsClient contentViewClient,
384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                TestWebServer webServer,
385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                ImagePageGenerator generator) throws Throwable {
386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            mWebServer = webServer;
388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            mGenerator = generator;
389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
391d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        @Override
392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        protected Boolean getAlteredValue() {
393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            return DISABLED;
394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        @Override
397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        protected Boolean getInitialValue() {
398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            return ENABLED;
399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        @Override
402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        protected Boolean getCurrentValue() {
403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            return mAwSettings.getImagesEnabled();
404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
405d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
406d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        @Override
407d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        protected void setCurrentValue(Boolean value) {
408d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            mAwSettings.setImagesEnabled(value);
409d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
410d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
411d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        @Override
412d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            final String httpImageUrl = mGenerator.getPageUrl(mWebServer);
414d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            AwSettingsTest.this.loadUrlSync(
415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    mAwContents,
416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    mContentViewClient.getOnPageFinishedHelper(),
417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    httpImageUrl);
418d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            assertEquals(value == ENABLED ?
419d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         ImagePageGenerator.IMAGE_LOADED_STRING :
420d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         ImagePageGenerator.IMAGE_NOT_LOADED_STRING,
421d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         getTitleOnUiThread());
422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
423d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        private TestWebServer mWebServer;
425d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        private ImagePageGenerator mGenerator;
426d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
427d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsDefaultTextEncodingTestHelper extends AwSettingsTestHelper<String> {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsDefaultTextEncodingTestHelper(
430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getAlteredValue() {
4374ccfafb49a467adf7819cc5933ef036c1ee41c10mkosiba            return "Latin-1";
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getInitialValue() {
4424ccfafb49a467adf7819cc5933ef036c1ee41c10mkosiba            return "UTF-8";
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getCurrentValue() {
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getDefaultTextEncodingName();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(String value) {
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setDefaultTextEncodingName(value);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(String value) throws Throwable {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(getData());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(value, getTitleOnUiThread());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getData() {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "<html><body onload='document.title=document.defaultCharset'></body></html>";
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsUserAgentStringTestHelper extends AwSettingsTestHelper<String> {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final String mDefaultUa;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String DEFAULT_UA = "";
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String CUSTOM_UA = "ChromeViewTest";
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsUserAgentStringTestHelper(
472effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
474effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mDefaultUa = mAwSettings.getUserAgentString();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getAlteredValue() {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return CUSTOM_UA;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getInitialValue() {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DEFAULT_UA;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected String getCurrentValue() {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // The test framework expects that getXXX() == Z after setXXX(Z).
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // But setUserAgentString("" / null) resets the UA string to default,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // and getUserAgentString returns the default UA string afterwards.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // To align with the framework, we return an empty string instead of
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // the default UA.
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            String currentUa = mAwSettings.getUserAgentString();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return mDefaultUa.equals(currentUa) ? DEFAULT_UA : currentUa;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(String value) {
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setUserAgentString(value);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(String value) throws Throwable {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(getData());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                DEFAULT_UA.equals(value) ? mDefaultUa : value,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getData() {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "<html><body onload='document.title=navigator.userAgent'></body></html>";
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsDomStorageEnabledTestHelper extends AwSettingsTestHelper<Boolean> {
518424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_FILE = "webview/localStorage.html";
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String NO_LOCAL_STORAGE = "No localStorage";
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String HAS_LOCAL_STORAGE = "Has localStorage";
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsDomStorageEnabledTestHelper(
523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
525effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
526424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AwSettingsTest.assertFileIsReadable(UrlUtils.getTestFilePath(TEST_FILE));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getDomStorageEnabled();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setDomStorageEnabled(value);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // It is not permitted to access localStorage from data URLs in WebKit,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // that is why a standalone page must be used.
553424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            loadUrlSync(UrlUtils.getTestFileUrl(TEST_FILE));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value == ENABLED ? HAS_LOCAL_STORAGE : NO_LOCAL_STORAGE,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class AwSettingsDatabaseTestHelper extends AwSettingsTestHelper<Boolean> {
561424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_FILE = "webview/database_access.html";
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private static final String NO_DATABASE = "No database";
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private static final String HAS_DATABASE = "Has database";
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AwSettingsDatabaseTestHelper(
566effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
568effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
569424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AwSettingsTest.assertFileIsReadable(UrlUtils.getTestFilePath(TEST_FILE));
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getAlteredValue() {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return ENABLED;
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getInitialValue() {
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return DISABLED;
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getCurrentValue() {
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getDatabaseEnabled();
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(Boolean value) {
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setDatabaseEnabled(value);
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // It seems accessing the database through a data scheme is not
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // supported, and fails with a DOM exception (likely a cross-domain
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // violation).
597424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            loadUrlSync(UrlUtils.getTestFileUrl(TEST_FILE));
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                value == ENABLED ? HAS_DATABASE : NO_DATABASE,
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                getTitleOnUiThread());
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsUniversalAccessFromFilesTestHelper extends AwSettingsTestHelper<Boolean> {
605424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_CONTAINER_FILE = "webview/iframe_access.html";
606424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_FILE = "webview/hello_world.html";
607ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        private static final String ACCESS_DENIED_TITLE = "Exception";
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsUniversalAccessFromFilesTestHelper(
610effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
612effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
613424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AwSettingsTest.assertFileIsReadable(UrlUtils.getTestFilePath(TEST_CONTAINER_FILE));
614424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AwSettingsTest.assertFileIsReadable(UrlUtils.getTestFilePath(TEST_FILE));
615424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            mIframeContainerUrl = UrlUtils.getTestFileUrl(TEST_CONTAINER_FILE);
616424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            mIframeUrl = UrlUtils.getTestFileUrl(TEST_FILE);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // The value of the setting depends on the SDK version.
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowUniversalAccessFromFileURLs(false);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // If universal access is true, the value of file access doesn't
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // matter. While if universal access is false, having file access
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // enabled will allow file loading.
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowFileAccessFromFileURLs(false);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getAllowUniversalAccessFromFileURLs();
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowUniversalAccessFromFileURLs(value);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadUrlSync(mIframeContainerUrl);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value == ENABLED ? mIframeUrl : ACCESS_DENIED_TITLE,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final String mIframeContainerUrl;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final String mIframeUrl;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsFileAccessFromFilesIframeTestHelper extends AwSettingsTestHelper<Boolean> {
658424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_CONTAINER_FILE = "webview/iframe_access.html";
659424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_FILE = "webview/hello_world.html";
660ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        private static final String ACCESS_DENIED_TITLE = "Exception";
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsFileAccessFromFilesIframeTestHelper(
663effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
665effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
666424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AwSettingsTest.assertFileIsReadable(UrlUtils.getTestFilePath(TEST_CONTAINER_FILE));
667424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AwSettingsTest.assertFileIsReadable(UrlUtils.getTestFilePath(TEST_FILE));
668424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            mIframeContainerUrl = UrlUtils.getTestFileUrl(TEST_CONTAINER_FILE);
669424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            mIframeUrl = UrlUtils.getTestFileUrl(TEST_FILE);
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowUniversalAccessFromFileURLs(false);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // The value of the setting depends on the SDK version.
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowFileAccessFromFileURLs(false);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getAllowFileAccessFromFileURLs();
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowFileAccessFromFileURLs(value);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadUrlSync(mIframeContainerUrl);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value == ENABLED ? mIframeUrl : ACCESS_DENIED_TITLE,
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final String mIframeContainerUrl;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final String mIframeUrl;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsFileAccessFromFilesXhrTestHelper extends AwSettingsTestHelper<Boolean> {
708424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_FILE = "webview/xhr_access.html";
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String ACCESS_GRANTED_TITLE = "Hello, World!";
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String ACCESS_DENIED_TITLE = "Exception";
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsFileAccessFromFilesXhrTestHelper(
713effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
715effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
716424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            assertFileIsReadable(UrlUtils.getTestFilePath(TEST_FILE));
717424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            mXhrContainerUrl = UrlUtils.getTestFileUrl(TEST_FILE);
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowUniversalAccessFromFileURLs(false);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // The value of the setting depends on the SDK version.
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowFileAccessFromFileURLs(false);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getAllowFileAccessFromFileURLs();
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setAllowFileAccessFromFileURLs(value);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadUrlSync(mXhrContainerUrl);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value == ENABLED ? ACCESS_GRANTED_TITLE : ACCESS_DENIED_TITLE,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final String mXhrContainerUrl;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    class AwSettingsFileUrlAccessTestHelper extends AwSettingsTestHelper<Boolean> {
755424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        private static final String TEST_FILE = "webview/hello_world.html";
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String ACCESS_GRANTED_TITLE = "Hello, World!";
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsFileUrlAccessTestHelper(
759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient,
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int startIndex) throws Throwable {
762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mIndex = startIndex;
764424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AwSettingsTest.assertFileIsReadable(UrlUtils.getTestFilePath(TEST_FILE));
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return mAwSettings.getAllowFileAccess();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mAwSettings.setAllowFileAccess(value);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Use query parameters to avoid hitting a cached page.
790424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            String fileUrl = UrlUtils.getTestFileUrl(TEST_FILE + "?id=" + mIndex);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mIndex += 2;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (value == ENABLED) {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                loadUrlSync(fileUrl);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                assertEquals(ACCESS_GRANTED_TITLE, getTitleOnUiThread());
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                loadUrlSyncAndExpectError(fileUrl);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private int mIndex;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    class AwSettingsContentUrlAccessTestHelper extends AwSettingsTestHelper<Boolean> {
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsContentUrlAccessTestHelper(
806effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int index) throws Throwable {
809effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mTarget = "content_access_" + index;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return mAwSettings.getAllowContentAccess();
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mAwSettings.setAllowContentAccess(value);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AwSettingsTest.this.resetResourceRequestCountInContentProvider(mTarget);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (value == ENABLED) {
837f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                loadUrlSync(AwSettingsTest.this.createContentUrl(mTarget));
838f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                String title = getTitleOnUiThread();
839f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                assertTrue(title != null);
840f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                assertTrue("[" + mTarget + "] Actual title: \"" + title + "\"",
841f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        title.contains(mTarget));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AwSettingsTest.this.ensureResourceRequestCountInContentProvider(mTarget, 1);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
844f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                loadUrlSyncAndExpectError(AwSettingsTest.this.createContentUrl(mTarget));
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AwSettingsTest.this.ensureResourceRequestCountInContentProvider(mTarget, 0);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final String mTarget;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    class AwSettingsContentUrlAccessFromFileTestHelper extends AwSettingsTestHelper<Boolean> {
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private static final String TARGET = "content_from_file";
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsContentUrlAccessFromFileTestHelper(
856effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient,
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int index) throws Throwable {
859effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mIndex = index;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mTempDir = getInstrumentation().getTargetContext().getCacheDir().getPath();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return mAwSettings.getAllowContentAccess();
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mAwSettings.setAllowContentAccess(value);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AwSettingsTest.this.resetResourceRequestCountInContentProvider(TARGET);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final String fileName = mTempDir + "/" + TARGET + ".html";
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            try {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestFileUtil.createNewHtmlFile(fileName,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TARGET,
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "<img src=\"" +
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        // Adding a query avoids hitting a cached image, and also verifies
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        // that content URL query parameters are ignored when accessing
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        // a content provider.
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        AwSettingsTest.this.createContentUrl(TARGET + "?id=" + mIndex) + "\">");
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mIndex += 2;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                loadUrlSync("file://" + fileName);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (value == ENABLED) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    AwSettingsTest.this.ensureResourceRequestCountInContentProvider(TARGET, 1);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    AwSettingsTest.this.ensureResourceRequestCountInContentProvider(TARGET, 0);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } finally {
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestFileUtil.deleteFile(fileName);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private int mIndex;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String mTempDir;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This class provides helper methods for testing of settings related to
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the text autosizing feature.
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    abstract class AwSettingsTextAutosizingTestHelper<T> extends AwSettingsTestHelper<T> {
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected static final float PARAGRAPH_FONT_SIZE = 14.0f;
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AwSettingsTextAutosizingTestHelper(
918effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
920effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mNeedToWaitForFontSizeChange = false;
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadDataSync(getData());
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(T value) throws Throwable {
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mNeedToWaitForFontSizeChange = false;
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (value != getCurrentValue()) {
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mOldFontSize = getActualFontSize();
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mNeedToWaitForFontSizeChange = true;
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected float getActualFontSize() throws Throwable {
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (!mNeedToWaitForFontSizeChange) {
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                executeJavaScriptAndWaitForResult("setTitleToActualFontSize()");
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } else {
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                final float oldFontSize = mOldFontSize;
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                poll(new Callable<Boolean>() {
9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    @Override
9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    public Boolean call() throws Exception {
9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        executeJavaScriptAndWaitForResult("setTitleToActualFontSize()");
9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        float newFontSize = Float.parseFloat(getTitleOnUiThread());
9445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        return newFontSize != oldFontSize;
9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    }
9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                });
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mNeedToWaitForFontSizeChange = false;
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return Float.parseFloat(getTitleOnUiThread());
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected String getData() {
953effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            DeviceDisplayInfo deviceInfo = DeviceDisplayInfo.create(mContext);
954effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            int displayWidth = (int) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
955effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            int layoutWidth = (int) (displayWidth * 2.5f); // Use 2.5 as autosizing layout tests do.
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            StringBuilder sb = new StringBuilder();
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            sb.append("<html>" +
958effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    "<head>" +
959effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    "<meta name=\"viewport\" content=\"width=" + layoutWidth + "\">" +
960effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    "<style>" +
961effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    "body { width: " + layoutWidth + "px; margin: 0; overflow-y: hidden; }" +
962effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    "</style>" +
963effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    "<script>" +
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "function setTitleToActualFontSize() {" +
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    // parseFloat is used to trim out the "px" suffix.
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "  document.title = parseFloat(getComputedStyle(" +
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "    document.getElementById('par')).getPropertyValue('font-size'));" +
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "}</script></head>" +
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "<body>" +
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "<p id=\"par\" style=\"font-size:");
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            sb.append(PARAGRAPH_FONT_SIZE);
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            sb.append("px;\">");
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Make the paragraph wide enough for being processed by the font autosizer.
974effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            for (int i = 0; i < 500; i++) {
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                sb.append("Hello, World! ");
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            sb.append("</p></body></html>");
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return sb.toString();
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private boolean mNeedToWaitForFontSizeChange;
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private float mOldFontSize;
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class AwSettingsLayoutAlgorithmTestHelper extends
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              AwSettingsTextAutosizingTestHelper<LayoutAlgorithm> {
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AwSettingsLayoutAlgorithmTestHelper(
989effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
991effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient);
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Font autosizing doesn't step in for narrow layout widths.
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setUseWideViewPort(true);
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected LayoutAlgorithm getAlteredValue() {
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return LayoutAlgorithm.TEXT_AUTOSIZING;
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected LayoutAlgorithm getInitialValue() {
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return LayoutAlgorithm.NARROW_COLUMNS;
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected LayoutAlgorithm getCurrentValue() {
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getLayoutAlgorithm();
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(LayoutAlgorithm value) throws Throwable {
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            super.setCurrentValue(value);
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setLayoutAlgorithm(value);
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void doEnsureSettingHasValue(LayoutAlgorithm value) throws Throwable {
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final float actualFontSize = getActualFontSize();
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (value == LayoutAlgorithm.TEXT_AUTOSIZING) {
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertFalse("Actual font size: " + actualFontSize,
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        actualFontSize == PARAGRAPH_FONT_SIZE);
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } else {
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertTrue("Actual font size: " + actualFontSize,
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        actualFontSize == PARAGRAPH_FONT_SIZE);
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class AwSettingsTextZoomTestHelper extends AwSettingsTextAutosizingTestHelper<Integer> {
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private static final int INITIAL_TEXT_ZOOM = 100;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private final float mInitialActualFontSize;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsTextZoomTestHelper(
1035effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
1037effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mInitialActualFontSize = getActualFontSize();
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Integer getAlteredValue() {
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return INITIAL_TEXT_ZOOM * 2;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Integer getInitialValue() {
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return INITIAL_TEXT_ZOOM;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Integer getCurrentValue() {
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getTextZoom();
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(Integer value) throws Throwable {
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            super.setCurrentValue(value);
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mAwSettings.setTextZoom(value);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Integer value) throws Throwable {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final float actualFontSize = getActualFontSize();
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Ensure that actual vs. initial font size ratio is similar to actual vs. initial
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // text zoom values ratio.
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final float ratiosDelta = Math.abs(
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (actualFontSize / mInitialActualFontSize) -
1069a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                (value / (float) INITIAL_TEXT_ZOOM));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertTrue(
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "|(" + actualFontSize + " / " + mInitialActualFontSize + ") - (" +
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                value + " / " + INITIAL_TEXT_ZOOM + ")| = " + ratiosDelta,
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ratiosDelta <= 0.2f);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class AwSettingsTextZoomAutosizingTestHelper
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            extends AwSettingsTextAutosizingTestHelper<Integer> {
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private static final int INITIAL_TEXT_ZOOM = 100;
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final float mInitialActualFontSize;
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AwSettingsTextZoomAutosizingTestHelper(
1083effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
1085effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient);
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setLayoutAlgorithm(LayoutAlgorithm.TEXT_AUTOSIZING);
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // The initial font size can be adjusted by font autosizer depending on the page's
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // viewport width.
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mInitialActualFontSize = getActualFontSize();
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Integer getAlteredValue() {
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return INITIAL_TEXT_ZOOM * 2;
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Integer getInitialValue() {
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return INITIAL_TEXT_ZOOM;
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Integer getCurrentValue() {
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getTextZoom();
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(Integer value) throws Throwable {
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            super.setCurrentValue(value);
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setTextZoom(value);
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void doEnsureSettingHasValue(Integer value) throws Throwable {
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final float actualFontSize = getActualFontSize();
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Ensure that actual vs. initial font size ratio is similar to actual vs. initial
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // text zoom values ratio.
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final float ratiosDelta = Math.abs(
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                (actualFontSize / mInitialActualFontSize) -
1120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                (value / (float) INITIAL_TEXT_ZOOM));
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertTrue(
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "|(" + actualFontSize + " / " + mInitialActualFontSize + ") - (" +
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                value + " / " + INITIAL_TEXT_ZOOM + ")| = " + ratiosDelta,
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ratiosDelta <= 0.2f);
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class AwSettingsJavaScriptPopupsTestHelper extends AwSettingsTestHelper<Boolean> {
1129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        private static final String POPUP_ENABLED = "Popup enabled";
1130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        private static final String POPUP_BLOCKED = "Popup blocked";
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwSettingsJavaScriptPopupsTestHelper(
1133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
1135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getAlteredValue() {
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return ENABLED;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getInitialValue() {
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return DISABLED;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected Boolean getCurrentValue() {
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getJavaScriptCanOpenWindowsAutomatically();
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setJavaScriptCanOpenWindowsAutomatically(value);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadDataSync(getData());
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final boolean expectPopupEnabled = value;
11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            poll(new Callable<Boolean>() {
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                @Override
11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                public Boolean call() throws Exception {
11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    String title = getTitleOnUiThread();
11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    return expectPopupEnabled ? POPUP_ENABLED.equals(title) :
11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            POPUP_BLOCKED.equals(title);
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            });
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(value ? POPUP_ENABLED : POPUP_BLOCKED, getTitleOnUiThread());
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        private String getData() {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return "<html><head>" +
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "<script>" +
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "    function tryOpenWindow() {" +
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "        var newWindow = window.open(" +
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "           'data:text/html;charset=utf-8," +
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "           <html><head><title>" + POPUP_ENABLED + "</title></head></html>');" +
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "        if (!newWindow) document.title = '" + POPUP_BLOCKED + "';" +
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "    }" +
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "</script></head>" +
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "<body onload='tryOpenWindow()'></body></html>";
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    class AwSettingsCacheModeTestHelper extends AwSettingsTestHelper<Integer> {
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AwSettingsCacheModeTestHelper(
1190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient,
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                int index,
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestWebServer webServer) throws Throwable {
1194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mIndex = index;
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mWebServer = webServer;
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Integer getAlteredValue() {
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // We use the value that results in a behaviour completely opposite to default.
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return WebSettings.LOAD_CACHE_ONLY;
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Integer getInitialValue() {
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return WebSettings.LOAD_DEFAULT;
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Integer getCurrentValue() {
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mAwSettings.getCacheMode();
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(Integer value) {
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mAwSettings.setCacheMode(value);
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void doEnsureSettingHasValue(Integer value) throws Throwable {
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String htmlPath = "/cache_mode_" + mIndex + ".html";
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mIndex += 2;
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String url = mWebServer.setResponse(htmlPath, "response", null);
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, mWebServer.getRequestCount(htmlPath));
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (value == WebSettings.LOAD_DEFAULT) {
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                loadUrlSync(url);
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertEquals(1, mWebServer.getRequestCount(htmlPath));
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } else {
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                loadUrlSyncAndExpectError(url);
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertEquals(0, mWebServer.getRequestCount(htmlPath));
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private int mIndex;
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private TestWebServer mWebServer;
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // To verify whether UseWideViewport works, we check, if the page width specified
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in the "meta viewport" tag is applied. When UseWideViewport is turned off, the
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // "viewport" tag is ignored, and the layout width is set to device width in DIP pixels.
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We specify a very high width value to make sure that it doesn't intersect with
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // device screen widths (in DIP pixels).
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    class AwSettingsUseWideViewportTestHelper extends AwSettingsTestHelper<Boolean> {
1245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        private static final String VIEWPORT_TAG_LAYOUT_WIDTH = "3000";
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AwSettingsUseWideViewportTestHelper(
1248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
1250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getAlteredValue() {
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return ENABLED;
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getInitialValue() {
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return DISABLED;
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getCurrentValue() {
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getUseWideViewPort();
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(Boolean value) {
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setUseWideViewPort(value);
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadDataSync(getData());
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String bodyWidth = getTitleOnUiThread();
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (value) {
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertTrue(bodyWidth, VIEWPORT_TAG_LAYOUT_WIDTH.equals(bodyWidth));
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } else {
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertFalse(bodyWidth, VIEWPORT_TAG_LAYOUT_WIDTH.equals(bodyWidth));
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private String getData() {
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return "<html><head>" +
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "<meta name='viewport' content='width=" + VIEWPORT_TAG_LAYOUT_WIDTH + "' />" +
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "</head>" +
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "<body onload='document.title=document.body.clientWidth'></body></html>";
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class AwSettingsLoadWithOverviewModeTestHelper extends AwSettingsTestHelper<Boolean> {
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private static final float DEFAULT_PAGE_SCALE = 1.0f;
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AwSettingsLoadWithOverviewModeTestHelper(
1296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                AwTestContainerView containerView,
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestAwContentsClient contentViewClient,
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                boolean withViewPortTag) throws Throwable {
1299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            super(containerView, contentViewClient, true);
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mWithViewPortTag = withViewPortTag;
1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setUseWideViewPort(true);
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getAlteredValue() {
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return ENABLED;
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getInitialValue() {
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return DISABLED;
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected Boolean getCurrentValue() {
1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mAwSettings.getLoadWithOverviewMode();
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void setCurrentValue(Boolean value) {
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mExpectScaleChange = mAwSettings.getLoadWithOverviewMode() != value;
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (mExpectScaleChange) {
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mOnScaleChangedCallCount =
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        mContentViewClient.getOnScaleChangedHelper().getCallCount();
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mAwSettings.setLoadWithOverviewMode(value);
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadDataSync(getData());
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (mExpectScaleChange) {
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mContentViewClient.getOnScaleChangedHelper().
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        waitForCallback(mOnScaleChangedCallCount);
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mExpectScaleChange = false;
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            float currentScale = AwSettingsTest.this.getScaleOnUiThread(mAwContents);
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (value) {
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertTrue("Expected: " + currentScale + " < " + DEFAULT_PAGE_SCALE,
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        currentScale < DEFAULT_PAGE_SCALE);
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } else {
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertEquals(DEFAULT_PAGE_SCALE, currentScale);
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private String getData() {
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return "<html><head>" +
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    (mWithViewPortTag ? "<meta name='viewport' content='width=3000' />" : "") +
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "</head>" +
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "<body></body></html>";
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final boolean mWithViewPortTag;
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private boolean mExpectScaleChange;
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private int mOnScaleChangedCallCount;
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class AwSettingsForceZeroLayoutHeightTestHelper extends AwSettingsTestHelper<Boolean> {
13596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        AwSettingsForceZeroLayoutHeightTestHelper(
13616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                AwTestContainerView containerView,
13626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                TestAwContentsClient contentViewClient,
13636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                boolean withViewPortTag) throws Throwable {
13646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            super(containerView, contentViewClient, true);
13656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mWithViewPortTag = withViewPortTag;
13666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mAwSettings.setUseWideViewPort(true);
13676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
13686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
13706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected Boolean getAlteredValue() {
13716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return ENABLED;
13726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
13736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
13756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected Boolean getInitialValue() {
13766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return DISABLED;
13776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
13786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
13806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected Boolean getCurrentValue() {
13816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return mAwSettings.getForceZeroLayoutHeight();
13826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
13836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
13856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
13866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mAwSettings.setForceZeroLayoutHeight(value);
13876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
13886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
13896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
13906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
13916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            loadDataSync(getData());
13926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            int height = Integer.parseInt(getTitleOnUiThread());
13936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            if (value) {
13946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                assertEquals(0, height);
13956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            } else {
13966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                assertTrue("Div should be at least 50px high, was: " + height, height >= 50);
13976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            }
13986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
13996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private String getData() {
14016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return "<html><head>" +
14026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    (mWithViewPortTag ? "<meta name='viewport' content='height=3000' />" : "") +
14036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  <script type='text/javascript'> " +
14046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "    window.addEventListener('load', function(event) { " +
14056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "       document.title = document.getElementById('testDiv').clientHeight; " +
14066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "    }); " +
14076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  </script> " +
14086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "</head>" +
14096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "<body> " +
14106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  <div style='height:50px;'>test</div> " +
14116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  <div id='testDiv' style='height:100%;'></div> " +
14126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "</body></html>";
14136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private final boolean mWithViewPortTag;
14166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
14176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    class AwSettingsZeroLayoutHeightDisablesViewportQuirkTestHelper extends
14196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            AwSettingsTestHelper<Boolean> {
14206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        AwSettingsZeroLayoutHeightDisablesViewportQuirkTestHelper(
14226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                AwTestContainerView containerView,
14236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                TestAwContentsClient contentViewClient) throws Throwable {
14246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            super(containerView, contentViewClient, true);
14256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mAwSettings.setUseWideViewPort(true);
14266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mAwSettings.setForceZeroLayoutHeight(true);
14276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
14306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected Boolean getAlteredValue() {
14316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return ENABLED;
14326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
14356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected Boolean getInitialValue() {
14366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return DISABLED;
14376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
14406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected Boolean getCurrentValue() {
14416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return mAwSettings.getZeroLayoutHeightDisablesViewportQuirk();
14426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
14456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected void setCurrentValue(Boolean value) {
14466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mAwSettings.setZeroLayoutHeightDisablesViewportQuirk(value);
14476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @Override
14506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        protected void doEnsureSettingHasValue(Boolean value) throws Throwable {
14516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            DeviceDisplayInfo deviceInfo = DeviceDisplayInfo.create(mContext);
14526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            int displayWidth = (int) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
14536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            loadDataSync(getData());
14556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            int width = Integer.parseInt(getTitleOnUiThread());
14566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            if (value) {
14576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                assertEquals(displayWidth, width);
14586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            } else {
14596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                assertEquals(3000, width);
14606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            }
14616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private String getData() {
14646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return "<html><head>" +
14656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "<meta name='viewport' content='width=3000' />" +
14666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  <script type='text/javascript'> " +
14676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "    window.addEventListener('load', function(event) { " +
14686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "       document.title = document.documentElement.clientWidth; " +
14696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "    }); " +
14706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  </script> " +
14716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "</head>" +
14726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "<body> " +
14736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  <div style='height:50px;'>test</div> " +
14746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "  <div id='testDiv' style='height:100%;'></div> " +
14756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    "</body></html>";
14766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
14776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
14786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The test verifies that JavaScript is disabled upon WebView
1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // creation without accessing AwSettings. If the test passes,
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it means that WebView-specific web preferences configuration
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is applied on WebView creation. JS state is used, because it is
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // enabled by default in Chrome, but must be disabled by default
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in WebView.
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testJavaScriptDisabledByDefault() throws Throwable {
14881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        final String jsEnabledString = "JS has run";
14891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        final String jsDisabledString = "JS has not run";
14901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        final String testPageHtml =
14911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "<html><head><title>" + jsDisabledString + "</title>"
14921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                + "</head><body onload=\"document.title='" + jsEnabledString
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                + "';\"></body></html>";
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            awContents,
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            contentClient.getOnPageFinishedHelper(),
15011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            testPageHtml,
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "text/html",
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            false);
15041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assertEquals(jsDisabledString, getTitleOnUiThread(awContents));
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testJavaScriptEnabledWithTwoViews() throws Throwable {
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1512effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsJavaScriptTestHelper(views.getContainer0(), views.getClient0()),
1513effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsJavaScriptTestHelper(views.getContainer1(), views.getClient1()));
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testJavaScriptEnabledDynamicWithTwoViews() throws Throwable {
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1521effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsJavaScriptDynamicTestHelper(views.getContainer0(), views.getClient0()),
1522effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsJavaScriptDynamicTestHelper(views.getContainer1(), views.getClient1()));
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testPluginsEnabledWithTwoViews() throws Throwable {
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1530effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsPluginsTestHelper(views.getContainer0(), views.getClient0()),
1531effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsPluginsTestHelper(views.getContainer1(), views.getClient1()));
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testStandardFontFamilyWithTwoViews() throws Throwable {
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsStandardFontFamilyTestHelper(views.getContainer0(), views.getClient0()),
1540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsStandardFontFamilyTestHelper(views.getContainer1(), views.getClient1()));
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDefaultFontSizeWithTwoViews() throws Throwable {
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1548effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsDefaultFontSizeTestHelper(views.getContainer0(), views.getClient0()),
1549effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsDefaultFontSizeTestHelper(views.getContainer1(), views.getClient1()));
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The test verifies that after changing the LoadsImagesAutomatically
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // setting value from false to true previously skipped images are
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // automatically loaded.
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testLoadsImagesAutomaticallyNoPageReload() throws Throwable {
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setJavaScriptEnabled(true);
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ImagePageGenerator generator = new ImagePageGenerator(0, false);
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setLoadsImagesAutomatically(false);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents,
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     contentClient.getOnPageFinishedHelper(),
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     generator.getPageSource(),
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "text/html", false);
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(ImagePageGenerator.IMAGE_NOT_LOADED_STRING,
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getTitleOnUiThread(awContents));
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setLoadsImagesAutomatically(true);
15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        poll(new Callable<Boolean>() {
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            @Override
15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            public Boolean call() throws Exception {
15765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                return !ImagePageGenerator.IMAGE_NOT_LOADED_STRING.equals(
15775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        getTitleOnUiThread(awContents));
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        });
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(ImagePageGenerator.IMAGE_LOADED_STRING, getTitleOnUiThread(awContents));
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testLoadsImagesAutomaticallyWithTwoViews() throws Throwable {
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new AwSettingsLoadImagesAutomaticallyTestHelper(
1590effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                views.getContainer0(), views.getClient0(), new ImagePageGenerator(0, true)),
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new AwSettingsLoadImagesAutomaticallyTestHelper(
1592effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                views.getContainer1(), views.getClient1(), new ImagePageGenerator(1, true)));
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDefaultTextEncodingWithTwoViews() throws Throwable {
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsDefaultTextEncodingTestHelper(views.getContainer0(), views.getClient0()),
1601effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsDefaultTextEncodingTestHelper(views.getContainer1(), views.getClient1()));
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The test verifies that the default user agent string follows the format
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // defined in Android CTS tests:
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Mozilla/5.0 (Linux;[ U;] Android <version>;[ <language>-<country>;]
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // [<devicemodel>;] Build/<buildID>) AppleWebKit/<major>.<minor> (KHTML, like Gecko)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Version/<major>.<minor>[ Mobile] Safari/<major>.<minor>
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testUserAgentStringDefault() throws Throwable {
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String actualUserAgentString = settings.getUserAgentString();
1619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        assertEquals(actualUserAgentString, AwSettings.getDefaultUserAgent());
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String patternString =
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "Mozilla/5\\.0 \\(Linux;( U;)? Android ([^;]+);( (\\w+)-(\\w+);)?" +
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "\\s?(.*)\\sBuild/(.+)\\) AppleWebKit/(\\d+)\\.(\\d+) \\(KHTML, like Gecko\\) " +
1623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                "Version/\\d+\\.\\d Chrome/\\d+\\.\\d+\\.\\d+\\.\\d+" +
1624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                "( Mobile)? Safari/(\\d+)\\.(\\d+)";
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final Pattern userAgentExpr = Pattern.compile(patternString);
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Matcher patternMatcher = userAgentExpr.matcher(actualUserAgentString);
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue(String.format("User agent string did not match expected pattern. %nExpected " +
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "pattern:%n%s%nActual:%n%s", patternString, actualUserAgentString),
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        patternMatcher.find());
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // No country-language code token.
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(null, patternMatcher.group(3));
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ("REL".equals(Build.VERSION.CODENAME)) {
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Model is only added in release builds
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(Build.MODEL, patternMatcher.group(6));
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Release version is valid only in release builds
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(Build.VERSION.RELEASE, patternMatcher.group(2));
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(Build.ID, patternMatcher.group(7));
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testUserAgentStringOverride() throws Throwable {
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String defaultUserAgentString = settings.getUserAgentString();
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Check that an attempt to reset the default UA string has no effect.
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setUserAgentString(null);
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(defaultUserAgentString, settings.getUserAgentString());
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setUserAgentString("");
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(defaultUserAgentString, settings.getUserAgentString());
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Check that we can also set the default value.
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setUserAgentString(defaultUserAgentString);
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(defaultUserAgentString, settings.getUserAgentString());
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Set a custom UA string, verify that it can be reset back to default.
1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final String customUserAgentString = "AwSettingsTest";
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setUserAgentString(customUserAgentString);
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(customUserAgentString, settings.getUserAgentString());
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setUserAgentString(null);
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(defaultUserAgentString, settings.getUserAgentString());
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that the current UA override setting has a priority over UA
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // overrides in navigation history entries.
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testUserAgentStringOverrideForHistory() throws Throwable {
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
16781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        final WebContents webContents = awContents.getWebContents();
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setJavaScriptEnabled(true);
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String defaultUserAgentString = settings.getUserAgentString();
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final String customUserAgentString = "AwSettingsTest";
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We are using different page titles to make sure that we are really
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // going back and forward between them.
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String pageTemplate =
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<html><head><title>%s</title></head>" +
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<body onload='document.title+=navigator.userAgent'></body>" +
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "</html>";
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String page1Title = "Page1";
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String page2Title = "Page2";
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String page1 = String.format(pageTemplate, page1Title);
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String page2 = String.format(pageTemplate, page2Title);
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setUserAgentString(customUserAgentString);
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awContents, onPageFinishedHelper, page1, "text/html", false);
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(page1Title + customUserAgentString, getTitleOnUiThread(awContents));
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awContents, onPageFinishedHelper, page2, "text/html", false);
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(page2Title + customUserAgentString, getTitleOnUiThread(awContents));
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setUserAgentString(null);
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Must not cause any changes until the next page loading.
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(page2Title + customUserAgentString, getTitleOnUiThread(awContents));
17041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        HistoryUtils.goBackSync(getInstrumentation(), webContents, onPageFinishedHelper);
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(page1Title + defaultUserAgentString, getTitleOnUiThread(awContents));
17061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        HistoryUtils.goForwardSync(getInstrumentation(), webContents,
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   onPageFinishedHelper);
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(page2Title + defaultUserAgentString, getTitleOnUiThread(awContents));
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testUserAgentStringWithTwoViews() throws Throwable {
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1716effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUserAgentStringTestHelper(views.getContainer0(), views.getClient0()),
1717effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUserAgentStringTestHelper(views.getContainer1(), views.getClient1()));
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testUserAgentWithTestServer() throws Throwable {
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwContents awContents = testContainerView.getAwContents();
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String customUserAgentString =
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "testUserAgentWithTestServerUserAgent";
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestWebServer webServer = null;
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        String fileName = null;
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try {
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            webServer = new TestWebServer(false);
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final String httpPath = "/testUserAgentWithTestServer.html";
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final String url = webServer.setResponse(httpPath, "foo", null);
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            settings.setUserAgentString(customUserAgentString);
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadUrlSync(awContents,
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        contentClient.getOnPageFinishedHelper(),
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        url);
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(1, webServer.getRequestCount(httpPath));
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            HttpRequest request = webServer.getLastRequest(httpPath);
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Header[] matchingHeaders = request.getHeaders("User-Agent");
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(1, matchingHeaders.length);
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Header header = matchingHeaders[0];
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(customUserAgentString, header.getValue());
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } finally {
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (webServer != null) webServer.shutdown();
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDomStorageEnabledWithTwoViews() throws Throwable {
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsDomStorageEnabledTestHelper(views.getContainer0(), views.getClient0()),
1761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsDomStorageEnabledTestHelper(views.getContainer1(), views.getClient1()));
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ideally, these three tests below should be combined into one, or tested using
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // runPerViewSettingsTest. However, it seems the database setting cannot be toggled
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // once set. Filed b/8186497.
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDatabaseInitialValue() throws Throwable {
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestAwContentsClient client = new TestAwContentsClient();
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(client);
1773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwSettingsDatabaseTestHelper helper =
1774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                new AwSettingsDatabaseTestHelper(testContainerView, client);
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper.ensureSettingHasInitialValue();
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDatabaseEnabled() throws Throwable {
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestAwContentsClient client = new TestAwContentsClient();
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(client);
1784effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwSettingsDatabaseTestHelper helper =
1785effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                new AwSettingsDatabaseTestHelper(testContainerView, client);
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper.setAlteredSettingValue();
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper.ensureSettingHasAlteredValue();
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDatabaseDisabled() throws Throwable {
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestAwContentsClient client = new TestAwContentsClient();
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(client);
1796effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwSettingsDatabaseTestHelper helper =
1797effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                new AwSettingsDatabaseTestHelper(testContainerView, client);
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper.setInitialSettingValue();
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper.ensureSettingHasInitialValue();
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @SmallTest
1803424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testUniversalAccessFromFilesWithTwoViews() throws Throwable {
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1807effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUniversalAccessFromFilesTestHelper(views.getContainer0(),
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                views.getClient0()),
1809effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUniversalAccessFromFilesTestHelper(views.getContainer1(),
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                views.getClient1()));
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This test verifies that local image resources can be loaded from file:
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // URLs regardless of file access state.
1815424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @SmallTest
1816424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testFileAccessFromFilesImage() throws Throwable {
1818424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        final String testFile = "webview/image_access.html";
1819424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        assertFileIsReadable(UrlUtils.getTestFilePath(testFile));
1820424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        final String imageContainerUrl = UrlUtils.getTestFileUrl(testFile);
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String imageHeight = "16";
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setJavaScriptEnabled(true);
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setAllowUniversalAccessFromFileURLs(false);
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setAllowFileAccessFromFileURLs(false);
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), imageContainerUrl);
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(imageHeight, getTitleOnUiThread(awContents));
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1834424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @SmallTest
1835424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testFileAccessFromFilesIframeWithTwoViews() throws Throwable {
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new AwSettingsFileAccessFromFilesIframeTestHelper(
1840effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                views.getContainer0(), views.getClient0()),
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new AwSettingsFileAccessFromFilesIframeTestHelper(
1842effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                views.getContainer1(), views.getClient1()));
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @SmallTest
1846424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testFileAccessFromFilesXhrWithTwoViews() throws Throwable {
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1850effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsFileAccessFromFilesXhrTestHelper(views.getContainer0(),
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                views.getClient0()),
1852effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsFileAccessFromFilesXhrTestHelper(views.getContainer1(),
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                views.getClient1()));
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testFileUrlAccessWithTwoViews() throws Throwable {
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1861effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsFileUrlAccessTestHelper(views.getContainer0(), views.getClient0(), 0),
1862effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsFileUrlAccessTestHelper(views.getContainer1(), views.getClient1(), 1));
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testContentUrlAccessWithTwoViews() throws Throwable {
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
1870effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsContentUrlAccessTestHelper(views.getContainer0(), views.getClient0(), 0),
1871effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsContentUrlAccessTestHelper(views.getContainer1(), views.getClient1(), 1));
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences", "Navigation"})
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testBlockingContentUrlsFromDataUrls() throws Throwable {
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String target = "content_from_data";
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String page = "<html><body>" +
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<img src=\"" +
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createContentUrl(target) + "\">" +
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "</body></html>";
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resetResourceRequestCountInContentProvider(target);
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            awContents,
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            contentClient.getOnPageFinishedHelper(),
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            page,
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "text/html",
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            false);
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ensureResourceRequestCountInContentProvider(target, 0);
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences", "Navigation"})
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testContentUrlFromFileWithTwoViews() throws Throwable {
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new AwSettingsContentUrlAccessFromFileTestHelper(
1902effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    views.getContainer0(), views.getClient0(), 0),
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new AwSettingsContentUrlAccessFromFileTestHelper(
1904effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    views.getContainer1(), views.getClient1(), 1));
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1907116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    @SmallTest
1908116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    @Feature({"AndroidWebView", "Preferences"})
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testBlockNetworkImagesDoesNotBlockDataUrlImage() throws Throwable {
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
1914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final AwSettings settings = getAwSettingsOnUiThread(awContents);
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ImagePageGenerator generator = new ImagePageGenerator(0, false);
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setJavaScriptEnabled(true);
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setImagesEnabled(false);
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents,
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     contentClient.getOnPageFinishedHelper(),
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     generator.getPageSource(),
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "text/html",
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     false);
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(ImagePageGenerator.IMAGE_LOADED_STRING, getTitleOnUiThread(awContents));
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testBlockNetworkImagesBlocksNetworkImageAndReloadInPlace() throws Throwable {
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final AwSettings settings = getAwSettingsOnUiThread(awContents);
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings.setJavaScriptEnabled(true);
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ImagePageGenerator generator = new ImagePageGenerator(0, false);
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestWebServer webServer = null;
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try {
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            webServer = new TestWebServer(false);
1941d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            final String httpImageUrl = generator.getPageUrl(webServer);
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            settings.setImagesEnabled(false);
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), httpImageUrl);
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals(ImagePageGenerator.IMAGE_NOT_LOADED_STRING,
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    getTitleOnUiThread(awContents));
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            settings.setImagesEnabled(true);
19495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            poll(new Callable<Boolean>() {
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                @Override
19515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                public Boolean call() throws Exception {
19525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    return ImagePageGenerator.IMAGE_LOADED_STRING.equals(
19535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        getTitleOnUiThread(awContents));
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
19555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            });
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } finally {
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (webServer != null) webServer.shutdown();
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
1963d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public void testBlockNetworkImagesWithTwoViews() throws Throwable {
1964d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        ViewPair views = createViews();
1965d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        TestWebServer webServer = null;
1966d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        try {
1967d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            webServer = new TestWebServer(false);
1968d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            runPerViewSettingsTest(
1969d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    new AwSettingsImagesEnabledHelper(
1970effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            views.getContainer0(),
1971d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            views.getClient0(),
1972d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            webServer,
1973d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            new ImagePageGenerator(0, true)),
1974d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    new AwSettingsImagesEnabledHelper(
1975effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            views.getContainer1(),
1976d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            views.getClient1(),
1977d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            webServer,
1978d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            new ImagePageGenerator(1, true)));
1979d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        } finally {
1980d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
1981d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
1982d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
1983d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1984d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @SmallTest
1985d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testBlockNetworkLoadsWithHttpResources() throws Throwable {
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainer =
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainer.getAwContents();
1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final AwSettings awSettings = getAwSettingsOnUiThread(awContents);
1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        awSettings.setJavaScriptEnabled(true);
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ImagePageGenerator generator = new ImagePageGenerator(0, false);
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebServer webServer = null;
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        String fileName = null;
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Set up http image.
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webServer = new TestWebServer(false);
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String httpPath = "/image.png";
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String imageUrl = webServer.setResponseBase64(
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    httpPath, generator.getImageSourceNoAdvance(),
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    CommonResources.getImagePngHeaders(true));
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Set up file html that loads http iframe.
2006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            String pageHtml = "<img src='" + imageUrl + "' " +
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "onload=\"document.title='img_onload_fired';\" " +
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "onerror=\"document.title='img_onerror_fired';\" />";
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Context context = getInstrumentation().getTargetContext();
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fileName = context.getCacheDir() + "/block_network_loads_test.html";
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            TestFileUtil.deleteFile(fileName);  // Remove leftover file if any.
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            TestFileUtil.createNewHtmlFile(fileName, "unset", pageHtml);
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Actual test. Blocking should trigger onerror handler.
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setBlockNetworkLoads(true);
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents,
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                contentClient.getOnPageFinishedHelper(),
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "file:///" + fileName);
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(httpPath));
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals("img_onerror_fired", getTitleOnUiThread(awContents));
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Unblock should load normally.
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setBlockNetworkLoads(false);
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents,
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                contentClient.getOnPageFinishedHelper(),
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "file:///" + fileName);
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(1, webServer.getRequestCount(httpPath));
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals("img_onload_fired", getTitleOnUiThread(awContents));
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } finally {
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (fileName != null) TestFileUtil.deleteFile(fileName);
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    private static class AudioEvent {
2038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        private CallbackHelper mCallback;
2039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        public AudioEvent(CallbackHelper callback) {
2040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            mCallback = callback;
2041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
2042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        @JavascriptInterface
2044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        public void onCanPlay() {
2045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            mCallback.notifyCalled();
2046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
2047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        @JavascriptInterface
2049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        public void onError() {
2050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            mCallback.notifyCalled();
2051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
2052f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
2053f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2054f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    @SmallTest
2055f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
2056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public void testBlockNetworkLoadsWithAudio() throws Throwable {
2057f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
2058f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        final AwTestContainerView testContainer =
2059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
2060f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        final AwContents awContents = testContainer.getAwContents();
2061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        final AwSettings awSettings = getAwSettingsOnUiThread(awContents);
2062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        final CallbackHelper callback = new CallbackHelper();
2063f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        awSettings.setJavaScriptEnabled(true);
2064f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2065f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        TestWebServer webServer = null;
2066f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        try {
2067f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            webServer = new TestWebServer(false);
2068f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            final String httpPath = "/audio.mp3";
2069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            // Don't care about the response is correct or not, just want
2070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            // to know whether Url is accessed.
2071f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            final String audioUrl = webServer.setResponse(httpPath, "1", null);
2072f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2073a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            String pageHtml = "<html><body><audio controls src='" + audioUrl + "' " +
2074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    "oncanplay=\"AudioEvent.onCanPlay();\" " +
2075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    "onerror=\"AudioEvent.onError();\" /> </body></html>";
2076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            // Actual test. Blocking should trigger onerror handler.
2077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            awSettings.setBlockNetworkLoads(true);
2078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            runTestOnUiThread(new Runnable() {
2079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                @Override
2080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                public void run() {
2081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    awContents.addPossiblyUnsafeJavascriptInterface(
2082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            new AudioEvent(callback), "AudioEvent", null);
2083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                }
2084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            });
2085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            int count = callback.getCallCount();
2086f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            loadDataSync(awContents, contentClient.getOnPageFinishedHelper(), pageHtml,
2087f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    "text/html", false);
2088f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            callback.waitForCallback(count, 1);
2089f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(httpPath));
2090f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2091f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            // The below test failed in Nexus Galaxy.
2092f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            // See https://code.google.com/p/chromium/issues/detail?id=313463
2093f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            // Unblock should load normally.
2094f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            /*
2095f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            awSettings.setBlockNetworkLoads(false);
2096f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            count = callback.getCallCount();
2097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            loadDataSync(awContents, contentClient.getOnPageFinishedHelper(), pageHtml,
2098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    "text/html", false);
2099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            callback.waitForCallback(count, 1);
2100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            assertTrue(0 != webServer.getRequestCount(httpPath));
2101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            */
2102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        } finally {
2103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
2104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
2105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
2106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Test an assert URL (file:///android_asset/)
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testAssetUrl() throws Throwable {
21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Note: this text needs to be kept in sync with the contents of the html file referenced
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // below.
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String expectedTitle = "Asset File";
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadUrlSync(awContents,
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "file:///android_asset/asset_file.html");
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(expectedTitle, getTitleOnUiThread(awContents));
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test a resource URL (file:///android_res/).
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testResourceUrl() throws Throwable {
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Note: this text needs to be kept in sync with the contents of the html file referenced
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // below.
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String expectedTitle = "Resource File";
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadUrlSync(awContents,
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "file:///android_res/raw/resource_file.html");
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(expectedTitle, getTitleOnUiThread(awContents));
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test that the file URL access toggle does not affect asset URLs.
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testFileUrlAccessToggleDoesNotBlockAssetUrls() throws Throwable {
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Note: this text needs to be kept in sync with the contents of the html file referenced
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // below.
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String expectedTitle = "Asset File";
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwSettings settings = getAwSettingsOnUiThread(awContents);
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.setAllowFileAccess(false);
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadUrlSync(awContents,
21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "file:///android_asset/asset_file.html");
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(expectedTitle, getTitleOnUiThread(awContents));
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test that the file URL access toggle does not affect resource URLs.
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testFileUrlAccessToggleDoesNotBlockResourceUrls() throws Throwable {
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Note: this text needs to be kept in sync with the contents of the html file referenced
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // below.
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String expectedTitle = "Resource File";
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwSettings settings = getAwSettingsOnUiThread(awContents);
21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.setAllowFileAccess(false);
21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadUrlSync(awContents,
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "file:///android_res/raw/resource_file.html");
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(expectedTitle, getTitleOnUiThread(awContents));
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testLayoutAlgorithmWithTwoViews() throws Throwable {
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        runPerViewSettingsTest(
2184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsLayoutAlgorithmTestHelper(views.getContainer0(), views.getClient0()),
2185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsLayoutAlgorithmTestHelper(views.getContainer1(), views.getClient1()));
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testTextZoomWithTwoViews() throws Throwable {
21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
2193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsTextZoomTestHelper(views.getContainer0(), views.getClient0()),
2194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsTextZoomTestHelper(views.getContainer1(), views.getClient1()));
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testTextZoomAutosizingWithTwoViews() throws Throwable {
22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        runPerViewSettingsTest(
2202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsTextZoomAutosizingTestHelper(views.getContainer0(), views.getClient0()),
2203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsTextZoomAutosizingTestHelper(views.getContainer1(), views.getClient1()));
22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testJavaScriptPopupsWithTwoViews() throws Throwable {
22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        runPerViewSettingsTest(
2211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsJavaScriptPopupsTestHelper(views.getContainer0(), views.getClient0()),
2212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsJavaScriptPopupsTestHelper(views.getContainer1(), views.getClient1()));
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCacheMode() throws Throwable {
22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainer =
22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainer.getAwContents();
22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwSettings awSettings = getAwSettingsOnUiThread(testContainer.getAwContents());
22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        clearCacheOnUiThread(awContents, true);
22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(WebSettings.LOAD_DEFAULT, awSettings.getCacheMode());
22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebServer webServer = null;
22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webServer = new TestWebServer(false);
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String htmlPath = "/testCacheMode.html";
22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String url = webServer.setResponse(htmlPath, "response", null);
22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), url);
22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(1, webServer.getRequestCount(htmlPath));
22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), url);
22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(1, webServer.getRequestCount(htmlPath));
22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), url);
22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(2, webServer.getRequestCount(htmlPath));
22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), url);
22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(3, webServer.getRequestCount(htmlPath));
22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), url);
22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(3, webServer.getRequestCount(htmlPath));
22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), url);
22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(3, webServer.getRequestCount(htmlPath));
22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String htmlNotInCachePath = "/testCacheMode-not-in-cache.html";
22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String urlNotInCache = webServer.setResponse(htmlNotInCachePath, "", null);
22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSyncAndExpectError(awContents,
22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnReceivedErrorHelper(),
22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    urlNotInCache);
22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(htmlNotInCachePath));
22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } finally {
22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // As our implementation of network loads blocking uses the same net::URLRequest settings, make
22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // sure that setting cache mode doesn't accidentally enable network loads.  The reference
22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // behaviour is that when network loads are blocked, setting cache mode has no effect.
22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCacheModeWithBlockedNetworkLoads() throws Throwable {
22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainer =
22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainer.getAwContents();
22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwSettings awSettings = getAwSettingsOnUiThread(testContainer.getAwContents());
22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        clearCacheOnUiThread(awContents, true);
22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(WebSettings.LOAD_DEFAULT, awSettings.getCacheMode());
22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        awSettings.setBlockNetworkLoads(true);
22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebServer webServer = null;
22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webServer = new TestWebServer(false);
22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String htmlPath = "/testCacheModeWithBlockedNetworkLoads.html";
22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final String url = webServer.setResponse(htmlPath, "response", null);
22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSyncAndExpectError(awContents,
22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnReceivedErrorHelper(),
22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    url);
22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(htmlPath));
22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSyncAndExpectError(awContents,
22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnReceivedErrorHelper(),
22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    url);
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(htmlPath));
22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSyncAndExpectError(awContents,
22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnReceivedErrorHelper(),
22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    url);
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(htmlPath));
23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            awSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSyncAndExpectError(awContents,
23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnReceivedErrorHelper(),
23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    url);
23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(htmlPath));
23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } finally {
23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCacheModeWithTwoViews() throws Throwable {
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebServer webServer = null;
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webServer = new TestWebServer(false);
23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            runPerViewSettingsTest(
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    new AwSettingsCacheModeTestHelper(
2321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            views.getContainer0(), views.getClient0(), 0, webServer),
23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    new AwSettingsCacheModeTestHelper(
2323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            views.getContainer1(), views.getClient1(), 1, webServer));
23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } finally {
23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static class ManifestTestHelper {
23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final TestWebServer mWebServer;
23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final String mHtmlPath;
23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final String mHtmlUrl;
23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final String mManifestPath;
23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ManifestTestHelper(
23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                TestWebServer webServer, String htmlPageName, String manifestName) {
23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mWebServer = webServer;
23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mHtmlPath = "/" + htmlPageName;
23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mHtmlUrl = webServer.setResponse(
23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    mHtmlPath, "<html manifest=\"" + manifestName + "\"></html>", null);
23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mManifestPath = "/" + manifestName;
23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webServer.setResponse(
23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    mManifestPath,
23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "CACHE MANIFEST",
23452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    CommonResources.getContentTypeAndCacheHeaders("text/cache-manifest", false));
23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        String getHtmlPath() {
23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mHtmlPath;
23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        String getHtmlUrl() {
23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mHtmlUrl;
23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        String getManifestPath() {
23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mManifestPath;
23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        int waitUntilHtmlIsRequested(final int initialRequestCount) throws Exception {
23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return waitUntilResourceIsRequested(mHtmlPath, initialRequestCount);
23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        int waitUntilManifestIsRequested(final int initialRequestCount) throws Exception {
23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return waitUntilResourceIsRequested(mManifestPath, initialRequestCount);
23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private int waitUntilResourceIsRequested(
23695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                final String path, final int initialRequestCount) throws Exception {
23705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            poll(new Callable<Boolean>() {
23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                @Override
23725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                public Boolean call() throws Exception {
23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    return mWebServer.getRequestCount(path) > initialRequestCount;
23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
23755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            });
23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mWebServer.getRequestCount(path);
23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences", "AppCache"})
23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testAppCache() throws Throwable {
23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainer =
23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainer.getAwContents();
2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final AwSettings settings = getAwSettingsOnUiThread(awContents);
23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.setJavaScriptEnabled(true);
23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Note that the cache isn't actually enabled until the call to setAppCachePath.
23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.setAppCacheEnabled(true);
23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebServer webServer = null;
23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webServer = new TestWebServer(false);
23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ManifestTestHelper helper = new ManifestTestHelper(
23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    webServer, "testAppCache.html", "appcache.manifest");
23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    awContents,
23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    helper.getHtmlUrl());
24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            helper.waitUntilHtmlIsRequested(0);
24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Unfortunately, there is no other good way of verifying that AppCache is
24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // disabled, other than checking that it didn't try to fetch the manifest.
24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Thread.sleep(1000);
24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(0, webServer.getRequestCount(helper.getManifestPath()));
24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            settings.setAppCachePath("whatever");  // Enables AppCache.
24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    awContents,
24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    contentClient.getOnPageFinishedHelper(),
24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    helper.getHtmlUrl());
24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            helper.waitUntilManifestIsRequested(0);
24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } finally {
24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    @SmallTest
2418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences", "AppCache"})
24192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testAppCacheWithTwoViews() throws Throwable {
24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We don't use the test helper here, because making sure that AppCache
24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // is disabled takes a lot of time, so running through the usual drill
24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // will take about 20 seconds.
24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings0 = getAwSettingsOnUiThread(views.getContents0());
24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings0.setJavaScriptEnabled(true);
24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings0.setAppCachePath("whatever");
24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings0.setAppCacheEnabled(true);
2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings1 = getAwSettingsOnUiThread(views.getContents1());
24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings1.setJavaScriptEnabled(true);
24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // AppCachePath setting is global, no need to set it for the second view.
24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings1.setAppCacheEnabled(true);
24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebServer webServer = null;
24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webServer = new TestWebServer(false);
24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ManifestTestHelper helper0 = new ManifestTestHelper(
24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    webServer, "testAppCache_0.html", "appcache.manifest_0");
24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getContents0(),
24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getClient0().getOnPageFinishedHelper(),
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    helper0.getHtmlUrl());
24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            int manifestRequests0 = helper0.waitUntilManifestIsRequested(0);
24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ManifestTestHelper helper1 = new ManifestTestHelper(
24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    webServer, "testAppCache_1.html", "appcache.manifest_1");
24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getContents1(),
24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getClient1().getOnPageFinishedHelper(),
24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    helper1.getHtmlUrl());
24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            helper1.waitUntilManifestIsRequested(0);
24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            settings1.setAppCacheEnabled(false);
24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getContents0(),
24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getClient0().getOnPageFinishedHelper(),
24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    helper0.getHtmlUrl());
24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            helper0.waitUntilManifestIsRequested(manifestRequests0);
24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            final int prevManifestRequestCount =
24582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    webServer.getRequestCount(helper1.getManifestPath());
24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            int htmlRequests1 = webServer.getRequestCount(helper1.getHtmlPath());
24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadUrlSync(
24612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getContents1(),
24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    views.getClient1().getOnPageFinishedHelper(),
24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    helper1.getHtmlUrl());
24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            helper1.waitUntilHtmlIsRequested(htmlRequests1);
24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Unfortunately, there is no other good way of verifying that AppCache is
24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // disabled, other than checking that it didn't try to fetch the manifest.
24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Thread.sleep(1000);
24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals(
24692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    prevManifestRequestCount, webServer.getRequestCount(helper1.getManifestPath()));
24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } finally {
24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (webServer != null) webServer.shutdown();
24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
24762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
24772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testUseWideViewportWithTwoViews() throws Throwable {
2478e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        ViewPair views = createViews(true);
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
2480effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUseWideViewportTestHelper(views.getContainer0(), views.getClient0()),
2481effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUseWideViewportTestHelper(views.getContainer1(), views.getClient1()));
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2484d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @SmallTest
2485d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
2486d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public void testUseWideViewportWithTwoViewsNoQuirks() throws Throwable {
2487e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        ViewPair views = createViews();
2488d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        runPerViewSettingsTest(
2489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUseWideViewportTestHelper(views.getContainer0(), views.getClient0()),
2490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            new AwSettingsUseWideViewportTestHelper(views.getContainer1(), views.getClient1()));
2491d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
2492d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2493d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    private void useWideViewportLayoutWidthTest(
2494effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            AwTestContainerView testContainer, CallbackHelper onPageFinishedHelper)
2495effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            throws Throwable {
2496effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final AwContents awContents = testContainer.getAwContents();
2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String pageTemplate = "<html><head>%s</head>" +
25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "<body onload='document.title=document.body.clientWidth'></body></html>";
25012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String pageNoViewport = String.format(pageTemplate, "");
25022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String pageViewportDeviceWidth = String.format(
25032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                pageTemplate,
25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "<meta name='viewport' content='width=device-width' />");
25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String viewportTagSpecifiedWidth = "3000";
25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String pageViewportSpecifiedWidth = String.format(
25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                pageTemplate,
25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "<meta name='viewport' content='width=" + viewportTagSpecifiedWidth + "' />");
25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2510effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        DeviceDisplayInfo deviceInfo = DeviceDisplayInfo.create(testContainer.getContext());
25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int displayWidth = (int) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.setJavaScriptEnabled(true);
25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertFalse(settings.getUseWideViewPort());
2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // When UseWideViewPort is off, "width" setting of "meta viewport"
2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // tags is ignored, and the layout width is set to device width in CSS pixels.
25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Thus, all 3 pages will have the same body width.
25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, pageNoViewport, "text/html", false);
25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Avoid rounding errors.
25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                Math.abs(displayWidth - actualWidth) <= 1);
25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, pageViewportDeviceWidth, "text/html", false);
25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                Math.abs(displayWidth - actualWidth) <= 1);
25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(
25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents, onPageFinishedHelper, pageViewportSpecifiedWidth, "text/html", false);
25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                Math.abs(displayWidth - actualWidth) <= 1);
25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.setUseWideViewPort(true);
25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // When UseWideViewPort is on, "meta viewport" tag is used.
25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // If there is no viewport tag, or width isn't specified,
25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // then layout width is set to max(980, <device-width-in-DIP-pixels>)
25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, pageNoViewport, "text/html", false);
25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Expected: >= 980 , Actual: " + actualWidth, actualWidth >= 980);
25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, pageViewportDeviceWidth, "text/html", false);
25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        actualWidth = Integer.parseInt(getTitleOnUiThread(awContents));
25422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Expected: " + displayWidth + ", Actual: " + actualWidth,
25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                Math.abs(displayWidth - actualWidth) <= 1);
25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(
25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents, onPageFinishedHelper, pageViewportSpecifiedWidth, "text/html", false);
25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(viewportTagSpecifiedWidth, getTitleOnUiThread(awContents));
25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @SmallTest
2550d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
2551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public void testUseWideViewportLayoutWidth() throws Throwable {
2552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        TestAwContentsClient contentClient = new TestAwContentsClient();
2553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        AwTestContainerView testContainerView =
2554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
2555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        useWideViewportLayoutWidthTest(testContainerView, contentClient.getOnPageFinishedHelper());
2556d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
2557d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @SmallTest
2559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
2560d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public void testUseWideViewportLayoutWidthNoQuirks() throws Throwable {
2561d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        TestAwContentsClient contentClient = new TestAwContentsClient();
2562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        AwTestContainerView testContainerView =
2563d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient, false);
2564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        useWideViewportLayoutWidthTest(testContainerView, contentClient.getOnPageFinishedHelper());
2565d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
2566d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @MediumTest
2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testUseWideViewportControlsDoubleTabToZoom() throws Throwable {
25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
2575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        AwSettings settings = getAwSettingsOnUiThread(awContents);
2576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        settings.setBuiltInZoomControls(true);
25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        DeviceDisplayInfo deviceInfo =
2579effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                DeviceDisplayInfo.create(testContainerView.getContext());
2580effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        int displayWidth = (int) (deviceInfo.getDisplayWidth() / deviceInfo.getDIPScale());
2581effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        int layoutWidth = displayWidth * 2;
2582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        final String page = "<html>" +
2583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                "<head><meta name='viewport' content='width=" + layoutWidth + "'>" +
2584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                "<style> body { width: " + layoutWidth + "px; }</style></head>" +
2585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                "<body>Page Text</body></html>";
2586effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertFalse(settings.getUseWideViewPort());
2588effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        // Without wide viewport the <meta viewport> tag will be ignored by WebView,
2589effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        // but it doesn't really matter as we don't expect double tap to change the scale.
25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final float initialScale = getScaleOnUiThread(awContents);
25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        simulateDoubleTapCenterOfWebViewOnUiThread(testContainerView);
25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Thread.sleep(1000);
25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(initialScale, getScaleOnUiThread(awContents));
25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.setUseWideViewPort(true);
25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
25982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount();
25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        simulateDoubleTapCenterOfWebViewOnUiThread(testContainerView);
26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        contentClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount);
26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final float zoomedOutScale = getScaleOnUiThread(awContents);
26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("zoomedOut: " + zoomedOutScale + ", initial: " + initialScale,
26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                zoomedOutScale < initialScale);
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
26086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public void testForceZeroLayoutHeightWithTwoViews() throws Throwable {
26096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ViewPair views = createViews();
26106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        runPerViewSettingsTest(
26116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                new AwSettingsForceZeroLayoutHeightTestHelper(
26126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        views.getContainer0(), views.getClient0(), false),
26136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                new AwSettingsForceZeroLayoutHeightTestHelper(
26146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        views.getContainer1(), views.getClient1(), false));
26156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
26166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
26176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @SmallTest
26186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
26196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public void testForceZeroLayoutHeightViewportTagWithTwoViews() throws Throwable {
26206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ViewPair views = createViews();
26216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        runPerViewSettingsTest(
26226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                new AwSettingsForceZeroLayoutHeightTestHelper(
26236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        views.getContainer0(), views.getClient0(), true),
26246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                new AwSettingsForceZeroLayoutHeightTestHelper(
26256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        views.getContainer1(), views.getClient1(), true));
26266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
26276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
26286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @SmallTest
26296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
26306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public void testZeroLayoutHeightDisablesViewportQuirkWithTwoViews() throws Throwable {
26316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ViewPair views = createViews();
26326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        runPerViewSettingsTest(
26336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                new AwSettingsZeroLayoutHeightDisablesViewportQuirkTestHelper(
26346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        views.getContainer0(), views.getClient0()),
26356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                new AwSettingsZeroLayoutHeightDisablesViewportQuirkTestHelper(
26366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        views.getContainer1(), views.getClient1()));
26376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
26386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
26396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @SmallTest
26406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testLoadWithOverviewModeWithTwoViews() throws Throwable {
26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                new AwSettingsLoadWithOverviewModeTestHelper(
2645effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        views.getContainer0(), views.getClient0(), false),
26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                new AwSettingsLoadWithOverviewModeTestHelper(
2647effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        views.getContainer1(), views.getClient1(), false));
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    @SmallTest
2651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testLoadWithOverviewModeViewportTagWithTwoViews() throws Throwable {
26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ViewPair views = createViews();
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runPerViewSettingsTest(
26552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                new AwSettingsLoadWithOverviewModeTestHelper(
2656effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        views.getContainer0(), views.getClient0(), true),
26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                new AwSettingsLoadWithOverviewModeTestHelper(
2658effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        views.getContainer1(), views.getClient1(), true));
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testSetInitialScale() throws Throwable {
26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentClient = new TestAwContentsClient();
26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
26662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                createAwTestContainerViewOnMainSync(contentClient);
26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
26682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwSettings awSettings = getAwSettingsOnUiThread(awContents);
26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CallbackHelper onPageFinishedHelper = contentClient.getOnPageFinishedHelper();
26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        WindowManager wm = (WindowManager) getInstrumentation().getTargetContext()
26727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                .getSystemService(Context.WINDOW_SERVICE);
26737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        Point screenSize = new Point();
26747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        wm.getDefaultDisplay().getSize(screenSize);
26757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Make sure after 50% scale, page width still larger than screen.
26767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        int height = screenSize.y * 2 + 1;
26777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        int width = screenSize.x * 2 + 1;
26782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String page = "<html><body>" +
2679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                "<p style='height:" + height + "px;width:" + width + "px'>" +
26807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                "testSetInitialScale</p></body></html>";
26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final float defaultScale =
26822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            getInstrumentation().getTargetContext().getResources().getDisplayMetrics().density;
26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(defaultScale, getPixelScaleOnUiThread(awContents), .01f);
26852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(defaultScale, getPixelScaleOnUiThread(awContents), .01f);
26872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount();
26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        awSettings.setInitialPageScale(50);
26902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        contentClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount);
26922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(0.5f, getPixelScaleOnUiThread(awContents), .01f);
26932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount();
26952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        awSettings.setInitialPageScale(500);
26962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
26972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        contentClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount);
26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(5.0f, getPixelScaleOnUiThread(awContents), .01f);
26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount();
27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        awSettings.setInitialPageScale(0);
27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false);
27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        contentClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount);
27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(defaultScale, getPixelScaleOnUiThread(awContents), .01f);
27052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
27062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /*
27082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @LargeTest
27092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
27104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    http://crbug.com/304549
27114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    */
27124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @DisabledTest
27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testMediaPlaybackWithoutUserGesture() throws Throwable {
2714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        assertTrue(VideoTestUtil.runVideoTest(this, false, WAIT_TIMEOUT_MS));
27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testMediaPlaybackWithUserGesture() throws Throwable {
27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Wait for 5 second to see if video played.
2721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        assertFalse(VideoTestUtil.runVideoTest(this, true, scaleTimeout(5000)));
27222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
27232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Preferences"})
27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDefaultVideoPosterURL() throws Throwable {
27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final CallbackHelper videoPosterAccessedCallbackHelper = new CallbackHelper();
27281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        final String defaultVideoPosterUrl = "http://default_video_poster/";
27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestAwContentsClient client = new TestAwContentsClient() {
27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
27316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            public AwWebResourceResponse shouldInterceptRequest(
27326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    ShouldInterceptRequestParams params) {
27331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                if (params.url.equals(defaultVideoPosterUrl)) {
27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    videoPosterAccessedCallbackHelper.notifyCalled();
27352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
27362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                return null;
27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        };
27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = createAwTestContainerViewOnMainSync(client).getAwContents();
27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        getInstrumentation().runOnMainSync(new Runnable() {
27412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
2743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                AwSettings awSettings = awContents.getSettings();
27441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                awSettings.setDefaultVideoPosterURL(defaultVideoPosterUrl);
27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
27462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
27472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        VideoTestWebServer webServer = new VideoTestWebServer(
27482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                getInstrumentation().getTargetContext());
27492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            String data = "<html><head><body>" +
27512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "<video id='video' control src='" +
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                webServer.getOnePixelOneFrameWebmURL() + "' /> </body></html>";
27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadDataAsync(awContents, data, "text/html", false);
27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            videoPosterAccessedCallbackHelper.waitForCallback(0, 1, 20, TimeUnit.SECONDS);
27552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } finally {
27562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (webServer.getTestWebServer() != null)
27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                webServer.getTestWebServer().shutdown();
27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
27592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    @SmallTest
27620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    @Feature({"AndroidWebView", "Preferences"})
27630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    public void testAllowMixedMode() throws Throwable {
27640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        final TestAwContentsClient contentClient = new TestAwContentsClient() {
27650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            @Override
27660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            public void onReceivedSslError(ValueCallback<Boolean> callback, SslError error) {
27670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                callback.onReceiveValue(true);
27680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            }
27690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        };
27700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        final AwTestContainerView testContainerView =
27710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                createAwTestContainerViewOnMainSync(contentClient);
27720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        final AwContents awContents = testContainerView.getAwContents();
27730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        final AwSettings awSettings = getAwSettingsOnUiThread(awContents);
27740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
27750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        awSettings.setJavaScriptEnabled(true);
27760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
27771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TestWebServer httpsServer = null;
27781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        TestWebServer httpServer = null;
27791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        try {
27801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            httpsServer = new TestWebServer(true);
27811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            httpServer = new TestWebServer(false);
27820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
27831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            final String jsUrl = "/insecure.js";
27841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            final String imageUrl = "/insecure.png";
27851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            final String secureUrl = "/secure.html";
27861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            httpServer.setResponse(jsUrl, "window.loaded_js = 42;", null);
27871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            httpServer.setResponseBase64(imageUrl, CommonResources.FAVICON_DATA_BASE64, null);
27880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
27891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            final String jsHtml = "<script src=\"" + httpServer.getResponseUrl(jsUrl) +
27900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                "\"></script>";
27911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            final String imageHtml = "<img src=\"" + httpServer.getResponseUrl(imageUrl) + "\" />";
27921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            final String secureHtml = "<body>" + imageHtml + " " + jsHtml + "</body>";
27931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String fullSecureUrl = httpsServer.setResponse(secureUrl, secureHtml, null);
27951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            awSettings.setMixedContentMode(AwSettings.MIXED_CONTENT_NEVER_ALLOW);
27971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), fullSecureUrl);
27981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(1, httpsServer.getRequestCount(secureUrl));
27991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(0, httpServer.getRequestCount(jsUrl));
28001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(0, httpServer.getRequestCount(imageUrl));
28011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
28021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            awSettings.setMixedContentMode(AwSettings.MIXED_CONTENT_ALWAYS_ALLOW);
28031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), fullSecureUrl);
28041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(2, httpsServer.getRequestCount(secureUrl));
28051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(1, httpServer.getRequestCount(jsUrl));
28061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(1, httpServer.getRequestCount(imageUrl));
28071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
28081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            awSettings.setMixedContentMode(AwSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
28091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            loadUrlSync(awContents, contentClient.getOnPageFinishedHelper(), fullSecureUrl);
28101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(3, httpsServer.getRequestCount(secureUrl));
28111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(1, httpServer.getRequestCount(jsUrl));
28121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(2, httpServer.getRequestCount(imageUrl));
28131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        } finally {
28141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (httpServer != null) {
28151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                httpServer.shutdown();
28161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
28171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (httpsServer != null) {
28181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                httpsServer.shutdown();
28191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
28201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
28210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
28220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
28230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static class ViewPair {
2825effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        private final AwTestContainerView mContainer0;
2826effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        private final TestAwContentsClient mClient0;
2827effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        private final AwTestContainerView mContainer1;
2828effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        private final TestAwContentsClient mClient1;
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2830effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        ViewPair(AwTestContainerView container0, TestAwContentsClient client0,
2831effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 AwTestContainerView container1, TestAwContentsClient client1) {
2832effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            this.mContainer0 = container0;
2833effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            this.mClient0 = client0;
2834effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            this.mContainer1 = container1;
2835effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            this.mClient1 = client1;
2836effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        }
2837effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2838effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwTestContainerView getContainer0() {
2839effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            return mContainer0;
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwContents getContents0() {
2843effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            return mContainer0.getAwContents();
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestAwContentsClient getClient0() {
2847effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            return mClient0;
2848effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        }
2849effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2850effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        AwTestContainerView getContainer1() {
2851effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            return mContainer1;
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AwContents getContents1() {
2855effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            return mContainer1.getAwContents();
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestAwContentsClient getClient1() {
2859effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            return mClient1;
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Verifies the following statements about a setting:
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  - initially, the setting has a default value;
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  - the setting can be switched to an alternate value and back;
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  - switching a setting in the first WebView doesn't affect the setting
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *    state in the second WebView and vice versa.
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param helper0 Test helper for the first ContentView
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param helper1 Test helper for the second ContentView
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @throws Throwable
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void runPerViewSettingsTest(AwSettingsTestHelper helper0,
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        AwSettingsTestHelper helper1) throws Throwable {
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasInitialValue();
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasInitialValue();
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.setAlteredSettingValue();
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasInitialValue();
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasAlteredValue();
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.setInitialSettingValue();
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasInitialValue();
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasInitialValue();
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.setAlteredSettingValue();
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasAlteredValue();
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasInitialValue();
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.setInitialSettingValue();
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasInitialValue();
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasInitialValue();
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.setAlteredSettingValue();
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasAlteredValue();
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasInitialValue();
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.setAlteredSettingValue();
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasAlteredValue();
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasAlteredValue();
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.setInitialSettingValue();
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasInitialValue();
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasAlteredValue();
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.setInitialSettingValue();
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper0.ensureSettingHasInitialValue();
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        helper1.ensureSettingHasInitialValue();
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private ViewPair createViews() throws Throwable {
2913e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        return createViews(false);
2914d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
2915d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2916d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    private ViewPair createViews(boolean supportsLegacyQuirks) throws Throwable {
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestAwContentsClient client0 = new TestAwContentsClient();
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestAwContentsClient client1 = new TestAwContentsClient();
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return new ViewPair(
2920effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            createAwTestContainerViewOnMainSync(client0, supportsLegacyQuirks),
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            client0,
2922effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            createAwTestContainerViewOnMainSync(client1, supportsLegacyQuirks),
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            client1);
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2926424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    static void assertFileIsReadable(String filePath) {
2927424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        File file = new File(filePath);
2928424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        try {
2929424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            assertTrue("Test file \"" + filePath + "\" is not readable." +
2930424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                    "Please make sure that files from android_webview/test/data/device_files/ " +
2931424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                    "has been pushed to the device before testing",
2932424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                    file.canRead());
2933424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        } catch (SecurityException e) {
2934424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            fail("Got a SecurityException for \"" + filePath + "\": " + e.toString());
2935424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        }
2936424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
2937424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Verifies the number of resource requests made to the content provider.
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param resource Resource name
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param expectedCount Expected resource requests count
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void ensureResourceRequestCountInContentProvider(String resource, int expectedCount) {
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Context context = getInstrumentation().getTargetContext();
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int actualCount = TestContentProvider.getResourceRequestCount(context, resource);
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(expectedCount, actualCount);
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void resetResourceRequestCountInContentProvider(String resource) {
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Context context = getInstrumentation().getTargetContext();
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TestContentProvider.resetResourceRequestCount(context, resource);
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String createContentUrl(final String target) {
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return TestContentProvider.createContentUrl(target);
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void simulateDoubleTapCenterOfWebViewOnUiThread(final AwTestContainerView webView)
29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            throws Throwable {
2960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        final int x = (webView.getRight() - webView.getLeft()) / 2;
2961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        final int y = (webView.getBottom() - webView.getTop()) / 2;
29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = webView.getAwContents();
29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        runTestOnUiThread(new Runnable() {
29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
2966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                awContents.getContentViewCore().sendDoubleTapForTest(
29675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        SystemClock.uptimeMillis(), x, y);
29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2972