1 // Copyright 2014 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.content.browser;
7 import android.test.suitebuilder.annotation.SmallTest;
8 import android.text.TextUtils;
9 import android.util.Pair;
11 import org.chromium.base.test.util.UrlUtils;
12 import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
13 import org.chromium.content_public.browser.LoadUrlParams;
14 import org.chromium.content_public.browser.NavigationTransitionDelegate;
15 import org.chromium.content_shell_apk.ContentShellActivity;
16 import org.chromium.content_shell_apk.ContentShellTestBase;
17 import org.chromium.net.test.util.TestWebServer;
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.concurrent.TimeUnit;
24 * Test suite for navigation transition listeners.
26 public class TransitionTest extends ContentShellTestBase {
28 private static final String URL_1 = UrlUtils.encodeHtmlDataUri("<html>1</html>");
29 private static final String URL_2 = "/2.html";
30 private static final String URL_2_DATA = "<html>2</html>";
31 private static final String URL_3 = "/3.html";
32 private static final String URL_3_DATA = "<html>3</html>";
34 static class TestNavigationTransitionDelegate implements NavigationTransitionDelegate {
35 private boolean mDidCallDefer = false;
36 private boolean mDidCallWillHandleDefer = false;
37 private boolean mDidCallAddStylesheet = false;
38 private boolean mHandleDefer = false;
39 private ArrayList<String> mTransitionStylesheets;
40 private ContentViewCore mContentViewCore;
41 private String mTransitionEnteringColor;
43 TestNavigationTransitionDelegate(ContentViewCore contentViewCore, boolean handleDefer) {
44 mContentViewCore = contentViewCore;
45 mHandleDefer = handleDefer;
46 mTransitionStylesheets = new ArrayList<String>();
50 public void didDeferAfterResponseStarted(String markup, String cssSelector,
51 String enteringColor) {
53 mContentViewCore.resumeResponseDeferredAtStart();
54 mTransitionEnteringColor = enteringColor;
58 public boolean willHandleDeferAfterResponseStarted() {
63 public void addEnteringStylesheetToTransition(String stylesheet) {
64 mDidCallAddStylesheet = true;
65 mTransitionStylesheets.add(stylesheet);
69 public void didStartNavigationTransitionForFrame(long frameId) {
72 public boolean getDidCallDefer() {
76 public boolean getDidCallWillHandlerDefer() {
77 return mDidCallWillHandleDefer;
80 public boolean getDidCallAddStylesheet() {
81 return mDidCallAddStylesheet;
84 public ArrayList<String> getTransitionStylesheets() {
85 return mTransitionStylesheets;
88 public String getTransitionEnteringColor() {
89 return mTransitionEnteringColor;
93 private static List<Pair<String, String>> createHeadersList(
94 String[] namesAndValues) {
95 List<Pair<String, String>> result =
96 new ArrayList<Pair<String, String>>();
97 for (int i = 0; i < namesAndValues.length; i += 2)
98 result.add(Pair.create(namesAndValues[i], namesAndValues[i + 1]));
103 * Tests that the listener recieves DidDeferAfterResponseStarted if we specify that
104 * the transition is handled.
107 public void testDidDeferAfterResponseStartedCalled() throws Throwable {
108 ContentShellActivity activity = launchContentShellWithUrl(URL_1);
109 waitForActiveShellToBeDoneLoading();
110 ContentViewCore contentViewCore = activity.getActiveContentViewCore();
111 TestCallbackHelperContainer testCallbackHelperContainer =
112 new TestCallbackHelperContainer(contentViewCore);
114 contentViewCore.getWebContents().setHasPendingNavigationTransitionForTesting();
115 TestNavigationTransitionDelegate delegate = new TestNavigationTransitionDelegate(
118 contentViewCore.getWebContents().setNavigationTransitionDelegate(delegate);
120 loadUrl(contentViewCore, testCallbackHelperContainer, new LoadUrlParams(URL_1));
122 assertTrue("didDeferAfterResponseStarted called.", delegate.getDidCallDefer());
126 * Tests that the listener does not receive DidDeferAfterResponseStarted if we specify that
127 * the transition is handled.
130 public void testDidDeferAfterResponseStartedNotCalled() throws Throwable {
131 ContentShellActivity activity = launchContentShellWithUrl(URL_1);
132 waitForActiveShellToBeDoneLoading();
133 ContentViewCore contentViewCore = activity.getActiveContentViewCore();
134 TestCallbackHelperContainer testCallbackHelperContainer =
135 new TestCallbackHelperContainer(contentViewCore);
137 contentViewCore.getWebContents().setHasPendingNavigationTransitionForTesting();
138 TestNavigationTransitionDelegate delegate = new TestNavigationTransitionDelegate(
141 contentViewCore.getWebContents().setNavigationTransitionDelegate(delegate);
143 loadUrl(contentViewCore, testCallbackHelperContainer, new LoadUrlParams(URL_1));
145 assertFalse("didDeferAfterResponseStarted called.", delegate.getDidCallDefer());
149 * Tests that the resource handler doesn't query the listener if no transition is pending.
152 public void testWillHandleDeferAfterResponseStartedNotCalled() throws Throwable {
153 ContentShellActivity activity = launchContentShellWithUrl(URL_1);
154 waitForActiveShellToBeDoneLoading();
155 ContentViewCore contentViewCore = activity.getActiveContentViewCore();
156 TestCallbackHelperContainer testCallbackHelperContainer =
157 new TestCallbackHelperContainer(contentViewCore);
159 TestNavigationTransitionDelegate delegate = new TestNavigationTransitionDelegate(
162 contentViewCore.getWebContents().setNavigationTransitionDelegate(delegate);
164 loadUrl(contentViewCore, testCallbackHelperContainer, new LoadUrlParams(URL_1));
166 assertFalse("didDeferAfterResponseStarted called.", delegate.getDidCallDefer());
167 assertFalse("willHandleDeferAfterResponseStarted called.",
168 delegate.getDidCallWillHandlerDefer());
172 * Tests that the listener receives addStylesheetToTransition if we specify
173 * that there are entering transition stylesheet.
176 public void testAddStylesheetToTransitionCalled() throws Throwable {
177 TestWebServer webServer = null;
179 webServer = new TestWebServer(false);
181 final String url2 = webServer.setResponse(URL_2, URL_2_DATA, null);
182 ContentShellActivity activity = launchContentShellWithUrl(url2);
183 waitForActiveShellToBeDoneLoading();
184 ContentViewCore contentViewCore = activity.getActiveContentViewCore();
185 TestCallbackHelperContainer testCallbackHelperContainer =
186 new TestCallbackHelperContainer(contentViewCore);
187 contentViewCore.getWebContents().setHasPendingNavigationTransitionForTesting();
188 TestNavigationTransitionDelegate delegate =
189 new TestNavigationTransitionDelegate(contentViewCore, true);
190 contentViewCore.getWebContents().setNavigationTransitionDelegate(delegate);
192 int currentCallCount = testCallbackHelperContainer
193 .getOnPageFinishedHelper().getCallCount();
196 "<transition0.css>;rel=transition-entering-stylesheet;scope=*",
198 "<transition1.css>;rel=transition-entering-stylesheet;scope=*",
200 "<transition2.css>;rel=transition-entering-stylesheet;scope=*"
202 final String url3 = webServer.setResponse(URL_3,
204 createHeadersList(headers));
205 LoadUrlParams url3_params = new LoadUrlParams(url3);
206 loadUrl(contentViewCore, testCallbackHelperContainer, url3_params);
207 testCallbackHelperContainer.getOnPageFinishedHelper().waitForCallback(
211 TimeUnit.MILLISECONDS);
213 assertTrue("addStylesheetToTransition called.",
214 delegate.getDidCallAddStylesheet());
215 assertTrue("Three stylesheets are added",
216 delegate.getTransitionStylesheets().size() == 3);
218 if (webServer != null)
219 webServer.shutdown();
224 * Tests that the listener receives addStylesheetToTransition if we specify
225 * that there are no entering transition stylesheet.
228 public void testAddStylesheetToTransitionNotCalled() throws Throwable {
229 TestWebServer webServer = null;
231 webServer = new TestWebServer(false);
233 final String url2 = webServer.setResponse(URL_2, URL_2_DATA, null);
234 ContentShellActivity activity = launchContentShellWithUrl(url2);
235 waitForActiveShellToBeDoneLoading();
236 ContentViewCore contentViewCore = activity.getActiveContentViewCore();
237 TestCallbackHelperContainer testCallbackHelperContainer =
238 new TestCallbackHelperContainer(contentViewCore);
239 contentViewCore.getWebContents().setHasPendingNavigationTransitionForTesting();
240 TestNavigationTransitionDelegate delegate =
241 new TestNavigationTransitionDelegate(contentViewCore, true);
242 contentViewCore.getWebContents().setNavigationTransitionDelegate(delegate);
244 int currentCallCount = testCallbackHelperContainer
245 .getOnPageFinishedHelper().getCallCount();
246 final String url3 = webServer.setResponse(URL_3, URL_3_DATA, null);
247 LoadUrlParams url3_params = new LoadUrlParams(url3);
248 loadUrl(contentViewCore, testCallbackHelperContainer, url3_params);
249 testCallbackHelperContainer.getOnPageFinishedHelper().waitForCallback(
253 TimeUnit.MILLISECONDS);
255 assertFalse("addStylesheetToTransition is not called.",
256 delegate.getDidCallAddStylesheet());
257 assertTrue("No stylesheets are added",
258 delegate.getTransitionStylesheets().size() == 0);
260 if (webServer != null)
261 webServer.shutdown();
266 * Tests that the listener receives the entering color if it's specified in the
270 public void testParseTransitionEnteringColor() throws Throwable {
271 TestWebServer webServer = null;
273 webServer = new TestWebServer(false);
275 final String url2 = webServer.setResponse(URL_2, URL_2_DATA, null);
276 ContentShellActivity activity = launchContentShellWithUrl(url2);
277 waitForActiveShellToBeDoneLoading();
278 ContentViewCore contentViewCore = activity.getActiveContentViewCore();
279 TestCallbackHelperContainer testCallbackHelperContainer =
280 new TestCallbackHelperContainer(contentViewCore);
281 contentViewCore.getWebContents().setHasPendingNavigationTransitionForTesting();
282 TestNavigationTransitionDelegate delegate =
283 new TestNavigationTransitionDelegate(contentViewCore, true);
284 contentViewCore.getWebContents().setNavigationTransitionDelegate(delegate);
286 String transitionEnteringColor = "#00FF00";
288 int currentCallCount = testCallbackHelperContainer
289 .getOnPageFinishedHelper().getCallCount();
291 "X-Transition-Entering-Color",
292 transitionEnteringColor,
294 final String url3 = webServer.setResponse(URL_3,
296 createHeadersList(headers));
297 LoadUrlParams url3Params = new LoadUrlParams(url3);
298 loadUrl(contentViewCore, testCallbackHelperContainer, url3Params);
299 testCallbackHelperContainer.getOnPageFinishedHelper().waitForCallback(
303 TimeUnit.MILLISECONDS);
305 assertTrue("X-Transition-Entering-Color parsed correctly.",
307 delegate.getTransitionEnteringColor(),
308 transitionEnteringColor));
310 if (webServer != null) webServer.shutdown();