1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Copyright (c) 2013 Intel Corporation. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 package org.xwalk.core.xwview.test;
8 import android.graphics.Bitmap;
9 import android.test.suitebuilder.annotation.SmallTest;
10 import android.util.Pair;
11 import android.webkit.ValueCallback;
12 import android.webkit.WebResourceResponse;
14 import java.util.concurrent.atomic.AtomicReference;
15 import java.util.concurrent.Callable;
17 import org.chromium.base.test.util.DisabledTest;
18 import org.chromium.base.test.util.Feature;
19 import org.chromium.content.browser.test.util.CallbackHelper;
20 import org.chromium.content.browser.test.util.Criteria;
21 import org.chromium.content.browser.test.util.CriteriaHelper;
22 import org.chromium.net.test.util.TestWebServer;
23 import org.xwalk.core.XWalkView;
24 import org.xwalk.core.internal.XWalkClient;
25 import org.xwalk.core.internal.XWalkSettings;
26 import org.xwalk.core.internal.XWalkWebChromeClient;
27 import org.xwalk.core.xwview.test.util.CommonResources;
30 * Test suite for setAppCacheEnabled().
32 public class SetAppCacheEnabledTest extends XWalkViewTestBase {
33 private static final long TEST_TIMEOUT = 20000L;
34 private static final int CHECK_INTERVAL = 100;
35 private TestHelperBridge mContentClient;
36 private XWalkSettings mSettings;
38 static class ManifestTestHelper {
39 private final TestWebServer mWebServer;
40 private final String mHtmlPath;
41 private final String mHtmlUrl;
42 private final String mManifestPath;
44 ManifestTestHelper(TestWebServer webServer, String htmlPageName, String manifestName) {
45 mWebServer = webServer;
46 mHtmlPath = "/" + htmlPageName;
47 mHtmlUrl = webServer.setResponse(
48 mHtmlPath, "<html manifest=\"" + manifestName + "\"></html>", null);
49 mManifestPath = "/" + manifestName;
50 webServer.setResponse(
53 CommonResources.getContentTypeAndCacheHeaders("text/cache-manifest", false));
56 String getHtmlPath() {
64 String getManifestPath() {
68 int waitUntilHtmlIsRequested(final int initialRequestCount) throws InterruptedException {
69 return waitUntilResourceIsRequested(mHtmlPath, initialRequestCount);
72 int waitUntilManifestIsRequested(final int initialRequestCount)
73 throws InterruptedException {
74 return waitUntilResourceIsRequested(mManifestPath, initialRequestCount);
77 private int waitUntilResourceIsRequested(
78 final String path, final int initialRequestCount) throws InterruptedException {
79 boolean result = CriteriaHelper.pollForCriteria(new Criteria() {
81 public boolean isSatisfied() {
82 return mWebServer.getRequestCount(path) > initialRequestCount;
84 }, TEST_TIMEOUT, CHECK_INTERVAL);
86 return mWebServer.getRequestCount(path);
90 private XWalkSettings getXWalkSettings(final XWalkView view) {
91 getInstrumentation().runOnMainSync(new Runnable() {
94 mSettings = view.getSettings();
101 @Feature({"XWalkView", "Preferences", "AppCache"})
102 public void testAppCache() throws Throwable {
103 final TestHelperBridge helperBridge =
104 new TestHelperBridge();
105 mContentClient = helperBridge;
106 final XWalkViewTestBase.TestXWalkClientBase client =
107 new XWalkViewTestBase.TestXWalkClientBase(helperBridge);
108 final XWalkViewTestBase.TestXWalkResourceClientBase resourceClient =
109 new XWalkViewTestBase.TestXWalkResourceClientBase(helperBridge);
110 final XWalkViewTestBase.TestXWalkWebChromeClientBase chromeClient =
111 new XWalkViewTestBase.TestXWalkWebChromeClientBase(helperBridge);
112 final XWalkView xWalkView =
113 createXWalkViewContainerOnMainSync(getActivity(), client,
114 resourceClient, chromeClient);
116 final XWalkSettings settings = getXWalkSettings(xWalkView);
117 settings.setJavaScriptEnabled(true);
118 settings.setAppCacheEnabled(false);
120 TestWebServer webServer = null;
122 webServer = new TestWebServer(false);
123 ManifestTestHelper helper = new ManifestTestHelper(
124 webServer, "testAppCache.html", "appcache.manifest");
125 loadUrlSyncByContent(
128 helper.getHtmlUrl());
129 helper.waitUntilHtmlIsRequested(0);
130 // Unfortunately, there is no other good way of verifying that AppCache is
131 // disabled, other than checking that it didn't try to fetch the manifest.
133 assertEquals(0, webServer.getRequestCount(helper.getManifestPath()));
134 // Enables AppCache. Use the default path if app cache path isn't set.
135 settings.setAppCacheEnabled(true);
136 loadUrlSyncByContent(
139 helper.getHtmlUrl());
140 helper.waitUntilManifestIsRequested(0);
142 if (webServer != null) webServer.shutdown();
148 * @Feature({"XWalkView", "Preferences", "AppCache"})
149 * This test is flaky but the root cause is not found yet. See crbug.com/171765.
152 public void testAppCacheWithTwoViews() throws Throwable {
153 // We don't use the test helper here, because making sure that AppCache
154 // is disabled takes a lot of time, so running through the usual drill
155 // will take about 20 seconds.
156 ViewPair views = createViews();
158 XWalkSettings settings0 = getXWalkSettingsOnUiThreadByContent(
159 views.getContent0());
160 settings0.setJavaScriptEnabled(true);
161 settings0.setAppCachePath("whatever");
162 settings0.setAppCacheEnabled(true);
163 XWalkSettings settings1 = getXWalkSettingsOnUiThreadByContent(
164 views.getContent1());
165 settings1.setJavaScriptEnabled(true);
166 // AppCachePath setting is global, no need to set it for the second view.
167 settings1.setAppCacheEnabled(true);
169 TestWebServer webServer = null;
171 webServer = new TestWebServer(false);
172 ManifestTestHelper helper0 = new ManifestTestHelper(
173 webServer, "testAppCache_0.html", "appcache.manifest_0");
174 mContentClient = views.getClient0();
175 loadUrlSyncByContent(
178 helper0.getHtmlUrl());
179 int manifestRequests0 = helper0.waitUntilManifestIsRequested(0);
180 ManifestTestHelper helper1 = new ManifestTestHelper(
181 webServer, "testAppCache_1.html", "appcache.manifest_1");
182 mContentClient = views.getClient1();
183 loadUrlSyncByContent(
186 helper1.getHtmlUrl());
187 helper1.waitUntilManifestIsRequested(0);
188 settings1.setAppCacheEnabled(false);
189 mContentClient = views.getClient0();
190 loadUrlSyncByContent(
193 helper0.getHtmlUrl());
194 helper0.waitUntilManifestIsRequested(manifestRequests0);
195 final int prevManifestRequestCount =
196 webServer.getRequestCount(helper1.getManifestPath());
197 int htmlRequests1 = webServer.getRequestCount(helper1.getHtmlPath());
198 mContentClient = views.getClient1();
199 loadUrlSyncByContent(
202 helper1.getHtmlUrl());
203 helper1.waitUntilHtmlIsRequested(htmlRequests1);
204 // Unfortunately, there is no other good way of verifying that AppCache is
205 // disabled, other than checking that it didn't try to fetch the manifest.
208 prevManifestRequestCount, webServer.getRequestCount(helper1.getManifestPath()));
210 if (webServer != null) webServer.shutdown();