// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.android_webview.test; import android.os.Bundle; import android.os.SystemClock; import android.test.suitebuilder.annotation.SmallTest; import android.util.Pair; import android.view.MotionEvent; import android.util.Log; import org.chromium.android_webview.AwContents; import org.chromium.android_webview.test.util.CommonResources; import org.chromium.android_webview.test.util.JSUtils; import org.chromium.base.test.util.Feature; import org.chromium.content.browser.NavigationHistory; import org.chromium.content.browser.LoadUrlParams; import org.chromium.content.browser.test.util.CallbackHelper; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageStartedHelper; import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnReceivedErrorHelper; import org.chromium.net.test.util.TestWebServer; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; /** * Tests for the WebViewClient.shouldOverrideUrlLoading() method. */ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase { private final static String ABOUT_BLANK_URL = "about:blank"; private final static String DATA_URL = "data:text/html,
"; private final static String REDIRECT_TARGET_PATH = "/redirect_target.html"; private final static String TITLE = "TITLE"; private static final long TEST_TIMEOUT = 20000L; private static final long CHECK_INTERVAL = 100; private static class TestAwContentsClient extends org.chromium.android_webview.test.TestAwContentsClient { public static class ShouldOverrideUrlLoadingHelper extends CallbackHelper { private String mShouldOverrideUrlLoadingUrl; private String mPreviousShouldOverrideUrlLoadingUrl; private boolean mShouldOverrideUrlLoadingReturnValue = false; void setShouldOverrideUrlLoadingUrl(String url) { mShouldOverrideUrlLoadingUrl = url; } void setPreviousShouldOverrideUrlLoadingUrl(String url) { mPreviousShouldOverrideUrlLoadingUrl = url; } void setShouldOverrideUrlLoadingReturnValue(boolean value) { mShouldOverrideUrlLoadingReturnValue = value; } public String getShouldOverrideUrlLoadingUrl() { assert getCallCount() > 0; return mShouldOverrideUrlLoadingUrl; } public String getPreviousShouldOverrideUrlLoadingUrl() { assert getCallCount() > 1; return mPreviousShouldOverrideUrlLoadingUrl; } public boolean getShouldOverrideUrlLoadingReturnValue() { return mShouldOverrideUrlLoadingReturnValue; } public void notifyCalled(String url) { mPreviousShouldOverrideUrlLoadingUrl = mShouldOverrideUrlLoadingUrl; mShouldOverrideUrlLoadingUrl = url; notifyCalled(); } } @Override public boolean shouldOverrideUrlLoading(String url) { super.shouldOverrideUrlLoading(url); boolean returnValue = mShouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingReturnValue(); mShouldOverrideUrlLoadingHelper.notifyCalled(url); return returnValue; } private ShouldOverrideUrlLoadingHelper mShouldOverrideUrlLoadingHelper; public TestAwContentsClient() { mShouldOverrideUrlLoadingHelper = new ShouldOverrideUrlLoadingHelper(); } public ShouldOverrideUrlLoadingHelper getShouldOverrideUrlLoadingHelper() { return mShouldOverrideUrlLoadingHelper; } } private TestWebServer mWebServer; @Override protected void setUp() throws Exception { super.setUp(); mWebServer = new TestWebServer(false); } @Override protected void tearDown() throws Exception { mWebServer.shutdown(); super.tearDown(); } private void clickOnLinkUsingJs(final AwContents awContents, final TestAwContentsClient contentsClient) throws Throwable { enableJavaScriptOnUiThread(awContents); JSUtils.clickOnLinkUsingJs(this, awContents, contentsClient.getOnEvaluateJavaScriptResultHelper(), "link"); } // Since this value is read on the UI thread, it's simpler to set it there too. void setShouldOverrideUrlLoadingReturnValueOnUiThread( final TestAwContentsClient.ShouldOverrideUrlLoadingHelper shouldOverrideHelper, final boolean value) throws Throwable { runTestOnUiThread(new Runnable() { @Override public void run() { shouldOverrideHelper.setShouldOverrideUrlLoadingReturnValue(value); } }); } private String makeHtmlPageFrom(String headers, String body) { return CommonResources.makeHtmlPageFrom("" + TITLE + " " + headers, body); } private String getHtmlForPageWithSimpleLinkTo(String destination) { return makeHtmlPageFrom("", "" + "" + ""); } private String getHtmlForPageWithJsAssignLinkTo(String url) { return makeHtmlPageFrom("", ""); } private String getHtmlForPageWithJsReplaceLinkTo(String url) { return makeHtmlPageFrom("", ""); } private String getHtmlForPageWithMetaRefreshRedirectTo(String url) { return makeHtmlPageFrom("", "
Meta refresh redirect
"); } private String getHtmlForPageWithJsRedirectTo(String url, String method, int timeout) { return makeHtmlPageFrom( "", String.format("