Lease objects that send events if they are not cached
authorMike Gorse <mgorse@novell.com>
Thu, 3 Jun 2010 18:19:24 +0000 (14:19 -0400)
committerMike Gorse <mgorse@novell.com>
Thu, 3 Jun 2010 18:56:15 +0000 (14:56 -0400)
When sending an event, lease it if it is not in the cache, except for
children-changed events, which should update the cache.
This helps prevent errors with Firefox, which can send property-changed
events on a progress bar that was never otherwise exposed.

atk-adaptor/event.c
atk-adaptor/object.c
atk-adaptor/object.h

index 69de709..3babc2f 100644 (file)
@@ -345,6 +345,9 @@ emit_event (AtkObject  *obj,
 
   dbus_connection_send(bus, sig, NULL);
   dbus_message_unref(sig);
+
+  if (g_strcmp0 (cname, "ChildrenChanged") != 0)
+    spi_object_lease_if_needed (G_OBJECT (obj));
 }
 
 /*---------------------------------------------------------------------------*/
index 2247467..04e456f 100644 (file)
@@ -55,8 +55,8 @@
  * This function will simply look for all the accessibles that the cache object
  * has not found and assume that they need to be leased.
  */
-static void
-maybe_lease (GObject *obj)
+void
+spi_object_lease_if_needed (GObject *obj)
 {
   if (!spi_cache_in (spi_global_cache, obj))
     {
@@ -101,7 +101,7 @@ spi_object_append_reference (DBusMessageIter * iter, AtkObject * obj)
     return;
   }
 
-  maybe_lease (G_OBJECT (obj));
+  spi_object_lease_if_needed (G_OBJECT (obj));
 
   name = dbus_bus_get_unique_name (spi_global_app_data->bus);
   path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
@@ -132,7 +132,7 @@ spi_hyperlink_append_reference (DBusMessageIter * iter, AtkHyperlink * obj)
     return;
   }
 
-  maybe_lease (G_OBJECT (obj));
+  spi_object_lease_if_needed (G_OBJECT (obj));
 
   name = dbus_bus_get_unique_name (spi_global_app_data->bus);
   path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
index ac2cbb4..3b27292 100644 (file)
@@ -28,6 +28,9 @@
 #include <dbus/dbus.h>
 
 void
+spi_object_lease_if_needed (GObject *obj);
+
+void
 spi_object_append_reference (DBusMessageIter * iter, AtkObject * obj);
 
 void