AX: AX needs to stop using WebCoreViewFactory
[WebKit-https.git] / Source / WebCore / accessibility / AXObjectCache.h
1 /*
2  * Copyright (C) 2003, 2006, 2007, 2008, 2009, 2010, 2011 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 COMPUTER, 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 COMPUTER, 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 #ifndef AXObjectCache_h
27 #define AXObjectCache_h
28
29 #include "AccessibilityObject.h"
30 #include "Timer.h"
31 #include <limits.h>
32 #include <wtf/Forward.h>
33 #include <wtf/HashMap.h>
34 #include <wtf/HashSet.h>
35 #include <wtf/RefPtr.h>
36
37 namespace WebCore {
38
39 class Document;
40 class HTMLAreaElement;
41 class Node;
42 class Page;
43 class RenderObject;
44 class ScrollView;
45 class VisiblePosition;
46 class Widget;
47
48 struct TextMarkerData {
49     AXID axID;
50     Node* node;
51     int offset;
52     EAffinity affinity;
53 };
54
55 enum PostType { PostSynchronously, PostAsynchronously };
56
57 class AXObjectCache {
58     WTF_MAKE_NONCOPYABLE(AXObjectCache); WTF_MAKE_FAST_ALLOCATED;
59 public:
60     AXObjectCache(const Document*);
61     ~AXObjectCache();
62
63     static AccessibilityObject* focusedUIElementForPage(const Page*);
64
65     AccessibilityObject* rootObject();
66     
67     // For AX objects with elements that back them.
68     AccessibilityObject* getOrCreate(RenderObject*);
69     AccessibilityObject* getOrCreate(Widget*);
70
71     // used for objects without backing elements
72     AccessibilityObject* getOrCreate(AccessibilityRole);
73     
74     // will only return the AccessibilityObject if it already exists
75     AccessibilityObject* get(RenderObject*);
76     
77     void remove(RenderObject*);
78     void remove(Widget*);
79     void remove(AXID);
80
81     void detachWrapper(AccessibilityObject*);
82     void attachWrapper(AccessibilityObject*);
83     void childrenChanged(RenderObject*);
84     void selectedChildrenChanged(RenderObject*);
85     // Called by a node when text or a text equivalent (e.g. alt) attribute is changed.
86     void contentChanged(RenderObject*);
87     
88     void handleActiveDescendantChanged(RenderObject*);
89     void handleAriaRoleChanged(RenderObject*);
90     void handleFocusedUIElementChanged(RenderObject* oldFocusedRenderer, RenderObject* newFocusedRenderer);
91     void handleScrolledToAnchor(const Node* anchorNode);
92     void handleAriaExpandedChange(RenderObject*);
93     void handleScrollbarUpdate(ScrollView*);
94     
95     static void enableAccessibility() { gAccessibilityEnabled = true; }
96     static void enableEnhancedUserInterfaceAccessibility() { gAccessibilityEnhancedUserInterfaceEnabled = true; }
97     
98     static bool accessibilityEnabled() { return gAccessibilityEnabled; }
99     static bool accessibilityEnhancedUserInterfaceEnabled() { return gAccessibilityEnhancedUserInterfaceEnabled; }
100
101     void removeAXID(AccessibilityObject*);
102     bool isIDinUse(AXID id) const { return m_idsInUse.contains(id); }
103     AXID platformGenerateAXID() const;
104     AccessibilityObject* objectFromAXID(AXID id) const { return m_objects.get(id).get(); }
105
106     // This is a weak reference cache for knowing if Nodes used by TextMarkers are valid.
107     void setNodeInUse(Node* n) { m_textMarkerNodes.add(n); }
108     void removeNodeForUse(Node* n) { m_textMarkerNodes.remove(n); }
109     bool isNodeInUse(Node* n) { return m_textMarkerNodes.contains(n); }
110     
111     // Text marker utilities.
112     void textMarkerDataForVisiblePosition(TextMarkerData&, const VisiblePosition&);
113     VisiblePosition visiblePositionForTextMarkerData(TextMarkerData&);
114
115     enum AXNotification {
116         AXActiveDescendantChanged,
117         AXCheckedStateChanged,
118         AXChildrenChanged,
119         AXFocusedUIElementChanged,
120         AXLayoutComplete,
121         AXLoadComplete,
122         AXSelectedChildrenChanged,
123         AXSelectedTextChanged,
124         AXValueChanged,
125         AXScrolledToAnchor,
126         AXLiveRegionChanged,
127         AXMenuListValueChanged,
128         AXRowCountChanged,
129         AXRowCollapsed,
130         AXRowExpanded,
131         AXInvalidStatusChanged,
132     };
133
134     void postNotification(RenderObject*, AXNotification, bool postToElement, PostType = PostAsynchronously);
135     void postNotification(AccessibilityObject*, Document*, AXNotification, bool postToElement, PostType = PostAsynchronously);
136
137     enum AXTextChange {
138         AXTextInserted,
139         AXTextDeleted,
140     };
141
142     void nodeTextChangeNotification(RenderObject*, AXTextChange, unsigned offset, unsigned count);
143
144     bool nodeHasRole(Node*, const AtomicString& role);
145
146 protected:
147     void postPlatformNotification(AccessibilityObject*, AXNotification);
148     void nodeTextChangePlatformNotification(AccessibilityObject*, AXTextChange, unsigned offset, unsigned count);
149
150 private:
151     Document* m_document;
152     HashMap<AXID, RefPtr<AccessibilityObject> > m_objects;
153     HashMap<RenderObject*, AXID> m_renderObjectMapping;
154     HashMap<Widget*, AXID> m_widgetObjectMapping;
155     HashSet<Node*> m_textMarkerNodes;
156     static bool gAccessibilityEnabled;
157     static bool gAccessibilityEnhancedUserInterfaceEnabled;
158     
159     HashSet<AXID> m_idsInUse;
160     
161     Timer<AXObjectCache> m_notificationPostTimer;
162     Vector<pair<RefPtr<AccessibilityObject>, AXNotification> > m_notificationsToPost;
163     void notificationPostTimerFired(Timer<AXObjectCache>*);
164     
165     static AccessibilityObject* focusedImageMapUIElement(HTMLAreaElement*);
166     
167     AXID getAXID(AccessibilityObject*);
168     AccessibilityObject* get(Widget*);
169 };
170
171 bool nodeHasRole(Node*, const String& role);
172
173 #if !HAVE(ACCESSIBILITY)
174 inline void AXObjectCache::handleActiveDescendantChanged(RenderObject*) { }
175 inline void AXObjectCache::handleAriaRoleChanged(RenderObject*) { }
176 inline void AXObjectCache::detachWrapper(AccessibilityObject*) { }
177 inline void AXObjectCache::attachWrapper(AccessibilityObject*) { }
178 inline void AXObjectCache::selectedChildrenChanged(RenderObject*) { }
179 inline void AXObjectCache::postNotification(RenderObject*, AXNotification, bool postToElement, PostType) { }
180 inline void AXObjectCache::postNotification(AccessibilityObject*, Document*, AXNotification, bool postToElement, PostType) { }
181 inline void AXObjectCache::postPlatformNotification(AccessibilityObject*, AXNotification) { }
182 inline void AXObjectCache::nodeTextChangeNotification(RenderObject*, AXTextChange, unsigned, unsigned) { }
183 inline void AXObjectCache::nodeTextChangePlatformNotification(AccessibilityObject*, AXTextChange, unsigned, unsigned) { }
184 inline void AXObjectCache::handleFocusedUIElementChanged(RenderObject*, RenderObject*) { }
185 inline void AXObjectCache::handleScrolledToAnchor(const Node*) { }
186 inline void AXObjectCache::contentChanged(RenderObject*) { }
187 inline void AXObjectCache::handleAriaExpandedChange(RenderObject*) { }
188 inline void AXObjectCache::handleScrollbarUpdate(ScrollView*) { }
189 #endif
190
191 }
192
193 #endif