| Index: chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..18aeb087df99eb9b6763c3ef8d4e1d54df9a2296
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java
|
| @@ -0,0 +1,281 @@
|
| +// Copyright 2015 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.
|
| +
|
| +/**
|
| + * This is a simple framework for a test of an Application. See
|
| + * {@link android.test.ApplicationTestCase ApplicationTestCase} for more
|
| + * information on how to write and extend Application tests.
|
| + */
|
| +
|
| +package org.chromium.chrome.browser.widget.findinpage;
|
| +
|
| +import android.test.suitebuilder.annotation.MediumTest;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +import android.view.KeyCharacterMap;
|
| +import android.view.KeyEvent;
|
| +import android.view.View;
|
| +import android.widget.EditText;
|
| +import android.widget.TextView;
|
| +
|
| +import com.google.android.apps.chrome.R;
|
| +
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
|
| +import org.chromium.chrome.test.util.MenuUtils;
|
| +import org.chromium.chrome.test.util.TestHttpServerClient;
|
| +import org.chromium.content.browser.test.util.Criteria;
|
| +import org.chromium.content.browser.test.util.CriteriaHelper;
|
| +import org.chromium.content.browser.test.util.KeyUtils;
|
| +import org.chromium.content.browser.test.util.UiUtils;
|
| +
|
| +/**
|
| + * Find in page tests.
|
| + */
|
| +public class FindTest extends ChromeTabbedActivityTestBase {
|
| + private static final String FILEPATH = "chrome/test/data/android/find/test.html";
|
| +
|
| + /**
|
| + * Returns the FindResults text.
|
| + */
|
| + private String waitForFindResults(final String expectedResult) throws InterruptedException {
|
| + final TextView findResults = (TextView) getActivity().findViewById(R.id.find_status);
|
| + assertNotNull(expectedResult);
|
| + assertNotNull(findResults);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return expectedResult.equals(findResults.getText());
|
| + }
|
| + }));
|
| + return findResults.getText().toString();
|
| + }
|
| +
|
| + /**
|
| + * Find in page by invoking the 'find in page' menu item.
|
| + *
|
| + * @throws InterruptedException
|
| + */
|
| + private void findInPageFromMenu() throws InterruptedException {
|
| + MenuUtils.invokeCustomMenuActionSync(getInstrumentation(),
|
| + getActivity(), R.id.find_in_page_id);
|
| +
|
| + waitForFindInPageVisibility(true);
|
| + }
|
| +
|
| + private void waitForFindInPageVisibility(final boolean visible) throws InterruptedException {
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(
|
| + R.id.find_toolbar);
|
| +
|
| + boolean isVisible = findToolbar != null && findToolbar.isShown();
|
| + return (visible == isVisible) && !findToolbar.isAnimating();
|
| + }
|
| + }));
|
| + }
|
| +
|
| + private String findStringInPage(final String query, String expectedResult)
|
| + throws InterruptedException {
|
| + findInPageFromMenu();
|
| + // FindToolbar should automatically get focus.
|
| + assertTrue("FindToolbar should have focus",
|
| + getActivity().findViewById(R.id.find_query).hasFocus());
|
| + final TextView findQueryText = (TextView) getActivity().findViewById(R.id.find_query);
|
| + assertNotNull(findQueryText);
|
| + // We have to send each key 1-by-1 to trigger the right listeners in the toolbar.
|
| + KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
|
| + final KeyEvent[] events = keyCharacterMap.getEvents(query.toCharArray());
|
| + assertNotNull(events);
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + for (int i = 0; i < events.length; i++) {
|
| + if (!findQueryText.dispatchKeyEventPreIme(events[i])) {
|
| + findQueryText.dispatchKeyEvent(events[i]);
|
| + }
|
| + }
|
| + }
|
| + });
|
| + return waitForFindResults(expectedResult);
|
| + }
|
| +
|
| + private void loadTestAndVerifyFindInPage(String query, String expectedResult)
|
| + throws InterruptedException {
|
| + loadUrl(TestHttpServerClient.getUrl(FILEPATH));
|
| + String findResults = findStringInPage(query, expectedResult);
|
| + assertTrue("Expected: " + expectedResult + " Got: " + findResults + " for: "
|
| + + TestHttpServerClient.getUrl(FILEPATH),
|
| + findResults.contains(expectedResult));
|
| + }
|
| +
|
| + /**
|
| + * Verify Find In Page is not case sensitive.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage", "Main"})
|
| + public void testFind() throws InterruptedException {
|
| + loadTestAndVerifyFindInPage("pitts", "1/7");
|
| + }
|
| +
|
| + /**
|
| + * Verify Find In Page with just one result.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testFind101() throws InterruptedException {
|
| + loadTestAndVerifyFindInPage("it", "1/101");
|
| + }
|
| +
|
| + /**
|
| + * Verify Find In Page with a multi-line string.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testFindMultiLine() throws InterruptedException {
|
| + String multiLineSearchTerm = "This is the text of this document.\n"
|
| + + " I am going to write the word \'Pitts\' 7 times. (That was one.)";
|
| + loadTestAndVerifyFindInPage(multiLineSearchTerm, "1/1");
|
| + }
|
| +
|
| + /**
|
| + * Test for Find In Page with a multi-line string. Search string has an extra character
|
| + * added to the end so it should not be found.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testFindMultiLineFalse() throws InterruptedException {
|
| + String multiLineSearchTerm = "aThis is the text of this document.\n"
|
| + + " I am going to write the word \'Pitts\' 7 times. (That was one.)";
|
| + loadTestAndVerifyFindInPage(multiLineSearchTerm, "0/0");
|
| + }
|
| +
|
| + /**
|
| + * Verify Find In Page Next button.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testFindNext() throws InterruptedException {
|
| + String query = "pitts";
|
| + loadTestAndVerifyFindInPage(query, "1/7");
|
| + // TODO(jaydeepmehta): Verify number of results and match against boxes drawn.
|
| + singleClickView(getActivity().findViewById(R.id.find_next_button));
|
| + waitForFindResults("2/7");
|
| + for (int i = 2; i <= 7; i++) {
|
| + singleClickView(getActivity().findViewById(R.id.find_next_button));
|
| + }
|
| + waitForFindResults("1/7");
|
| + }
|
| +
|
| + /**
|
| + * Verify Find In Page Next/Previous button.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testFindNextPrevious() throws InterruptedException {
|
| + String query = "pitts";
|
| + loadTestAndVerifyFindInPage(query, "1/7");
|
| + // TODO(jaydeepmehta): Verify number of results and match against boxes drawn.
|
| + singleClickView(getActivity().findViewById(R.id.find_next_button));
|
| + waitForFindResults("2/7");
|
| + singleClickView(getActivity().findViewById(R.id.find_prev_button));
|
| + waitForFindResults("1/7");
|
| + }
|
| +
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testResultsBarInitiallyVisible() throws InterruptedException {
|
| + loadUrl(TestHttpServerClient.getUrl(FILEPATH));
|
| + findInPageFromMenu();
|
| + FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(R.id.find_toolbar);
|
| + View resultBar = findToolbar.getFindResultBar();
|
| + assertEquals(View.VISIBLE, resultBar.getVisibility());
|
| + }
|
| +
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testResultsBarVisibleAfterTypingText() throws InterruptedException {
|
| + loadUrl(TestHttpServerClient.getUrl(FILEPATH));
|
| + findInPageFromMenu();
|
| + FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(R.id.find_toolbar);
|
| + View resultBar = findToolbar.getFindResultBar();
|
| + assertNotNull(resultBar);
|
| + final TextView findQueryText = (TextView) findToolbar.findViewById(R.id.find_query);
|
| + assertNotNull(findQueryText);
|
| +
|
| + KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_T);
|
| + assertEquals(View.VISIBLE, resultBar.getVisibility());
|
| + KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_DEL);
|
| + assertEquals(View.VISIBLE, resultBar.getVisibility());
|
| + }
|
| +
|
| + /**
|
| + * Verify Find In Page isn't dismissed and matches no results
|
| + * if invoked with an empty string.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testFindDismissOnEmptyString() throws InterruptedException {
|
| + loadUrl(TestHttpServerClient.getUrl(FILEPATH));
|
| + findInPageFromMenu();
|
| +
|
| + FindToolbar findToolbar = (FindToolbar) getActivity().findViewById(R.id.find_toolbar);
|
| + assertNotNull(findToolbar);
|
| + assertEquals(View.VISIBLE, findToolbar.getVisibility());
|
| + final TextView findQueryText = (TextView) findToolbar.findViewById(R.id.find_query);
|
| + assertNotNull(findQueryText);
|
| + KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_T);
|
| + KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_DEL);
|
| + KeyUtils.singleKeyEventView(getInstrumentation(), findQueryText, KeyEvent.KEYCODE_ENTER);
|
| +
|
| + assertEquals(View.VISIBLE, findToolbar.getVisibility());
|
| +
|
| + String findResults = waitForFindResults("");
|
| + assertEquals(0, findResults.length());
|
| + }
|
| +
|
| + /**
|
| + * Verify FIP in IncognitoTabs.
|
| + */
|
| + @SmallTest
|
| + @Feature({"FindInPage"})
|
| + public void testFindNextPreviousIncognitoTab() throws InterruptedException {
|
| + String query = "pitts";
|
| + newIncognitoTabFromMenu();
|
| + loadTestAndVerifyFindInPage(query, "1/7");
|
| + // TODO(jaydeepmehta): Verify number of results and match against boxes drawn.
|
| + singleClickView(getActivity().findViewById(R.id.find_next_button));
|
| + waitForFindResults("2/7");
|
| + singleClickView(getActivity().findViewById(R.id.find_prev_button));
|
| + waitForFindResults("1/7");
|
| + }
|
| +
|
| + /**
|
| + * Verify Find in Page text isnt restored on Incognito Tabs.
|
| + */
|
| + @MediumTest
|
| + @Feature({"FindInPage"})
|
| + public void testFipTextNotRestoredIncognitoTab() throws InterruptedException {
|
| + newIncognitoTabFromMenu();
|
| + loadTestAndVerifyFindInPage("pitts", "1/7");
|
| + // close the fip
|
| + final View v = getActivity().findViewById(R.id.close_find_button);
|
| + singleClickView(v);
|
| + waitForFindInPageVisibility(false);
|
| +
|
| + // Reopen and check the text.
|
| + findInPageFromMenu();
|
| + UiUtils.settleDownUI(getInstrumentation());
|
| + // Verify the text content.
|
| + EditText e = (EditText) getActivity().findViewById(R.id.find_query);
|
| + String myText = e.getText().toString();
|
| + assertTrue("expected empty string : " + myText, myText.isEmpty());
|
| + }
|
| +
|
| + @Override
|
| + public void startMainActivity() throws InterruptedException {
|
| + startMainActivityOnBlankPage();
|
| + }
|
| +}
|
|
|