| Index: chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
 | 
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
 | 
| index b8313e57918732ca8ea8682faf0e283b6f9c5298..be60094217da5db1ae4a1c03b055193bc6dd43fc 100644
 | 
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
 | 
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
 | 
| @@ -9,11 +9,6 @@
 | 
|  import android.view.View;
 | 
|  import android.view.ViewGroup;
 | 
|  import android.widget.HorizontalScrollView;
 | 
| -
 | 
| -import org.junit.Assert;
 | 
| -import org.junit.Rule;
 | 
| -import org.junit.Test;
 | 
| -import org.junit.runner.RunWith;
 | 
|  
 | 
|  import org.chromium.base.ThreadUtils;
 | 
|  import org.chromium.base.test.util.CommandLineFlags;
 | 
| @@ -25,8 +20,7 @@
 | 
|  import org.chromium.chrome.browser.ChromeActivity;
 | 
|  import org.chromium.chrome.browser.ChromeSwitches;
 | 
|  import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 | 
| -import org.chromium.chrome.test.ChromeActivityTestRule;
 | 
| -import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 | 
| +import org.chromium.chrome.test.ChromeActivityTestCaseBase;
 | 
|  import org.chromium.content.browser.ContentViewCore;
 | 
|  import org.chromium.content.browser.test.util.Criteria;
 | 
|  import org.chromium.content.browser.test.util.CriteriaHelper;
 | 
| @@ -42,16 +36,9 @@
 | 
|  /**
 | 
|   * Integration tests for autofill keyboard accessory.
 | 
|   */
 | 
| -@RunWith(ChromeJUnit4ClassRunner.class)
 | 
| +@CommandLineFlags.Add({ChromeSwitches.ENABLE_AUTOFILL_KEYBOARD_ACCESSORY})
 | 
|  @RetryOnFailure
 | 
| -@CommandLineFlags.Add({ChromeSwitches.ENABLE_AUTOFILL_KEYBOARD_ACCESSORY,
 | 
| -        ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
 | 
| -        ChromeActivityTestRule.DISABLE_NETWORK_PREDICTION_FLAG})
 | 
