summaryrefslogtreecommitdiffstats
path: root/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/GeckoRequest.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/GeckoRequest.java')
-rw-r--r--mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/GeckoRequest.java94
1 files changed, 94 insertions, 0 deletions
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/GeckoRequest.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/GeckoRequest.java
new file mode 100644
index 000000000..a57ed7f08
--- /dev/null
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/GeckoRequest.java
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+package org.mozilla.gecko.util;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.mozilla.gecko.annotation.RobocopTarget;
+
+import android.util.Log;
+
+public abstract class GeckoRequest {
+ private static final String LOGTAG = "GeckoRequest";
+ private static final AtomicInteger currentId = new AtomicInteger(0);
+
+ private final int id = currentId.getAndIncrement();
+ private final String name;
+ private final String data;
+
+ /**
+ * Creates a request that can be dispatched using
+ * {@link GeckoAppShell#sendRequestToGecko(GeckoRequest)}.
+ *
+ * @param name The name of the event associated with this request, which must have a
+ * Gecko-side listener registered to respond to this request.
+ * @param data Data to send with this request, which can be any object serializable by
+ * {@link JSONObject#put(String, Object)}.
+ */
+ @RobocopTarget
+ public GeckoRequest(String name, Object data) {
+ this.name = name;
+ final JSONObject message = new JSONObject();
+ try {
+ message.put("id", id);
+ message.put("data", data);
+ } catch (JSONException e) {
+ Log.e(LOGTAG, "JSON error", e);
+ }
+ this.data = message.toString();
+ }
+
+ /**
+ * Gets the ID for this request.
+ *
+ * @return The request ID
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * Gets the event name associated with this request.
+ *
+ * @return The name of the event sent to Gecko
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Gets the stringified data associated with this request.
+ *
+ * @return The data being sent with the request
+ */
+ public String getData() {
+ return data;
+ }
+
+ /**
+ * Callback executed when the request succeeds.
+ *
+ * @param nativeJSObject The response data from Gecko
+ */
+ @RobocopTarget
+ public abstract void onResponse(NativeJSObject nativeJSObject);
+
+ /**
+ * Callback executed when the request fails.
+ *
+ * By default, an exception is thrown. This should be overridden if the
+ * GeckoRequest is able to recover from the error.
+ *
+ * @throws RuntimeException
+ */
+ @RobocopTarget
+ public void onError(NativeJSObject error) {
+ final String message = error.optString("message", "<no message>");
+ final String stack = error.optString("stack", "<no stack>");
+ throw new RuntimeException("Unhandled error for GeckoRequest " + name + ": " + message + "\nJS stack:\n" + stack);
+ }
+}