Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Unified Diff: content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java

Issue 335943002: [Android] Composited selection handle rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_native_handles_final
Patch Set: Fix animation tests Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java b/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java
deleted file mode 100644
index 562bd4c03942af78fe95aa57592f94def2ae7f02..0000000000000000000000000000000000000000
--- a/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java
+++ /dev/null
@@ -1,408 +0,0 @@
-// Copyright 2012 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.content.browser.input;
-
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.content.Context;
-import android.graphics.Rect;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.text.Editable;
-import android.text.Selection;
-import android.view.KeyEvent;
-import android.view.View;
-
-import org.chromium.base.test.util.DisabledTest;
-import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.UrlUtils;
-import org.chromium.content.browser.RenderCoordinates;
-import org.chromium.content.browser.test.util.Criteria;
-import org.chromium.content.browser.test.util.CriteriaHelper;
-import org.chromium.content.browser.test.util.DOMUtils;
-import org.chromium.content.browser.test.util.TestInputMethodManagerWrapper;
-import org.chromium.content.browser.test.util.TestTouchUtils;
-import org.chromium.content.browser.test.util.TouchCommon;
-import org.chromium.content_shell_apk.ContentShellTestBase;
-
-/**
- * Tests the insertion handle that allows users to paste text.
- */
-public class InsertionHandleTest extends ContentShellTestBase {
- private static final String META_DISABLE_ZOOM =
- "<meta name=\"viewport\" content=\"" +
- "height=device-height," +
- "width=device-width," +
- "initial-scale=1.0," +
- "minimum-scale=1.0," +
- "maximum-scale=1.0," +
- "\" />";
-
- private static final String TEXTAREA_ID = "textarea";
- private static final String TEXTAREA_DATA_URL = UrlUtils.encodeHtmlDataUri(
- "<html><head>" + META_DISABLE_ZOOM + "</head><body>" +
- "<textarea id=\"" + TEXTAREA_ID + "\" cols=\"20\" rows=\"10\">" +
- "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor " +
- "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud " +
- "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute " +
- "irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " +
- "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui " +
- "officia deserunt mollit anim id est laborum." +
- "</textarea>" +
- "</body></html>");
-
- private static final String INPUT_TEXT_ID = "input_text";
- private static final String INPUT_TEXT_DATA_URL = UrlUtils.encodeHtmlDataUri(
- "<html><head>" + META_DISABLE_ZOOM + "</head><body>" +
- "<input id=\"input_text\" type=\"text\" value=\"" +
- "T0D0(cjhopman): put amusing sample text here. Make sure it is at least " +
- "100 characters. 123456789012345678901234567890\" size=20></input>" +
- "</body></html>");
-
- // Offset to compensate for the fact that the handle is below the text.
- private static final int VERTICAL_OFFSET = 10;
- private static final int HANDLE_POSITION_TOLERANCE = 20;
- private static final String PASTE_TEXT = "**test text to paste**";
-
-
- public void launchWithUrl(String url) throws Throwable {
- launchContentShellWithUrl(url);
- assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading());
- assertWaitForPageScaleFactorMatch(1.0f);
-
- // The TestInputMethodManagerWrapper intercepts showSoftInput so that a keyboard is never
- // brought up.
- getContentViewCore().getImeAdapterForTest().setInputMethodManagerWrapper(
- new TestInputMethodManagerWrapper(getContentViewCore()));
- }
-
- @MediumTest
- @Feature({"TextSelection", "TextInput", "Main"})
- public void testUnselectHidesHandle() throws Throwable {
- launchWithUrl(TEXTAREA_DATA_URL);
- clickNodeToShowInsertionHandle(TEXTAREA_ID);
-
- // Unselecting should cause the handle to disappear.
- unselectOnMainSync();
- assertTrue(waitForHandleShowingEquals(false));
- }
-
- @MediumTest
- @Feature({"TextSelection", "TextInput", "Main"})
- public void testUpdateContainerViewAndUnselectHidesHandle() throws Throwable {
- launchWithUrl(TEXTAREA_DATA_URL);
- replaceContainerView();
-
- clickNodeToShowInsertionHandle(TEXTAREA_ID);
-
- // Unselecting should cause the handle to disappear.
- unselectOnMainSync();
- assertTrue(waitForHandleShowingEquals(false));
- }
-
- /**
- * @MediumTest
- * @Feature({"TextSelection", "TextInput", "Main"})
- * http://crbug.com/169648
- */
- @DisabledTest
- public void testKeyEventHidesHandle() throws Throwable {
- launchWithUrl(TEXTAREA_DATA_URL);
- clickNodeToShowInsertionHandle(TEXTAREA_ID);
-
- getInstrumentation().sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_X));
- getInstrumentation().sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_X));
- assertTrue(waitForHandleShowingEquals(false));
- }
-
- /**
- * @MediumTest
- * @Feature({"TextSelection", "TextInput", "Main"})
- * http://crbug.com/169648
- */
- @DisabledTest
- public void testDragInsertionHandle() throws Throwable {
- launchWithUrl(TEXTAREA_DATA_URL);
-
- clickNodeToShowInsertionHandle(TEXTAREA_ID);
-
- InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
- HandleView handle = ihc.getHandleViewForTest();
-
- int initialX = handle.getPositionX();
- int initialY = handle.getPositionY();
- int dragToX = initialX + 120;
- int dragToY = initialY + 120;
-
- dragHandleTo(dragToX, dragToY);
- assertWaitForHandleNear(dragToX, dragToY);
- }
-
-
- @MediumTest
- @Feature({"TextSelection", "TextInput", "Main"})
- public void testPasteAtInsertionHandle() throws Throwable {
- launchWithUrl(TEXTAREA_DATA_URL);
-
- clickNodeToShowInsertionHandle(TEXTAREA_ID);
-
- int offset = getSelectionStart();
- String initialText = getEditableText();
-
- saveToClipboard(PASTE_TEXT);
- pasteOnMainSync();
-
- String expectedText =
- initialText.substring(0, offset) + PASTE_TEXT + initialText.substring(offset);
- assertTrue(waitForEditableTextEquals(expectedText));
- assertTrue(waitForHandleShowingEquals(false));
- }
-
- /**
- * @MediumTest
- * @Feature({"TextSelection", "TextInput", "Main"})
- * http://crbug.com/169648
- */
- @DisabledTest
- public void testDragInsertionHandleInputText() throws Throwable {
- launchWithUrl(INPUT_TEXT_DATA_URL);
-
- clickNodeToShowInsertionHandle(INPUT_TEXT_ID);
-
- InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
- HandleView handle = ihc.getHandleViewForTest();
-
- int initialX = handle.getPositionX();
- int initialY = handle.getPositionY();
- int dragToX = initialX + 120;
- int dragToY = initialY;
- dragHandleTo(dragToX, dragToY);
- assertWaitForHandleNear(dragToX, initialY);
-
- TestTouchUtils.sleepForDoubleTapTimeout(getInstrumentation());
-
- initialX = handle.getPositionX();
- initialY = handle.getPositionY();
- dragToY = initialY + 120;
- dragHandleTo(initialX, dragToY);
- // Vertical drag should not change the y-position.
- assertWaitForHandleNear(initialX, initialY);
- }
-
- /**
- * @MediumTest
- * @Feature({"TextSelection", "TextInput", "Main"})
- * http://crbug.com/169648
- */
- @DisabledTest
- public void testDragInsertionHandleInputTextOutsideBounds() throws Throwable {
- launchWithUrl(INPUT_TEXT_DATA_URL);
-
- clickNodeToShowInsertionHandle(INPUT_TEXT_ID);
-
- InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
- HandleView handle = ihc.getHandleViewForTest();
-
- int initialX = handle.getPositionX();
- int initialY = handle.getPositionY();
- int dragToX = initialX;
- int dragToY = initialY + 150;
-
- // A vertical drag should not move the insertion handle.
- dragHandleTo(dragToX, dragToY);
- assertWaitForHandleNear(initialX, initialY);
-
- // The input box does not go to the edge of the screen, and neither should the insertion
- // handle.
- dragToX = getContentViewCore().getContainerView().getWidth();
- dragHandleTo(dragToX, dragToY);
- assertTrue(handle.getPositionX() < dragToX - 100);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- // No way to just clear clipboard, so setting to empty string instead.
- saveToClipboard("");
- }
-
- private void clickNodeToShowInsertionHandle(String nodeId) throws Throwable {
- // On the first click the keyboard will be displayed but no insertion handles. On the second
- // click (only if it changes the selection), the insertion handle is displayed. So that the
- // second click changes the selection, the two clicks should be in sufficiently different
- // locations.
- Rect nodeBounds = DOMUtils.getNodeBounds(getContentViewCore(), nodeId);
-
- RenderCoordinates renderCoordinates = getContentViewCore().getRenderCoordinates();
- int offsetX = getContentViewCore().getViewportSizeOffsetWidthPix();
- int offsetY = getContentViewCore().getViewportSizeOffsetHeightPix();
- float left = renderCoordinates.fromLocalCssToPix(nodeBounds.left) + offsetX;
- float right = renderCoordinates.fromLocalCssToPix(nodeBounds.right) + offsetX;
- float top = renderCoordinates.fromLocalCssToPix(nodeBounds.top) + offsetY;
- float bottom = renderCoordinates.fromLocalCssToPix(nodeBounds.bottom) + offsetY;
-
- TouchCommon touchCommon = new TouchCommon(this);
- touchCommon.singleClickView(getContentViewCore().getContainerView(),
- (int)(left + 3 * (right - left) / 4), (int)(top + (bottom - top) / 2));
-
-
- TestTouchUtils.sleepForDoubleTapTimeout(getInstrumentation());
- assertTrue(waitForHasSelectionPosition());
-
- // TODO(cjhopman): Wait for keyboard display finished?
- touchCommon.singleClickView(getContentViewCore().getContainerView(),
- (int)(left + (right - left) / 4), (int)(top + (bottom - top) / 2));
- assertTrue(waitForHandleShowingEquals(true));
- assertTrue(waitForHandleViewStopped());
- }
-
- private boolean waitForHandleViewStopped() throws Throwable {
- // If the polling interval is too short, slowly moving may be detected as not moving.
- final int POLLING_INTERVAL = 200;
- return CriteriaHelper.pollForCriteria(new Criteria() {
- int mPositionX = -1;
- int mPositionY = -1;
- @Override
- public boolean isSatisfied() {
- int lastPositionX = mPositionX;
- int lastPositionY = mPositionY;
- InsertionHandleController ihc =
- getContentViewCore().getInsertionHandleControllerForTest();
- HandleView handle = ihc.getHandleViewForTest();
- mPositionX = handle.getPositionX();
- mPositionY = handle.getPositionY();
- return !handle.isDragging() &&
- mPositionX == lastPositionX && mPositionY == lastPositionY;
- }
- }, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL, POLLING_INTERVAL);
- }
-
- private boolean waitForEditableTextEquals(final String expectedText)
- throws Throwable {
- return CriteriaHelper.pollForCriteria(new Criteria() {
- @Override
- public boolean isSatisfied() {
- return getEditableText().trim().equals(expectedText.trim());
- }
- });
- }
-
- private boolean waitForHasSelectionPosition()
- throws Throwable {
- return CriteriaHelper.pollForCriteria(new Criteria() {
- @Override
- public boolean isSatisfied() {
- int start = getSelectionStart();
- int end = getSelectionEnd();
- return start > 0 && start == end;
- }
- });
- }
-
- private void dragHandleTo(int dragToX, int dragToY, int steps) throws Throwable {
- InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
- HandleView handle = ihc.getHandleViewForTest();
- int initialX = handle.getPositionX();
- int initialY = handle.getPositionY();
- View view = getContentViewCore().getContainerView();
-
- int fromLocation[] = TestTouchUtils.getAbsoluteLocationFromRelative(view, initialX,
- initialY + VERTICAL_OFFSET);
- int toLocation[] = TestTouchUtils.getAbsoluteLocationFromRelative(view, dragToX,
- dragToY + VERTICAL_OFFSET);
-
- long downTime = TestTouchUtils.dragStart(getInstrumentation(), fromLocation[0],
- fromLocation[1]);
- assertWaitForHandleDraggingEquals(true);
- TestTouchUtils.dragTo(getInstrumentation(), fromLocation[0], toLocation[0],
- fromLocation[1], toLocation[1], steps, downTime);
- TestTouchUtils.dragEnd(getInstrumentation(), toLocation[0], toLocation[1], downTime);
- assertWaitForHandleDraggingEquals(false);
- assertTrue(waitForHandleViewStopped());
- }
-
- private void dragHandleTo(int dragToX, int dragToY) throws Throwable {
- dragHandleTo(dragToX, dragToY, 5);
- }
-
- private void assertWaitForHandleDraggingEquals(final boolean expected) throws Throwable {
- InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
- final HandleView handle = ihc.getHandleViewForTest();
- assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
- @Override
- public boolean isSatisfied() {
- return handle.isDragging() == expected;
- }
- }));
- }
-
- private static boolean isHandleNear(HandleView handle, int x, int y) {
- return (Math.abs(handle.getPositionX() - x) < HANDLE_POSITION_TOLERANCE) &&
- (Math.abs(handle.getPositionY() - VERTICAL_OFFSET - y) < HANDLE_POSITION_TOLERANCE);
- }
-
- private void assertWaitForHandleNear(final int x, final int y) throws Throwable {
- InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
- final HandleView handle = ihc.getHandleViewForTest();
- assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
- @Override
- public boolean isSatisfied() {
- return isHandleNear(handle, x, y);
- }
- }));
- }
-
- private boolean waitForHandleShowingEquals(final boolean shouldBeShowing)
- throws Throwable {
- return CriteriaHelper.pollForCriteria(new Criteria() {
- @Override
- public boolean isSatisfied() {
- InsertionHandleController ihc =
- getContentViewCore().getInsertionHandleControllerForTest();
- boolean isShowing = ihc != null && ihc.isShowing();
- return isShowing == shouldBeShowing;
- }
- });
- }
-
- private void pasteOnMainSync() {
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- getContentViewCore().getInsertionHandleControllerForTest().paste();
- }
- });
- }
-
- private void unselectOnMainSync() {
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- getContentViewCore().getImeAdapterForTest().unselect();
- }
- });
- }
-
- private int getSelectionStart() {
- return Selection.getSelectionStart(getEditable());
- }
-
- private int getSelectionEnd() {
- return Selection.getSelectionEnd(getEditable());
- }
-
- private Editable getEditable() {
- return getContentViewCore().getEditableForTest();
- }
-
- private String getEditableText() {
- return getEditable().toString();
- }
-
- private void saveToClipboard(String text) {
- ClipboardManager clipMgr =
- (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
- clipMgr.setPrimaryClip(ClipData.newPlainText(null, text));
- }
-}

Powered by Google App Engine
This is Rietveld 408576698