[epiphany/pgriffis/web-extension/api-cleanups: 17/20] WebExtensions: alarms: Port to json-glib
- From: Patrick Griffis <pgriffis src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/pgriffis/web-extension/api-cleanups: 17/20] WebExtensions: alarms: Port to json-glib
- Date: Wed, 6 Jul 2022 01:22:17 +0000 (UTC)
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]