[epiphany/pgriffis/web-extension/api-cleanups: 17/20] WebExtensions: alarms: Port to json-glib




commit 65d262e873ff6376c5d081b422733320ad1681c4
Author: Patrick Griffis <pgriffis igalia com>
Date:   Sun Jul 3 20:39:54 2022 -0500

    WebExtensions: alarms: Port to json-glib

 src/webextension/api/alarms.c         | 102 +++++++++++++++-------------------
 src/webextension/ephy-json-utils.c    |  51 +++++++++++++++--
 src/webextension/ephy-json-utils.h    |  10 ++++
 src/webextension/ephy-web-extension.h |   2 +-
 4 files changed, 102 insertions(+), 63 deletions(-)
---
diff --git a/src/webextension/api/alarms.c b/src/webextension/api/alarms.c
index 003026625..8a4d4f8ca 100644
--- a/src/webextension/api/alarms.c
+++ b/src/webextension/api/alarms.c
@@ -23,6 +23,7 @@
 #include <time.h>
 
 #include "ephy-embed-utils.h"
+#include "ephy-json-utils.h"
 #include "ephy-shell.h"
 #include "ephy-window.h"
 
@@ -57,16 +58,6 @@ get_alarms (EphyWebExtension *extension)
   return alarms;
 }
 
