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)