diff options
author | Mike Gorse <mgorse@suse.com> | 2022-04-07 12:43:59 -0500 |
---|---|---|
committer | Mike Gorse <mgorse@suse.com> | 2022-04-08 09:09:56 -0500 |
commit | 4766e3be06cef19c7bc647eae0a3af61b254dc38 (patch) | |
tree | 2f73fae165d00492c7cbfba736d7b4548d3b5b30 /atk-adaptor/bridge.c | |
parent | 6a36042d828c8edc3976eec6deb9a4e7a7a7b037 (diff) | |
download | at-spi2-atk-4766e3be06cef19c7bc647eae0a3af61b254dc38.tar.gz |
droute: handle unimplemented interfaces for GetAll and introspection
The iterator for retrieving all properties doesn't handle a getter failing,
which happens if the AtkObject doesn't implement the atk interface
corresponding to the dbus interface. This leads to the application aborting
on account of a malformed DBusMessage.
Helps #20
Diffstat (limited to 'atk-adaptor/bridge.c')
-rw-r--r-- | atk-adaptor/bridge.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/atk-adaptor/bridge.c b/atk-adaptor/bridge.c index bdb4c70..f808acb 100644 --- a/atk-adaptor/bridge.c +++ b/atk-adaptor/bridge.c @@ -980,6 +980,45 @@ spi_atk_activate () } } +static gboolean +spi_object_has_dbus_interface (void *obj, const char *interface) +{ + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_ACCESSIBLE)) + return TRUE; + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_ACTION)) + return ATK_IS_ACTION (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_COLLECTION)) + return TRUE; + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_COMPONENT)) + return ATK_IS_COMPONENT (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_DOCUMENT)) + return ATK_IS_DOCUMENT (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_EDITABLE_TEXT)) + return ATK_IS_EDITABLE_TEXT (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_HYPERLINK)) + return ATK_IS_HYPERLINK (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_HYPERTEXT)) + return ATK_IS_HYPERTEXT (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_IMAGE)) + return ATK_IS_IMAGE (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_SELECTION)) + return ATK_IS_SELECTION (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_SOCKET)) + return TRUE; + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_TABLE)) + return ATK_IS_TABLE (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_TABLE_CELL)) + return ATK_IS_TABLE_CELL (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_TEXT)) + return ATK_IS_TEXT (obj); + if (!strcmp (interface, ATSPI_DBUS_INTERFACE_VALUE)) + return ATK_IS_VALUE (obj); + + return FALSE; + + return TRUE; +} + /** * atk_bridge_adaptor_init: initializes the atk bridge adaptor * @@ -1090,7 +1129,8 @@ atk_bridge_adaptor_init (gint * argc, gchar ** argv[]) introspect_children_cb, NULL, (DRouteGetDatumFunction) - spi_global_register_path_to_object); + spi_global_register_path_to_object, + spi_object_has_dbus_interface); /* Register all interfaces with droute and set up application accessible db */ |