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 class LocalTestClient extends TestAwContentsClient {
55 private boolean mIsOnReceivedErrorCalled = false;
56 private boolean mIsOnPageFinishedCalled = false;
57 private boolean mAllowAboutBlank = false;
60 public void onReceivedError(int errorCode, String description, String failingUrl) {
61 assertEquals("onReceivedError called twice for " + failingUrl,
62 false, mIsOnReceivedErrorCalled);
63 mIsOnReceivedErrorCalled = true;
64 assertEquals("onPageFinished called before onReceivedError for " + failingUrl,
65 false, mIsOnPageFinishedCalled);
66 super.onReceivedError(errorCode, description, failingUrl);
70 public void onPageFinished(String url) {
71 if (mAllowAboutBlank && "about:blank".equals(url)) {
72 super.onPageFinished(url);
75 assertEquals("onPageFinished called twice for " + url,
76 false, mIsOnPageFinishedCalled);
77 mIsOnPageFinishedCalled = true;
78 assertEquals("onReceivedError not called before onPageFinished for " + url,
79 true, mIsOnReceivedErrorCalled);
80 super.onPageFinished(url);
83 void setAllowAboutBlank() {
84 mAllowAboutBlank = true;
87 LocalTestClient testContentsClient = new LocalTestClient();
88 setTestAwContentsClient(testContentsClient);
90 TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
91 mContentsClient.getOnReceivedErrorHelper();
92 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
93 mContentsClient.getOnPageFinishedHelper();
95 String invalidUrl = "http://localhost:7/non_existent";
96 loadUrlSync(mAwContents, onPageFinishedHelper, invalidUrl);
98 assertEquals(invalidUrl, onReceivedErrorHelper.getFailingUrl());
99 assertEquals(invalidUrl, onPageFinishedHelper.getUrl());
101 // Rather than wait a fixed time to see that another onPageFinished callback isn't issued
102 // we load a valid page. Since callbacks arrive sequentially, this will ensure that
103 // any extra calls of onPageFinished / onReceivedError will arrive to our client.
104 testContentsClient.setAllowAboutBlank();
105 loadUrlSync(mAwContents, onPageFinishedHelper, "about:blank");
109 @Feature({"AndroidWebView"})
110 public void testOnPageFinishedCalledAfterRedirectedUrlIsOverridden() throws Throwable {
112 * If url1 is redirected url2, and url2 load is overridden, onPageFinished should still be
115 * 1. load url1. url1 onPageStarted
116 * 2. server redirects url1 to url2. url2 onPageStarted
117 * 3. shouldOverridedUrlLoading called for url2 and returns true
118 * 4. url2 onPageFinishedCalled
121 TestWebServer webServer = null;
123 webServer = new TestWebServer(false);
124 final String redirectTargetPath = "/redirect_target.html";
125 final String redirectTargetUrl = webServer.setResponse(redirectTargetPath,
126 "<html><body>hello world</body></html>", null);
127 final String redirectUrl = webServer.setRedirect("/302.html", redirectTargetUrl);
129 final TestAwContentsClient.ShouldOverrideUrlLoadingHelper urlOverrideHelper =
130 mContentsClient.getShouldOverrideUrlLoadingHelper();
131 // Override the load of redirectTargetUrl
132 urlOverrideHelper.setShouldOverrideUrlLoadingReturnValue(true);
134 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
135 mContentsClient.getOnPageFinishedHelper();
137 final int currentOnPageFinishedCallCount = onPageFinishedHelper.getCallCount();
138 loadUrlAsync(mAwContents, redirectUrl);
140 onPageFinishedHelper.waitForCallback(currentOnPageFinishedCallCount);
141 // onPageFinished needs to be called for redirectTargetUrl, but not for redirectUrl
142 assertEquals(redirectTargetUrl, onPageFinishedHelper.getUrl());
144 if (webServer != null) webServer.shutdown();
149 @Feature({"AndroidWebView"})
150 public void testOnPageFinishedNotCalledForValidSubresources() throws Throwable {
151 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
152 mContentsClient.getOnPageFinishedHelper();
154 TestWebServer webServer = null;
156 webServer = new TestWebServer(false);
158 final String testHtml = "<html><head>Header</head><body>Body</body></html>";
159 final String testPath = "/test.html";
160 final String syncPath = "/sync.html";
162 final String testUrl = webServer.setResponse(testPath, testHtml, null);
163 final String syncUrl = webServer.setResponse(syncPath, testHtml, null);
165 assertEquals(0, onPageFinishedHelper.getCallCount());
166 final int pageWithSubresourcesCallCount = onPageFinishedHelper.getCallCount();
167 loadDataAsync(mAwContents,
168 "<html><iframe src=\"" + testUrl + "\" /></html>",
172 onPageFinishedHelper.waitForCallback(pageWithSubresourcesCallCount);
174 // Rather than wait a fixed time to see that an onPageFinished callback isn't issued
175 // we load another valid page. Since callbacks arrive sequentially if the next callback
176 // we get is for the synchronizationUrl we know that the previous load did not schedule
177 // a callback for the iframe.
178 final int synchronizationPageCallCount = onPageFinishedHelper.getCallCount();
179 loadUrlAsync(mAwContents, syncUrl);
181 onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
182 assertEquals(syncUrl, onPageFinishedHelper.getUrl());
183 assertEquals(2, onPageFinishedHelper.getCallCount());
186 if (webServer != null) webServer.shutdown();
191 @Feature({"AndroidWebView"})
192 public void testOnPageFinishedNotCalledForHistoryApi() throws Throwable {
193 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
194 mContentsClient.getOnPageFinishedHelper();
195 enableJavaScriptOnUiThread(mAwContents);
197 TestWebServer webServer = null;
199 webServer = new TestWebServer(false);
201 final String testHtml = "<html><head>Header</head><body>Body</body></html>";
202 final String testPath = "/test.html";
203 final String historyPath = "/history.html";
204 final String syncPath = "/sync.html";
206 final String testUrl = webServer.setResponse(testPath, testHtml, null);
207 final String historyUrl = webServer.getResponseUrl(historyPath);
208 final String syncUrl = webServer.setResponse(syncPath, testHtml, null);
210 assertEquals(0, onPageFinishedHelper.getCallCount());
211 loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
213 executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
214 "history.pushState(null, null, '" + historyUrl + "');");
216 // Rather than wait a fixed time to see that an onPageFinished callback isn't issued
217 // we load another valid page. Since callbacks arrive sequentially if the next callback
218 // we get is for the synchronizationUrl we know that the previous load did not schedule
219 // a callback for the iframe.
220 final int synchronizationPageCallCount = onPageFinishedHelper.getCallCount();
221 loadUrlAsync(mAwContents, syncUrl);
223 onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
224 assertEquals(syncUrl, onPageFinishedHelper.getUrl());
225 assertEquals(2, onPageFinishedHelper.getCallCount());
228 if (webServer != null) webServer.shutdown();
233 @Feature({"AndroidWebView"})
234 public void testOnPageFinishedCalledForHrefNavigations() throws Throwable {
235 doTestOnPageFinishedCalledForHrefNavigations(false);
239 @Feature({"AndroidWebView"})
240 public void testOnPageFinishedCalledForHrefNavigationsWithBaseUrl() throws Throwable {
241 doTestOnPageFinishedCalledForHrefNavigations(true);
244 private void doTestOnPageFinishedCalledForHrefNavigations(boolean useBaseUrl) throws Throwable {
245 TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
246 mContentsClient.getOnPageFinishedHelper();
247 TestCallbackHelperContainer.OnPageStartedHelper onPageStartedHelper =
248 mContentsClient.getOnPageStartedHelper();
249 enableJavaScriptOnUiThread(mAwContents);
251 TestWebServer webServer = null;
253 webServer = new TestWebServer(false);
255 final String testHtml = CommonResources.makeHtmlPageFrom("",
256 "<a href=\"#anchor\" id=\"link\">anchor</a>");
257 final String testPath = "/test.html";
258 final String testUrl = webServer.setResponse(testPath, testHtml, null);
261 loadDataWithBaseUrlSync(mAwContents, onPageFinishedHelper,
262 testHtml, "text/html", false, webServer.getBaseUrl(), null);
264 loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
267 int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
268 int onPageStartedCallCount = onPageStartedHelper.getCallCount();
270 JSUtils.clickOnLinkUsingJs(this, mAwContents,
271 mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
273 onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
274 assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
276 onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
277 onPageStartedCallCount = onPageStartedHelper.getCallCount();
279 executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
280 "window.history.go(-1)");
282 onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
283 assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
285 if (webServer != null) webServer.shutdown();