1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.android_webview.test;
7 import android.test.suitebuilder.annotation.MediumTest;
9 import org.chromium.android_webview.AwContents;
10 import org.chromium.android_webview.test.util.CommonResources;
11 import org.chromium.android_webview.test.util.JSUtils;
12 import org.chromium.base.test.util.Feature;
13 import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
14 import org.chromium.net.test.util.TestWebServer;
17 * Tests for the ContentViewClient.onPageFinished() method.
19 public class ClientOnPageFinishedTest extends AwTestBase {
21 private TestAwContentsClient mContentsClient;
22 private AwContents mAwContents;
25 public void setUp() throws Exception {
27 setTestAwContentsClient(new TestAwContentsClient());
30 private void setTestAwContentsClient(TestAwContentsClient contentsClient) throws Exception {
31 mContentsClient = contentsClient;
32 final AwTestContainerView testContainerView =
33 createAwTestContainerViewOnMainSync(mContentsClient);
34 mAwContents = testContainerView.getAwContents();
38 @Feature({"AndroidWebView"})
39 public void testOnPageFinishedPassesCorrectUrl() throws Throwable {
40 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
41 mContentsClient.getOnPageFinishedHelper();
43 String html = "<html><body>Simple page.</body></html>";
44 int currentCallCount = onPageFinishedHelper.getCallCount();
45 loadDataAsync(mAwContents, html, "text/html", false);
47 onPageFinishedHelper.waitForCallback(currentCallCount);
48 assertEquals("data:text/html," + html, onPageFinishedHelper.getUrl());
52 @Feature({"AndroidWebView"})
53 public void testOnPageFinishedCalledAfterError() throws Throwable {
54 setTestAwContentsClient(new TestAwContentsClient() {
55 private boolean isOnReceivedErrorCalled = false;
56 private boolean isOnPageFinishedCalled = false;
59 public void onReceivedError(int errorCode, String description, String failingUrl) {
60 isOnReceivedErrorCalled = true;
61 // Make sure onReceivedError is called before onPageFinished
62 assertEquals(false, isOnPageFinishedCalled);
63 super.onReceivedError(errorCode, description, failingUrl);
67 public void onPageFinished(String url) {
68 isOnPageFinishedCalled = true;
69 // Make sure onReceivedError is called before onPageFinished
70 assertEquals(true, isOnReceivedErrorCalled);
71 super.onPageFinished(url);
75 TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
76 mContentsClient.getOnReceivedErrorHelper();
77 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
78 mContentsClient.getOnPageFinishedHelper();
80 String invalidUrl = "http://localhost:7/non_existent";
81 int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
82 int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
83 loadUrlSync(mAwContents, onPageFinishedHelper, invalidUrl);
85 assertEquals(invalidUrl, onReceivedErrorHelper.getFailingUrl());
86 assertEquals(invalidUrl, onPageFinishedHelper.getUrl());
90 @Feature({"AndroidWebView"})
91 public void testOnPageFinishedCalledAfterRedirectedUrlIsOverridden() throws Throwable {
93 * If url1 is redirected url2, and url2 load is overridden, onPageFinished should still be
96 * 1. load url1. url1 onPageStarted
97 * 2. server redirects url1 to url2. url2 onPageStarted
98 * 3. shouldOverridedUrlLoading called for url2 and returns true
99 * 4. url2 onPageFinishedCalled
102 TestWebServer webServer = null;
104 webServer = new TestWebServer(false);
105 final String redirectTargetPath = "/redirect_target.html";
106 final String redirectTargetUrl = webServer.setResponse(redirectTargetPath,
107 "<html><body>hello world</body></html>", null);
108 final String redirectUrl = webServer.setRedirect("/302.html", redirectTargetUrl);
110 final TestAwContentsClient.ShouldOverrideUrlLoadingHelper urlOverrideHelper =
111 mContentsClient.getShouldOverrideUrlLoadingHelper();
112 // Override the load of redirectTargetUrl
113 urlOverrideHelper.setShouldOverrideUrlLoadingReturnValue(true);
115 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
116 mContentsClient.getOnPageFinishedHelper();
118 final int currentOnPageFinishedCallCount = onPageFinishedHelper.getCallCount();
119 loadUrlAsync(mAwContents, redirectUrl);
121 onPageFinishedHelper.waitForCallback(currentOnPageFinishedCallCount);
122 // onPageFinished needs to be called for redirectTargetUrl, but not for redirectUrl
123 assertEquals(redirectTargetUrl, onPageFinishedHelper.getUrl());
125 if (webServer != null) webServer.shutdown();
130 @Feature({"AndroidWebView"})
131 public void testOnPageFinishedNotCalledForValidSubresources() throws Throwable {
132 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
133 mContentsClient.getOnPageFinishedHelper();
135 TestWebServer webServer = null;
137 webServer = new TestWebServer(false);
139 final String testHtml = "<html><head>Header</head><body>Body</body></html>";
140 final String testPath = "/test.html";
141 final String syncPath = "/sync.html";
143 final String testUrl = webServer.setResponse(testPath, testHtml, null);
144 final String syncUrl = webServer.setResponse(syncPath, testHtml, null);
146 assertEquals(0, onPageFinishedHelper.getCallCount());
147 final int pageWithSubresourcesCallCount = onPageFinishedHelper.getCallCount();
148 loadDataAsync(mAwContents,
149 "<html><iframe src=\"" + testUrl + "\" /></html>",
153 onPageFinishedHelper.waitForCallback(pageWithSubresourcesCallCount);
155 // Rather than wait a fixed time to see that an onPageFinished callback isn't issued
156 // we load another valid page. Since callbacks arrive sequentially if the next callback
157 // we get is for the synchronizationUrl we know that the previous load did not schedule
158 // a callback for the iframe.
159 final int synchronizationPageCallCount = onPageFinishedHelper.getCallCount();
160 loadUrlAsync(mAwContents, syncUrl);
162 onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
163 assertEquals(syncUrl, onPageFinishedHelper.getUrl());
164 assertEquals(2, onPageFinishedHelper.getCallCount());
167 if (webServer != null) webServer.shutdown();
172 @Feature({"AndroidWebView"})
173 public void testOnPageFinishedNotCalledForHistoryApi() throws Throwable {
174 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
175 mContentsClient.getOnPageFinishedHelper();
176 enableJavaScriptOnUiThread(mAwContents);
178 TestWebServer webServer = null;
180 webServer = new TestWebServer(false);
182 final String testHtml = "<html><head>Header</head><body>Body</body></html>";
183 final String testPath = "/test.html";
184 final String historyPath = "/history.html";
185 final String syncPath = "/sync.html";
187 final String testUrl = webServer.setResponse(testPath, testHtml, null);
188 final String historyUrl = webServer.getResponseUrl(historyPath);
189 final String syncUrl = webServer.setResponse(syncPath, testHtml, null);
191 assertEquals(0, onPageFinishedHelper.getCallCount());
192 loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
194 executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
195 "history.pushState(null, null, '" + historyUrl + "');");
197 // Rather than wait a fixed time to see that an onPageFinished callback isn't issued
198 // we load another valid page. Since callbacks arrive sequentially if the next callback
199 // we get is for the synchronizationUrl we know that the previous load did not schedule
200 // a callback for the iframe.
201 final int synchronizationPageCallCount = onPageFinishedHelper.getCallCount();
202 loadUrlAsync(mAwContents, syncUrl);
204 onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
205 assertEquals(syncUrl, onPageFinishedHelper.getUrl());
206 assertEquals(2, onPageFinishedHelper.getCallCount());
209 if (webServer != null) webServer.shutdown();
214 @Feature({"AndroidWebView"})
215 public void testOnPageFinishedCalledForHrefNavigations() throws Throwable {
216 doTestOnPageFinishedCalledForHrefNavigations(false);
220 @Feature({"AndroidWebView"})
221 public void testOnPageFinishedCalledForHrefNavigationsWithBaseUrl() throws Throwable {
222 doTestOnPageFinishedCalledForHrefNavigations(true);
225 private void doTestOnPageFinishedCalledForHrefNavigations(boolean useBaseUrl) throws Throwable {
226 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
227 mContentsClient.getOnPageFinishedHelper();
228 TestCallbackHelperContainer.OnPageStartedHelper onPageStartedHelper =
229 mContentsClient.getOnPageStartedHelper();
230 enableJavaScriptOnUiThread(mAwContents);
232 TestWebServer webServer = null;
234 webServer = new TestWebServer(false);
236 final String testHtml = CommonResources.makeHtmlPageFrom("",
237 "<a href=\"#anchor\" id=\"link\">anchor</a>");
238 final String testPath = "/test.html";
239 final String testUrl = webServer.setResponse(testPath, testHtml, null);
242 loadDataWithBaseUrlSync(mAwContents, onPageFinishedHelper,
243 testHtml, "text/html", false, webServer.getBaseUrl(), null);
245 loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
248 int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
249 int onPageStartedCallCount = onPageStartedHelper.getCallCount();
251 JSUtils.clickOnLinkUsingJs(this, mAwContents,
252 mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
254 onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
255 assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
257 onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
258 onPageStartedCallCount = onPageStartedHelper.getCallCount();
260 executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
261 "window.history.go(-1)");
263 onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
264 assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
266 if (webServer != null) webServer.shutdown();