Changeset 78179 in webkit


Ignore:
Timestamp:
Feb 10, 2011 1:03:30 AM (13 years ago)
Author:
mario@webkit.org
Message:

2011-02-10 Mario Sanchez Prada <msanchez@igalia.com>

Reviewed by Chris Fleizach.

[GTK] Add support in DRT to log "accessibility events"
https://bugs.webkit.org/show_bug.cgi?id=54116

Added a way to log accessibility related events, in a
platform-dependant way.

Add new function to AccessibilityController.

  • DumpRenderTree/AccessibilityController.h:
  • DumpRenderTree/AccessibilityController.cpp: (logAccessibilityEventsCallback): New callback. (AccessibilityController::getJSClass): Added new function. (AccessibilityController::resetToConsistentState): Initialized calling setLogAccessibilityEvents(false).

Provided implementation for the GTK port.

  • DumpRenderTree/gtk/AccessibilityControllerGtk.cpp: (accessibility_event_listener): Common listener for logging information about all the signals emitted by any AtkObject. (AccessibilityController::setLogAccessibilityEvents): Add or remove listeners for signals, as specified by the parameter.

Provide dummy implementations for mac and win ports.

  • DumpRenderTree/mac/AccessibilityControllerMac.mm: (AccessibilityController::setLogAccessibilityEvents):
  • DumpRenderTree/win/AccessibilityControllerWin.cpp: (AccessibilityController::setLogAccessibilityEvents):
