1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package org.chromium.content.browser;
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.LargeTest;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.ThreadUtils;
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.test.util.Feature;
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.test.util.UrlUtils;
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.Criteria;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.TouchCommon;
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.chromium.content_public.browser.WebContents;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content_shell_apk.ContentShellActivity;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content_shell_apk.ContentShellTestBase;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.Callable;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.ExecutionException;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Tests for interstitial pages.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class InterstitialPageTest extends ContentShellTestBase {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private static final String URL = UrlUtils.encodeHtmlDataUri(
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "<html><head></head><body>test</body></html>");
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    private static class TestWebContentsObserverAndroid extends WebContentsObserverAndroid {
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        private boolean mInterstitialShowing;
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        public TestWebContentsObserverAndroid(WebContents webContents) {
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            super(webContents);
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        public boolean isInterstitialShowing() throws ExecutionException {
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            return ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                @Override
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                public Boolean call() throws Exception {
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    return mInterstitialShowing;
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                }
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            }).booleanValue();
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        @Override
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        public void didAttachInterstitialPage() {
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            mInterstitialShowing = true;
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        @Override
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        public void didDetachInterstitialPage() {
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            mInterstitialShowing = false;
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Override
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    protected void setUp() throws Exception {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super.setUp();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentShellActivity activity = launchContentShellWithUrl(URL);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertNotNull(activity);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        waitForActiveShellToBeDoneLoading();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private boolean waitForInterstitial(final boolean shouldBeShown) throws InterruptedException {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return CriteriaHelper.pollForCriteria(new Criteria() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public boolean isSatisfied() {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                try {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    return ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        @Override
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        public Boolean call() throws Exception {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            return shouldBeShown
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                    == getContentViewCore().isShowingInterstitialPage();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    });
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                } catch (ExecutionException e) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    return false;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     * Tests that showing and hiding an interstitial works.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @LargeTest
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"Navigation"})
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    public void testCloseInterstitial() throws InterruptedException, ExecutionException {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String proceedCommand = "PROCEED";
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final String htmlContent =
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "<html>" +
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "<head>" +
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "<script>" +
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "function sendCommand(command) {" +
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        "window.domAutomationController.setAutomationId(1);" +
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        "window.domAutomationController.send(command);" +
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "}" +
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "</script>" +
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "</head>" +
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "<body style='background-color:#FF0000' " +
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "onclick='sendCommand(\"" + proceedCommand + "\");'>" +
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "<h1>This is a scary interstitial page</h1>" +
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "</body>" +
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "</html>";
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final InterstitialPageDelegateAndroid delegate =
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                new InterstitialPageDelegateAndroid(htmlContent) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            protected void commandReceived(String command) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertEquals(command, proceedCommand);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                proceed();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        };
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        TestWebContentsObserverAndroid observer = ThreadUtils.runOnUiThreadBlocking(
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                new Callable<TestWebContentsObserverAndroid>() {
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    @Override
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    public TestWebContentsObserverAndroid call() throws Exception {
1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        getContentViewCore().showInterstitialPage(URL, delegate);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        return new TestWebContentsObserverAndroid(
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                getContentViewCore().getWebContents());
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    }
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                });
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Interstitial never shown.", waitForInterstitial(true));
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        assertTrue("WebContentsObserver not notified of interstitial showing",
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                observer.isInterstitialShowing());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TouchCommon touchCommon = new TouchCommon(this);
1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        touchCommon.singleClickViewRelative(getContentViewCore().getContainerView(), 10, 10);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Interstitial never hidden.", waitForInterstitial(false));
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        assertTrue("WebContentsObserver not notified of interstitial hiding",
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                !observer.isInterstitialShowing());
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
134