diff options
Diffstat (limited to 'Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp')
-rw-r--r-- | Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp | 72 |
1 files changed, 19 insertions, 53 deletions
diff --git a/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp index b6af081c2..bb2280877 100644 --- a/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp +++ b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityNotificationHandlerAtk.cpp @@ -25,12 +25,12 @@ #include "InjectedBundle.h" #include "InjectedBundlePage.h" #include "JSWrapper.h" -#include <WebKit2/WKBundleFrame.h> -#include <WebKit2/WKBundlePage.h> -#include <WebKit2/WKBundlePagePrivate.h> +#include <WebKit/WKBundleFrame.h> +#include <WebKit/WKBundlePage.h> +#include <WebKit/WKBundlePagePrivate.h> #include <wtf/HashMap.h> #include <wtf/Vector.h> -#include <wtf/gobject/GUniquePtr.h> +#include <wtf/glib/GUniquePtr.h> #include <wtf/text/CString.h> #include <wtf/text/WTFString.h> @@ -43,29 +43,6 @@ typedef HashMap<AtkObject*, AccessibilityNotificationHandler*> NotificationHandl WTF::Vector<unsigned> listenerIds; NotificationHandlersMap notificationHandlers; AccessibilityNotificationHandler* globalNotificationHandler = nullptr; -bool loggingAccessibilityEvents = false; - -void printAccessibilityEvent(AtkObject* accessible, const char* signalName, const char* signalValue) -{ - // Do not handle state-change:defunct signals, as the AtkObject - // associated to them will not be valid at this point already. - if (!signalName || !g_strcmp0(signalName, "state-change:defunct")) - return; - - if (!accessible || !ATK_IS_OBJECT(accessible)) - return; - - const char* objectName = atk_object_get_name(accessible); - AtkRole objectRole = atk_object_get_role(accessible); - - // Try to always provide a name to be logged for the object. - if (!objectName || *objectName == '\0') - objectName = "(No name)"; - - GUniquePtr<char> signalNameAndValue(signalValue ? g_strdup_printf("%s = %s", signalName, signalValue) : g_strdup(signalName)); - GUniquePtr<char> accessibilityEventString(g_strdup_printf("Accessibility object emitted \"%s\" / Name: \"%s\" / Role: %d\n", signalNameAndValue.get(), objectName, objectRole)); - InjectedBundle::shared().outputText(String::fromUTF8(accessibilityEventString.get())); -} gboolean axObjectEventListener(GSignalInvocationHint* signalHint, unsigned numParamValues, const GValue* paramValues, gpointer data) { @@ -78,7 +55,7 @@ gboolean axObjectEventListener(GSignalInvocationHint* signalHint, unsigned numPa return true; #if PLATFORM(GTK) || PLATFORM(EFL) - WKBundlePageRef page = InjectedBundle::shared().page()->page(); + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page); JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame); #else @@ -86,47 +63,39 @@ gboolean axObjectEventListener(GSignalInvocationHint* signalHint, unsigned numPa #endif GSignalQuery signalQuery; - GUniquePtr<char> signalName; - GUniquePtr<char> signalValue; const char* notificationName = nullptr; Vector<JSValueRef> extraArgs; g_signal_query(signalHint->signal_id, &signalQuery); if (!g_strcmp0(signalQuery.signal_name, "state-change")) { - signalName.reset(g_strdup_printf("state-change:%s", g_value_get_string(¶mValues[1]))); - signalValue.reset(g_strdup_printf("%d", g_value_get_boolean(¶mValues[2]))); if (!g_strcmp0(g_value_get_string(¶mValues[1]), "checked")) notificationName = "CheckedStateChanged"; else if (!g_strcmp0(g_value_get_string(¶mValues[1]), "invalid-entry")) notificationName = "AXInvalidStatusChanged"; } else if (!g_strcmp0(signalQuery.signal_name, "focus-event")) { - signalName.reset(g_strdup("focus-event")); - signalValue.reset(g_strdup_printf("%d", g_value_get_boolean(¶mValues[1]))); if (g_value_get_boolean(¶mValues[1])) notificationName = "AXFocusedUIElementChanged"; + } else if (!g_strcmp0(signalQuery.signal_name, "selection-changed")) { + notificationName = "AXSelectedChildrenChanged"; } else if (!g_strcmp0(signalQuery.signal_name, "children-changed")) { const gchar* childrenChangedDetail = g_quark_to_string(signalHint->detail); - signalName.reset(g_strdup_printf("children-changed:%s", childrenChangedDetail)); - signalValue.reset(g_strdup_printf("%d", g_value_get_uint(¶mValues[1]))); notificationName = !g_strcmp0(childrenChangedDetail, "add") ? "AXChildrenAdded" : "AXChildrenRemoved"; + gpointer child = g_value_get_pointer(¶mValues[2]); + if (ATK_IS_OBJECT(child)) + extraArgs.append(toJS(jsContext, WTF::getPtr(WTR::AccessibilityUIElement::create(ATK_OBJECT(child))))); } else if (!g_strcmp0(signalQuery.signal_name, "property-change")) { - signalName.reset(g_strdup_printf("property-change:%s", g_quark_to_string(signalHint->detail))); if (!g_strcmp0(g_quark_to_string(signalHint->detail), "accessible-value")) notificationName = "AXValueChanged"; } else if (!g_strcmp0(signalQuery.signal_name, "load-complete")) notificationName = "AXLoadComplete"; else if (!g_strcmp0(signalQuery.signal_name, "text-caret-moved")) { notificationName = "AXTextCaretMoved"; - signalName.reset(g_strdup(signalQuery.signal_name)); - signalValue.reset(g_strdup_printf("%d", g_value_get_int(¶mValues[1]))); + GUniquePtr<char> signalValue(g_strdup_printf("%d", g_value_get_int(¶mValues[1]))); JSRetainPtr<JSStringRef> jsSignalValue(Adopt, JSStringCreateWithUTF8CString(signalValue.get())); extraArgs.append(JSValueMakeString(jsContext, jsSignalValue.get())); - } else - signalName.reset(g_strdup(signalQuery.signal_name)); - - if (loggingAccessibilityEvents) - printAccessibilityEvent(accessible, signalName.get(), signalValue.get()); + } else if (!g_strcmp0(signalQuery.signal_name, "text-insert") || !g_strcmp0(signalQuery.signal_name, "text-remove")) + notificationName = "AXTextChanged"; if (!jsContext) return true; @@ -174,12 +143,6 @@ AccessibilityNotificationHandler::~AccessibilityNotificationHandler() disconnectAccessibilityCallbacks(); } -void AccessibilityNotificationHandler::logAccessibilityEvents() -{ - connectAccessibilityCallbacks(); - loggingAccessibilityEvents = true; -} - void AccessibilityNotificationHandler::setNotificationFunctionCallback(JSValueRef notificationFunctionCallback) { if (!notificationFunctionCallback) { @@ -191,7 +154,7 @@ void AccessibilityNotificationHandler::setNotificationFunctionCallback(JSValueRe m_notificationFunctionCallback = notificationFunctionCallback; #if PLATFORM(GTK) || PLATFORM(EFL) - WKBundlePageRef page = InjectedBundle::shared().page()->page(); + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page); JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame); #else @@ -222,7 +185,7 @@ void AccessibilityNotificationHandler::setNotificationFunctionCallback(JSValueRe void AccessibilityNotificationHandler::removeAccessibilityNotificationHandler() { #if PLATFORM(GTK) || PLATFORM(EFL) - WKBundlePageRef page = InjectedBundle::shared().page()->page(); + WKBundlePageRef page = InjectedBundle::singleton().page()->page(); WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page); JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame); #else @@ -257,7 +220,10 @@ void AccessibilityNotificationHandler::connectAccessibilityCallbacks() "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 }; @@ -271,7 +237,7 @@ void AccessibilityNotificationHandler::connectAccessibilityCallbacks() 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::shared().outputText(message); + InjectedBundle::singleton().outputText(message); continue; } |