Commit 6436d1fa authored by Andrew Luo's avatar Andrew Luo Committed by Commit Bot

Add Tabswitcher Page Controllers.

Bug: 924194
Change-Id: Id53cdc9890977de6e8d58940b53eeea79833c426
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1684972
Commit-Queue: Andrew Luo <aluo@chromium.org>
Reviewed-by: default avatarJohn Budorick <jbudorick@chromium.org>
Reviewed-by: default avatarSky Malice <skym@chromium.org>
Cr-Commit-Position: refs/heads/master@{#680139}
parent 584c663e
...@@ -20,6 +20,8 @@ android_library("chrome_java_test_pagecontroller") { ...@@ -20,6 +20,8 @@ android_library("chrome_java_test_pagecontroller") {
"javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/NewTabPageController.java", "javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/NewTabPageController.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/SuggestionTileController.java", "javatests/src/org/chromium/chrome/test/pagecontroller/controllers/ntp/SuggestionTileController.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/controllers/PageController.java", "javatests/src/org/chromium/chrome/test/pagecontroller/controllers/PageController.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/controllers/tabswitcher/TabSwitcherController.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/controllers/tabswitcher/TabSwitcherMenuController.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/controllers/urlpage/UrlPage.java", "javatests/src/org/chromium/chrome/test/pagecontroller/controllers/urlpage/UrlPage.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/rules/ChromeUiApplicationTestRule.java", "javatests/src/org/chromium/chrome/test/pagecontroller/rules/ChromeUiApplicationTestRule.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/rules/ChromeUiAutomatorTestRule.java", "javatests/src/org/chromium/chrome/test/pagecontroller/rules/ChromeUiAutomatorTestRule.java",
...@@ -56,6 +58,7 @@ instrumentation_test_apk("chrome_java_test_pagecontroller_tests") { ...@@ -56,6 +58,7 @@ instrumentation_test_apk("chrome_java_test_pagecontroller_tests") {
"javatests/src/org/chromium/chrome/test/pagecontroller/tests/ExampleTest.java", "javatests/src/org/chromium/chrome/test/pagecontroller/tests/ExampleTest.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/tests/FirstRunControllerTest.java", "javatests/src/org/chromium/chrome/test/pagecontroller/tests/FirstRunControllerTest.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/tests/NewTabPageControllerTest.java", "javatests/src/org/chromium/chrome/test/pagecontroller/tests/NewTabPageControllerTest.java",
"javatests/src/org/chromium/chrome/test/pagecontroller/tests/TabSwitcherControllerTest.java",
] ]
deps = [ deps = [
":chrome_java_test_pagecontroller", ":chrome_java_test_pagecontroller",
......
...@@ -6,6 +6,7 @@ package org.chromium.chrome.test.pagecontroller.controllers.ntp; ...@@ -6,6 +6,7 @@ package org.chromium.chrome.test.pagecontroller.controllers.ntp;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.test.pagecontroller.controllers.PageController; import org.chromium.chrome.test.pagecontroller.controllers.PageController;
import org.chromium.chrome.test.pagecontroller.controllers.tabswitcher.TabSwitcherController;
import org.chromium.chrome.test.pagecontroller.controllers.urlpage.UrlPage; import org.chromium.chrome.test.pagecontroller.controllers.urlpage.UrlPage;
import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator; import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator;
import org.chromium.chrome.test.pagecontroller.utils.Ui2Locators; import org.chromium.chrome.test.pagecontroller.utils.Ui2Locators;
...@@ -245,6 +246,18 @@ public class NewTabPageController extends PageController { ...@@ -245,6 +246,18 @@ public class NewTabPageController extends PageController {
mUtils.click(LOCATOR_MORE_BUTTON); mUtils.click(LOCATOR_MORE_BUTTON);
} }
/**
* Open the tab switcher at the top. This will cause the page to scroll to the top.
* @return The TabSwitcher Page Controller.
*/
public TabSwitcherController openTabSwitcher() {
scrollToTop();
mUtils.click(LOCATOR_TAB_SWITCHER);
TabSwitcherController inst = TabSwitcherController.getInstance();
inst.verify();
return inst;
}
/** /**
* Open the 3-dot menu at the top. This will cause the page to scroll to the top. * Open the 3-dot menu at the top. This will cause the page to scroll to the top.
* @return The ChromeMenu Page Controller. * @return The ChromeMenu Page Controller.
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.test.pagecontroller.controllers.tabswitcher;
import org.chromium.chrome.R;
import org.chromium.chrome.test.pagecontroller.controllers.PageController;
import org.chromium.chrome.test.pagecontroller.controllers.ntp.NewTabPageController;
import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator;
import org.chromium.chrome.test.pagecontroller.utils.Ui2Locators;
import org.chromium.chrome.test.pagecontroller.utils.UiLocationException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Tab Switcher Page Controller.
*/
public class TabSwitcherController extends PageController {
private static final Pattern PATTERN_NUMBER_OF_OPEN_TABS = Pattern.compile("^(\\d+) .*");
private static final IUi2Locator LOCATOR_CLOSE_ALL_TABS =
Ui2Locators.withResEntries(R.id.close_all_tabs_button);
private static final IUi2Locator LOCATOR_NEW_TAB =
Ui2Locators.withResEntries(R.id.tab_switcher_new_tab_button, R.id.new_tab_button);
private static final IUi2Locator LOCATOR_TAB_SWITCHER_BUTTON = Ui2Locators.withResEntries(
R.id.tab_switcher_button, R.id.tab_switcher_mode_tab_switcher_button);
private static final IUi2Locator LOCATOR_MENU = Ui2Locators.withResEntries(R.id.menu_button);
private static final TabSwitcherController sInstance = new TabSwitcherController();
static public TabSwitcherController getInstance() {
return sInstance;
}
private TabSwitcherController() {}
public void clickCloseAllTabs() {
// Default to use the close all tabs button.
if (mLocatorHelper.isOnScreen(LOCATOR_CLOSE_ALL_TABS)) {
mUtils.click(LOCATOR_CLOSE_ALL_TABS);
} else {
// If it's not found for whatever reason, then do it through the menu.
clickMenu().clickCloseAllTabs();
}
}
public void clickTabSwitcher() {
mUtils.click(LOCATOR_TAB_SWITCHER_BUTTON);
}
public int getNumberOfOpenTabs() {
String text = mLocatorHelper.getOneDescription(LOCATOR_TAB_SWITCHER_BUTTON);
Matcher matcher = PATTERN_NUMBER_OF_OPEN_TABS.matcher(text);
if (matcher.matches()) {
return Integer.valueOf(matcher.group(1));
} else {
throw UiLocationException.newInstance(
"Could not match " + text + " to " + PATTERN_NUMBER_OF_OPEN_TABS);
}
}
public NewTabPageController clickNewTab() {
mUtils.click(LOCATOR_NEW_TAB);
NewTabPageController inst = NewTabPageController.getInstance();
inst.verify();
return inst;
}
public TabSwitcherMenuController clickMenu() {
mUtils.click(LOCATOR_MENU);
TabSwitcherMenuController inst = TabSwitcherMenuController.getInstance();
inst.verify();
return inst;
}
@Override
public boolean isCurrentPageThis() {
return mLocatorHelper.isOnScreen(LOCATOR_NEW_TAB);
}
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.test.pagecontroller.controllers.tabswitcher;
import org.chromium.chrome.R;
import org.chromium.chrome.test.pagecontroller.controllers.PageController;
import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator;
import org.chromium.chrome.test.pagecontroller.utils.Ui2Locators;
/**
* Tab Switcher Menu Dialog Page Controller.
*/
public class TabSwitcherMenuController extends PageController {
private static final IUi2Locator LOCATOR_MENU_BOX =
Ui2Locators.withResEntries(R.id.app_menu_list);
// TODO(aluo): Add resource ids for menus, using text will break when switching languages
private static final IUi2Locator LOCATOR_MENU =
Ui2Locators.withPath(LOCATOR_MENU_BOX, Ui2Locators.withText("Close all tabs"));
private static final IUi2Locator LOCATOR_NEW_TAB =
Ui2Locators.withResEntriesByIndex(0, R.id.menu_item_text);
private static final IUi2Locator LOCATOR_NEW_INCOGNITO_TAB =
Ui2Locators.withResEntriesByIndex(1, R.id.menu_item_text);
private static final IUi2Locator LOCATOR_CLOSE_ALL_TABS =
Ui2Locators.withResEntriesByIndex(2, R.id.menu_item_text);
private static final IUi2Locator LOCATOR_SETTINGS =
Ui2Locators.withResEntriesByIndex(3, R.id.menu_item_text);
static private final TabSwitcherMenuController sInstance = new TabSwitcherMenuController();
static public TabSwitcherMenuController getInstance() {
return sInstance;
}
@Override
public boolean isCurrentPageThis() {
return mLocatorHelper.isOnScreen(LOCATOR_MENU);
}
public void clickNewTab() {
mUtils.click(LOCATOR_NEW_TAB);
}
public void clickNewIncognitoTab() {
mUtils.click(LOCATOR_NEW_INCOGNITO_TAB);
}
public void clickCloseAllTabs() {
mUtils.click(LOCATOR_CLOSE_ALL_TABS);
}
public void clickSettings() {
mUtils.click(LOCATOR_SETTINGS);
}
public TabSwitcherController dismiss() {
mUtils.clickOutsideOf(LOCATOR_MENU_BOX);
TabSwitcherController inst = TabSwitcherController.getInstance();
inst.verify();
return inst;
}
}
...@@ -6,6 +6,7 @@ package org.chromium.chrome.test.pagecontroller.controllers.urlpage; ...@@ -6,6 +6,7 @@ package org.chromium.chrome.test.pagecontroller.controllers.urlpage;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.test.pagecontroller.controllers.PageController; import org.chromium.chrome.test.pagecontroller.controllers.PageController;
import org.chromium.chrome.test.pagecontroller.controllers.tabswitcher.TabSwitcherController;
import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator; import org.chromium.chrome.test.pagecontroller.utils.IUi2Locator;
import org.chromium.chrome.test.pagecontroller.utils.Ui2Locators; import org.chromium.chrome.test.pagecontroller.utils.Ui2Locators;
import org.chromium.chrome.test.pagecontroller.utils.UiLocatorHelper; import org.chromium.chrome.test.pagecontroller.utils.UiLocatorHelper;
...@@ -46,4 +47,11 @@ public class UrlPage extends PageController { ...@@ -46,4 +47,11 @@ public class UrlPage extends PageController {
Ui2Locators.withPath(LOCATOR_WEB_VIEW, Ui2Locators.withTextContaining(text)); Ui2Locators.withPath(LOCATOR_WEB_VIEW, Ui2Locators.withTextContaining(text));
return mLocatorHelper.isOnScreen(locator); return mLocatorHelper.isOnScreen(locator);
} }
public TabSwitcherController openTabSwitcher() {
mUtils.click(LOCATOR_TAB_SWITCHER);
TabSwitcherController inst = TabSwitcherController.getInstance();
inst.verify();
return inst;
}
} }
...@@ -10,13 +10,9 @@ import org.junit.rules.ExternalResource; ...@@ -10,13 +10,9 @@ import org.junit.rules.ExternalResource;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.chrome.test.pagecontroller.controllers.PageController; import org.chromium.chrome.test.pagecontroller.controllers.PageController;
import org.chromium.chrome.test.pagecontroller.controllers.android.PermissionDialog;
import org.chromium.chrome.test.pagecontroller.controllers.first_run.DataSaverController; import org.chromium.chrome.test.pagecontroller.controllers.first_run.DataSaverController;
import org.chromium.chrome.test.pagecontroller.controllers.first_run.SyncController; import org.chromium.chrome.test.pagecontroller.controllers.first_run.SyncController;
import org.chromium.chrome.test.pagecontroller.controllers.first_run.TOSController; import org.chromium.chrome.test.pagecontroller.controllers.first_run.TOSController;
import org.chromium.chrome.test.pagecontroller.controllers.notifications.DownloadNotificationController;
import org.chromium.chrome.test.pagecontroller.controllers.ntp.ChromeMenu;
import org.chromium.chrome.test.pagecontroller.controllers.ntp.IncognitoNewTabPageController;
import org.chromium.chrome.test.pagecontroller.controllers.ntp.NewTabPageController; import org.chromium.chrome.test.pagecontroller.controllers.ntp.NewTabPageController;
import org.chromium.chrome.test.pagecontroller.utils.UiAutomatorUtils; import org.chromium.chrome.test.pagecontroller.utils.UiAutomatorUtils;
import org.chromium.chrome.test.pagecontroller.utils.UiLocationException; import org.chromium.chrome.test.pagecontroller.utils.UiLocationException;
...@@ -47,42 +43,30 @@ public class ChromeUiApplicationTestRule extends ExternalResource { ...@@ -47,42 +43,30 @@ public class ChromeUiApplicationTestRule extends ExternalResource {
throw UiLocationException.newInstance("Could not detect current Page"); throw UiLocationException.newInstance("Could not detect current Page");
} }
/**
* Detect the page controller from among all page controllers.
* When a new page controller is implemented, add it to the list here.
* @return The detected page controller.
* @throws UiLocationError If page can't be determined.
*/
public static PageController detectCurrentPage() {
return detectPageAmong(NewTabPageController.getInstance(), SyncController.getInstance(),
DataSaverController.getInstance(), TOSController.getInstance(),
DownloadNotificationController.getInstance(), PermissionDialog.getInstance(),
IncognitoNewTabPageController.getInstance(), ChromeMenu.getInstance());
}
/** Launch the chrome application */ /** Launch the chrome application */
public void launchApplication() { public void launchApplication() {
UiAutomatorUtils utils = UiAutomatorUtils.getInstance(); UiAutomatorUtils utils = UiAutomatorUtils.getInstance();
utils.launchApplication(mPackageName); utils.launchApplication(mPackageName);
} }
/** Navigate to the New Tab Page from somewhere in the application. */ /**
public NewTabPageController navigateToNewTabPage() { * Navigate to the New Tab Page after the application starts for the first time, or after
PageController controller = detectCurrentPage(); * application data was cleared.
* @return NewTabPageController
*/
public NewTabPageController navigateToNewTabPageOnFirstRun() {
PageController controller = detectPageOnFirstRun();
if (controller instanceof TOSController) { if (controller instanceof TOSController) {
((TOSController) controller).acceptAndContinue(); ((TOSController) controller).acceptAndContinue();
controller = detectCurrentPage(); controller = detectPageOnFirstRun();
} }
if (controller instanceof DataSaverController) { if (controller instanceof DataSaverController) {
((DataSaverController) controller).clickNext(); ((DataSaverController) controller).clickNext();
controller = detectCurrentPage(); controller = detectPageOnFirstRun();
} }
if (controller instanceof SyncController) { if (controller instanceof SyncController) {
((SyncController) controller).clickNoThanks(); ((SyncController) controller).clickNoThanks();
controller = detectCurrentPage(); controller = detectPageOnFirstRun();
}
if (controller instanceof ChromeMenu) {
controller = ((ChromeMenu) controller).dismiss();
} }
if (controller instanceof NewTabPageController) { if (controller instanceof NewTabPageController) {
return (NewTabPageController) controller; return (NewTabPageController) controller;
...@@ -93,9 +77,9 @@ public class ChromeUiApplicationTestRule extends ExternalResource { ...@@ -93,9 +77,9 @@ public class ChromeUiApplicationTestRule extends ExternalResource {
} }
/** Launch the application and navigate to the New Tab Page */ /** Launch the application and navigate to the New Tab Page */
public NewTabPageController launchIntoNewTabPage() { public NewTabPageController launchIntoNewTabPageOnFirstRun() {
launchApplication(); launchApplication();
return navigateToNewTabPage(); return navigateToNewTabPageOnFirstRun();
} }
public String getApplicationPackage() { public String getApplicationPackage() {
...@@ -112,4 +96,16 @@ public class ChromeUiApplicationTestRule extends ExternalResource { ...@@ -112,4 +96,16 @@ public class ChromeUiApplicationTestRule extends ExternalResource {
mPackageName = InstrumentationRegistry.getTargetContext().getPackageName(); mPackageName = InstrumentationRegistry.getTargetContext().getPackageName();
} }
} }
/**
* Detect the page controller from among page controllers that could be displayed on first
* launch or after application data was cleared.
* Add potential page controllers that could show up before the New Tab Page here.
* @return The detected page controller.
* @throws UiLocationError If page can't be determined.
*/
private static PageController detectPageOnFirstRun() {
return detectPageAmong(TOSController.getInstance(), SyncController.getInstance(),
DataSaverController.getInstance(), NewTabPageController.getInstance());
}
} }
...@@ -41,7 +41,7 @@ public class NewTabPageControllerTest { ...@@ -41,7 +41,7 @@ public class NewTabPageControllerTest {
@Before @Before
public void setUp() { public void setUp() {
mController = mChromeUiRule.launchIntoNewTabPage(); mController = mChromeUiRule.launchIntoNewTabPageOnFirstRun();
} }
@Test @Test
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.test.pagecontroller.tests;
import android.support.test.filters.SmallTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.chrome.test.pagecontroller.controllers.ntp.NewTabPageController;
import org.chromium.chrome.test.pagecontroller.controllers.tabswitcher.TabSwitcherController;
import org.chromium.chrome.test.pagecontroller.controllers.tabswitcher.TabSwitcherMenuController;
import org.chromium.chrome.test.pagecontroller.rules.ChromeUiApplicationTestRule;
import org.chromium.chrome.test.pagecontroller.rules.ChromeUiAutomatorTestRule;
/**
* Tests for the TabSwitcherController.
*/
@SmallTest
@RunWith(BaseJUnit4ClassRunner.class)
public class TabSwitcherControllerTest {
public ChromeUiAutomatorTestRule mRule = new ChromeUiAutomatorTestRule();
public ChromeUiApplicationTestRule mChromeUiRule = new ChromeUiApplicationTestRule();
@Rule
public final TestRule mChain = RuleChain.outerRule(mChromeUiRule).around(mRule);
private TabSwitcherController mController;
@Before
public void setUp() {
mController = mChromeUiRule.launchIntoNewTabPageOnFirstRun().openTabSwitcher();
}
@Test
public void testOpenNewTab() {
mController.clickNewTab();
Assert.assertTrue(NewTabPageController.getInstance().isCurrentPageThis());
}
@Test
public void testCloseAllTabs() {
mController.clickNewTab().openTabSwitcher().clickNewTab().openTabSwitcher();
mController.clickCloseAllTabs();
Assert.assertEquals(0, mController.getNumberOfOpenTabs());
}
@Test
public void testNumberOfOpenTabs() {
int startTabs = mController.getNumberOfOpenTabs();
mController.clickNewTab().openTabSwitcher();
Assert.assertEquals(startTabs + 1, mController.getNumberOfOpenTabs());
}
@Test
public void testClickTabSwitcher() {
mController.clickTabSwitcher();
Assert.assertTrue(NewTabPageController.getInstance().isCurrentPageThis());
}
@Test
public void testOpenMenu() {
mController.clickMenu();
Assert.assertTrue(TabSwitcherMenuController.getInstance().isCurrentPageThis());
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment