| Index: chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
|
| index e61b32514667d43012a4906d0dec14311b6adeaf..edd883cb57464b67a8e0aadad5846941c1891ec6 100644
|
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
|
| @@ -8,16 +8,26 @@ import android.content.Intent;
|
| import android.net.Uri;
|
| import android.provider.Browser;
|
| import android.test.FlakyTest;
|
| +import android.test.suitebuilder.annotation.MediumTest;
|
| import android.text.TextUtils;
|
| +import android.view.ContextMenu;
|
| import android.view.KeyEvent;
|
| +import android.view.View;
|
|
|
| import junit.framework.Assert;
|
|
|
| +import org.chromium.base.BaseSwitches;
|
| import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.test.util.CommandLineFlags;
|
| import org.chromium.base.test.util.DisabledTest;
|
| import org.chromium.base.test.util.Feature;
|
| +import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.tab.EmptyTabObserver;
|
| import org.chromium.chrome.browser.tab.Tab;
|
| +import org.chromium.chrome.browser.tabmodel.TabModelUtils;
|
| import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
|
| +import org.chromium.chrome.test.MultiActivityTestBase;
|
| +import org.chromium.chrome.test.util.ApplicationTestUtils;
|
| import org.chromium.chrome.test.util.ChromeTabUtils;
|
| import org.chromium.chrome.test.util.TestHttpServerClient;
|
| import org.chromium.content.browser.test.util.Criteria;
|
| @@ -25,12 +35,13 @@ import org.chromium.content.browser.test.util.CriteriaHelper;
|
| import org.chromium.content.browser.test.util.DOMUtils;
|
| import org.chromium.content.browser.test.util.JavaScriptUtils;
|
| import org.chromium.content.browser.test.util.KeyUtils;
|
| +import org.chromium.content.browser.test.util.TouchCommon;
|
|
|
| +import java.util.concurrent.Callable;
|
| import java.util.concurrent.TimeoutException;
|
|
|
| /**
|
| - * Test the behavior of tabs when opening a URL from an external app, more specifically how we reuse
|
| - * tabs.
|
| + * Test the behavior of tabs when opening a URL from an external app.
|
| */
|
| public class TabsOpenedFromExternalAppTest extends ChromeTabbedActivityTestBase {
|
|
|
| @@ -437,4 +448,99 @@ public class TabsOpenedFromExternalAppTest extends ChromeTabbedActivityTestBase
|
| assertEquals("Selected tab is not on the right URL.", url2,
|
| getActivity().getActivityTab().getUrl());
|
| }
|
| +
|
| +
|
| + private static class TestTabObserver extends EmptyTabObserver {
|
| + private ContextMenu mContextMenu;
|
| +
|
| + @Override
|
| + public void onContextMenuShown(Tab tab, ContextMenu menu) {
|
| + mContextMenu = menu;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Catches regressions for https://crbug.com/495877.
|
| + */
|
| + @MediumTest
|
| + @CommandLineFlags.Add(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)
|
| + public void testBackgroundSvelteTabIsSelectedAfterClosingExternalTab() throws Exception {
|
| + // Start up Chrome and immediately close its tab -- it gets in the way.
|
| + startMainActivityFromLauncher();
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + TabModelUtils.closeTabByIndex(getActivity().getCurrentTabModel(), 0);
|
| + }
|
| + });
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return getActivity().getTabModelSelector().getTotalTabCount() == 0;
|
| + }
|
| + }));
|
| +
|
| + // Open a tab via an external application.
|
| + final Intent intent = new Intent(
|
| + Intent.ACTION_VIEW, Uri.parse(MultiActivityTestBase.HREF_LINK));
|
| + intent.setClassName(getInstrumentation().getTargetContext().getPackageName(),
|
| + ChromeTabbedActivity.class.getName());
|
| + intent.putExtra(Browser.EXTRA_APPLICATION_ID, "com.legit.totes");
|
| + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| + getInstrumentation().getTargetContext().startActivity(intent);
|
| +
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return getActivity().getTabModelSelector().getTotalTabCount() == 1;
|
| + }
|
| + }));
|
| + ApplicationTestUtils.assertWaitForPageScaleFactorMatch(getActivity(), 0.5f, false);
|
| +
|
| + // Long press the center of the page, which should bring up the context menu.
|
| + final TestTabObserver observer = new TestTabObserver();
|
| + getActivity().getActivityTab().addObserver(observer);
|
| + assertNull(observer.mContextMenu);
|
| + final View view = ThreadUtils.runOnUiThreadBlocking(new Callable<View>() {
|
| + @Override
|
| + public View call() throws Exception {
|
| + return getActivity().getActivityTab().getContentViewCore().getContainerView();
|
| + }
|
| + });
|
| + TouchCommon.longPressView(view, view.getWidth() / 2, view.getHeight() / 2);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return observer.mContextMenu != null;
|
| + }
|
| + }));
|
| + getActivity().getActivityTab().removeObserver(observer);
|
| +
|
| + // Select the "open in new tab" option.
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + assertTrue(observer.mContextMenu.performIdentifierAction(
|
| + R.id.contextmenu_open_in_new_tab, 0));
|
| + }
|
| + });
|
| +
|
| + // The second tab should open in the background.
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return getActivity().getTabModelSelector().getTotalTabCount() == 2;
|
| + }
|
| + }));
|
| +
|
| + // Hitting "back" should close the tab, minimize Chrome, and select the background tab.
|
| + // Confirm that the number of tabs is correct and that closing the tab didn't cause a crash.
|
| + getActivity().onBackPressed();
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return getActivity().getTabModelSelector().getTotalTabCount() == 1;
|
| + }
|
| + }));
|
| + }
|
| }
|
|
|