| -public class AutofillKeyboardAccessoryTest {
 | 
| -    @Rule
 | 
| -    public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
 | 
| -            new ChromeActivityTestRule<>(ChromeActivity.class);
 | 
| -
 | 
| +public class AutofillKeyboardAccessoryTest extends ChromeActivityTestCaseBase<ChromeActivity> {
 | 
|      private final AtomicReference<ContentViewCore> mViewCoreRef =
 | 
|              new AtomicReference<ContentViewCore>();
 | 
|      private final AtomicReference<WebContents> mWebContentsRef = new AtomicReference<WebContents>();
 | 
| @@ -59,10 +46,18 @@
 | 
|      private final AtomicReference<ViewGroup> mKeyboardAccessoryRef =
 | 
|              new AtomicReference<ViewGroup>();
 | 
|  
 | 
| +    public AutofillKeyboardAccessoryTest() {
 | 
| +        super(ChromeActivity.class);
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    public void startMainActivity() throws InterruptedException {}
 | 
| +
 | 
|      private void loadTestPage(boolean isRtl) throws InterruptedException, ExecutionException,
 | 
|              TimeoutException {
 | 
| -        mActivityTestRule.startMainActivityWithURL(UrlUtils.encodeHtmlDataUri("<html"
 | 
| -                + (isRtl ? " dir=\"rtl\"" : "") + "><head>"
 | 
| +        startMainActivityWithURL(UrlUtils.encodeHtmlDataUri("<html"
 | 
| +                + (isRtl ? " dir=\"rtl\"" : "")
 | 
| +                + "><head>"
 | 
|                  + "<meta name=\"viewport\""
 | 
|                  + "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>"
 | 
|                  + "<body><form method=\"POST\">"
 | 
| @@ -95,12 +90,11 @@
 | 
|          ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
|              @Override
 | 
|              public void run() {
 | 
| -                mViewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore());
 | 
| +                mViewCoreRef.set(getActivity().getCurrentContentViewCore());
 | 
|                  mWebContentsRef.set(mViewCoreRef.get().getWebContents());
 | 
|                  mContainerRef.set(mViewCoreRef.get().getContainerView());
 | 
| -                mKeyboardAccessoryRef.set(mActivityTestRule.getActivity()
 | 
| -                                                  .getWindowAndroid()
 | 
| -                                                  .getKeyboardAccessoryView());
 | 
| +                mKeyboardAccessoryRef.set(
 | 
| +                        getActivity().getWindowAndroid().getKeyboardAccessoryView());
 | 
|              }
 | 
|          });
 | 
|          DOMUtils.waitForNonZeroNodeBounds(mWebContentsRef.get(), "fn");
 | 
| @@ -109,49 +103,42 @@
 | 
|      /**
 | 
|       * Autofocused fields should not show a keyboard accessory.
 | 
|       */
 | 
| -    @Test
 | 
| -    @MediumTest
 | 
| -    @Feature({"keyboard-accessory"})
 | 
| -    public void testAutofocusedFieldDoesNotShowKeyboardAccessory()
 | 
| -            throws InterruptedException, ExecutionException, TimeoutException {
 | 
| +    @MediumTest
 | 
| +    @Feature({"keyboard-accessory"})
 | 
| +    public void testAutofocusedFieldDoesNotShowKeyboardAccessory() throws InterruptedException,
 | 
| +           ExecutionException, TimeoutException {
 | 
|          loadTestPage(false);
 | 
| -        Assert.assertTrue("Keyboard accessory should be hidden.",
 | 
| -                ThreadUtils
 | 
| -                        .runOnUiThreadBlocking(new Callable<Boolean>() {
 | 
| -                            @Override
 | 
| -                            public Boolean call() {
 | 
| -                                return mKeyboardAccessoryRef.get().getVisibility() == View.GONE;
 | 
| -                            }
 | 
| -                        })
 | 
| -                        .booleanValue());
 | 
| +        assertTrue("Keyboard accessory should be hidden.",
 | 
| +                ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
 | 
| +                    @Override
 | 
| +                    public Boolean call() {
 | 
| +                        return mKeyboardAccessoryRef.get().getVisibility() == View.GONE;
 | 
| +                    }
 | 
| +                }).booleanValue());
 | 
|      }
 | 
|  
 | 
|      /**
 | 
|       * Tapping on an input field should show a keyboard and its keyboard accessory.
 | 
|       */
 | 
| -    @Test
 | 
| -    @MediumTest
 | 
| -    @Feature({"keyboard-accessory"})
 | 
| -    public void testTapInputFieldShowsKeyboardAccessory()
 | 
| -            throws ExecutionException, InterruptedException, TimeoutException {
 | 
| +    @MediumTest
 | 
| +    @Feature({"keyboard-accessory"})
 | 
| +    public void testTapInputFieldShowsKeyboardAccessory() throws ExecutionException,
 | 
| +             InterruptedException, TimeoutException {
 | 
|          loadTestPage(false);
 | 
|          DOMUtils.clickNode(mViewCoreRef.get(), "fn");
 | 
|          CriteriaHelper.pollUiThread(new Criteria("Keyboard should be showing.") {
 | 
|              @Override
 | 
|              public boolean isSatisfied() {
 | 
| -                return UiUtils.isKeyboardShowing(
 | 
| -                        mActivityTestRule.getActivity(), mContainerRef.get());
 | 
| -            }
 | 
| -        });
 | 
| -        Assert.assertTrue("Keyboard accessory should be showing.",
 | 
| -                ThreadUtils
 | 
| -                        .runOnUiThreadBlocking(new Callable<Boolean>() {
 | 
| -                            @Override
 | 
| -                            public Boolean call() {
 | 
| -                                return mKeyboardAccessoryRef.get().getVisibility() == View.VISIBLE;
 | 
| -                            }
 | 
| -                        })
 | 
| -                        .booleanValue());
 | 
| +                return UiUtils.isKeyboardShowing(getActivity(), mContainerRef.get());
 | 
| +            }
 | 
| +        });
 | 
| +        assertTrue("Keyboard accessory should be showing.",
 | 
| +                ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
 | 
| +                    @Override
 | 
| +                    public Boolean call() {
 | 
| +                        return mKeyboardAccessoryRef.get().getVisibility() == View.VISIBLE;
 | 
| +                    }
 | 
| +                }).booleanValue());
 | 
|      }
 | 
|  
 | 
|      /**
 | 
| @@ -161,17 +148,15 @@
 | 
|      @MediumTest
 | 
|      @Feature({"keyboard-accessory"})
 | 
|      */
 | 
| -    @Test
 | 
|      @FlakyTest(message = "https://crbug.com/563640")
 | 
| -    public void testSwitchFieldsRescrollsKeyboardAccessory()
 | 
