Migrate accessibility/ to using nullptr instead of 0
[WebKit-https.git] / Source / WebCore / accessibility / mac / AXObjectCacheMac.mm
1 /*
2  * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "AXObjectCache.h"
28
29 #if HAVE(ACCESSIBILITY)
30
31 #import "AccessibilityObject.h"
32 #import "RenderObject.h"
33 #import "WebAccessibilityObjectWrapperMac.h"
34 #import "WebCoreSystemInterface.h"
35
36 #import <wtf/PassRefPtr.h>
37
38 #ifndef NSAccessibilityLiveRegionChangedNotification
39 #define NSAccessibilityLiveRegionChangedNotification @"AXLiveRegionChanged"
40 #endif
41
42 #ifndef NSAccessibilityLiveRegionCreatedNotification 
43 #define NSAccessibilityLiveRegionCreatedNotification @"AXLiveRegionCreated"
44 #endif
45
46 // The simple Cocoa calls in this file don't throw exceptions.
47
48 namespace WebCore {
49
50 void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType)
51 {
52     [obj->wrapper() detach];
53     obj->setWrapper(nullptr);
54 }
55
56 void AXObjectCache::attachWrapper(AccessibilityObject* obj)
57 {
58     RetainPtr<WebAccessibilityObjectWrapper> wrapper = adoptNS([[WebAccessibilityObjectWrapper alloc] initWithAccessibilityObject:obj]);
59     obj->setWrapper(wrapper.get());
60 }
61
62 void AXObjectCache::postPlatformNotification(AccessibilityObject* obj, AXNotification notification)
63 {
64     if (!obj)
65         return;
66     
67     // Some notifications are unique to Safari and do not have NSAccessibility equivalents.
68     NSString *macNotification;
69     switch (notification) {
70         case AXActiveDescendantChanged:
71             // An active descendant change for trees means a selected rows change.
72             if (obj->isTree())
73                 macNotification = NSAccessibilitySelectedRowsChangedNotification;
74             
75             // When a combobox uses active descendant, it means the selected item in its associated
76             // list has changed. In these cases we should use selected children changed, because
77             // we don't want the focus to change away from the combobox where the user is typing.
78             else if (obj->isComboBox())
79                 macNotification = NSAccessibilitySelectedChildrenChangedNotification;
80             else
81                 macNotification = NSAccessibilityFocusedUIElementChangedNotification;                
82             break;
83         case AXAutocorrectionOccured:
84             macNotification = @"AXAutocorrectionOccurred";
85             break;
86         case AXFocusedUIElementChanged:
87             macNotification = NSAccessibilityFocusedUIElementChangedNotification;
88             break;
89         case AXLayoutComplete:
90             macNotification = @"AXLayoutComplete";
91             break;
92         case AXLoadComplete:
93             macNotification = @"AXLoadComplete";
94             break;
95         case AXInvalidStatusChanged:
96             macNotification = @"AXInvalidStatusChanged";
97             break;
98         case AXSelectedChildrenChanged:
99             if (obj->isAccessibilityTable())
100                 macNotification = NSAccessibilitySelectedRowsChangedNotification;
101             else
102                 macNotification = NSAccessibilitySelectedChildrenChangedNotification;
103             break;
104         case AXSelectedTextChanged:
105             macNotification = NSAccessibilitySelectedTextChangedNotification;
106             break;
107         case AXValueChanged:
108             macNotification = NSAccessibilityValueChangedNotification;
109             break;
110         case AXLiveRegionCreated:
111             macNotification = NSAccessibilityLiveRegionCreatedNotification;
112             break;
113         case AXLiveRegionChanged:
114             macNotification = NSAccessibilityLiveRegionChangedNotification;
115             break;
116         case AXRowCountChanged:
117             macNotification = NSAccessibilityRowCountChangedNotification;
118             break;
119         case AXRowExpanded:
120             macNotification = NSAccessibilityRowExpandedNotification;
121             break;
122         case AXRowCollapsed:
123             macNotification = NSAccessibilityRowCollapsedNotification;
124             break;
125         case AXElementBusyChanged:
126             macNotification = @"AXElementBusyChanged";
127             break;
128         case AXExpandedChanged:
129             macNotification = @"AXExpandedChanged";
130             break;
131         case AXMenuClosed:
132             macNotification = (id)kAXMenuClosedNotification;
133             break;
134         case AXMenuListItemSelected:
135             macNotification = (id)kAXMenuItemSelectedNotification;
136             break;
137         case AXMenuOpened:
138             macNotification = (id)kAXMenuOpenedNotification;
139             break;
140         case AXCheckedStateChanged:
141             // Does not exist on Mac.
142         default:
143             return;
144     }
145     
146     // NSAccessibilityPostNotification will call this method, (but not when running DRT), so ASSERT here to make sure it does not crash.
147     // https://bugs.webkit.org/show_bug.cgi?id=46662
148 #pragma clang diagnostic push
149 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
150     ASSERT([obj->wrapper() accessibilityIsIgnored] || true);
151 #pragma clang diagnostic pop
152     
153     NSAccessibilityPostNotification(obj->wrapper(), macNotification);
154     
155     // Used by DRT to know when notifications are posted.
156     [obj->wrapper() accessibilityPostedNotification:macNotification];
157 }
158
159 void AXObjectCache::nodeTextChangePlatformNotification(AccessibilityObject*, AXTextChange, unsigned, const String&)
160 {
161 }
162
163 void AXObjectCache::frameLoadingEventPlatformNotification(AccessibilityObject*, AXLoadingEvent)
164 {
165 }
166
167 void AXObjectCache::platformHandleFocusedUIElementChanged(Node*, Node*)
168 {
169     wkAccessibilityHandleFocusChanged();
170 }
171
172 void AXObjectCache::handleScrolledToAnchor(const Node*)
173 {
174 }
175
176 }
177
178 #endif // HAVE(ACCESSIBILITY)