Always emit children-changed, property-change, and state-changed events
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / event.c
index 65881fe..a616879 100644 (file)
@@ -35,7 +35,6 @@
 #include "common/spi-dbus.h"
 #include "event.h"
 #include "object.h"
-#include "dbus/dbus-glib-lowlevel.h"
 
 static GArray *listener_ids = NULL;
 
@@ -60,13 +59,11 @@ typedef struct _SpiReentrantCallClosure
 static void
 switch_main_context (GMainContext *cnx)
 {
-/* This code won't work on dbus-glib earlier than 0.9.0 because of FDO#30574 */
-  if (spi_global_app_data->app_bus_addr [0] == '\0')
-    return;
-
   GList *list;
 
+#ifndef DISABLE_P2P
   atspi_dbus_server_setup_with_g_main (spi_global_app_data->server, cnx);
+#endif
   atspi_dbus_connection_setup_with_g_main (spi_global_app_data->bus, cnx);
   for (list = spi_global_app_data->direct_connections; list; list = list->next)
     atspi_dbus_connection_setup_with_g_main (list->data, cnx);
@@ -231,7 +228,7 @@ convert_signal_name (const gchar * s)
 }
 
 static const void *
-replace_null (const gint type,
+validate_for_dbus (const gint type,
               const void *val)
 {
   switch (type)
@@ -240,6 +237,11 @@ replace_null (const gint type,
       case DBUS_TYPE_OBJECT_PATH:
           if (!val)
              return "";
+          else if (!g_utf8_validate (val, -1, NULL))
+             {
+              g_warning ("atk-bridge: Received bad UTF-8 string when emitting event");
+              return "";
+               }
           else
              return val;
       default:
@@ -256,7 +258,7 @@ append_basic (DBusMessageIter *iter,
 
   dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, type, &sub);
 
-    val = replace_null ((int) *type, val);
+    val = validate_for_dbus ((int) *type, val);
     dbus_message_iter_append_basic(&sub, (int) *type, &val);
 
   dbus_message_iter_close_container(iter, &sub);
@@ -361,6 +363,19 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor)
   data [2] = ensure_proper_format (minor);
   data [3] = NULL;
 
+  /* Hack: Always pass events that update the cache.
+   * TODO: FOr 2.2, have at-spi2-core define a special "cache listener" for
+   * this instead, so that we don't send these if no one is listening */
+  if (!g_strcmp0 (data [1], "ChildrenChanged") ||
+      !g_strcmp0 (data [1], "PropertyChange") ||
+      !g_strcmp0 (data [1], "StateChanged"))
+  {
+    g_free (data [2]);
+    g_free (data [1]);
+    g_free (data [0]);
+    return TRUE;
+  }
+
   /* Hack: events such as "object::text-changed::insert:system" as
      generated by Gecko */
   data [2][strcspn (data [2], ":")] = '\0';
@@ -374,6 +389,9 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor)
         }
     }
 
+#if 0
+  g_print("event: %s %s %s: %d\n", data[0], data[1], data[2], ret);
+#endif
   g_free (data [2]);
   g_free (data [1]);
   g_free (data [0]);
@@ -795,6 +813,8 @@ text_changed_event_listener (GSignalInvocationHint * signal_hint,
 
   emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
               DBUS_TYPE_STRING_AS_STRING, selected, append_basic);
+  g_free (selected);
+
   return TRUE;
 }