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