-static gdouble
-get_double_property (JSCValue   *object,
-                     const char *name)
-{
-  g_autoptr (JSCValue) value = jsc_value_object_get_property (object, name);
-  if (jsc_value_is_number (value))
-    return jsc_value_to_double (value);
-  return 0.0;
-}
-
 static guint64
 time_now_ms (void)
 {
@@ -164,12 +155,12 @@ on_alarm_start (gpointer user_data)
 
 static void
 alarms_handler_create (EphyWebExtensionSender *sender,
-                        char                   *name,
-                        JSCValue               *args,
-                        GTask                  *task)
+                       const char             *method_name,
+                       JsonArray              *args,
+                       GTask                  *task)
 {
-  g_autoptr (JSCValue) alarm_name = NULL;
-  g_autoptr (JSCValue) alarm_info = NULL;
+  const char *name;
+  JsonObject *alarm_info;
   GHashTable *alarms = get_alarms (sender->extension);
   Alarm *alarm;
   double delay_in_minutes = 0.0;
@@ -178,19 +169,16 @@ alarms_handler_create (EphyWebExtensionSender *sender,
   g_autofree char *name_str = NULL;
 
   /* This takes two optional args, name:str, info:obj */
-  alarm_name = jsc_value_object_get_property_at_index (args, 0);
-  if (jsc_value_is_string (alarm_name)) {
-    name_str = jsc_value_to_string (alarm_name);
-    alarm_info = jsc_value_object_get_property_at_index (args, 1);
-  } else {
-    name_str = g_strdup ("");
-    alarm_info = g_steal_pointer (&alarm_name);
-  }
+  name = ephy_json_array_get_string (args, 0);
+  alarm_info = ephy_json_array_get_object (args, name ? 1 : 0);
+
+  if (!name)
+    name = "";
 
-  if (jsc_value_is_object (alarm_info)) {
-    delay_in_minutes = get_double_property (alarm_info, "delayInMinutes");
-    period_in_minutes = get_double_property (alarm_info, "periodInMinutes");
-    when = get_double_property (alarm_info, "when");
+  if (alarm_info) {
+    delay_in_minutes = ephy_json_object_get_double_with_default (alarm_info, "delayInMinutes", 0.0);
+    period_in_minutes = ephy_json_object_get_double_with_default (alarm_info, "periodInMinutes", 0.0);
+    when = ephy_json_object_get_double_with_default (alarm_info, "when", 0.0);
   }
 
   if (delay_in_minutes && when) {
@@ -201,7 +189,7 @@ alarms_handler_create (EphyWebExtensionSender *sender,
   alarm = g_new0 (Alarm, 1);
   alarm->repeat_interval_ms = minutes_to_ms (period_in_minutes);
   alarm->web_extension = sender->extension;
-  alarm->name = g_steal_pointer (&name_str);
+  alarm->name = g_strdup (name);
 
   if (delay_in_minutes) {
     alarm->timeout_id = g_timeout_add (minutes_to_ms (delay_in_minutes), on_alarm_start, alarm);
@@ -221,20 +209,14 @@ alarms_handler_create (EphyWebExtensionSender *sender,
 
 static void
 alarms_handler_clear (EphyWebExtensionSender *sender,
-                        char                   *name,
-                        JSCValue               *args,
-                        GTask                  *task)
+                      const char             *method_name,
+                      JsonArray              *args,
+                      GTask                  *task)
 {
   GHashTable *alarms = get_alarms (sender->extension);
-  g_autoptr (JSCValue) name_value = jsc_value_object_get_property_at_index (args, 0);
-  g_autofree char *name_str = NULL;
+  const char *name = ephy_json_array_get_string_with_default (args, 0, "");
 
-  if (!jsc_value_is_string (name_value))
-    name_str = g_strdup ("");
-  else
-    name_str = jsc_value_to_string (name_value);
-
-  if (g_hash_table_remove (alarms, name_str)) {
+  if (g_hash_table_remove (alarms, name)) {
     g_task_return_pointer (task, g_strdup ("true"), g_free);
     return;
   }
@@ -244,9 +226,9 @@ alarms_handler_clear (EphyWebExtensionSender *sender,
 
 static void
 alarms_handler_clear_all (EphyWebExtensionSender *sender,
-                        char                   *name,
-                        JSCValue               *args,
-                        GTask                  *task)
+                          const char             *method_name,
+                          JsonArray              *args,
+                          GTask                  *task)
 {
   GHashTable *alarms = get_alarms (sender->extension);
 
@@ -261,28 +243,30 @@ alarms_handler_clear_all (EphyWebExtensionSender *sender,
 
 static void
 alarms_handler_get (EphyWebExtensionSender *sender,
-                    char                   *name,
-                    JSCValue               *args,
+                    const char             *method_name,
+                    JsonArray              *args,
                     GTask                  *task)
 {
   GHashTable *alarms = get_alarms (sender->extension);
-  g_autoptr (JSCValue) name_value = jsc_value_object_get_property_at_index (args, 0);
-  g_autofree char *name_str = NULL;
+  const char *name = ephy_json_array_get_string (args, 0);
   Alarm *alarm;
 
-  if (!jsc_value_is_string (name_value))
-    name_str = g_strdup ("");
-  else
-    name_str = jsc_value_to_string (name_value);
+  if (!name)
+    name = "";
+
+  alarm = g_hash_table_lookup (alarms, name);
+  if (!alarm) {
+    g_task_return_pointer (task, NULL, NULL);
+    return;
+  }
 
-  alarm = g_hash_table_lookup (alarms, name_str);
   g_task_return_pointer (task, alarm_to_json (alarm), g_free);
 }
 
 static void
 alarms_handler_get_all (EphyWebExtensionSender *sender,
-                        char                   *name,
-                        JSCValue               *args,
+                        const char             *method_name,
+                        JsonArray              *args,
                         GTask                  *task)
 {
   GHashTable *alarms = get_alarms (sender->extension);
@@ -298,7 +282,7 @@ alarms_handler_get_all (EphyWebExtensionSender *sender,
   g_task_return_pointer (task, json_to_string (node, FALSE), g_free);
 }
 
-static EphyWebExtensionAsyncApiHandler alarms_handlers[] = {
+static EphyWebExtensionApiHandler alarms_handlers[] = {
   {"clear", alarms_handler_clear},
   {"clearAll", alarms_handler_clear_all},
   {"create", alarms_handler_create},
@@ -312,16 +296,22 @@ ephy_web_extension_api_alarms_handler (EphyWebExtensionSender *sender,
                                        JSCValue               *args,
                                        GTask                  *task)
 {
+  /* Temporary conversion as we migrate to json-glib here. */
+  g_autofree char *json = jsc_value_to_json (args, 0);
+  g_autoptr (JsonNode) json_node = json_from_string (json, NULL);
+  JsonArray *json_args = json_node_get_array (json_node);
+  json_array_seal (json_args);
+
   if (!ephy_web_extension_has_permission (sender->extension, "alarms")) {
     g_task_return_new_error (task, WEB_EXTENSION_ERROR, WEB_EXTENSION_ERROR_PERMISSION_DENIED, "alarms: 
Permission Denied");
     return;
   }
 
   for (guint idx = 0; idx < G_N_ELEMENTS (alarms_handlers); idx++) {
-    EphyWebExtensionAsyncApiHandler handler = alarms_handlers[idx];
+    EphyWebExtensionApiHandler handler = alarms_handlers[idx];
 
     if (g_strcmp0 (handler.name, name) == 0) {
-      handler.execute (sender, name, args, task);
+      handler.execute (sender, name, json_args, task);
       return;
     }
   }
diff --git a/src/webextension/ephy-json-utils.c b/src/webextension/ephy-json-utils.c
index 1f1cbccb8..a3f3fa36a 100644
--- a/src/webextension/ephy-json-utils.c
+++ b/src/webextension/ephy-json-utils.c
@@ -72,26 +72,44 @@ ephy_json_object_get_int (JsonObject *object,
  * ephy_json_object_get_double:
  * @object: A valid #JsonObject
  * @name: The member name
+ * @default: Default value
  *
  * This safely looks up a double member of a #JsonObject.
  *
- * Returns: A number or `-1.0` if member was missing or not a number.
+ * Returns: A number or @default if member was missing or not a number.
  */
 double
-ephy_json_object_get_double (JsonObject *object,
-                             const char *name)
+ephy_json_object_get_double_with_default (JsonObject *object,
+                                          const char *name,
+                                          double      default_value)
 {
   JsonNode *node = json_object_get_member (object, name);
 
   if (!node || !JSON_NODE_HOLDS_VALUE (node))
-    return -1;
+    return default_value;
 
   if (json_node_get_value_type (node) != G_TYPE_DOUBLE)
-    return -1;
+    return default_value;
 
   return json_node_get_int (node);
 }
 
+/**
+ * ephy_json_object_get_double:
+ * @object: A valid #JsonObject
+ * @name: The member name
+ *
+ * This safely looks up a double member of a #JsonObject.
+ *
+ * Returns: A number or `-1.0` if member was missing or not a number.
+ */
+double
+ephy_json_object_get_double (JsonObject *object,
+                             const char *name)
+{
+  return ephy_json_object_get_double_with_default (object, name, -1.0);
+}
+
 /**
  * ephy_json_object_get_array:
  * @object: A valid #JsonObject
@@ -142,7 +160,7 @@ ephy_json_object_get_object (JsonObject *object,
  *
  * This safely looks up a boolean member of a #JsonObject.
  *
- * Returns: A number or @default if member was missing or not a boolean.
+ * Returns: A number or @default_value if member was missing or not a boolean.
  */
 gboolean
 ephy_json_object_get_boolean (JsonObject *object,
@@ -197,6 +215,27 @@ ephy_json_node_to_string (JsonNode *node)
   return json_node_get_string (node);
 }
 
+/**
+ * ephy_json_array_get_string_with_default:
+ * @array: A #JsonArray
+ * @default_value: Default string value
+ *
+ * This safely gets a string from an array.
+ *
+ * Returns: (transfer none): A string or @default_value if not a string.
+ */
+const char *
+ephy_json_array_get_string_with_default (JsonArray  *array,
+                                         guint       index,
+                                         const char *default_value)
+{
+  const char *value = ephy_json_node_to_string (json_array_get_element (array, index));
+  if (!value)
+    return default_value;
+
+  return value;
+}
+
 /**
  * ephy_json_array_get_string:
  * @array: A #JsonArray
diff --git a/src/webextension/ephy-json-utils.h b/src/webextension/ephy-json-utils.h
index 04c9f42f5..86e78eb5b 100644
--- a/src/webextension/ephy-json-utils.h
+++ b/src/webextension/ephy-json-utils.h
@@ -32,6 +32,11 @@ gboolean      ephy_json_object_get_boolean          (JsonObject          *object
 double        ephy_json_object_get_double           (JsonObject          *object,
                                                      const char          *name);
 
+double        ephy_json_object_get_double_with_default
+                                                    (JsonObject          *object,
+                                                     const char          *name,
+                                                     double               default_value);
+
 gint64        ephy_json_object_get_int              (JsonObject          *object,
                                                      const char          *name);
 
@@ -48,5 +53,10 @@ const char   *ephy_json_node_to_string              (JsonNode            *node);
 const char   *ephy_json_array_get_string            (JsonArray           *array,
                                                      guint                index);
 
+const char   *ephy_json_array_get_string_with_default
+                                                    (JsonArray           *array,
+                                                     guint                index,
+                                                     const char          *default_value);
+
 JsonObject   *ephy_json_array_get_object            (JsonArray           *array,
                                                      guint                index);
diff --git a/src/webextension/ephy-web-extension.h b/src/webextension/ephy-web-extension.h
index c9f470a91..b9c9952c2 100644
--- a/src/webextension/ephy-web-extension.h
+++ b/src/webextension/ephy-web-extension.h
@@ -58,7 +58,7 @@ typedef char *(*executeHandler)(EphyWebExtensionSender  *sender,
                                 GError                 **error);
 
 typedef void (*EphyApiExecuteFunc)(EphyWebExtensionSender *sender,
-                                   char                   *name,
+                                   const char             *method_name,
                                    JsonArray              *args,
                                    GTask                  *task);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]