void connectAccessibilityCallbacks() { // Ensure no callbacks are connected before. disconnectAccessibilityCallbacks(); // Ensure that accessibility is initialized for the WebView by querying for // the root accessible object, which will create the full hierarchy. #if PLATFORM(GTK) DumpRenderTreeSupportGtk::getRootAccessibleElement(mainFrame); #elif PLATFORM(EFL) DumpRenderTreeSupportEfl::rootAccessibleElement(browser->mainFrame()); #endif // Add global listeners for AtkObject's signals. stateChangeListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:state-change"); focusEventListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:focus-event"); activeDescendantChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:active-descendant-changed"); childrenChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:children-changed"); propertyChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:property-change"); visibleDataChangedListenerId = atk_add_global_event_listener(axObjectEventListener, "ATK:AtkObject:visible-data-changed"); // Ensure the Atk interface types are registered, otherwise // the AtkDocument signal handlers below won't get registered. GObject* dummyAxObject = G_OBJECT(g_object_new(ATK_TYPE_OBJECT, 0)); AtkObject* dummyNoOpAxObject = atk_no_op_object_new(dummyAxObject); g_object_unref(G_OBJECT(dummyNoOpAxObject)); g_object_unref(dummyAxObject); }
void AccessibilityNotificationHandler::connectAccessibilityCallbacks() { // Ensure no callbacks are connected before. if (!disconnectAccessibilityCallbacks()) return; const char* signalNames[] = { "ATK:AtkObject:state-change", "ATK:AtkObject:focus-event", "ATK:AtkObject:active-descendant-changed", "ATK:AtkObject:children-changed", "ATK:AtkObject:property-change", "ATK:AtkObject:visible-data-changed", "ATK:AtkDocument:load-complete", "ATK:AtkSelection:selection-changed", "ATK:AtkText:text-caret-moved", "ATK:AtkText:text-insert", "ATK:AtkText:text-remove", 0 }; // Register atk interfaces, otherwise add_global may fail. GObject* dummyObject = (GObject*)g_object_new(G_TYPE_OBJECT, NULL, NULL); g_object_unref(atk_no_op_object_new(dummyObject)); g_object_unref(dummyObject); // Add global listeners for AtkObject's signals. for (const char** signalName = signalNames; *signalName; signalName++) { unsigned id = atk_add_global_event_listener(axObjectEventListener, *signalName); if (!id) { String message = String::format("atk_add_global_event_listener failed for signal %s\n", *signalName); InjectedBundle::singleton().outputText(message); continue; } listenerIds.append(id); } }