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