15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.android_webview.test;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Bundle;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.SystemClock;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.Pair;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.MotionEvent;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.Log;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.AwContents;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.test.util.CommonResources;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.test.util.JSUtils;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.Feature;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.NavigationHistory;
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport org.chromium.content.browser.LoadUrlParams;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.CallbackHelper;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.Criteria;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageStartedHelper;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnReceivedErrorHelper;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.net.test.util.TestWebServer;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.net.URLEncoder;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.ArrayList;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.List;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.concurrent.Callable;
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport java.util.concurrent.TimeUnit;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Tests for the WebViewClient.shouldOverrideUrlLoading() method.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final static String ABOUT_BLANK_URL = "about:blank";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final static String DATA_URL = "data:text/html,<div/>";
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final static String REDIRECT_TARGET_PATH = "/redirect_target.html";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final static String TITLE = "TITLE";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static final long TEST_TIMEOUT = 20000L;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private static final long CHECK_INTERVAL = 100;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static class TestAwContentsClient
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            extends org.chromium.android_webview.test.TestAwContentsClient {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        public static class ShouldOverrideUrlLoadingHelper extends CallbackHelper {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            private String mShouldOverrideUrlLoadingUrl;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            private String mPreviousShouldOverrideUrlLoadingUrl;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            private boolean mShouldOverrideUrlLoadingReturnValue = false;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            void setShouldOverrideUrlLoadingUrl(String url) {
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mShouldOverrideUrlLoadingUrl = url;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            void setPreviousShouldOverrideUrlLoadingUrl(String url) {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mPreviousShouldOverrideUrlLoadingUrl = url;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            void setShouldOverrideUrlLoadingReturnValue(boolean value) {
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mShouldOverrideUrlLoadingReturnValue = value;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            public String getShouldOverrideUrlLoadingUrl() {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                assert getCallCount() > 0;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                return mShouldOverrideUrlLoadingUrl;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            public String getPreviousShouldOverrideUrlLoadingUrl() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                assert getCallCount() > 1;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                return mPreviousShouldOverrideUrlLoadingUrl;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            public boolean getShouldOverrideUrlLoadingReturnValue() {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                return mShouldOverrideUrlLoadingReturnValue;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            public void notifyCalled(String url) {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mPreviousShouldOverrideUrlLoadingUrl = mShouldOverrideUrlLoadingUrl;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mShouldOverrideUrlLoadingUrl = url;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                notifyCalled();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        public boolean shouldOverrideUrlLoading(String url) {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            super.shouldOverrideUrlLoading(url);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            boolean returnValue =
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mShouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingReturnValue();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mShouldOverrideUrlLoadingHelper.notifyCalled(url);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return returnValue;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        private ShouldOverrideUrlLoadingHelper mShouldOverrideUrlLoadingHelper;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        public TestAwContentsClient() {
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            mShouldOverrideUrlLoadingHelper = new ShouldOverrideUrlLoadingHelper();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        public ShouldOverrideUrlLoadingHelper getShouldOverrideUrlLoadingHelper() {
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return mShouldOverrideUrlLoadingHelper;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private TestWebServer mWebServer;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void setUp() throws Exception {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.setUp();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mWebServer = new TestWebServer(false);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected void tearDown() throws Exception {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mWebServer.shutdown();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        super.tearDown();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void clickOnLinkUsingJs(final AwContents awContents,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final TestAwContentsClient contentsClient) throws Throwable {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enableJavaScriptOnUiThread(awContents);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        JSUtils.clickOnLinkUsingJs(this, awContents,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                contentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since this value is read on the UI thread, it's simpler to set it there too.
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void setShouldOverrideUrlLoadingReturnValueOnUiThread(
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideHelper,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            final boolean value) throws Throwable {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runTestOnUiThread(new Runnable() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            @Override
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            public void run() {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideHelper.setShouldOverrideUrlLoadingReturnValue(value);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String makeHtmlPageFrom(String headers, String body) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return CommonResources.makeHtmlPageFrom("<title>" + TITLE + "</title> " + headers, body);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String getHtmlForPageWithSimpleLinkTo(String destination) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return makeHtmlPageFrom("",
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "<a href=\"" + destination + "\" id=\"link\">" +
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "<img class=\"big\" />" +
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "</a>");
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String getHtmlForPageWithJsAssignLinkTo(String url) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return makeHtmlPageFrom("",
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<img onclick=\"location.href='" + url + "'\" class=\"big\" id=\"link\" />");
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String getHtmlForPageWithJsReplaceLinkTo(String url) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return makeHtmlPageFrom("",
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<img onclick=\"location.replace('" + url + "');\" class=\"big\" id=\"link\" />");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String getHtmlForPageWithMetaRefreshRedirectTo(String url) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return makeHtmlPageFrom("<meta http-equiv=\"refresh\" content=\"0;url=" + url + "\" />",
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<div>Meta refresh redirect</div>");
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String getHtmlForPageWithJsRedirectTo(String url, String method, int timeout) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return makeHtmlPageFrom(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<script>" +
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "function doRedirectAssign() {" +
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "location.href = '" + url + "';" +
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "} " +
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "function doRedirectReplace() {" +
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "location.replace('" + url + "');" +
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "} "+
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "</script>",
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                String.format("<iframe onLoad=\"setTimeout('doRedirect%s()', %d);\" />",
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    method, timeout));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String getHtmlForPageWithSimplePostFormTo(String destination) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return makeHtmlPageFrom("",
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "<form action=\"" + destination + "\" method=\"post\">" +
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "<input type=\"submit\" value=\"post\" id=\"link\">"+
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "</form>");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String addPageToTestServer(TestWebServer webServer, String httpPath, String html) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        headers.add(Pair.create("Content-Type", "text/html"));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        headers.add(Pair.create("Cache-Control", "no-store"));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return webServer.setResponse(httpPath, html, headers);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String createRedirectTargetPage(TestWebServer webServer) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return addPageToTestServer(webServer, REDIRECT_TARGET_PATH,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                makeHtmlPageFrom("", "<div>This is the end of the redirect chain</div>"));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testNotCalledOnLoadUrl() throws Throwable {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void waitForNavigationRunnableAndAssertTitleChanged(AwContents awContents,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            CallbackHelper onPageFinishedHelper,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Runnable navigationRunnable) throws Exception {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final int callCount = onPageFinishedHelper.getCallCount();
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String oldTitle = getTitleOnUiThread(awContents);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        getInstrumentation().runOnMainSync(navigationRunnable);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        onPageFinishedHelper.waitForCallback(callCount);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertFalse(oldTitle.equals(getTitleOnUiThread(awContents)));
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testNotCalledOnBackForwardNavigation() throws Throwable {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String[] pageTitles = new String[] { "page1", "page2", "page3" };
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (String title: pageTitles) {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    CommonResources.makeHtmlPageFrom("<title>" + title + "</title>", ""),
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    "text/html", false);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waitForNavigationRunnableAndAssertTitleChanged(awContents,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                contentsClient.getOnPageFinishedHelper(), new Runnable() {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents.goBack();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waitForNavigationRunnableAndAssertTitleChanged(awContents,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                contentsClient.getOnPageFinishedHelper(), new Runnable() {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents.goForward();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waitForNavigationRunnableAndAssertTitleChanged(awContents,
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                contentsClient.getOnPageFinishedHelper(), new Runnable() {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents.goBackOrForward(-2);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waitForNavigationRunnableAndAssertTitleChanged(awContents,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                contentsClient.getOnPageFinishedHelper(), new Runnable() {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                awContents.goBackOrForward(1);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCantBlockLoads() throws Throwable {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setShouldOverrideUrlLoadingReturnValueOnUiThread(shouldOverrideUrlLoadingHelper, true);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(TITLE, getTitleOnUiThread(awContents));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledBeforeOnPageStarted() throws Throwable {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        OnPageStartedHelper onPageStartedHelper = contentsClient.getOnPageStartedHelper();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final int shouldOverrideUrlLoadingCallCount = shouldOverrideUrlLoadingHelper.getCallCount();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final int onPageStartedCallCount = onPageStartedHelper.getCallCount();
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setShouldOverrideUrlLoadingReturnValueOnUiThread(shouldOverrideUrlLoadingHelper, true);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(shouldOverrideUrlLoadingCallCount);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testDoesNotCauseOnReceivedError() throws Throwable {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        OnReceivedErrorHelper onReceivedErrorHelper = contentsClient.getOnReceivedErrorHelper();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final int shouldOverrideUrlLoadingCallCount = shouldOverrideUrlLoadingHelper.getCallCount();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setShouldOverrideUrlLoadingReturnValueOnUiThread(shouldOverrideUrlLoadingHelper, true);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(shouldOverrideUrlLoadingCallCount);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setShouldOverrideUrlLoadingReturnValueOnUiThread(shouldOverrideUrlLoadingHelper, false);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // After we load this URL we're certain that any in-flight callbacks for the previous
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // navigation have been delivered.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), ABOUT_BLANK_URL);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(onReceivedErrorCallCount, onReceivedErrorHelper.getCallCount());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testNotCalledForAnchorNavigations() throws Throwable {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String anchorLinkPath = "/anchor_link.html";
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String anchorLinkUrl = mWebServer.getResponseUrl(anchorLinkPath);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addPageToTestServer(mWebServer, anchorLinkPath,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(anchorLinkUrl + "#anchor"));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), anchorLinkUrl);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final int shouldOverrideUrlLoadingCallCount =
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            shouldOverrideUrlLoadingHelper.getCallCount();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // After we load this URL we're certain that any in-flight callbacks for the previous
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // navigation have been delivered.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), ABOUT_BLANK_URL);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(shouldOverrideUrlLoadingCallCount,
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getCallCount());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledWhenLinkClicked() throws Throwable {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We can't go to about:blank from here because we'd get a cross-origin error.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledWhenSelfLinkClicked() throws Throwable {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String httpPath = "/page_with_link_to_self.html";
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String httpPathOnServer = mWebServer.getResponseUrl(httpPath);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addPageToTestServer(mWebServer, httpPath,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(httpPathOnServer));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                httpPathOnServer);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(httpPathOnServer,
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledWhenNavigatingFromJavaScriptUsingAssign()
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            throws Throwable {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enableJavaScriptOnUiThread(awContents);
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithJsAssignLinkTo(redirectTargetUrl), "text/html", false);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledWhenNavigatingFromJavaScriptUsingReplace()
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            throws Throwable {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enableJavaScriptOnUiThread(awContents);
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithJsReplaceLinkTo(redirectTargetUrl), "text/html", false);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testPassesCorrectUrl() throws Throwable {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(redirectTargetUrl), "text/html", false);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(redirectTargetUrl,
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCanIgnoreLoading() throws Throwable {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String pageWithLinkToIgnorePath = "/page_with_link_to_ignore.html";
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String pageWithLinkToIgnoreUrl = addPageToTestServer(mWebServer,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pageWithLinkToIgnorePath,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(redirectTargetUrl));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String synchronizationPath = "/sync.html";
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String synchronizationUrl = addPageToTestServer(mWebServer,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                synchronizationPath,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(redirectTargetUrl));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pageWithLinkToIgnoreUrl);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setShouldOverrideUrlLoadingReturnValueOnUiThread(shouldOverrideUrlLoadingHelper, true);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int onPageFinishedCallCount = contentsClient.getOnPageFinishedHelper().getCallCount();
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Some time around here true should be returned from the shouldOverrideUrlLoading
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // callback causing the navigation caused by calling clickOnLinkUsingJs to be ignored.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We validate this by checking which pages were loaded on the server.
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        setShouldOverrideUrlLoadingReturnValueOnUiThread(shouldOverrideUrlLoadingHelper, false);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We need to wait for the navigation to complete before we can initiate another load.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contentsClient.getOnPageFinishedHelper().waitForCallback(onPageFinishedCallCount);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), synchronizationUrl);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(1, mWebServer.getRequestCount(pageWithLinkToIgnorePath));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(1, mWebServer.getRequestCount(synchronizationPath));
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(0, mWebServer.getRequestCount(REDIRECT_TARGET_PATH));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledForDataUrl() throws Throwable {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String dataUrl =
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "data:text/html;base64," +
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "PGh0bWw+PGhlYWQ+PHRpdGxlPmRhdGFVcmxUZXN0QmFzZTY0PC90aXRsZT48" +
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "L2hlYWQ+PC9odG1sPg==";
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(dataUrl), "text/html", false);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertTrue("Expected URL that starts with 'data:' but got: <" +
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl() + "> instead.",
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl().startsWith(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "data:"));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledForUnsupportedSchemes() throws Throwable {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String unsupportedSchemeUrl = "foobar://resource/1";
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadDataSync(awContents, contentsClient.getOnPageFinishedHelper(),
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(unsupportedSchemeUrl), "text/html", false);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int callCount = shouldOverrideUrlLoadingHelper.getCallCount();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(callCount);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(unsupportedSchemeUrl,
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testNotCalledForPostNavigations() throws Throwable {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // The reason POST requests are excluded is BUG 155250.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String postLinkUrl = addPageToTestServer(mWebServer, "/page_with_post_link.html",
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimplePostFormTo(redirectTargetUrl));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), postLinkUrl);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final int shouldOverrideUrlLoadingCallCount =
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            shouldOverrideUrlLoadingHelper.getCallCount();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(0, mWebServer.getRequestCount(REDIRECT_TARGET_PATH));
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Wait for the target URL to be fetched from the server.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            @Override
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            public boolean isSatisfied() {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return mWebServer.getRequestCount(REDIRECT_TARGET_PATH) == 1;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }, WAIT_TIMEOUT_SECONDS * 1000L, CHECK_INTERVAL));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Since the targetURL was loaded from the test server it means all processing related
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // to dispatching a shouldOverrideUrlLoading callback had finished and checking the call
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // is stable.
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(shouldOverrideUrlLoadingCallCount,
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getCallCount());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
6229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    public void testCalledFor302AfterPostNavigations() throws Throwable {
6239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        // The reason POST requests are excluded is BUG 155250.
6249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final TestAwContentsClient contentsClient = new TestAwContentsClient();
6259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final AwTestContainerView testContainerView =
6269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            createAwTestContainerViewOnMainSync(contentsClient);
6279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final AwContents awContents = testContainerView.getAwContents();
6289ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
6299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            contentsClient.getShouldOverrideUrlLoadingHelper();
6309ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6319ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
6329ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final String postToGetRedirectUrl = mWebServer.setRedirect("/302.html", redirectTargetUrl);
6339ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final String postLinkUrl = addPageToTestServer(mWebServer, "/page_with_post_link.html",
6349ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                getHtmlForPageWithSimplePostFormTo(postToGetRedirectUrl));
6359ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6369ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), postLinkUrl);
6379ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        final int shouldOverrideUrlLoadingCallCount =
6399ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            shouldOverrideUrlLoadingHelper.getCallCount();
6409ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6419ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        clickOnLinkUsingJs(awContents, contentsClient);
6429ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6439ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        shouldOverrideUrlLoadingHelper.waitForCallback(shouldOverrideUrlLoadingCallCount);
6449ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6459ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        // Wait for the target URL to be fetched from the server.
6469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
6479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            @Override
6489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            public boolean isSatisfied() {
6499ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                return mWebServer.getRequestCount(REDIRECT_TARGET_PATH) == 1;
6509ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            }
6519ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        }, WAIT_TIMEOUT_SECONDS * 1000L, CHECK_INTERVAL));
6529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6539ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        assertEquals(redirectTargetUrl,
6549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
6559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    }
6569ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    @SmallTest
6589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    @Feature({"AndroidWebView", "Navigation"})
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testNotCalledForIframeHttpNavigations() throws Throwable {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String iframeRedirectTargetUrl = createRedirectTargetPage(mWebServer);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String iframeRedirectUrl =
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mWebServer.setRedirect("/302.html", iframeRedirectTargetUrl);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String pageWithIframeUrl =
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            addPageToTestServer(mWebServer, "/iframe_intercept.html",
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                makeHtmlPageFrom("", "<iframe src=\"" + iframeRedirectUrl + "\" />"));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final int shouldOverrideUrlLoadingCallCount =
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            shouldOverrideUrlLoadingHelper.getCallCount();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(0, mWebServer.getRequestCount(REDIRECT_TARGET_PATH));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), pageWithIframeUrl);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Wait for the redirect target URL to be fetched from the server.
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public boolean isSatisfied() {
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                return mWebServer.getRequestCount(REDIRECT_TARGET_PATH) == 1;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }, WAIT_TIMEOUT_SECONDS * 1000L, CHECK_INTERVAL));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(shouldOverrideUrlLoadingCallCount,
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getCallCount());
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledForIframeUnsupportedSchemeNavigations() throws Throwable {
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwTestContainerView testContainerView =
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            contentsClient.getShouldOverrideUrlLoadingHelper();
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String unsupportedSchemeUrl = "foobar://resource/1";
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String pageWithIframeUrl =
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            addPageToTestServer(mWebServer, "/iframe_intercept.html",
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                makeHtmlPageFrom("", "<iframe src=\"" + unsupportedSchemeUrl + "\" />"));
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        final int shouldOverrideUrlLoadingCallCount =
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            shouldOverrideUrlLoadingHelper.getCallCount();
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), pageWithIframeUrl);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(shouldOverrideUrlLoadingCallCount);
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals(unsupportedSchemeUrl,
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Worker method for the various redirect tests.
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Calling this will first load the redirect URL built from redirectFilePath, query and
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * locationFilePath and assert that we get a override callback for the destination.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The second part of the test loads a page that contains a link which points at the redirect
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * URL. We expect two callbacks - one for the redirect link and another for the destination.
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void doTestCalledOnRedirect(TestWebServer webServer,
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            String redirectUrl, String redirectTarget) throws Throwable {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final TestAwContentsClient contentsClient = new TestAwContentsClient();
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwTestContainerView testContainerView =
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            createAwTestContainerViewOnMainSync(contentsClient);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final AwContents awContents = testContainerView.getAwContents();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String pageWithLinkToRedirectUrl = addPageToTestServer(webServer,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "/page_with_link_to_redirect.html",
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithSimpleLinkTo(redirectUrl));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enableJavaScriptOnUiThread(awContents);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                contentsClient.getShouldOverrideUrlLoadingHelper();
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int directLoadCallCount = shouldOverrideUrlLoadingHelper.getCallCount();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), redirectUrl);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(directLoadCallCount, 1);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(redirectTarget,
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // There is a slight difference between navigations caused by calling load and navigations
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // caused by clicking on a link:
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //  * when using load the navigation is treated as if it came from the URL bar (has the
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //    navigation type TYPED and doesn't have the has_user_gesture flag)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //  * when clicking on a link the navigation has the LINK type and has_user_gesture is
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //    true.
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Both of these should yield the same result which is what we're verifying here.
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int indirectLoadCallCount = shouldOverrideUrlLoadingHelper.getCallCount();
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(),
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pageWithLinkToRedirectUrl);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        assertEquals(indirectLoadCallCount, shouldOverrideUrlLoadingHelper.getCallCount());
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clickOnLinkUsingJs(awContents, contentsClient);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        shouldOverrideUrlLoadingHelper.waitForCallback(indirectLoadCallCount, 2);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(redirectTarget,
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals(redirectUrl,
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                shouldOverrideUrlLoadingHelper.getPreviousShouldOverrideUrlLoadingUrl());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledOn302Redirect() throws Throwable {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectUrl = mWebServer.setRedirect("/302.html", redirectTargetUrl);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        doTestCalledOnRedirect(mWebServer, redirectUrl, redirectTargetUrl);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledOnMetaRefreshRedirect() throws Throwable {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectUrl = addPageToTestServer(mWebServer, "/meta_refresh.html",
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithMetaRefreshRedirectTo(redirectTargetUrl));
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        doTestCalledOnRedirect(mWebServer, redirectUrl, redirectTargetUrl);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledOnJavaScriptLocationImmediateAssignRedirect()
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            throws Throwable {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectUrl = addPageToTestServer(mWebServer, "/js_immediate_assign.html",
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithJsRedirectTo(redirectTargetUrl, "Assign", 0));
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        doTestCalledOnRedirect(mWebServer, redirectUrl, redirectTargetUrl);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledOnJavaScriptLocationImmediateReplaceRedirect()
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            throws Throwable {
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectUrl = addPageToTestServer(mWebServer, "/js_immediate_replace.html",
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithJsRedirectTo(redirectTargetUrl, "Replace", 0));
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        doTestCalledOnRedirect(mWebServer, redirectUrl, redirectTargetUrl);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledOnJavaScriptLocationDelayedAssignRedirect()
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            throws Throwable {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectUrl = addPageToTestServer(mWebServer, "/js_delayed_assign.html",
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithJsRedirectTo(redirectTargetUrl, "Assign", 100));
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        doTestCalledOnRedirect(mWebServer, redirectUrl, redirectTargetUrl);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @SmallTest
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Feature({"AndroidWebView", "Navigation"})
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testCalledOnJavaScriptLocationDelayedReplaceRedirect()
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            throws Throwable {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectTargetUrl = createRedirectTargetPage(mWebServer);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        final String redirectUrl = addPageToTestServer(mWebServer, "/js_delayed_replace.html",
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                getHtmlForPageWithJsRedirectTo(redirectTargetUrl, "Replace", 100));
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        doTestCalledOnRedirect(mWebServer, redirectUrl, redirectTargetUrl);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    @SmallTest
8277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    @Feature({"AndroidWebView", "Navigation"})
8287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    public void testDoubleNavigateDoesNotSuppressInitialNavigate() throws Throwable {
8297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        final String jsUrl = "javascript:try{console.log('processed js loadUrl');}catch(e){};";
8307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        final TestAwContentsClient contentsClient = new TestAwContentsClient();
8317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        final AwTestContainerView testContainerView =
8327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            createAwTestContainerViewOnMainSync(contentsClient);
8337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        final AwContents awContents = testContainerView.getAwContents();
8347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideUrlLoadingHelper =
8357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            contentsClient.getShouldOverrideUrlLoadingHelper();
8367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Do a double navigagtion, the second being an effective no-op, in quick succession (i.e.
8387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // without yielding the main thread inbetween).
8397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        int currentCallCount = contentsClient.getOnPageFinishedHelper().getCallCount();
8407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        getInstrumentation().runOnMainSync(new Runnable() {
8417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            @Override
8427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            public void run() {
8437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                awContents.loadUrl(LoadUrlParams.createLoadDataParams(
8447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        getHtmlForPageWithSimpleLinkTo(DATA_URL), "text/html", false));
8457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                awContents.loadUrl(new LoadUrlParams(jsUrl));
8467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            }
8477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        });
8487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        contentsClient.getOnPageFinishedHelper().waitForCallback(currentCallCount, 1,
8497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
8507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount());
8527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
854