| -            throws ExecutionException, InterruptedException, TimeoutException {
 | 
| +    public void testSwitchFieldsRescrollsKeyboardAccessory() throws ExecutionException,
 | 
| +             InterruptedException, TimeoutException {
 | 
|          loadTestPage(false);
 | 
|          DOMUtils.clickNode(mViewCoreRef.get(), "fn");
 | 
|          CriteriaHelper.pollUiThread(new Criteria("Keyboard should be showing.") {
 | 
|              @Override
 | 
|              public boolean isSatisfied() {
 | 
| -                return UiUtils.isKeyboardShowing(
 | 
| -                        mActivityTestRule.getActivity(), mContainerRef.get());
 | 
| +                return UiUtils.isKeyboardShowing(getActivity(), mContainerRef.get());
 | 
|              }
 | 
|          });
 | 
|          ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
| @@ -212,19 +197,17 @@
 | 
|       * RTL is only supported on Jelly Bean MR 1+.
 | 
|       * http://android-developers.blogspot.com/2013/03/native-rtl-support-in-android-42.html
 | 
|       */
 | 
| -    @Test
 | 
|      @MediumTest
 | 
|      @Feature({"keyboard-accessory"})
 | 
|      @MinAndroidSdkLevel(Build.VERSION_CODES.JELLY_BEAN_MR1)
 | 
| -    public void testSwitchFieldsRescrollsKeyboardAccessoryRtl()
 | 
| -            throws ExecutionException, InterruptedException, TimeoutException {
 | 
| +    public void testSwitchFieldsRescrollsKeyboardAccessoryRtl() throws ExecutionException,
 | 
| +             InterruptedException, TimeoutException {
 | 
|          loadTestPage(true);
 | 
|          DOMUtils.clickNode(mViewCoreRef.get(), "fn");
 | 
|          CriteriaHelper.pollUiThread(new Criteria("Keyboard should be showing.") {
 | 
|              @Override
 | 
|              public boolean isSatisfied() {
 | 
| -                return UiUtils.isKeyboardShowing(
 | 
| -                        mActivityTestRule.getActivity(), mContainerRef.get());
 | 
| +                return UiUtils.isKeyboardShowing(getActivity(), mContainerRef.get());
 | 
|              }
 | 
|          });
 | 
|          ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
| @@ -268,18 +251,16 @@
 | 
|       * Selecting a keyboard accessory suggestion should hide the keyboard and its keyboard
 | 
|       * accessory.
 | 
|       */
 | 
| -    @Test
 | 
| -    @MediumTest
 | 
| -    @Feature({"keyboard-accessory"})
 | 
| -    public void testSelectSuggestionHidesKeyboardAccessory()
 | 
| -            throws ExecutionException, InterruptedException, TimeoutException {
 | 
| +    @MediumTest
 | 
| +    @Feature({"keyboard-accessory"})
 | 
| +    public void testSelectSuggestionHidesKeyboardAccessory() throws ExecutionException,
 | 
| +             InterruptedException, TimeoutException {
 | 
|          loadTestPage(false);
 | 
|          DOMUtils.clickNode(mViewCoreRef.get(), "fn");
 | 
|          CriteriaHelper.pollUiThread(new Criteria("Keyboard should be showing.") {
 | 
|              @Override
 | 
|              public boolean isSatisfied() {
 | 
| -                return UiUtils.isKeyboardShowing(
 | 
| -                        mActivityTestRule.getActivity(), mContainerRef.get());
 | 
| +                return UiUtils.isKeyboardShowing(getActivity(), mContainerRef.get());
 | 
|              }
 | 
|          });
 | 
|          ThreadUtils.runOnUiThreadBlocking(new Runnable() {
 | 
| @@ -294,19 +275,16 @@
 | 
|          CriteriaHelper.pollUiThread(new Criteria("Keyboard should be hidden.") {
 | 
|              @Override
 | 
|              public boolean isSatisfied() {
 | 
| -                return !UiUtils.isKeyboardShowing(
 | 
| -                        mActivityTestRule.getActivity(), mContainerRef.get());
 | 
| -            }
 | 
| -        });
 | 
| -        Assert.assertTrue("Keyboard accessory should be hidden.",
 | 
| -                ThreadUtils
 | 
| -                        .runOnUiThreadBlocking(new Callable<Boolean>() {
 | 
| -                            @Override
 | 
| -                            public Boolean call() {
 | 
| -                                return mKeyboardAccessoryRef.get().getVisibility() == View.GONE;
 | 
| -                            }
 | 
| -                        })
 | 
| -                        .booleanValue());
 | 
| +                return !UiUtils.isKeyboardShowing(getActivity(), mContainerRef.get());
 | 
| +            }
 | 
| +        });
 | 
| +        assertTrue("Keyboard accessory should be hidden.",
 | 
| +                ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
 | 
| +                    @Override
 | 
| +                    public Boolean call() {
 | 
| +                        return mKeyboardAccessoryRef.get().getVisibility() == View.GONE;
 | 
| +                    }
 | 
| +                }).booleanValue());
 | 
|      }
 | 
|  
 | 
|      private View getSuggestionAt(int index) {
 | 
| 
 |