Index: chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java |
index 5b82434a380a7229a0d383a008935d582b3b97aa..0a70e141b8116218b6120103f944ce2927afe314 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java |
@@ -6,12 +6,15 @@ package org.chromium.chrome.browser.appmenu; |
import android.app.Activity; |
import android.content.pm.ActivityInfo; |
-import android.test.FlakyTest; |
+import android.test.suitebuilder.annotation.SmallTest; |
import android.view.KeyEvent; |
import android.view.MenuItem; |
import android.view.View; |
+import android.widget.ListPopupWindow; |
+import android.widget.ListView; |
import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.util.Feature; |
import org.chromium.chrome.shell.ChromeShellActivity; |
import org.chromium.chrome.shell.ChromeShellActivity.AppMenuHandlerFactory; |
import org.chromium.chrome.shell.ChromeShellTestBase; |
@@ -75,111 +78,117 @@ public class AppMenuTest extends ChromeShellTestBase { |
} |
})); |
mAppMenu = getActivity().getAppMenuHandler().getAppMenu(); |
- pressKey(KeyEvent.KEYCODE_SPACE); |
- |
+ ThreadUtils.runOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ mAppMenu.getPopup().getListView().setSelection(0); |
+ } |
+ }); |
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return getCurrentFocusedRow() == 0; |
+ } |
+ })); |
+ getInstrumentation().waitForIdleSync(); |
} |
+ |
/** |
* Test bounds when accessing the menu through the keyboard. |
* Make sure that the menu stays open when trying to move past the first and last items. |
- * @SmallTest |
- * @Feature({"Browser", "Main"}) |
*/ |
- @FlakyTest |
+ @SmallTest |
+ @Feature({"Browser", "Main"}) |
public void testKeyboardMenuBoundaries() throws InterruptedException { |
moveToBoundary(false, true); |
- assertEquals(mAppMenu.getCount() - 1, mAppMenu.getCurrentFocusedPosition()); |
+ assertEquals(getCount() - 1, getCurrentFocusedRow()); |
moveToBoundary(true, true); |
- assertEquals(0, mAppMenu.getCurrentFocusedPosition()); |
+ assertEquals(0, getCurrentFocusedRow()); |
moveToBoundary(false, true); |
- assertEquals(mAppMenu.getCount() - 1, mAppMenu.getCurrentFocusedPosition()); |
+ assertEquals(getCount() - 1, getCurrentFocusedRow()); |
} |
/** |
* Test that typing ENTER immediately opening the menu works. |
- * @SmallTest |
- * @Feature({"Browser", "Main"}) |
*/ |
- @FlakyTest |
+ @SmallTest |
+ @Feature({"Browser", "Main"}) |
public void testKeyboardMenuEnterOnOpen() throws InterruptedException { |
- hitEnterAndAssertItemSelected(); |
+ hitEnterAndAssertAppMenuDismissed(); |
} |
/** |
* Test that hitting ENTER past the top item doesn't crash Chrome. |
- * @SmallTest |
- * @Feature({"Browser", "Main"}) |
*/ |
- @FlakyTest |
+ @SmallTest |
+ @Feature({"Browser", "Main"}) |
public void testKeyboardEnterAfterMovePastTopItem() throws InterruptedException { |
moveToBoundary(true, true); |
- assertEquals(0, mAppMenu.getCurrentFocusedPosition()); |
- hitEnterAndAssertItemSelected(); |
+ assertEquals(0, getCurrentFocusedRow()); |
+ hitEnterAndAssertAppMenuDismissed(); |
} |
/** |
* Test that hitting ENTER past the bottom item doesn't crash Chrome. |
* Catches regressions for http://crbug.com/181067 |
- * @SmallTest |
- * @Feature({"Browser", "Main"}) |
*/ |
- @FlakyTest |
+ @SmallTest |
+ @Feature({"Browser", "Main"}) |
public void testKeyboardEnterAfterMovePastBottomItem() throws InterruptedException { |
moveToBoundary(false, true); |
- assertEquals(mAppMenu.getCount() - 1, mAppMenu.getCurrentFocusedPosition()); |
- hitEnterAndAssertItemSelected(); |
+ assertEquals(getCount() - 1, getCurrentFocusedRow()); |
+ hitEnterAndAssertAppMenuDismissed(); |
} |
/** |
* Test that hitting ENTER on the top item actually triggers the top item. |
* Catches regressions for https://crbug.com/191239 for shrunken menus. |
- * @SmallTest |
- * @Feature({"Browser", "Main"}) |
*/ |
- @FlakyTest |
+ @SmallTest |
+ @Feature({"Browser", "Main"}) |
public void testKeyboardMenuEnterOnTopItemLandscape() throws InterruptedException { |
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); |
moveToBoundary(true, false); |
- assertEquals(0, mAppMenu.getCurrentFocusedPosition()); |
- hitEnterAndAssertItemSelected(); |
+ assertEquals(0, getCurrentFocusedRow()); |
+ hitEnterAndAssertAppMenuDismissed(); |
} |
/** |
* Test that hitting ENTER on the top item doesn't crash Chrome. |
- * @SmallTest |
- * @Feature({"Browser", "Main"}) |
*/ |
- @FlakyTest |
+ @SmallTest |
+ @Feature({"Browser", "Main"}) |
public void testKeyboardMenuEnterOnTopItemPortrait() throws InterruptedException { |
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); |
moveToBoundary(true, false); |
- assertEquals(0, mAppMenu.getCurrentFocusedPosition()); |
- hitEnterAndAssertItemSelected(); |
+ assertEquals(0, getCurrentFocusedRow()); |
+ hitEnterAndAssertAppMenuDismissed(); |
} |
- private void hitEnterAndAssertItemSelected() throws InterruptedException { |
- final int expectedItemId = mAppMenu.getCurrentFocusedItemId(); |
+ private void hitEnterAndAssertAppMenuDismissed() throws InterruptedException { |
+ getInstrumentation().waitForIdleSync(); |
pressKey(KeyEvent.KEYCODE_ENTER); |
- assertTrue("Did not select a correct menu item", |
+ assertTrue("AppMenu did not dismiss", |
CriteriaHelper.pollForCriteria(new Criteria() { |
@Override |
public boolean isSatisfied() { |
- return mAppMenuHandler.mLastSelectedItemId == expectedItemId; |
+ return !mAppMenuHandler.isAppMenuShowing(); |
} |
})); |
} |
private void moveToBoundary(boolean towardsTop, boolean movePast) throws InterruptedException { |
// Move to the boundary. |
- final int end = towardsTop ? 0 : mAppMenu.getCount() - 1; |
+ final int end = towardsTop ? 0 : getCount() - 1; |
int increment = towardsTop ? -1 : 1; |
- for (int index = mAppMenu.getCurrentFocusedPosition(); index != end; index += increment) { |
+ for (int index = getCurrentFocusedRow(); index != end; index += increment) { |
pressKey(towardsTop ? KeyEvent.KEYCODE_DPAD_UP : KeyEvent.KEYCODE_DPAD_DOWN); |
final int expectedPosition = index + increment; |
assertTrue("Focus did not move to the next menu item", |
CriteriaHelper.pollForCriteria(new Criteria() { |
@Override |
public boolean isSatisfied() { |
- return mAppMenu.getCurrentFocusedPosition() == expectedPosition; |
+ return getCurrentFocusedRow() == expectedPosition; |
} |
})); |
} |
@@ -191,7 +200,7 @@ public class AppMenuTest extends ChromeShellTestBase { |
CriteriaHelper.pollForCriteria(new Criteria() { |
@Override |
public boolean isSatisfied() { |
- return mAppMenu.getCurrentFocusedPosition() == end; |
+ return getCurrentFocusedRow() == end; |
} |
})); |
} |
@@ -204,4 +213,17 @@ public class AppMenuTest extends ChromeShellTestBase { |
getInstrumentation().sendKeyDownUpSync(keycode); |
getInstrumentation().waitForIdleSync(); |
} |
+ |
+ private int getCurrentFocusedRow() { |
+ ListPopupWindow popup = mAppMenu.getPopup(); |
+ if (popup == null || popup.getListView() == null) return ListView.INVALID_POSITION; |
+ ListView listView = popup.getListView(); |
+ return listView.getSelectedItemPosition(); |
+ } |
+ |
+ private int getCount() { |
+ ListPopupWindow popup = mAppMenu.getPopup(); |
+ if (popup == null || popup.getListView() == null) return 0; |
+ return popup.getListView().getCount(); |
+ } |
} |