2008-04-29 Beth Dakin <bdakin@apple.com>
[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 isLink() const;
191     bool isImage() const;
192     bool isNativeImage() const;
193     bool isImageButton() const;
194     bool isPasswordField() const;
195     bool isTextControl() const;
196     bool isNativeTextControl() const;
197     bool isWebArea() const;
198     bool isCheckboxOrRadio() const;
199
200     bool isChecked() const;
201     bool isEnabled() const;
202     bool isFocused() const;
203     bool isHovered() const;
204     bool isIndeterminate() const;
205     bool isLoaded() const;
206     bool isMultiSelect() const;
207     bool isOffScreen() const;
208     bool isPressed() const;
209     bool isReadOnly() const;
210     bool isVisited() const;
211
212     bool canSetFocusAttribute() const;
213     bool canSetTextRangeAttributes() const;
214     bool canSetValueAttribute() const;
215
216     bool hasIntValue() const;
217
218     bool accessibilityShouldUseUniqueId() const;
219     bool accessibilityIsIgnored() const;
220
221     static int headingLevel(Node*);
222     int intValue() const;
223     int layoutCount() const;
224     unsigned axObjectID() const;
225     AccessibilityObject* doAccessibilityHitTest(const IntPoint&) const;
226     AccessibilityObject* focusedUIElement() const;
227     AccessibilityObject* firstChild() const;
228     AccessibilityObject* lastChild() const;
229     AccessibilityObject* previousSibling() const;
230     AccessibilityObject* nextSibling() const;
231     AccessibilityObject* parentObject() const;
232     AccessibilityObject* parentObjectUnignored() const;
233     AccessibilityObject* observableObject() const;
234     AccessibilityObject* linkedUIElement() const;
235
236     AccessibilityRole ariaRoleAttribute() const;
237     AccessibilityRole roleValue() const;
238     AXObjectCache* axObjectCache() const;
239     Element* actionElement() const;
240     Element* mouseButtonListener() const;
241     FrameView* frameViewIfRenderView() const;
242     FrameView* documentFrameView() const;
243     HTMLAnchorElement* anchorElement() const;
244     HTMLAreaElement* areaElement() const { return m_areaElement.get(); }
245     IntRect boundingBoxRect() const;
246     IntSize size() const;
247     KURL url() const;
248     PlainTextRange selectedTextRange() const;
249     unsigned selectionStart() const;
250     unsigned selectionEnd() const;
251     RenderObject* renderer() const { return m_renderer; }
252     RenderObject* topRenderer() const;
253     Selection selection() const;
254     String stringValue() const;
255     String title() const;
256     String accessibilityDescription() const;
257     String helpText() const;
258     String textUnderElement() const;
259     String text() const;
260     int textLength() const;
261     PassRefPtr<Range> ariaSelectedTextDOMRange() const;
262     String selectedText() const;
263     const AtomicString& accessKey() const;
264     const String& actionVerb() const;
265     Widget* widget() const;
266     Widget* widgetForAttachmentView() const;
267     void getDocumentLinks(Vector< RefPtr<AccessibilityObject> >&) const;
268     const Vector<RefPtr<AccessibilityObject> >& children() const;
269
270     void setAXObjectID(unsigned);
271     void setFocused(bool);
272     void setSelectedText(const String&);
273     void setSelectedTextRange(const PlainTextRange&);
274     void setValue(const String&);
275
276     void detach();
277     void makeRangeVisible(const PlainTextRange&);
278     bool press() const;
279     bool performDefaultAction() const { return press(); }
280     void childrenChanged();
281
282     VisiblePositionRange visiblePositionRange() const;
283     VisiblePositionRange doAXTextMarkerRangeForLine(unsigned) const;
284     VisiblePositionRange doAXTextMarkerRangeForUnorderedTextMarkers(const VisiblePosition&, const VisiblePosition&) const;
285     VisiblePositionRange doAXLeftWordTextMarkerRangeForTextMarker(const VisiblePosition&) const;
286     VisiblePositionRange doAXRightWordTextMarkerRangeForTextMarker(const VisiblePosition&) const;
287     VisiblePositionRange doAXLeftLineTextMarkerRangeForTextMarker(const VisiblePosition&) const;
288     VisiblePositionRange doAXRightLineTextMarkerRangeForTextMarker(const VisiblePosition&) const;
289     VisiblePositionRange doAXSentenceTextMarkerRangeForTextMarker(const VisiblePosition&) const;
290     VisiblePositionRange doAXParagraphTextMarkerRangeForTextMarker(const VisiblePosition&) const;
291     VisiblePositionRange doAXStyleTextMarkerRangeForTextMarker(const VisiblePosition&) const;
292     VisiblePositionRange textMarkerRangeForRange(const PlainTextRange&) const;
293
294     String doAXStringForTextMarkerRange(const VisiblePositionRange&) const;
295     IntRect doAXBoundsForTextMarkerRange(const VisiblePositionRange&) const;
296     int doAXLengthForTextMarkerRange(const VisiblePositionRange&) const;
297     void doSetAXSelectedTextMarkerRange(const VisiblePositionRange&) const;
298     PlainTextRange rangeForTextMarkerRange(const VisiblePositionRange&) const;
299
300     VisiblePosition doAXTextMarkerForPosition(const IntPoint&) const;
301     VisiblePosition doAXNextTextMarkerForTextMarker(const VisiblePosition&) const;
302     VisiblePosition doAXPreviousTextMarkerForTextMarker(const VisiblePosition&) const;
303     VisiblePosition doAXNextWordEndTextMarkerForTextMarker(const VisiblePosition&) const;
304     VisiblePosition doAXPreviousWordStartTextMarkerForTextMarker(const VisiblePosition&) const;
305     VisiblePosition doAXNextLineEndTextMarkerForTextMarker(const VisiblePosition&) const;
306     VisiblePosition doAXPreviousLineStartTextMarkerForTextMarker(const VisiblePosition&) const;
307     VisiblePosition doAXNextSentenceEndTextMarkerForTextMarker(const VisiblePosition&) const;
308     VisiblePosition doAXPreviousSentenceStartTextMarkerForTextMarker(const VisiblePosition&) const;
309     VisiblePosition doAXNextParagraphEndTextMarkerForTextMarker(const VisiblePosition&) const;
310     VisiblePosition doAXPreviousParagraphStartTextMarkerForTextMarker(const VisiblePosition&) const;
311     VisiblePosition textMarkerForIndex(unsigned indexValue, bool lastIndexOK) const;
312     
313     VisiblePosition visiblePositionForIndex(int) const;
314     int indexForVisiblePosition(const VisiblePosition&) const;
315
316     AccessibilityObject* doAXUIElementForTextMarker(const VisiblePosition&) const;
317     unsigned doAXLineForTextMarker(const VisiblePosition&) const;
318     int indexForTextMarker(const VisiblePosition&) const;
319
320     PlainTextRange doAXRangeForLine(unsigned) const;
321     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
322     PlainTextRange doAXRangeForIndex(unsigned) const;
323     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
324
325     String doAXStringForRange(const PlainTextRange&) const;
326     IntRect doAXBoundsForRange(const PlainTextRange&) const;
327
328     unsigned doAXLineForIndex(unsigned);
329
330 #if HAVE(ACCESSIBILITY)
331     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
332     void setWrapper(AccessibilityObjectWrapper* wrapper) 
333     {
334         ASSERT(!m_wrapper);
335         m_wrapper = wrapper;
336     }
337 #endif
338
339 private:
340     RenderObject* m_renderer;
341     RefPtr<HTMLAreaElement> m_areaElement;
342     unsigned m_id;
343     mutable Vector<RefPtr<AccessibilityObject> > m_children;
344     mutable bool m_haveChildren;
345
346     void addChildren() const;
347     void clearChildren();
348     void removeAXObjectID();
349
350     bool isDetached() const { return !m_renderer; }
351
352 #if PLATFORM(MAC)
353     RetainPtr<AccessibilityObjectWrapper> m_wrapper;
354 #elif PLATFORM(WIN)
355     COMPtr<AccessibilityObjectWrapper> m_wrapper;
356 #endif
357 };
358
359 } // namespace WebCore
360
361 #endif // AccessibilityObject_h