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.os.Bundle;
8 import android.test.suitebuilder.annotation.SmallTest;
10 import org.chromium.android_webview.AwContents;
11 import org.chromium.android_webview.test.util.CommonResources;
12 import org.chromium.base.test.util.Feature;
13 import org.chromium.content_public.browser.NavigationController;
14 import org.chromium.content_public.browser.NavigationHistory;
15 import org.chromium.net.test.util.TestWebServer;
17 import java.util.concurrent.Callable;
20 * Tests for the {@link android.webkit.WebView#saveState} and
21 * {@link android.webkit.WebView#restoreState} APIs.
23 public class SaveRestoreStateTest extends AwTestBase {
24 private static class TestVars {
25 public final TestAwContentsClient contentsClient;
26 public final AwTestContainerView testView;
27 public final AwContents awContents;
28 public final NavigationController navigationController;
30 public TestVars(TestAwContentsClient contentsClient,
31 AwTestContainerView testView) {
32 this.contentsClient = contentsClient;
33 this.testView = testView;
34 this.awContents = testView.getAwContents();
35 this.navigationController = this.awContents.getNavigationController();
39 private TestVars createNewView() throws Exception {
40 TestAwContentsClient contentsClient = new TestAwContentsClient();
41 AwTestContainerView testView = createAwTestContainerViewOnMainSync(contentsClient);
42 return new TestVars(contentsClient, testView);
45 private TestVars mVars;
46 private TestWebServer mWebServer;
48 private static final int NUM_NAVIGATIONS = 3;
49 private static final String TITLES[] = {
54 private static final String PATHS[] = {
60 private String mUrls[];
63 public void setUp() throws Exception {
65 mVars = createNewView();
66 mUrls = new String[NUM_NAVIGATIONS];
67 mWebServer = TestWebServer.start();
71 public void tearDown() throws Exception {
72 if (mWebServer != null) {
73 mWebServer.shutdown();
78 private void setServerResponseAndLoad(TestVars vars, int upto) throws Throwable {
79 for (int i = 0; i < upto; ++i) {
80 String html = CommonResources.makeHtmlPageFrom(
81 "<title>" + TITLES[i] + "</title>",
83 mUrls[i] = mWebServer.setResponse(PATHS[i], html, null);
85 loadUrlSync(vars.awContents,
86 vars.contentsClient.getOnPageFinishedHelper(),
91 private NavigationHistory getNavigationHistoryOnUiThread(
92 final TestVars vars) throws Throwable {
93 return runTestOnUiThreadAndGetResult(new Callable<NavigationHistory>() {
95 public NavigationHistory call() throws Exception {
96 return vars.navigationController.getNavigationHistory();
101 private void checkHistoryItemList(TestVars vars) throws Throwable {
102 NavigationHistory history = getNavigationHistoryOnUiThread(vars);
103 assertEquals(NUM_NAVIGATIONS, history.getEntryCount());
104 assertEquals(NUM_NAVIGATIONS - 1, history.getCurrentEntryIndex());
106 // Note this is not meant to be a thorough test of NavigationHistory,
107 // but is only meant to test enough to make sure state is restored.
108 // See NavigationHistoryTest for more thorough tests.
109 for (int i = 0; i < NUM_NAVIGATIONS; ++i) {
110 assertEquals(mUrls[i], history.getEntryAtIndex(i).getOriginalUrl());
111 assertEquals(mUrls[i], history.getEntryAtIndex(i).getUrl());
112 assertEquals(TITLES[i], history.getEntryAtIndex(i).getTitle());
116 private TestVars saveAndRestoreStateOnUiThread(final TestVars vars) throws Throwable {
117 final TestVars restoredVars = createNewView();
118 getInstrumentation().runOnMainSync(new Runnable() {
121 Bundle bundle = new Bundle();
122 boolean result = vars.awContents.saveState(bundle);
124 result = restoredVars.awContents.restoreState(bundle);
132 @Feature({"AndroidWebView"})
133 public void testSaveRestoreStateWithTitle() throws Throwable {
134 setServerResponseAndLoad(mVars, 1);
135 final TestVars restoredVars = saveAndRestoreStateOnUiThread(mVars);
136 pollOnUiThread(new Callable<Boolean>() {
138 public Boolean call() throws Exception {
139 return TITLES[0].equals(restoredVars.awContents.getTitle()) &&
140 TITLES[0].equals(restoredVars.contentsClient.getUpdatedTitle());
146 @Feature({"AndroidWebView"})
147 public void testSaveRestoreStateWithHistoryItemList() throws Throwable {
148 setServerResponseAndLoad(mVars, NUM_NAVIGATIONS);
149 TestVars restoredVars = saveAndRestoreStateOnUiThread(mVars);
150 checkHistoryItemList(restoredVars);
154 @Feature({"AndroidWebView"})
155 public void testRestoreFromInvalidStateFails() throws Throwable {
156 final Bundle invalidState = new Bundle();
157 invalidState.putByteArray(AwContents.SAVE_RESTORE_STATE_KEY,
158 "invalid state".getBytes());
159 boolean result = runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
161 public Boolean call() throws Exception {
162 return mVars.awContents.restoreState(invalidState);
169 @Feature({"AndroidWebView"})
170 public void testSaveStateForNoNavigationFails() throws Throwable {
171 final Bundle state = new Bundle();
172 boolean result = runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
174 public Boolean call() throws Exception {
175 return mVars.awContents.restoreState(state);