platform/mac/accessibility/aria-multiline.html sometimes asserts in AccessibilityCont...
[WebKit-https.git] / Tools / DumpRenderTree / atk / AccessibilityControllerAtk.cpp
1 /*
2  * Copyright (C) 2008, 2009, 2010 Apple Inc. All Rights Reserved.
3  * Copyright (C) 2009 Jan Michael Alonzo
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "AccessibilityController.h"
29
30 #if HAVE(ACCESSIBILITY)
31
32 #include "AccessibilityCallbacks.h"
33 #include "AccessibilityUIElement.h"
34 #include "DumpRenderTree.h"
35
36 #include <atk/atk.h>
37
38 bool loggingAccessibilityEvents = false;
39
40 AccessibilityController::AccessibilityController()
41     : m_globalNotificationHandler(nullptr)
42 {
43 }
44
45 AccessibilityController::~AccessibilityController()
46 {
47 }
48
49 AccessibilityUIElement AccessibilityController::elementAtPoint(int x, int y)
50 {
51     // FIXME: implement
52     return nullptr;
53 }
54
55 void AccessibilityController::platformResetToConsistentState()
56 {
57 }
58
59 void AccessibilityController::setLogFocusEvents(bool)
60 {
61 }
62
63 void AccessibilityController::setLogScrollingStartEvents(bool)
64 {
65 }
66
67 void AccessibilityController::setLogValueChangeEvents(bool)
68 {
69 }
70
71 void AccessibilityController::setLogAccessibilityEvents(bool logAccessibilityEvents)
72 {
73     if (logAccessibilityEvents == loggingAccessibilityEvents)
74         return;
75
76     if (!logAccessibilityEvents) {
77         loggingAccessibilityEvents = false;
78         disconnectAccessibilityCallbacks();
79         return;
80     }
81
82     connectAccessibilityCallbacks();
83     loggingAccessibilityEvents = true;
84 }
85
86 bool AccessibilityController::addNotificationListener(JSObjectRef functionCallback)
87 {
88     if (!functionCallback)
89         return false;
90
91     // Only one global notification listener.
92     if (m_globalNotificationHandler)
93         return false;
94
95     m_globalNotificationHandler = AccessibilityNotificationHandler::create();
96     m_globalNotificationHandler->setNotificationFunctionCallback(functionCallback);
97
98     return true;
99 }
100
101 void AccessibilityController::removeNotificationListener()
102 {
103     // Programmers should not be trying to remove a listener that's already removed.
104     ASSERT(m_globalNotificationHandler);
105
106     m_globalNotificationHandler = nullptr;
107 }
108
109 JSRetainPtr<JSStringRef> AccessibilityController::platformName() const
110 {
111     JSRetainPtr<JSStringRef> platformName(Adopt, JSStringCreateWithUTF8CString("atk"));
112     return platformName;
113 }
114
115 AtkObject* AccessibilityController::childElementById(AtkObject* parent, const char* id)
116 {
117     if (!ATK_IS_OBJECT(parent))
118         return nullptr;
119
120     bool parentFound = false;
121     AtkAttributeSet* attributeSet(atk_object_get_attributes(parent));
122     for (AtkAttributeSet* attributes = attributeSet; attributes; attributes = attributes->next) {
123         AtkAttribute* attribute = static_cast<AtkAttribute*>(attributes->data);
124         if (!strcmp(attribute->name, "html-id")) {
125             if (!strcmp(attribute->value, id))
126                 parentFound = true;
127             break;
128         }
129     }
130     atk_attribute_set_free(attributeSet);
131
132     if (parentFound)
133         return parent;
134
135     int childCount = atk_object_get_n_accessible_children(parent);
136     for (int i = 0; i < childCount; i++) {
137         AtkObject* result = childElementById(atk_object_ref_accessible_child(parent, i), id);
138         if (ATK_IS_OBJECT(result))
139             return result;
140     }
141
142     return nullptr;
143 }
144
145 #endif