Index: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java |
index 6112be34e224d80e8ea6d69d70165874a9ea9491..49379709b4e6da0a73009f945697ab00820bc5f7 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java |
@@ -8,6 +8,7 @@ import android.annotation.SuppressLint; |
import android.graphics.Canvas; |
import android.graphics.Point; |
import android.os.StrictMode; |
+import android.util.SparseArray; |
import android.view.MotionEvent; |
import android.view.Surface; |
import android.view.SurfaceHolder; |
@@ -20,9 +21,13 @@ import android.widget.FrameLayout.LayoutParams; |
import com.google.vr.ndk.base.AndroidCompat; |
import com.google.vr.ndk.base.GvrLayout; |
+import org.json.JSONException; |
+import org.json.JSONObject; |
+ |
import org.chromium.base.CommandLine; |
import org.chromium.base.Log; |
import org.chromium.base.ThreadUtils; |
+import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
import org.chromium.chrome.browser.ChromeActivity; |
@@ -56,6 +61,9 @@ import org.chromium.ui.base.WindowAndroid; |
import org.chromium.ui.display.DisplayAndroid; |
import org.chromium.ui.display.VirtualDisplayAndroid; |
+import java.util.HashMap; |
+import java.util.Iterator; |
+ |
/** |
* This view extends from GvrLayout which wraps a GLSurfaceView that renders VR shell. |
*/ |
@@ -97,6 +105,10 @@ public class VrShellImpl |
private Surface mSurface; |
private View mPresentationView; |
+ private SparseArray<Runnable> mUiElementInfoReplyCallbacks; |
mthiesse
2017/03/30 14:25:38
Why do we need multiple callbacks at once? Seems u
bsheedy
2017/03/30 21:05:14
For testing, a single callback should be sufficien
|
+ private HashMap<String, JSONObject> mUiElementInfoJson; |
+ private int mCallbackCounter; |
+ |
// The tab that holds the main ContentViewCore. |
private Tab mTab; |
private NativePage mNativePage; |
@@ -628,6 +640,55 @@ public class VrShellImpl |
@Override |
public void removeWindowAndroidChangedObserver(WindowAndroidChangedObserver observer) {} |
+ @VisibleForTesting |
+ public WebContents getUiContentsForTesting() { |
+ return mUiContents; |
+ } |
+ |
+ // Lazily instantiate since we don't need it in most cases. |
+ private SparseArray<Runnable> getUiElementInfoReplyCallbacksForTesting() { |
+ if (mUiElementInfoReplyCallbacks == null) { |
+ mUiElementInfoReplyCallbacks = new SparseArray<Runnable>(); |
+ } |
+ return mUiElementInfoReplyCallbacks; |
+ } |
+ |
+ // Lazily instantiate since we don't need it in most cases. |
+ @VisibleForTesting |
+ public HashMap<String, JSONObject> getUiElementInfoJsonForTesting() { |
mthiesse
2017/03/30 14:25:39
Why expose this? Why not just create this object i
bsheedy
2017/03/30 21:05:14
Done.
|
+ if (mUiElementInfoJson == null) mUiElementInfoJson = new HashMap<String, JSONObject>(); |
+ return mUiElementInfoJson; |
+ } |
+ |
+ /** |
+ * Sends an asynchronous request for native UI element information. |
+ * @param elementIds The unique IDs of all the elements you want info on |
+ * @param onReply The runnable that will be run when native replies |
+ */ |
+ @VisibleForTesting |
+ public void requestUiElementInfoFromNativeForTesting(String[] elementNames, Runnable onReply) { |
+ getUiElementInfoReplyCallbacksForTesting().append(mCallbackCounter, onReply); |
+ nativeRequestUiElementInfoForTesting(mNativeVrShell, elementNames, mCallbackCounter); |
+ mCallbackCounter++; |
+ } |
+ |
+ @CalledByNative |
+ public void replyToUiElementInfoRequestForTesting(String jsonString, int callbackId) |
+ throws JSONException { |
+ JSONObject reply = new JSONObject(jsonString); |
+ HashMap<String, JSONObject> uiElementInfo = getUiElementInfoJsonForTesting(); |
+ for (Iterator<String> iter = reply.keys(); iter.hasNext();) { |
+ String key = iter.next(); |
+ uiElementInfo.put(key, reply.optJSONObject(key)); |
+ } |
+ SparseArray<Runnable> callbacks = getUiElementInfoReplyCallbacksForTesting(); |
+ Runnable callback = callbacks.get(callbackId); |
+ if (callback != null) { |
+ callback.run(); |
+ } |
+ callbacks.remove(callbackId); |
+ } |
+ |
private native long nativeInit(WebContents uiWebContents, long nativeContentWindowAndroid, |
long nativeUiWindowAndroid, boolean forWebVR, VrShellDelegate delegate, long gvrApi, |
boolean reprojectedRendering); |
@@ -654,4 +715,6 @@ public class VrShellImpl |
private native void nativeRestoreContentSurface(long nativeVrShell); |
private native void nativeSetHistoryButtonsEnabled( |
long nativeVrShell, boolean canGoBack, boolean canGoForward); |
+ private native void nativeRequestUiElementInfoForTesting( |
+ long nativeVrShell, String[] elementNames, int callbackId); |
} |