| Index: content/public/test/android/javatests/src/org/chromium/content/browser/test/util/DOMUtils.java
|
| diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/DOMUtils.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/DOMUtils.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fcac2b4378b3f7e50a2c1808bfe6766f4d83edab
|
| --- /dev/null
|
| +++ b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/DOMUtils.java
|
| @@ -0,0 +1,120 @@
|
| +// Copyright (c) 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.test.util;
|
| +
|
| +import android.graphics.Rect;
|
| +import android.test.ActivityInstrumentationTestCase2;
|
| +import android.test.InstrumentationTestCase;
|
| +import android.util.JsonReader;
|
| +
|
| +import java.io.IOException;
|
| +import java.io.StringReader;
|
| +
|
| +import junit.framework.Assert;
|
| +
|
| +import org.chromium.content.browser.ContentView;
|
| +
|
| +/**
|
| + * Collection of DOM-based utilities.
|
| + */
|
| +public class DOMUtils {
|
| +
|
| + /**
|
| + * Returns the rect boundaries for a node by its id.
|
| + */
|
| + public static Rect getNodeBounds(InstrumentationTestCase test, final ContentView view,
|
| + TestCallbackHelperContainer viewClient, String nodeId) throws Throwable {
|
| + StringBuilder sb = new StringBuilder();
|
| + sb.append("(function() {");
|
| + sb.append(" var node = document.getElementById('" + nodeId + "');");
|
| + sb.append(" if (!node) return null;");
|
| + sb.append(" var width = node.offsetWidth;");
|
| + sb.append(" var height = node.offsetHeight;");
|
| + sb.append(" var x = -window.scrollX;");
|
| + sb.append(" var y = -window.scrollY;");
|
| + sb.append(" do {");
|
| + sb.append(" x += node.offsetLeft;");
|
| + sb.append(" y += node.offsetTop;");
|
| + sb.append(" } while (node = node.offsetParent);");
|
| + sb.append(" return [ x, y, width, height ];");
|
| + sb.append("})();");
|
| +
|
| + String jsonText = JavaScriptUtils.executeJavaScriptAndWaitForResult(test, view, viewClient,
|
| + sb.toString());
|
| +
|
| + Assert.assertFalse("Failed to retrieve bounds for " + nodeId,
|
| + jsonText.trim().equalsIgnoreCase("null"));
|
| +
|
| + JsonReader jsonReader = new JsonReader(new StringReader(jsonText));
|
| + int[] bounds = new int[4];
|
| + try {
|
| + jsonReader.beginArray();
|
| + int i = 0;
|
| + while (jsonReader.hasNext()) {
|
| + bounds[i++] = jsonReader.nextInt();
|
| + }
|
| + jsonReader.endArray();
|
| + Assert.assertEquals("Invalid bounds returned.", 4, i);
|
| + } catch (IOException exception) {
|
| + Assert.fail("Failed to evaluate JavaScript: " + jsonText + "\n" + exception);
|
| + }
|
| + return new Rect(bounds[0], bounds[1], bounds[0] + bounds[2], bounds[1] + bounds[3]);
|
| + }
|
| +
|
| + /**
|
| + * Click a DOM node by its id.
|
| + */
|
| + public static void clickNode(ActivityInstrumentationTestCase2 activityTestCase,
|
| + final ContentView view, TestCallbackHelperContainer viewClient, String nodeId)
|
| + throws Throwable {
|
| + Rect bounds = getNodeBounds(activityTestCase, view, viewClient, nodeId);
|
| + Assert.assertNotNull("Failed to get DOM element bounds of '" + nodeId + "'.'", bounds);
|
| +
|
| + // TODO(leandrogracia): make this use view.getScale() once the correct value is available.
|
| + // WARNING: this will only work with a viewport fixed scale value of 1.0.
|
| + float scale = getDevicePixelRatio(activityTestCase, view, viewClient);
|
| + int clickX = (int)(bounds.exactCenterX() * scale + 0.5);
|
| + int clickY = (int)(bounds.exactCenterY() * scale + 0.5);
|
| +
|
| + TouchCommon touchCommon = new TouchCommon(activityTestCase.getActivity());
|
| + touchCommon.singleClickView(view, clickX, clickY);
|
| + }
|
| +
|
| + /**
|
| + * Long-press a DOM node by its id.
|
| + */
|
| + public static void longPressNode(ActivityInstrumentationTestCase2 activityTestCase,
|
| + final ContentView view, TestCallbackHelperContainer viewClient, String nodeId)
|
| + throws Throwable {
|
| + Rect bounds = getNodeBounds(activityTestCase, view, viewClient, nodeId);
|
| + Assert.assertNotNull("Failed to get DOM element bounds of '" + nodeId + "'.'", bounds);
|
| +
|
| + // TODO(leandrogracia): make this use view.getScale() once the correct value is available.
|
| + // WARNING: this will only work with a viewport fixed scale value of 1.0.
|
| + float scale = getDevicePixelRatio(activityTestCase, view, viewClient);
|
| + int clickX = (int)(bounds.exactCenterX() * scale + 0.5);
|
| + int clickY = (int)(bounds.exactCenterY() * scale + 0.5);
|
| +
|
| + TouchCommon touchCommon = new TouchCommon(activityTestCase.getActivity());
|
| + touchCommon.longPressView(view, clickX, clickY);
|
| + }
|
| +
|
| + /**
|
| + * Scrolls the view to ensure that the required DOM node is visible.
|
| + */
|
| + public static void scrollNodeIntoView(InstrumentationTestCase test, final ContentView view,
|
| + TestCallbackHelperContainer viewClient, String nodeId) throws Throwable {
|
| + JavaScriptUtils.executeJavaScriptAndWaitForResult(test, view, viewClient,
|
| + "document.getElementById('" + nodeId + "').scrollIntoView()");
|
| + }
|
| +
|
| + // This is a temporary workaround to make clickNode and longPressNode work under fixed viewport
|
| + // scale settings of 1.0 until the new compositor correctly provides the ContentView page scale.
|
| + private static float getDevicePixelRatio(InstrumentationTestCase test, final ContentView view,
|
| + TestCallbackHelperContainer viewClient) throws Throwable {
|
| + return Float.valueOf(JavaScriptUtils.executeJavaScriptAndWaitForResult(test, view,
|
| + viewClient, "window.devicePixelRatio"));
|
| + }
|
| +}
|
|
|