Location:
trunk/Tools
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r78175 r78179  
     12011-02-10  Mario Sanchez Prada  <msanchez@igalia.com>
     2
     3        Reviewed by Chris Fleizach.
     4
     5        [GTK] Add support in DRT to log "accessibility events"
     6        https://bugs.webkit.org/show_bug.cgi?id=54116
     7
     8        Added a way to log accessibility related events, in a
     9        platform-dependant way.
     10
     11        Add new function to AccessibilityController.
     12
     13        * DumpRenderTree/AccessibilityController.h:
     14        * DumpRenderTree/AccessibilityController.cpp:
     15        (logAccessibilityEventsCallback): New callback.
     16        (AccessibilityController::getJSClass): Added new function.
     17        (AccessibilityController::resetToConsistentState): Initialized
     18        calling setLogAccessibilityEvents(false).
     19
     20        Provided implementation for the GTK port.
     21
     22        * DumpRenderTree/gtk/AccessibilityControllerGtk.cpp:
     23        (accessibility_event_listener): Common listener for logging
     24        information about all the signals emitted by any AtkObject.
     25        (AccessibilityController::setLogAccessibilityEvents): Add or
     26        remove listeners for signals, as specified by the parameter.
     27
     28        Provide dummy implementations for mac and win ports.
     29
     30        * DumpRenderTree/mac/AccessibilityControllerMac.mm:
     31        (AccessibilityController::setLogAccessibilityEvents):
     32        * DumpRenderTree/win/AccessibilityControllerWin.cpp:
     33        (AccessibilityController::setLogAccessibilityEvents):
     34
    1352011-02-09  Hayato Ito  <hayato@chromium.org>
    236
  • trunk/Tools/DumpRenderTree/AccessibilityController.cpp

    r55729 r78179  
    7878}
    7979
     80static JSValueRef logAccessibilityEventsCallback(JSContextRef ctx, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*)
     81{
     82    AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     83    controller->setLogAccessibilityEvents(true);
     84    return JSValueMakeUndefined(ctx);
     85}
     86
    8087static JSValueRef getElementAtPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    8188{
     
    97104        { "logValueChangeEvents", logValueChangeEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    98105        { "logScrollingStartEvents", logScrollingStartEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     106        { "logAccessibilityEvents", logAccessibilityEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    99107        { "elementAtPoint", getElementAtPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    100108        { 0, 0, 0 }
     
    120128    setLogValueChangeEvents(false);
    121129    setLogScrollingStartEvents(false);
     130    setLogAccessibilityEvents(false);
    122131}
  • trunk/Tools/DumpRenderTree/AccessibilityController.h

    r55729 r78179  
    5151    void setLogValueChangeEvents(bool);
    5252    void setLogScrollingStartEvents(bool);
     53    void setLogAccessibilityEvents(bool);
    5354
    5455    void resetToConsistentState();
  • trunk/Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp

    r75072 r78179  
    3535#include <gtk/gtk.h>
    3636#include <webkit/webkit.h>
     37
     38static bool loggingAccessibilityEvents = false;
     39
     40static guint state_change_listener_id = 0;
     41static guint focus_event_listener_id = 0;
     42static guint active_descendant_changed_listener_id = 0;
     43static guint children_changed_listener_id = 0;
     44static guint property_changed_listener_id = 0;
     45static guint visible_data_changed_listener_id = 0;
    3746
    3847AccessibilityController::AccessibilityController()
     
    8089}
    8190
     91static gboolean accessibility_event_listener(GSignalInvocationHint *signal_hint,
     92                                            guint n_param_values,
     93                                            const GValue *param_values,
     94                                            gpointer data)
     95{
     96    // At least we should receive the instance emitting the signal.
     97    if (n_param_values < 1)
     98        return TRUE;
     99
     100    AtkObject* accessible = ATK_OBJECT(g_value_get_object(&param_values[0]));
     101    const gchar* axObjectName = 0;
     102    guint axObjectRole = 0;
     103    if (accessible) {
     104        axObjectName = atk_object_get_name(accessible);
     105        axObjectRole = atk_object_get_role(accessible);
     106    }
     107
     108    GSignalQuery signal_query;
     109    gchar* signalName = 0;
     110
     111    g_signal_query(signal_hint->signal_id, &signal_query);
     112
     113    if (!g_strcmp0(signal_query.signal_name, "state-change")) {
     114        signalName = g_strdup_printf("state-change:%s = %d",
     115                                     g_value_get_string(&param_values[1]),
     116                                     g_value_get_boolean(&param_values[2]));
     117    } else if (!g_strcmp0(signal_query.signal_name, "focus-event")) {
     118        signalName = g_strdup_printf("focus-event = %d",
     119                                     g_value_get_boolean(&param_values[1]));
     120    } else if (!g_strcmp0(signal_query.signal_name, "children-changed")) {
     121        signalName = g_strdup_printf("children-changed = %d",
     122                                     g_value_get_uint(&param_values[1]));
     123    } else {
     124        signalName = g_strdup(signal_query.signal_name);
     125    }
     126
     127    // Try to provide always a name to be logged for the object.
     128    gchar* objectName = 0;
     129    if (!axObjectName || *axObjectName == '\0')
     130        objectName = g_strdup("(No name)");
     131    else
     132        objectName = g_strdup(axObjectName);
     133
     134    printf("Accessibility object emitted \"%s\" / Name: \"%s\" / Role: %d\n", signalName, objectName, axObjectRole);
     135    g_free(signalName);
     136    g_free(objectName);
     137
     138    return TRUE;
     139}
     140
     141void AccessibilityController::setLogAccessibilityEvents(bool logAccessibilityEvents)
     142{
     143    if (logAccessibilityEvents == loggingAccessibilityEvents)
     144        return;
     145
     146    if (state_change_listener_id) {
     147        atk_remove_global_event_listener(state_change_listener_id);
     148        state_change_listener_id = 0;
     149    }
     150    if (focus_event_listener_id) {
     151        atk_remove_global_event_listener(focus_event_listener_id);
     152        focus_event_listener_id = 0;
     153    }
     154    if (active_descendant_changed_listener_id) {
     155        atk_remove_global_event_listener(active_descendant_changed_listener_id);
     156        active_descendant_changed_listener_id = 0;
     157    }
     158    if (children_changed_listener_id) {
     159        atk_remove_global_event_listener(children_changed_listener_id);
     160        children_changed_listener_id = 0;
     161    }
     162    if (property_changed_listener_id) {
     163        atk_remove_global_event_listener(property_changed_listener_id);
     164        property_changed_listener_id = 0;
     165    }
     166    if (visible_data_changed_listener_id) {
     167        atk_remove_global_event_listener(visible_data_changed_listener_id);
     168        visible_data_changed_listener_id = 0;
     169    }
     170
     171    if (!logAccessibilityEvents) {
     172        loggingAccessibilityEvents = false;
     173        return;
     174    }
     175
     176    // Ensure that accessibility is initialized for the WebView by querying for
     177    // the root accessible object.
     178    rootElement();
     179
     180    // Add global listeners
     181    state_change_listener_id = atk_add_global_event_listener(accessibility_event_listener, "Gtk:AtkObject:state-change");
     182    focus_event_listener_id = atk_add_global_event_listener(accessibility_event_listener, "Gtk:AtkObject:focus-event");
     183    active_descendant_changed_listener_id = atk_add_global_event_listener(accessibility_event_listener, "Gtk:AtkObject:active-descendant-changed");
     184    children_changed_listener_id = atk_add_global_event_listener(accessibility_event_listener, "Gtk:AtkObject:children-changed");
     185    property_changed_listener_id = atk_add_global_event_listener(accessibility_event_listener, "Gtk:AtkObject:property-change");
     186    visible_data_changed_listener_id = atk_add_global_event_listener(accessibility_event_listener, "Gtk:AtkObject:visible-data-changed");
     187
     188    loggingAccessibilityEvents = true;
     189}
     190
    82191void AccessibilityController::addNotificationListener(PlatformUIElement, JSObjectRef)
    83192{
  • trunk/Tools/DumpRenderTree/mac/AccessibilityControllerMac.mm

    r75031 r78179  
    7575}
    7676
     77void AccessibilityController::setLogAccessibilityEvents(bool)
     78{
     79}
     80
    7781void AccessibilityController::addNotificationListener(PlatformUIElement, JSObjectRef)
    7882{
  • trunk/Tools/DumpRenderTree/win/AccessibilityControllerWin.cpp

    r68907 r78179  
    214214}
    215215
     216void AccessibilityController::setLogAccessibilityEvents(bool)
     217{
     218}
     219
    216220static string stringEvent(DWORD event)
    217221{
Note: See TracChangeset for help on using the changeset viewer.