2008-05-13 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 Selection;
83 class String;
84 class Widget;
85
86 enum AccessibilityRole {
87     UnknownRole = 1,
88     ButtonRole,
89     RadioButtonRole,
90     CheckBoxRole,
91     SliderRole,
92     TabGroupRole,
93     TextFieldRole,
94     StaticTextRole,
95     TextAreaRole,
96     ScrollAreaRole,
97     PopUpButtonRole,
98     MenuButtonRole,
99     TableRole,
100     ApplicationRole,
101     GroupRole,
102     RadioGroupRole,
103     ListRole,
104     ScrollBarRole,
105     ValueIndicatorRole,
106     ImageRole,
107     MenuBarRole,
108     MenuRole,
109     MenuItemRole,
110     ColumnRole,
111     RowRole,
112     ToolbarRole,
113     BusyIndicatorRole,
114     ProgressIndicatorRole,
115     WindowRole,
116     DrawerRole,
117     SystemWideRole,
118     OutlineRole,
119     IncrementorRole,
120     BrowserRole,
121     ComboBoxRole,
122     SplitGroupRole,
123     SplitterRole,
124     ColorWellRole,
125     GrowAreaRole,
126     SheetRole,
127     HelpTagRole,
128     MatteRole,
129     RulerRole,
130     RulerMarkerRole,
131     LinkRole,
132     DisclosureTriangleRole,
133     GridRole,
134
135     // AppKit includes SortButtonRole but it is misnamed and really a subrole of ButtonRole so we do not include it here.
136
137     // WebCore-specific roles
138     WebCoreLinkRole,
139     ImageMapRole,
140     ListMarkerRole,
141     WebAreaRole,
142     HeadingRole,
143     ListBoxRole,
144     ListBoxOptionRole
145 };
146
147 struct VisiblePositionRange {
148
149     VisiblePosition start;
150     VisiblePosition end;
151
152     VisiblePositionRange() {}
153
154     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
155         : start(s)
156         , end(e)
157     { }
158
159     bool isNull() const { return start.isNull() || end.isNull(); }
160 };
161
162 struct PlainTextRange {
163         
164     unsigned start;
165     unsigned length;
166     
167     PlainTextRange()
168         : start(0)
169         , length(0)
170     { }
171     
172     PlainTextRange(unsigned s, unsigned l)
173         : start(s)
174         , length(l)
175     { }
176     
177     bool isNull() const { return start == 0 && length == 0; }
178 };
179
180 class AccessibilityObject : public RefCounted<AccessibilityObject> {
181 protected:
182     AccessibilityObject();
183 public:
184     static PassRefPtr<AccessibilityObject> create();
185     virtual ~AccessibilityObject();
186     
187     virtual bool isAccessibilityRenderObject() const { return false; };
188     virtual bool isAnchor() const { return false; };
189     virtual bool isAttachment() const { return false; };
190     virtual bool isHeading() const { return false; };
191     virtual bool isLink() const { return false; };
192     virtual bool isImage() const { return false; };
193     virtual bool isNativeImage() const { return false; };
194     virtual bool isImageButton() const { return false; };
195     virtual bool isPasswordField() const { return false; };
196     virtual bool isTextControl() const { return false; };
197     virtual bool isNativeTextControl() const { return false; };
198     virtual bool isWebArea() const { return false; };
199     virtual bool isCheckboxOrRadio() const { return false; };
200     virtual bool isListBox() const { return false; };
201     virtual bool isFileUploadButton() const { return false; };
202     virtual bool isProgressIndicator() const { return false; };
203     
204     virtual bool isChecked() const { return false; };
205     virtual bool isEnabled() const { return false; };
206     virtual bool isSelected() const { return false; };
207     virtual bool isFocused() const { return false; };
208     virtual bool isHovered() const { return false; };
209     virtual bool isIndeterminate() const { return false; };
210     virtual bool isLoaded() const { return false; };
211     virtual bool isMultiSelect() const { return false; };
212     virtual bool isOffScreen() const { return false; };
213     virtual bool isPressed() const { return false; };
214     virtual bool isReadOnly() const { return false; };
215     virtual bool isVisited() const { return false; };
216
217     virtual bool canSetFocusAttribute() const { return false; };
218     virtual bool canSetTextRangeAttributes() const { return false; };
219     virtual bool canSetValueAttribute() const { return false; };
220
221     virtual bool hasIntValue() const { return false; };
222
223     virtual bool accessibilityShouldUseUniqueId() const { return false; };
224     virtual bool accessibilityIsIgnored() const  { return true; };
225
226     virtual int intValue() const;
227     virtual float valueForRange() const { return 0.0f; }
228     virtual float maxValueForRange() const { return 0.0f; }
229     virtual float minValueForRange() const {return 0.0f; }
230     virtual int layoutCount() const;
231     static bool isARIAControl(AccessibilityRole);
232     static bool isARIAInput(AccessibilityRole);
233     unsigned axObjectID() const;
234     
235     virtual AccessibilityObject* doAccessibilityHitTest(const IntPoint&) const;
236     virtual AccessibilityObject* focusedUIElement() const;
237     virtual AccessibilityObject* firstChild() const;
238     virtual AccessibilityObject* lastChild() const;
239     virtual AccessibilityObject* previousSibling() const;
240     virtual AccessibilityObject* nextSibling() const;
241     virtual AccessibilityObject* parentObject() const;
242     virtual AccessibilityObject* parentObjectUnignored() const;
243     virtual AccessibilityObject* observableObject() const;
244     virtual AccessibilityObject* linkedUIElement() const;
245     virtual AccessibilityRole ariaRoleAttribute() const;
246     virtual AccessibilityRole roleValue() const;
247     virtual AXObjectCache* axObjectCache() const;
248     
249     virtual HTMLAnchorElement* anchorElement() const;
250     virtual Element* actionElement() const;
251
252     virtual IntRect boundingBoxRect() const;
253     virtual IntRect elementRect() const;
254     virtual IntSize size() const;
255     
256     virtual KURL url() const;
257     virtual PlainTextRange selectedTextRange() const;
258     virtual Selection selection() const;
259     unsigned selectionStart() const;
260     unsigned selectionEnd() const;
261     virtual String stringValue() const;
262     virtual String ariaAccessiblityName(const String&) const;
263     virtual String ariaLabeledByAttribute() const;
264     virtual String title() const;
265     virtual String ariaDescribedByAttribute() const;
266     virtual String accessibilityDescription() const;
267     virtual String helpText() const;
268     virtual String textUnderElement() const;
269     virtual String text() const;
270     virtual int textLength() const;
271     virtual PassRefPtr<Range> ariaSelectedTextDOMRange() const;
272     virtual String selectedText() const;
273     virtual const AtomicString& accessKey() const;
274     const String& actionVerb() const;
275     virtual Widget* widget() const;
276     virtual Widget* widgetForAttachmentView() const;
277     void getDocumentLinks(Vector< RefPtr<AccessibilityObject> >&) const;
278     virtual Document* document() const { return 0; }
279     virtual FrameView* topDocumentFrameView() const { return 0; }
280     virtual FrameView* documentFrameView() const;
281
282     void setAXObjectID(unsigned);
283     virtual void setFocused(bool);
284     virtual void setSelectedText(const String&);
285     virtual void setSelectedTextRange(const PlainTextRange&);
286     virtual void setValue(const String&);
287     
288     virtual void detach();
289     virtual void makeRangeVisible(const PlainTextRange&);
290     virtual bool press() const;
291     bool performDefaultAction() const { return press(); }
292     
293     virtual void childrenChanged();
294     virtual const Vector<RefPtr<AccessibilityObject> >& children() { return m_children; }
295     virtual void addChildren();
296     virtual bool hasChildren() const { return m_haveChildren; };
297     
298     virtual VisiblePositionRange visiblePositionRange() const;
299     virtual VisiblePositionRange doAXTextMarkerRangeForLine(unsigned) const;
300     
301     VisiblePositionRange doAXTextMarkerRangeForUnorderedTextMarkers(const VisiblePosition&, const VisiblePosition&) const;
302     VisiblePositionRange doAXLeftWordTextMarkerRangeForTextMarker(const VisiblePosition&) const;
303     VisiblePositionRange doAXRightWordTextMarkerRangeForTextMarker(const VisiblePosition&) const;
304     VisiblePositionRange doAXLeftLineTextMarkerRangeForTextMarker(const VisiblePosition&) const;
305     VisiblePositionRange doAXRightLineTextMarkerRangeForTextMarker(const VisiblePosition&) const;
306     VisiblePositionRange doAXSentenceTextMarkerRangeForTextMarker(const VisiblePosition&) const;
307     VisiblePositionRange doAXParagraphTextMarkerRangeForTextMarker(const VisiblePosition&) const;
308     VisiblePositionRange doAXStyleTextMarkerRangeForTextMarker(const VisiblePosition&) const;
309     VisiblePositionRange textMarkerRangeForRange(const PlainTextRange&) const;
310
311     String doAXStringForTextMarkerRange(const VisiblePositionRange&) const;
312     virtual IntRect doAXBoundsForTextMarkerRange(const VisiblePositionRange&) const;    
313     int doAXLengthForTextMarkerRange(const VisiblePositionRange&) const;
314     virtual void doSetAXSelectedTextMarkerRange(const VisiblePositionRange&) const;
315     PlainTextRange rangeForTextMarkerRange(const VisiblePositionRange&) const;
316
317     virtual VisiblePosition doAXTextMarkerForPosition(const IntPoint&) const;
318     VisiblePosition doAXNextTextMarkerForTextMarker(const VisiblePosition&) const;
319     VisiblePosition doAXPreviousTextMarkerForTextMarker(const VisiblePosition&) const;
320     VisiblePosition doAXNextWordEndTextMarkerForTextMarker(const VisiblePosition&) const;
321     VisiblePosition doAXPreviousWordStartTextMarkerForTextMarker(const VisiblePosition&) const;
322     VisiblePosition doAXNextLineEndTextMarkerForTextMarker(const VisiblePosition&) const;
323     VisiblePosition doAXPreviousLineStartTextMarkerForTextMarker(const VisiblePosition&) const;
324     VisiblePosition doAXNextSentenceEndTextMarkerForTextMarker(const VisiblePosition&) const;
325     VisiblePosition doAXPreviousSentenceStartTextMarkerForTextMarker(const VisiblePosition&) const;
326     VisiblePosition doAXNextParagraphEndTextMarkerForTextMarker(const VisiblePosition&) const;
327     VisiblePosition doAXPreviousParagraphStartTextMarkerForTextMarker(const VisiblePosition&) const;
328     virtual VisiblePosition textMarkerForIndex(unsigned indexValue, bool lastIndexOK) const;
329     
330     virtual VisiblePosition visiblePositionForIndex(int) const;
331     virtual int indexForVisiblePosition(const VisiblePosition&) const;
332
333     AccessibilityObject* doAXUIElementForTextMarker(const VisiblePosition&) const;
334     unsigned doAXLineForTextMarker(const VisiblePosition&) const;
335     virtual int indexForTextMarker(const VisiblePosition&) const;
336
337     virtual PlainTextRange doAXRangeForLine(unsigned) const;
338     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
339     virtual PlainTextRange doAXRangeForIndex(unsigned) const;
340     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
341
342     virtual String doAXStringForRange(const PlainTextRange&) const;
343     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const;
344
345     unsigned doAXLineForIndex(unsigned);
346
347 #if HAVE(ACCESSIBILITY)
348     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
349     void setWrapper(AccessibilityObjectWrapper* wrapper) 
350     {
351         m_wrapper = wrapper;
352     }
353 #endif
354
355 protected:
356     unsigned m_id;
357     Vector<RefPtr<AccessibilityObject> > m_children;
358     mutable bool m_haveChildren;
359     
360     virtual void clearChildren();
361     virtual void removeAXObjectID();
362     virtual bool isDetached() const { return true; }
363
364 #if PLATFORM(MAC)
365     RetainPtr<AccessibilityObjectWrapper> m_wrapper;
366 #elif PLATFORM(WIN)
367     COMPtr<AccessibilityObjectWrapper> m_wrapper;
368 #endif
369 };
370
371 } // namespace WebCore
372
373 #endif // AccessibilityObject_h