1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Copyright (c) 2013-2014 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.internal.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.internal.XWalkViewInternal;
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.internal.xwview.test.util.CommonResources;
30 * Test suite for setAppCacheEnabled().
32 public class SetAppCacheEnabledTest extends XWalkViewInternalTestBase {
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 XWalkViewInternal view) {
91 getInstrumentation().runOnMainSync(new Runnable() {
94 mSettings = view.getSettings();
101 @Feature({"XWalkViewInternal", "Preferences", "AppCache"})
102 public void testAppCache() throws Throwable {
103 final TestHelperBridge helperBridge =
104 new TestHelperBridge();
105 mContentClient = helperBridge;
106 final XWalkViewInternalTestBase.TestXWalkUIClientInternalBase uiClient =
107 new XWalkViewInternalTestBase.TestXWalkUIClientInternalBase(helperBridge);
108 final XWalkViewInternalTestBase.TestXWalkResourceClientBase resourceClient =
109 new XWalkViewInternalTestBase.TestXWalkResourceClientBase(helperBridge);
110 final XWalkViewInternal xWalkViewInternal =
111 createXWalkViewContainerOnMainSync(getActivity(), uiClient,
114 final XWalkSettings settings = getXWalkSettings(xWalkViewInternal);
115 settings.setJavaScriptEnabled(true);
116 settings.setAppCacheEnabled(false);
118 TestWebServer webServer = TestWebServer.start();
120 ManifestTestHelper helper = new ManifestTestHelper(
121 webServer, "testAppCache.html", "appcache.manifest");
122 loadUrlSyncByContent(
125 helper.getHtmlUrl());
126 helper.waitUntilHtmlIsRequested(0);
127 // Unfortunately, there is no other good way of verifying that AppCache is
128 // disabled, other than checking that it didn't try to fetch the manifest.
130 assertEquals(0, webServer.getRequestCount(helper.getManifestPath()));
131 // Enables AppCache. Use the default path if app cache path isn't set.
132 settings.setAppCacheEnabled(true);
133 loadUrlSyncByContent(
136 helper.getHtmlUrl());
137 helper.waitUntilManifestIsRequested(0);
139 webServer.shutdown();
145 * @Feature({"XWalkViewInternal", "Preferences", "AppCache"})
146 * This test is flaky but the root cause is not found yet. See crbug.com/171765.
149 public void testAppCacheWithTwoViews() throws Throwable {
150 // We don't use the test helper here, because making sure that AppCache
151 // is disabled takes a lot of time, so running through the usual drill
152 // will take about 20 seconds.
153 ViewPair views = createViews();
155 XWalkSettings settings0 = getXWalkSettingsOnUiThreadByContent(
157 settings0.setJavaScriptEnabled(true);
158 settings0.setAppCachePath("whatever");
159 settings0.setAppCacheEnabled(true);
160 XWalkSettings settings1 = getXWalkSettingsOnUiThreadByContent(
162 settings1.setJavaScriptEnabled(true);
163 // AppCachePath setting is global, no need to set it for the second view.
164 settings1.setAppCacheEnabled(true);
166 TestWebServer webServer = TestWebServer.start();
168 ManifestTestHelper helper0 = new ManifestTestHelper(
169 webServer, "testAppCache_0.html", "appcache.manifest_0");
170 mContentClient = views.getClient0();
171 loadUrlSyncByContent(
174 helper0.getHtmlUrl());
175 int manifestRequests0 = helper0.waitUntilManifestIsRequested(0);
176 ManifestTestHelper helper1 = new ManifestTestHelper(
177 webServer, "testAppCache_1.html", "appcache.manifest_1");
178 mContentClient = views.getClient1();
179 loadUrlSyncByContent(
182 helper1.getHtmlUrl());
183 helper1.waitUntilManifestIsRequested(0);
184 settings1.setAppCacheEnabled(false);
185 mContentClient = views.getClient0();
186 loadUrlSyncByContent(
189 helper0.getHtmlUrl());
190 helper0.waitUntilManifestIsRequested(manifestRequests0);
191 final int prevManifestRequestCount =
192 webServer.getRequestCount(helper1.getManifestPath());
193 int htmlRequests1 = webServer.getRequestCount(helper1.getHtmlPath());
194 mContentClient = views.getClient1();
195 loadUrlSyncByContent(
198 helper1.getHtmlUrl());
199 helper1.waitUntilHtmlIsRequested(htmlRequests1);
200 // Unfortunately, there is no other good way of verifying that AppCache is
201 // disabled, other than checking that it didn't try to fetch the manifest.
204 prevManifestRequestCount, webServer.getRequestCount(helper1.getManifestPath()));
206 webServer.shutdown();