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

Unified Diff: content/public/test/android/javatests/src/org/chromium/content/browser/test/util/DOMUtils.java

Issue 11085008: [Android] Upstream content detection and ChromeBrowserProvider tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase after landing resources separately. Created 8 years, 2 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/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"));
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698