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