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

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

Issue 11593011: Add a new code/message path for moving an insertion handle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase + function rename Created 7 years, 11 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/InsertionHandleTest.java
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/InsertionHandleTest.java b/content/public/android/javatests/src/org/chromium/content/browser/InsertionHandleTest.java
index c1da521f65445d98d5803b6cc653fcb5e23bf852..8d207a371e16bc2a10cbbda937f61b8c8bf21079 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/InsertionHandleTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/InsertionHandleTest.java
@@ -14,12 +14,16 @@ import android.text.Selection;
import org.chromium.base.test.util.Feature;
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.TestCallbackHelperContainer;
import org.chromium.content.browser.test.util.TouchUtils;
import org.chromium.content_shell.ContentShellTestBase;
public class InsertionHandleTest extends ContentShellTestBase {
private static final String FILENAME = "content/insertion_handle/editable_long_text.html";
+ private static final String INPUT_TEXT_FILENAME = "content/insertion_handle/input_text.html";
+ private static final String INPUT_TEXT_ID = "input_text";
// Offset to compensate for the fact that the handle is below the text.
private static final int VERTICAL_OFFSET = 10;
// These positions should both be in the text area and not within
@@ -28,9 +32,43 @@ public class InsertionHandleTest extends ContentShellTestBase {
private static final int INITIAL_CLICK_Y = 100;
private static final int DRAG_TO_X = 287;
private static final int DRAG_TO_Y = 199;
- private static final int HANDLE_POSITION_TOLERANCE = 60;
+ private static final int HANDLE_POSITION_TOLERANCE = 40;
private static final String PASTE_TEXT = "**test text to paste**";
+ 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() + VERTICAL_OFFSET;
+ ContentView view = getContentView();
+
+ int fromLocation[] = TouchUtils.getAbsoluteLocationFromRelative(view, initialX, initialY);
+ int toLocation[] = TouchUtils.getAbsoluteLocationFromRelative(view, dragToX, dragToY);
+
+ long downTime = TouchUtils.dragStart(getInstrumentation(), fromLocation[0],
+ fromLocation[1]);
+ assertWaitForHandleDraggingEquals(true);
+ TouchUtils.dragTo(getInstrumentation(), fromLocation[0], toLocation[0], fromLocation[1],
+ toLocation[1], steps, downTime);
+ TouchUtils.dragEnd(getInstrumentation(), toLocation[0], toLocation[1], downTime);
+ assertWaitForHandleDraggingEquals(false);
+ }
+
+ 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;
+ }
+ }));
+ }
+
@MediumTest
@Feature({"TextSelection", "TextInput", "Main"})
public void testDragInsertionHandle() throws Throwable {
@@ -38,15 +76,8 @@ public class InsertionHandleTest extends ContentShellTestBase {
clickToShowInsertionHandle();
- InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
- HandleView handle = ihc.getHandleViewForTest();
- int initialX = handle.getPositionX();
- int initialY = handle.getPositionY();
-
- TouchUtils.dragCompleteView(getInstrumentation(), getContentView(), initialX, DRAG_TO_X,
- initialY + VERTICAL_OFFSET, DRAG_TO_Y, 5);
-
- assertTrue(waitForHandleNear(handle, DRAG_TO_X, DRAG_TO_Y));
+ dragHandleTo(DRAG_TO_X, DRAG_TO_Y);
+ assertWaitForHandleNear(DRAG_TO_X, DRAG_TO_Y);
// Unselecting should cause the handle to disappear.
getImeAdapter().unselect();
@@ -58,14 +89,15 @@ public class InsertionHandleTest extends ContentShellTestBase {
(Math.abs(handle.getPositionY() - y) < HANDLE_POSITION_TOLERANCE);
}
- private static boolean waitForHandleNear(final HandleView handle, final int x,
- final int y) throws Throwable {
- return CriteriaHelper.pollForCriteria(new Criteria() {
+ 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)
@@ -138,6 +170,88 @@ public class InsertionHandleTest extends ContentShellTestBase {
});
}
+ @MediumTest
+ @Feature({"TextSelection", "TextInput", "Main"})
+ public void testDragInsertionHandleInputText() throws Throwable {
+ startActivityWithTestUrl(INPUT_TEXT_FILENAME);
+
+ DOMUtils.clickNode(this, getContentView(),
+ new TestCallbackHelperContainer(getContentView()), INPUT_TEXT_ID);
+ TouchUtils.sleepForDoubleTapTimeout(getInstrumentation());
+ DOMUtils.clickNode(this, getContentView(),
+ new TestCallbackHelperContainer(getContentView()), INPUT_TEXT_ID);
+
+ assertTrue(waitForHandleShowingEquals(true));
+ assertWaitForZoomFinished();
+ assertTrue(waitForHandleViewStopped());
+
+ InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
+ HandleView handle = ihc.getHandleViewForTest();
+
+ int initialX = handle.getPositionX();
+ int initialY = handle.getPositionY() + VERTICAL_OFFSET;
+ int dragToX = initialX + 120;
+ int dragToY = initialY;
+ dragHandleTo(dragToX, dragToY);
+
+ assertTrue(waitForHandleViewStopped());
+ assertWaitForHandleNear(dragToX, initialY);
+
+ TouchUtils.sleepForDoubleTapTimeout(getInstrumentation());
+
+ initialX = handle.getPositionX();
+ initialY = handle.getPositionY() + VERTICAL_OFFSET;
+ dragToX = initialX - 120;
+ dragToY = initialY;
+ dragHandleTo(dragToX, dragToY);
+
+ assertTrue(waitForHandleViewStopped());
+ // Vertical drag should not change the y-position.
+ assertWaitForHandleNear(dragToX, initialY);
+ }
+
+ @MediumTest
+ @Feature({"TextSelection", "TextInput", "Main"})
+ public void testDragInsertionHandleInputTextOutsideBounds() throws Throwable {
+ startActivityWithTestUrl(INPUT_TEXT_FILENAME);
+
+ DOMUtils.clickNode(this, getContentView(),
+ new TestCallbackHelperContainer(getContentView()), INPUT_TEXT_ID);
+ TouchUtils.sleepForDoubleTapTimeout(getInstrumentation());
+ DOMUtils.clickNode(this, getContentView(),
+ new TestCallbackHelperContainer(getContentView()), INPUT_TEXT_ID);
+
+ assertTrue(waitForHandleShowingEquals(true));
+ assertWaitForZoomFinished();
+
+ InsertionHandleController ihc = getContentViewCore().getInsertionHandleControllerForTest();
+ HandleView handle = ihc.getHandleViewForTest();
+
+ getContentView().zoomReset();
+ assertWaitForZoomFinished();
+
+ // Quickly (i.e. few move events) drag the handle down and to the right. When this happens,
+ // the handle should stay vertically aligned with the drag position.
+ int initialX = handle.getPositionX();
+ int initialY = handle.getPositionY() + VERTICAL_OFFSET;
+ int dragToX = initialX;
+ int dragToY = initialY + 150;
+
+ // A vertical drag should not move the insertion handle.
+ dragHandleTo(dragToX, dragToY);
+ assertTrue(waitForHandleViewStopped());
+ // TODO(cjhopman): This currently does not work, dragging above or below will snap to the
+ // beginning/end of the editable. See http://crbug.com/169055
+ //assertWaitForHandleNear(initialX, initialY);
+
+ // The input box does not go to the edge of the screen, and neither should the insertion
+ // handle.
+ dragToX = getContentView().getWidth();
+ dragHandleTo(dragToX, dragToY);
+ assertTrue(waitForHandleViewStopped());
+ assertTrue(handle.getPositionX() < dragToX - 100);
+ }
+
@Override
protected void tearDown() throws Exception {
super.tearDown();
@@ -152,10 +266,24 @@ public class InsertionHandleTest extends ContentShellTestBase {
TouchUtils.singleClickView(getInstrumentation(), getContentView(), INITIAL_CLICK_X,
INITIAL_CLICK_Y);
assertTrue(waitForHandleShowingEquals(true));
- assertTrue(waitForZoomFinished());
+ assertWaitForZoomFinished();
+ }
+
+ private void assertWaitForZoomFinished() throws Throwable {
+ // If the polling interval is too short, slowly zooming may be detected as not zooming.
+ final int POLLING_INTERVAL = 200;
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
+ float mScale = -1;
+ @Override
+ public boolean isSatisfied() {
+ float lastScale = mScale;
+ mScale = getContentView().getScale();
+ return mScale == lastScale;
+ }
+ }, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL, POLLING_INTERVAL));
}
- private boolean waitForZoomFinished() throws Throwable {
+ private boolean waitForHandleViewStopped() throws Throwable {
// If the polling interval is too short, slowly zooming may be detected as not zooming.
final int POLLING_INTERVAL = 200;
return CriteriaHelper.pollForCriteria(new Criteria() {
@@ -170,7 +298,8 @@ public class InsertionHandleTest extends ContentShellTestBase {
HandleView handle = ihc.getHandleViewForTest();
mPositionX = handle.getPositionX();
mPositionY = handle.getPositionY();
- return mPositionX == lastPositionX && mPositionY == lastPositionY;
+ return !handle.isDragging() &&
+ mPositionX == lastPositionX && mPositionY == lastPositionY;
}
}, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL, POLLING_INTERVAL);
}

Powered by Google App Engine
This is Rietveld 408576698