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