280e72f7b0362fb134d9793289fcfb58f13b5b9a
[WebKit-https.git] / WebCore / page / AccessibilityObject.h
1 /*
2  * Copyright (C) 2008 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  *
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  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef AccessibilityObject_h
30 #define AccessibilityObject_h
31
32 #include "VisiblePosition.h"
33 #include <wtf/Platform.h>
34 #include <wtf/RefPtr.h>
35 #include <wtf/Vector.h>
36
37 #if PLATFORM(MAC)
38 #include <wtf/RetainPtr.h>
39 #elif PLATFORM(WIN)
40 #include "AccessibilityObjectWrapperWin.h"
41 #include "COMPtr.h"
42 #endif
43
44 typedef struct _NSRange NSRange;
45
46 #ifdef __OBJC__
47 @class AccessibilityObjectWrapper;
48 @class NSArray;
49 @class NSAttributedString;
50 @class NSData;
51 @class NSMutableAttributedString;
52 @class NSString;
53 @class NSValue;
54 @class NSView;
55 @class WebCoreTextMarker;
56 @class WebCoreTextMarkerRange;
57 #else
58 class AccessibilityObjectWrapper;
59 class NSArray;
60 class NSAttributedString;
61 class NSData;
62 class NSMutableAttributedString;
63 class NSString;
64 class NSValue;
65 class NSView;
66 class WebCoreTextMarker;
67 class WebCoreTextMarkerRange;
68 #endif
69
70 namespace WebCore {
71
72 class AXObjectCache;
73 class Element;
74 class Frame;
75 class FrameView;
76 class HTMLAnchorElement;
77 class HTMLAreaElement;
78 class IntPoint;
79 class IntSize;
80 class Node;
81 class RenderObject;
82 class RenderTextControl;
83 class Selection;
84 class String;
85 class Widget;
86
87 enum AccessibilityRole {
88     UnknownRole = 1,
89     ButtonRole,
90     RadioButtonRole,
91     CheckBoxRole,
92     SliderRole,
93     TabGroupRole,
94     TextFieldRole,
95     StaticTextRole,
96     TextAreaRole,
97     ScrollAreaRole,
98     PopUpButtonRole,
99     MenuButtonRole,
100     TableRole,
101     ApplicationRole,
102     GroupRole,
103     RadioGroupRole,
104     ListRole,
105     ScrollBarRole,
106     ValueIndicatorRole,
107     ImageRole,
108     MenuBarRole,
109     MenuRole,
110     MenuItemRole,
111     ColumnRole,
112     RowRole,
113     ToolbarRole,
114     BusyIndicatorRole,
115     ProgressIndicatorRole,
116     WindowRole,
117     DrawerRole,
118     SystemWideRole,
119     OutlineRole,
120     IncrementorRole,
121     BrowserRole,
122     ComboBoxRole,
123     SplitGroupRole,
124     SplitterRole,
125     ColorWellRole,
126     GrowAreaRole,
127     SheetRole,
128     HelpTagRole,
129     MatteRole,
130     RulerRole,
131     RulerMarkerRole,
132     LinkRole,
133     DisclosureTriangleRole,
134     GridRole,
135
136     // AppKit includes SortButtonRole but it is misnamed and really a subrole of ButtonRole so we do not include it here.
137
138     // WebCore-specific roles
139     WebCoreLinkRole,
140     ImageMapRole,
141     ListMarkerRole,
142     WebAreaRole,
143     HeadingRole
144 };
145
146 struct VisiblePositionRange {
147
148     VisiblePosition start;
149     VisiblePosition end;
150
151     VisiblePositionRange() {}
152
153     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
154         : start(s)
155         , end(e)
156     { }
157
158     bool isNull() const { return start.isNull() || end.isNull(); }
159 };
160
161 class AccessibilityObject : public RefCounted<AccessibilityObject> {
162 private:
163     AccessibilityObject(RenderObject*);
164 public:
165     static PassRefPtr<AccessibilityObject> create(RenderObject*);
166     ~AccessibilityObject();
167
168     struct PlainTextRange {
169
170         unsigned start;
171         unsigned length;
172
173         PlainTextRange()
174             : start(0)
175             , length(0)
176         { }
177
178         PlainTextRange(unsigned s, unsigned l)
179             : start(s)
180             , length(l)
181         { }
182
183         bool isNull() const { return start == 0 && length == 0; }
184
185     };
186
187     bool isAnchor() const;
188     bool isAttachment() const;
189     bool isHeading() const;
190     bool isImage() const;
191     bool isImageButton() const;
192     bool isPasswordField() const;
193     bool isTextControl() const;
194     bool isWebArea() const;
195
196     bool isChecked() const;
197     bool isEnabled() const;
198     bool isFocused() const;
199     bool isHovered() const;
200     bool isIndeterminate() const;
201     bool isLoaded() const;
202     bool isMultiSelect() const;
203     bool isOffScreen() const;
204     bool isPressed() const;
205     bool isReadOnly() const;
206     bool isVisited() const;
207
208     bool canSetFocusAttribute() const;
209     bool canSetTextRangeAttributes() const;
210     bool canSetValueAttribute() const;
211
212     bool hasIntValue() const;
213
214     bool accessibilityShouldUseUniqueId() const;
215     bool accessibilityIsIgnored() const;
216
217     static int headingLevel(Node*);
218     int intValue() const;
219     int layoutCount() const;
220     int textLength() const;
221     unsigned axObjectID() const;
222     AccessibilityObject* doAccessibilityHitTest(const IntPoint&) const;
223     AccessibilityObject* focusedUIElement() const;
224     AccessibilityObject* firstChild() const;
225     AccessibilityObject* lastChild() const;
226     AccessibilityObject* previousSibling() const;
227     AccessibilityObject* nextSibling() const;
228     AccessibilityObject* parentObject() const;
229     AccessibilityObject* parentObjectUnignored() const;
230     AccessibilityObject* observableObject() const;
231     AccessibilityObject* linkedUIElement() const;
232     AccessibilityRole roleValue() const;
233     AXObjectCache* axObjectCache() const;
234     Element* actionElement() const;
235     Element* mouseButtonListener() const;
236     FrameView* frameViewIfRenderView() const;
237     FrameView* documentFrameView() const;
238     HTMLAnchorElement* anchorElement() const;
239     HTMLAreaElement* areaElement() const { return m_areaElement.get(); }
240     IntRect boundingBoxRect() const;
241     IntSize size() const;
242     KURL url() const;
243     PlainTextRange selectedTextRange() const;
244     RenderObject* renderer() const { return m_renderer; }
245     RenderObject* topRenderer() const;
246     RenderTextControl* textControl() const;
247     Selection selection() const;
248     String stringValue() const;
249     String title() const;
250     String accessibilityDescription() const;
251     String helpText() const;
252     String textUnderElement() const;
253     String selectedText() const;
254     const AtomicString& accessKey() const;
255     const String& actionVerb() const;
256     Widget* widget() const;
257     Widget* widgetForAttachmentView() const;
258     void getDocumentLinks(Vector< RefPtr<AccessibilityObject> >&) const;
259     const Vector<RefPtr<AccessibilityObject> >& children() const;
260
261     void setAXObjectID(unsigned);
262     void setFocused(bool);
263     void setSelectedText(const String&);
264     void setSelectedTextRange(const PlainTextRange&);
265     void setValue(const String&);
266
267     void detach();
268     void makeRangeVisible(const PlainTextRange&);
269     bool press() const;
270     bool performDefaultAction() const { return press(); }
271     void childrenChanged();
272
273     VisiblePositionRange visiblePositionRange() const;
274     VisiblePositionRange doAXTextMarkerRangeForLine(unsigned) const;
275     VisiblePositionRange doAXTextMarkerRangeForUnorderedTextMarkers(const VisiblePosition&, const VisiblePosition&) const;
276     VisiblePositionRange doAXLeftWordTextMarkerRangeForTextMarker(const VisiblePosition&) const;
277     VisiblePositionRange doAXRightWordTextMarkerRangeForTextMarker(const VisiblePosition&) const;
278     VisiblePositionRange doAXLeftLineTextMarkerRangeForTextMarker(const VisiblePosition&) const;
279     VisiblePositionRange doAXRightLineTextMarkerRangeForTextMarker(const VisiblePosition&) const;
280     VisiblePositionRange doAXSentenceTextMarkerRangeForTextMarker(const VisiblePosition&) const;
281     VisiblePositionRange doAXParagraphTextMarkerRangeForTextMarker(const VisiblePosition&) const;
282     VisiblePositionRange doAXStyleTextMarkerRangeForTextMarker(const VisiblePosition&) const;
283     VisiblePositionRange textMarkerRangeForRange(const PlainTextRange&, RenderTextControl*) const;
284
285     String doAXStringForTextMarkerRange(const VisiblePositionRange&) const;
286     IntRect doAXBoundsForTextMarkerRange(const VisiblePositionRange&) const;
287     int doAXLengthForTextMarkerRange(const VisiblePositionRange&) const;
288     void doSetAXSelectedTextMarkerRange(const VisiblePositionRange&) const;
289     PlainTextRange rangeForTextMarkerRange(const VisiblePositionRange&) const;
290
291     VisiblePosition doAXTextMarkerForPosition(const IntPoint&) const;
292     VisiblePosition doAXNextTextMarkerForTextMarker(const VisiblePosition&) const;
293     VisiblePosition doAXPreviousTextMarkerForTextMarker(const VisiblePosition&) const;
294     VisiblePosition doAXNextWordEndTextMarkerForTextMarker(const VisiblePosition&) const;
295     VisiblePosition doAXPreviousWordStartTextMarkerForTextMarker(const VisiblePosition&) const;
296     VisiblePosition doAXNextLineEndTextMarkerForTextMarker(const VisiblePosition&) const;
297     VisiblePosition doAXPreviousLineStartTextMarkerForTextMarker(const VisiblePosition&) const;
298     VisiblePosition doAXNextSentenceEndTextMarkerForTextMarker(const VisiblePosition&) const;
299     VisiblePosition doAXPreviousSentenceStartTextMarkerForTextMarker(const VisiblePosition&) const;
300     VisiblePosition doAXNextParagraphEndTextMarkerForTextMarker(const VisiblePosition&) const;
301     VisiblePosition doAXPreviousParagraphStartTextMarkerForTextMarker(const VisiblePosition&) const;
302     VisiblePosition textMarkerForIndex(unsigned indexValue, bool lastIndexOK) const;
303
304     AccessibilityObject* doAXUIElementForTextMarker(const VisiblePosition&) const;
305     unsigned doAXLineForTextMarker(const VisiblePosition&) const;
306     int indexForTextMarker(const VisiblePosition&) const;
307
308     PlainTextRange doAXRangeForLine(unsigned) const;
309     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
310     PlainTextRange doAXRangeForIndex(unsigned) const;
311     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
312
313     String doAXStringForRange(const PlainTextRange&) const;
314     IntRect doAXBoundsForRange(const PlainTextRange&) const;
315
316     unsigned doAXLineForIndex(unsigned);
317
318 #if HAVE(ACCESSIBILITY)
319     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
320     void setWrapper(AccessibilityObjectWrapper* wrapper) 
321     {
322         ASSERT(!m_wrapper);
323         m_wrapper = wrapper;
324     }
325 #endif
326
327 private:
328     RenderObject* m_renderer;
329     RefPtr<HTMLAreaElement> m_areaElement;
330     unsigned m_id;
331     mutable Vector<RefPtr<AccessibilityObject> > m_children;
332     mutable bool m_haveChildren;
333
334     void addChildren() const;
335     void clearChildren();
336     void removeAXObjectID();
337
338     bool isDetached() const { return !m_renderer; }
339
340 #if PLATFORM(MAC)
341     RetainPtr<AccessibilityObjectWrapper> m_wrapper;
342 #elif PLATFORM(WIN)
343     COMPtr<AccessibilityObjectWrapper> m_wrapper;
344 #endif
345 };
346
347 } // namespace WebCore
348
349 #endif // AccessibilityObject_h