1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 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) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)package org.chromium.chrome.shell; 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.ThreadUtils; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.test.util.Feature; 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.ContentViewCore; 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.ContentViewRenderView; 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuimport org.chromium.ui.base.WindowAndroid; 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import java.util.Locale; 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.atomic.AtomicBoolean; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.atomic.AtomicReference; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch/** 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * Basic sanity test for loading urls in ChromeShell. 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */ 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public class ChromeShellUrlTest extends ChromeShellTestBase { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL used for base tests. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final String URL = "data:text"; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SmallTest 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Feature({"Main"}) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testBaseStartup() throws InterruptedException { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ChromeShellActivity activity = launchChromeShellWithUrl(URL); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waitForActiveShellToBeDoneLoading(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the activity was created as expected. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNotNull(activity); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Main"}) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testChromeWelcomePageLoads() throws InterruptedException { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) String welcomeUrl = "chrome://welcome/"; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) final ChromeShellActivity activity = launchChromeShellWithUrl(welcomeUrl); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waitForActiveShellToBeDoneLoading(); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the activity was created as expected. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertNotNull(activity); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Ensure we have a valid ContentViewCore. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final AtomicReference<ContentViewCore> contentViewCore = 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new AtomicReference<ContentViewCore>(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu contentViewCore.set(activity.getActiveContentViewCore()); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertNotNull(contentViewCore.get()); 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu assertNotNull(contentViewCore.get().getContainerView()); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the correct page has been loaded, ie. not interstitial, and title/url should 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be sane. Note, a typical correct title is: "Welcome to Chromium", whereas a wrong one 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // would be on the form "chrome://welcome/ is not available". 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final AtomicBoolean isShowingInterstitialPage = new AtomicBoolean(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final AtomicReference<String> url = new AtomicReference<String>(); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final AtomicReference<String> title = new AtomicReference<String>(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci isShowingInterstitialPage.set(contentViewCore.get().getWebContents() 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .isShowingInterstitialPage()); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url.set(contentViewCore.get().getWebContents().getUrl()); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci title.set(contentViewCore.get().getWebContents().getTitle()); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Showed interstitial page instead of welcome page", 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) isShowingInterstitialPage.get()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertNotNull("URL was null", url.get()); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("URL did not contain: " + welcomeUrl + ". Was: " + url.get(), 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url.get().contains(welcomeUrl)); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertNotNull("Title was null", title.get()); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertFalse("Title should not contain: " + welcomeUrl + ". Was: " + title.get(), 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title.get().toLowerCase(Locale.US).contains(welcomeUrl)); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Tests that creating an extra ContentViewRenderView does not cause an assert because we would 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * initialize the compositor twice http://crbug.com/162312 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"Main"}) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testCompositorInit() throws InterruptedException { 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Start the ChromeShell, this loads the native library and create an instance of 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ContentViewRenderView. 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) final ChromeShellActivity activity = launchChromeShellWithUrl(URL); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) waitForActiveShellToBeDoneLoading(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now create a new ContentViewRenderView, it should not assert. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) runTestOnUiThread(new Runnable() { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WindowAndroid windowAndroid = new WindowAndroid( 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu getInstrumentation().getTargetContext().getApplicationContext()); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewRenderView contentViewRenderView = 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ContentViewRenderView(getInstrumentation().getTargetContext()); 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) contentViewRenderView.onNativeLibraryLoaded(windowAndroid); 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch contentViewRenderView.setCurrentContentViewCore( 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu activity.getActiveContentViewCore()); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } catch (Throwable e) { 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu e.printStackTrace(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fail("Could not create a ContentViewRenderView: " + e); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 115