Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / android_webview / javatests / src / org / chromium / android_webview / test / ClientOnPageFinishedTest.java
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.
4
5 package org.chromium.android_webview.test;
6
7 import android.test.suitebuilder.annotation.MediumTest;
8
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;
15
16 /**
17  * Tests for the ContentViewClient.onPageFinished() method.
18  */
19 public class ClientOnPageFinishedTest extends AwTestBase {
20
21     private TestAwContentsClient mContentsClient;
22     private AwContents mAwContents;
23
24     @Override
25     public void setUp() throws Exception {
26         super.setUp();
27         setTestAwContentsClient(new TestAwContentsClient());
28     }
29
30     private void setTestAwContentsClient(TestAwContentsClient contentsClient) throws Exception {
31         mContentsClient = contentsClient;
32         final AwTestContainerView testContainerView =
33                 createAwTestContainerViewOnMainSync(mContentsClient);
34         mAwContents = testContainerView.getAwContents();
35     }
36
37     @MediumTest
38     @Feature({"AndroidWebView"})
39     public void testOnPageFinishedPassesCorrectUrl() throws Throwable {
40         TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
41                 mContentsClient.getOnPageFinishedHelper();
42
43         String html = "<html><body>Simple page.</body></html>";
44         int currentCallCount = onPageFinishedHelper.getCallCount();
45         loadDataAsync(mAwContents, html, "text/html", false);
46
47         onPageFinishedHelper.waitForCallback(currentCallCount);
48         assertEquals("data:text/html," + html, onPageFinishedHelper.getUrl());
49     }
50
51     @MediumTest
52     @Feature({"AndroidWebView"})
53     public void testOnPageFinishedCalledAfterError() throws Throwable {
54         setTestAwContentsClient(new TestAwContentsClient() {
55             private boolean isOnReceivedErrorCalled = false;
56             private boolean isOnPageFinishedCalled = false;
57
58             @Override
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);
64             }
65
66             @Override
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);
72             }
73         });
74
75         TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
76                 mContentsClient.getOnReceivedErrorHelper();
77         TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
78                 mContentsClient.getOnPageFinishedHelper();
79
80         String invalidUrl = "http://localhost:7/non_existent";
81         int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
82         int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
83         loadUrlSync(mAwContents, onPageFinishedHelper, invalidUrl);
84
85         assertEquals(invalidUrl, onReceivedErrorHelper.getFailingUrl());
86         assertEquals(invalidUrl, onPageFinishedHelper.getUrl());
87     }
88
89     @MediumTest
90     @Feature({"AndroidWebView"})
91     public void testOnPageFinishedCalledAfterRedirectedUrlIsOverridden() throws Throwable {
92         /*
93          * If url1 is redirected url2, and url2 load is overridden, onPageFinished should still be
94          * called for url2.
95          * Steps:
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
100          */
101
102         TestWebServer webServer = null;
103         try {
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);
109
110             final TestAwContentsClient.ShouldOverrideUrlLoadingHelper urlOverrideHelper =
111                     mContentsClient.getShouldOverrideUrlLoadingHelper();
112             // Override the load of redirectTargetUrl
113             urlOverrideHelper.setShouldOverrideUrlLoadingReturnValue(true);
114
115             TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
116                 mContentsClient.getOnPageFinishedHelper();
117
118             final int currentOnPageFinishedCallCount = onPageFinishedHelper.getCallCount();
119             loadUrlAsync(mAwContents, redirectUrl);
120
121             onPageFinishedHelper.waitForCallback(currentOnPageFinishedCallCount);
122             // onPageFinished needs to be called for redirectTargetUrl, but not for redirectUrl
123             assertEquals(redirectTargetUrl, onPageFinishedHelper.getUrl());
124         } finally {
125             if (webServer != null) webServer.shutdown();
126         }
127     }
128
129     @MediumTest
130     @Feature({"AndroidWebView"})
131     public void testOnPageFinishedNotCalledForValidSubresources() throws Throwable {
132         TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
133                 mContentsClient.getOnPageFinishedHelper();
134
135         TestWebServer webServer = null;
136         try {
137             webServer = new TestWebServer(false);
138
139             final String testHtml = "<html><head>Header</head><body>Body</body></html>";
140             final String testPath = "/test.html";
141             final String syncPath = "/sync.html";
142
143             final String testUrl = webServer.setResponse(testPath, testHtml, null);
144             final String syncUrl = webServer.setResponse(syncPath, testHtml, null);
145
146             assertEquals(0, onPageFinishedHelper.getCallCount());
147             final int pageWithSubresourcesCallCount = onPageFinishedHelper.getCallCount();
148             loadDataAsync(mAwContents,
149                           "<html><iframe src=\"" + testUrl + "\" /></html>",
150                           "text/html",
151                           false);
152
153             onPageFinishedHelper.waitForCallback(pageWithSubresourcesCallCount);
154
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);
161
162             onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
163             assertEquals(syncUrl, onPageFinishedHelper.getUrl());
164             assertEquals(2, onPageFinishedHelper.getCallCount());
165
166         } finally {
167             if (webServer != null) webServer.shutdown();
168         }
169     }
170
171     @MediumTest
172     @Feature({"AndroidWebView"})
173     public void testOnPageFinishedNotCalledForHistoryApi() throws Throwable {
174         TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
175                 mContentsClient.getOnPageFinishedHelper();
176         enableJavaScriptOnUiThread(mAwContents);
177
178         TestWebServer webServer = null;
179         try {
180             webServer = new TestWebServer(false);
181
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";
186
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);
190
191             assertEquals(0, onPageFinishedHelper.getCallCount());
192             loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
193
194             executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
195                     "history.pushState(null, null, '" + historyUrl + "');");
196
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);
203
204             onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
205             assertEquals(syncUrl, onPageFinishedHelper.getUrl());
206             assertEquals(2, onPageFinishedHelper.getCallCount());
207
208         } finally {
209             if (webServer != null) webServer.shutdown();
210         }
211     }
212
213     @MediumTest
214     @Feature({"AndroidWebView"})
215     public void testOnPageFinishedCalledForHrefNavigations() throws Throwable {
216         doTestOnPageFinishedCalledForHrefNavigations(false);
217     }
218
219     @MediumTest
220     @Feature({"AndroidWebView"})
221     public void testOnPageFinishedCalledForHrefNavigationsWithBaseUrl() throws Throwable {
222         doTestOnPageFinishedCalledForHrefNavigations(true);
223     }
224
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);
231
232         TestWebServer webServer = null;
233         try {
234             webServer = new TestWebServer(false);
235
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);
240
241             if (useBaseUrl) {
242                 loadDataWithBaseUrlSync(mAwContents, onPageFinishedHelper,
243                         testHtml, "text/html", false, webServer.getBaseUrl(), null);
244             } else {
245                 loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
246             }
247
248             int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
249             int onPageStartedCallCount = onPageStartedHelper.getCallCount();
250
251             JSUtils.clickOnLinkUsingJs(this, mAwContents,
252                     mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
253
254             onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
255             assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
256
257             onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
258             onPageStartedCallCount = onPageStartedHelper.getCallCount();
259
260             executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
261                     "window.history.go(-1)");
262
263             onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
264             assertEquals(onPageStartedCallCount, onPageStartedHelper.getCallCount());
265         } finally {
266             if (webServer != null) webServer.shutdown();
267         }
268     }
269 }