import android.test.suitebuilder.annotation.MediumTest;
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.test.util.TestCallbackHelperContainer;
import org.chromium.net.test.util.TestWebServer;
-import java.util.concurrent.TimeUnit;
-
/**
* Tests for the ContentViewClient.onPageFinished() method.
*/
@Override
public void setUp() throws Exception {
super.setUp();
- mContentsClient = new TestAwContentsClient();
+ setTestAwContentsClient(new TestAwContentsClient());
+ }
+
+ private void setTestAwContentsClient(TestAwContentsClient contentsClient) throws Exception {
+ mContentsClient = contentsClient;
final AwTestContainerView testContainerView =
createAwTestContainerViewOnMainSync(mContentsClient);
mAwContents = testContainerView.getAwContents();
@MediumTest
@Feature({"AndroidWebView"})
public void testOnPageFinishedCalledAfterError() throws Throwable {
+ class LocalTestClient extends TestAwContentsClient {
+ private boolean mIsOnReceivedErrorCalled = false;
+ private boolean mIsOnPageFinishedCalled = false;
+ private boolean mAllowAboutBlank = false;
+
+ @Override
+ public void onReceivedError(int errorCode, String description, String failingUrl) {
+ assertEquals("onReceivedError called twice for " + failingUrl,
+ false, mIsOnReceivedErrorCalled);
+ mIsOnReceivedErrorCalled = true;
+ assertEquals("onPageFinished called before onReceivedError for " + failingUrl,
+ false, mIsOnPageFinishedCalled);
+ super.onReceivedError(errorCode, description, failingUrl);
+ }
+
+ @Override
+ public void onPageFinished(String url) {
+ if (mAllowAboutBlank && "about:blank".equals(url)) {
+ super.onPageFinished(url);
+ return;
+ }
+ assertEquals("onPageFinished called twice for " + url,
+ false, mIsOnPageFinishedCalled);
+ mIsOnPageFinishedCalled = true;
+ assertEquals("onReceivedError not called before onPageFinished for " + url,
+ true, mIsOnReceivedErrorCalled);
+ super.onPageFinished(url);
+ }
+
+ void setAllowAboutBlank() {
+ mAllowAboutBlank = true;
+ }
+ }
+ LocalTestClient testContentsClient = new LocalTestClient();
+ setTestAwContentsClient(testContentsClient);
+
TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
mContentsClient.getOnReceivedErrorHelper();
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
mContentsClient.getOnPageFinishedHelper();
- assertEquals(0, onReceivedErrorHelper.getCallCount());
-
- String url = "http://localhost:7/non_existent";
- int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
- int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
- loadUrlAsync(mAwContents, url);
-
- onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount,
- 1 /* numberOfCallsToWaitFor */,
- WAIT_TIMEOUT_MS,
- TimeUnit.MILLISECONDS);
- onPageFinishedHelper.waitForCallback(onPageFinishedCallCount,
- 1 /* numberOfCallsToWaitFor */,
- WAIT_TIMEOUT_MS,
- TimeUnit.MILLISECONDS);
- assertEquals(1, onReceivedErrorHelper.getCallCount());
+ String invalidUrl = "http://localhost:7/non_existent";
+ loadUrlSync(mAwContents, onPageFinishedHelper, invalidUrl);
+
+ assertEquals(invalidUrl, onReceivedErrorHelper.getFailingUrl());
+ assertEquals(invalidUrl, onPageFinishedHelper.getUrl());
+
+ // Rather than wait a fixed time to see that another onPageFinished callback isn't issued
+ // we load a valid page. Since callbacks arrive sequentially, this will ensure that
+ // any extra calls of onPageFinished / onReceivedError will arrive to our client.
+ testContentsClient.setAllowAboutBlank();
+ loadUrlSync(mAwContents, onPageFinishedHelper, "about:blank");
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testOnPageFinishedCalledAfterRedirectedUrlIsOverridden() throws Throwable {
+ /*
+ * If url1 is redirected url2, and url2 load is overridden, onPageFinished should still be
+ * called for url2.
+ * Steps:
+ * 1. load url1. url1 onPageStarted
+ * 2. server redirects url1 to url2. url2 onPageStarted
+ * 3. shouldOverridedUrlLoading called for url2 and returns true
+ * 4. url2 onPageFinishedCalled
+ */
+
+ TestWebServer webServer = TestWebServer.start();
+ try {
+ final String redirectTargetPath = "/redirect_target.html";
+ final String redirectTargetUrl = webServer.setResponse(redirectTargetPath,
+ "<html><body>hello world</body></html>", null);
+ final String redirectUrl = webServer.setRedirect("/302.html", redirectTargetUrl);
+
+ final TestAwContentsClient.ShouldOverrideUrlLoadingHelper urlOverrideHelper =
+ mContentsClient.getShouldOverrideUrlLoadingHelper();
+ // Override the load of redirectTargetUrl
+ urlOverrideHelper.setShouldOverrideUrlLoadingReturnValue(true);
+
+ TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
+ mContentsClient.getOnPageFinishedHelper();
+
+ final int currentOnPageFinishedCallCount = onPageFinishedHelper.getCallCount();
+ loadUrlAsync(mAwContents, redirectUrl);
+
+ onPageFinishedHelper.waitForCallback(currentOnPageFinishedCallCount);
+ // onPageFinished needs to be called for redirectTargetUrl, but not for redirectUrl
+ assertEquals(redirectTargetUrl, onPageFinishedHelper.getUrl());
+ } finally {
+ webServer.shutdown();
+ }
}
@MediumTest
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
mContentsClient.getOnPageFinishedHelper();
- TestWebServer webServer = null;
+ TestWebServer webServer = TestWebServer.start();
try {
- webServer = new TestWebServer(false);
-
final String testHtml = "<html><head>Header</head><body>Body</body></html>";
final String testPath = "/test.html";
final String syncPath = "/sync.html";
onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
assertEquals(syncUrl, onPageFinishedHelper.getUrl());
assertEquals(2, onPageFinishedHelper.getCallCount());
-
} finally {
- if (webServer != null) webServer.shutdown();
+ webServer.shutdown();
}
}
mContentsClient.getOnPageFinishedHelper();
enableJavaScriptOnUiThread(mAwContents);
- TestWebServer webServer = null;
+ TestWebServer webServer = TestWebServer.start();
try {
- webServer = new TestWebServer(false);
-
final String testHtml = "<html><head>Header</head><body>Body</body></html>";
final String testPath = "/test.html";
final String historyPath = "/history.html";
onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
assertEquals(syncUrl, onPageFinishedHelper.getUrl());
assertEquals(2, onPageFinishedHelper.getCallCount());
+ } finally {
+ webServer.shutdown();
+ }
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testOnPageFinishedCalledForHrefNavigations() throws Throwable {
+ doTestOnPageFinishedCalledForHrefNavigations(false);
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView"})
+ public void testOnPageFinishedCalledForHrefNavigationsWithBaseUrl() throws Throwable {
+ doTestOnPageFinishedCalledForHrefNavigations(true);
+ }
+
+ private void doTestOnPageFinishedCalledForHrefNavigations(boolean useBaseUrl) throws Throwable {
+ TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
+ mContentsClient.getOnPageFinishedHelper();
+ TestCallbackHelperContainer.OnPageStartedHelper onPageStartedHelper =
+ mContentsClient.getOnPageStartedHelper();
+ enableJavaScriptOnUiThread(mAwContents);
+
+ TestWebServer webServer = TestWebServer.start();
+ try {
+ final String testHtml = CommonResources.makeHtmlPageFrom("",
+ "<a href=\"#anchor\" id=\"link\">anchor</a>");
+ final String testPath = "/test.html";
+ final String testUrl = webServer.setResponse(testPath, testHtml, null);
+
+ if (useBaseUrl) {
+ loadDataWithBaseUrlSync(mAwContents, onPageFinishedHelper,
+ testHtml, "text/html", false, webServer.getBaseUrl(), null);
+ } else {
+ loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
+ }
+
+ int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
+ int onPageStartedCallCount = onPageStartedHelper.getCallCount();
+
+ JSUtils.clickOnLinkUsingJs(this, mAwContents,
+ mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
+
+ onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
+ assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
+
+ onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
+ onPageStartedCallCount = onPageStartedHelper.getCallCount();
+
+ executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
+ "window.history.go(-1)");
+ onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
+ assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
} finally {
- if (webServer != null) webServer.shutdown();
+ webServer.shutdown();
}
}
}