12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 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.chrome.browser;
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.graphics.Bitmap;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.MediumTest;
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest;
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.ThreadUtils;
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.test.util.Feature;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.test.util.UrlUtils;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.chrome.testshell.ChromiumTestShellActivity;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.chrome.testshell.ChromiumTestShellTestBase;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.NavigationClient;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.NavigationEntry;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.NavigationHistory;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.Criteria;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.Callable;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.ExecutionException;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Tests for the navigation popup.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class NavigationPopupTest extends ChromiumTestShellTestBase {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private static final int INVALID_NAVIGATION_INDEX = -1;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private ChromiumTestShellActivity mActivity;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Override
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void setUp() throws Exception {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super.setUp();
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mActivity = launchChromiumTestShellWithBlankPage();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Exists solely to expose protected methods to this test.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private static class TestNavigationHistory extends NavigationHistory {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        protected void addEntry(NavigationEntry entry) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            super.addEntry(entry);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Exists solely to expose protected methods to this test.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private static class TestNavigationEntry extends NavigationEntry {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public TestNavigationEntry(int index, String url, String virtualUrl, String originalUrl,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                String title, Bitmap favicon) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            super(index, url, virtualUrl, originalUrl, title, favicon);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private static class TestNavigationClient implements NavigationClient {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private TestNavigationHistory mHistory;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private int mNavigatedIndex = INVALID_NAVIGATION_INDEX;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public TestNavigationClient() {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mHistory = new TestNavigationHistory();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mHistory.addEntry(new TestNavigationEntry(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    1, "about:blank", null, null, "About Blank", null));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mHistory.addEntry(new TestNavigationEntry(
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    5, UrlUtils.encodeHtmlDataUri("<html>1</html>"), null, null, null, null));
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public NavigationHistory getDirectedNavigationHistory(boolean isForward, int itemLimit) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mHistory;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        @Override
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public void goToNavigationIndex(int index) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mNavigatedIndex = index;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @MediumTest
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"Navigation"})
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testFaviconFetching() throws InterruptedException {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestNavigationClient client = new TestNavigationClient();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final NavigationPopup popup = new NavigationPopup(
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mActivity, client, true);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        popup.setWidth(300);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        popup.setAnchorView(mActivity.getActiveContentView());
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                popup.show();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("All favicons did not get updated.",
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CriteriaHelper.pollForCriteria(new Criteria() {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public boolean isSatisfied() {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                try {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    return ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        @Override
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        public Boolean call() throws Exception {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            NavigationHistory history = client.mHistory;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            for (int i = 0; i < history.getEntryCount(); i++) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                if (history.getEntryAtIndex(i).getFavicon() == null) return false;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            return true;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    });
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                } catch (ExecutionException e) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    return false;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                popup.dismiss();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"Navigation"})
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testItemSelection() {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final TestNavigationClient client = new TestNavigationClient();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        final NavigationPopup popup = new NavigationPopup(
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                mActivity, client, true);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        popup.setWidth(300);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        popup.setAnchorView(mActivity.getActiveContentView());
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                popup.show();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                popup.performItemClick(1);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertFalse("Popup did not hide as expected.", popup.isShowing());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertEquals("Popup attempted to navigate to the wrong index", 5, client.mNavigatedIndex);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
151