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