AwContentsTest.java revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.android_webview.test; 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Bitmap; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.BitmapFactory; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Handler; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Looper; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Message; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.UiThreadTest; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.LargeTest; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.Pair; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.AwContents; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.android_webview.test.util.CommonResources; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.DisabledTest; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.Feature; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.CallbackHelper; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.Criteria; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.net.test.util.TestWebServer; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.InputStream; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.net.URL; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.ArrayList; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.concurrent.atomic.AtomicInteger; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.concurrent.Semaphore; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.concurrent.TimeUnit; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.List; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * AwContents tests. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public class AwContentsTest extends AwTestBase { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static class OnDownloadStartHelper extends CallbackHelper { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String mUrl; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String mUserAgent; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String mContentDisposition; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String mMimeType; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long mContentLength; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String getUrl() { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert getCallCount() > 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mUrl; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String getUserAgent() { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert getCallCount() > 0; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mUserAgent; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String getContentDisposition() { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert getCallCount() > 0; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContentDisposition; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String getMimeType() { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert getCallCount() > 0; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mMimeType; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public long getContentLength() { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert getCallCount() > 0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContentLength; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void notifyCalled(String url, String userAgent, String contentDisposition, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String mimeType, long contentLength) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mUrl = url; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mUserAgent = userAgent; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentDisposition = contentDisposition; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mMimeType = mimeType; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentLength = contentLength; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifyCalled(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static class TestAwContentsClient 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extends org.chromium.android_webview.test.TestAwContentsClient { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private OnDownloadStartHelper mOnDownloadStartHelper; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public TestAwContentsClient() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mOnDownloadStartHelper = new OnDownloadStartHelper(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public OnDownloadStartHelper getOnDownloadStartHelper() { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mOnDownloadStartHelper; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onDownloadStart(String url, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String userAgent, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String contentDisposition, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String mimeType, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long contentLength) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getOnDownloadStartHelper().notifyCalled(url, userAgent, contentDisposition, mimeType, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contentLength); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private TestAwContentsClient mContentsClient = new TestAwContentsClient(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView"}) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @UiThreadTest 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testCreateDestroy() throws Throwable { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE this test runs on UI thread, so we cannot call any async methods. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) createAwTestContainerView(mContentsClient).getAwContents().destroy(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @LargeTest 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @Feature({"AndroidWebView"}) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Disabled until we switch to final rendering pipeline. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @DisabledTest 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testCreateLoadDestroyManyTimes() throws Throwable { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final int CREATE_AND_DESTROY_REPEAT_COUNT = 10; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < CREATE_AND_DESTROY_REPEAT_COUNT; ++i) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AwContents awContents = testView.getAwContents(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), "about:blank"); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroyAwContentsOnMainSync(awContents); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @LargeTest 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @Feature({"AndroidWebView"}) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Disabled until we switch to final rendering pipeline. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @DisabledTest 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testCreateLoadDestroyManyAtOnce() throws Throwable { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final int CREATE_AND_DESTROY_REPEAT_COUNT = 10; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AwTestContainerView views[] = new AwTestContainerView[CREATE_AND_DESTROY_REPEAT_COUNT]; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < views.length; ++i) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views[i] = createAwTestContainerViewOnMainSync(mContentsClient); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(views[i].getAwContents(), mContentsClient.getOnPageFinishedHelper(), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "about:blank"); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < views.length; ++i) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroyAwContentsOnMainSync(views[i].getAwContents()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views[i] = null; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private int callDocumentHasImagesSync(final AwContents awContents) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throws Throwable, InterruptedException { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a container to hold the result object and a semaphore to 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // make the test wait for the result. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AtomicInteger val = new AtomicInteger(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final Semaphore s = new Semaphore(0); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final Message msg = Message.obtain(new Handler(Looper.getMainLooper()) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void handleMessage(Message msg) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val.set(msg.arg1); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s.release(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runTestOnUiThread(new Runnable() { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void run() { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awContents.documentHasImages(msg); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(s.tryAcquire(WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = val.get(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView"}) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testDocumentHasImages() throws Throwable { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AwContents awContents = testView.getAwContents(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final CallbackHelper loadHelper = mContentsClient.getOnPageFinishedHelper(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String mime = "text/html"; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String emptyDoc = "<head/><body/>"; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String imageDoc = "<head/><body><img/><img/></body>"; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure a document that does not have images returns 0 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadDataSync(awContents, loadHelper, emptyDoc, mime, false); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = callDocumentHasImagesSync(awContents); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(0, result); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure a document that does have images returns 1 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadDataSync(awContents, loadHelper, imageDoc, mime, false); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = callDocumentHasImagesSync(awContents); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(1, result); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView"}) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testClearCacheMemoryAndDisk() throws Throwable { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AwTestContainerView testContainer = 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) createAwTestContainerViewOnMainSync(mContentsClient); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AwContents awContents = testContainer.getAwContents(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWebServer webServer = null; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webServer = new TestWebServer(false); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String pagePath = "/clear_cache_test.html"; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) List<Pair<String, String>> headers = new ArrayList<Pair<String, String>>(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set Cache-Control headers to cache this request. One century should be long enough. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.add(Pair.create("Cache-Control", "max-age=3153600000")); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.add(Pair.create("Last-Modified", "Wed, 3 Oct 2012 00:00:00 GMT")); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String pageUrl = webServer.setResponse( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pagePath, "<html><body>foo</body></html>", headers); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First load to populate cache. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clearCacheOnUiThread(awContents, true); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(awContents, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentsClient.getOnPageFinishedHelper(), 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pageUrl); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(1, webServer.getRequestCount(pagePath)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load about:blank so next load is not treated as reload by webkit and force 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // revalidate with the server. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(awContents, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentsClient.getOnPageFinishedHelper(), 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "about:blank"); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No clearCache call, so should be loaded from cache. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(awContents, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentsClient.getOnPageFinishedHelper(), 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pageUrl); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(1, webServer.getRequestCount(pagePath)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(awContents, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentsClient.getOnPageFinishedHelper(), 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "about:blank"); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear cache, so should hit server again. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clearCacheOnUiThread(awContents, true); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(awContents, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentsClient.getOnPageFinishedHelper(), 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pageUrl); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(2, webServer.getRequestCount(pagePath)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } finally { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webServer != null) webServer.shutdown(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView"}) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testClearCacheInQuickSuccession() throws Throwable { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AwTestContainerView testContainer = 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) createAwTestContainerViewOnMainSync(new TestAwContentsClient()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AwContents awContents = testContainer.getAwContents(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runTestOnUiThread(new Runnable() { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void run() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; ++i) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awContents.clearCache(true); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final long TEST_TIMEOUT = 20000L; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final int CHECK_INTERVAL = 100; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView"}) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testGetFavicon() throws Throwable { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final AwContents awContents = testView.getAwContents(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWebServer webServer = null; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webServer = new TestWebServer(false); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String faviconUrl = webServer.setResponseBase64( 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/" + CommonResources.FAVICON_FILENAME, CommonResources.FAVICON_DATA_BASE64, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonResources.getImagePngHeaders(false)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String pageUrl = webServer.setResponse("/favicon.html", 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonResources.FAVICON_STATIC_HTML, null); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The getFavicon will return the right icon a certain time after 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page load completes which makes it slightly hard to test. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final Bitmap defaultFavicon = awContents.getFavicon(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getContentSettingsOnUiThread(awContents).setImagesEnabled(true); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isSatisfied() { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return awContents.getFavicon() != null && 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !awContents.getFavicon().sameAs(defaultFavicon); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, TEST_TIMEOUT, CHECK_INTERVAL)); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final Object originalFaviconSource = (new URL(faviconUrl)).getContent(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final Bitmap originalFavicon = 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BitmapFactory.decodeStream((InputStream)originalFaviconSource); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNotNull(originalFavicon); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(awContents.getFavicon().sameAs(originalFavicon)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } finally { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webServer != null) webServer.shutdown(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"AndroidWebView", "Downloads"}) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void testDownload() throws Throwable { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AwContents awContents = testView.getAwContents(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String data = "download data"; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String contentDisposition = "attachment;filename=\"download.txt\""; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String mimeType = "text/plain"; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) List<Pair<String, String>> downloadHeaders = new ArrayList<Pair<String, String>>(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloadHeaders.add(Pair.create("Content-Disposition", contentDisposition)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloadHeaders.add(Pair.create("Content-Type", mimeType)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloadHeaders.add(Pair.create("Content-Length", Integer.toString(data.length()))); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWebServer webServer = null; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webServer = new TestWebServer(false); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final String pageUrl = webServer.setResponse( 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/download.txt", data, downloadHeaders); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final OnDownloadStartHelper downloadStartHelper = 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentsClient.getOnDownloadStartHelper(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final int callCount = downloadStartHelper.getCallCount(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadUrlAsync(awContents, pageUrl); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) downloadStartHelper.waitForCallback(callCount); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(pageUrl, downloadStartHelper.getUrl()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(contentDisposition, downloadStartHelper.getContentDisposition()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(mimeType, downloadStartHelper.getMimeType()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(data.length(), downloadStartHelper.getContentLength()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } finally { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webServer != null) webServer.shutdown(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)