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