WebCore:
[WebKit-https.git] / WebCore / page / AccessibilityObject.h
1 /*
2  * Copyright (C) 2008 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Nuanti Ltd.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #ifndef AccessibilityObject_h
31 #define AccessibilityObject_h
32
33 #include "VisiblePosition.h"
34 #include <wtf/Platform.h>
35 #include <wtf/RefPtr.h>
36 #include <wtf/Vector.h>
37
38 #if PLATFORM(MAC)
39 #include <wtf/RetainPtr.h>
40 #elif PLATFORM(WIN)
41 #include "AccessibilityObjectWrapperWin.h"
42 #include "COMPtr.h"
43 #endif
44
45 typedef struct _NSRange NSRange;
46
47 #ifdef __OBJC__
48 @class AccessibilityObjectWrapper;
49 @class NSArray;
50 @class NSAttributedString;
51 @class NSData;
52 @class NSMutableAttributedString;
53 @class NSString;
54 @class NSValue;
55 @class NSView;
56 #else
57 class NSArray;
58 class NSAttributedString;
59 class NSData;
60 class NSMutableAttributedString;
61 class NSString;
62 class NSValue;
63 class NSView;
64 #if PLATFORM(GTK)
65 typedef struct _AtkObject AtkObject;
66 typedef struct _AtkObject AccessibilityObjectWrapper;
67 #else
68 class AccessibilityObjectWrapper;
69 #endif
70 #endif
71
72 namespace WebCore {
73
74 class AXObjectCache;
75 class Element;
76 class Frame;
77 class FrameView;
78 class HTMLAnchorElement;
79 class HTMLAreaElement;
80 class IntPoint;
81 class IntSize;
82 class Node;
83 class RenderObject;
84 class Selection;
85 class String;
86 class Widget;
87
88 enum AccessibilityRole {
89     UnknownRole = 1,
90     ButtonRole,
91     RadioButtonRole,
92     CheckBoxRole,
93     SliderRole,
94     TabGroupRole,
95     TextFieldRole,
96     StaticTextRole,
97     TextAreaRole,
98     ScrollAreaRole,
99     PopUpButtonRole,
100     MenuButtonRole,
101     TableRole,
102     ApplicationRole,
103     GroupRole,
104     RadioGroupRole,
105     ListRole,
106     ScrollBarRole,
107     ValueIndicatorRole,
108     ImageRole,
109     MenuBarRole,
110     MenuRole,
111     MenuItemRole,
112     ColumnRole,
113     RowRole,
114     ToolbarRole,
115     BusyIndicatorRole,
116     ProgressIndicatorRole,
117     WindowRole,
118     DrawerRole,
119     SystemWideRole,
120     OutlineRole,
121     IncrementorRole,
122     BrowserRole,
123     ComboBoxRole,
124     SplitGroupRole,
125     SplitterRole,
126     ColorWellRole,
127     GrowAreaRole,
128     SheetRole,
129     HelpTagRole,
130     MatteRole,
131     RulerRole,
132     RulerMarkerRole,
133     LinkRole,
134     DisclosureTriangleRole,
135     GridRole,
136
137     // AppKit includes SortButtonRole but it is misnamed and really a subrole of ButtonRole so we do not include it here.
138
139     // WebCore-specific roles
140     WebCoreLinkRole,
141     ImageMapRole,
142     ListMarkerRole,
143     WebAreaRole,
144     HeadingRole,
145     ListBoxRole,
146     ListBoxOptionRole
147 };
148
149 struct VisiblePositionRange {
150
151     VisiblePosition start;
152     VisiblePosition end;
153
154     VisiblePositionRange() {}
155
156     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
157         : start(s)
158         , end(e)
159     { }
160
161     bool isNull() const { return start.isNull() || end.isNull(); }
162 };
163
164 struct PlainTextRange {
165         
166     unsigned start;
167     unsigned length;
168     
169     PlainTextRange()
170         : start(0)
171         , length(0)
172     { }
173     
174     PlainTextRange(unsigned s, unsigned l)
175         : start(s)
176         , length(l)
177     { }
178     
179     bool isNull() const { return start == 0 && length == 0; }
180 };
181
182 class AccessibilityObject : public RefCounted<AccessibilityObject> {
183 protected:
184     AccessibilityObject();
185 public:
186     virtual ~AccessibilityObject();
187         
188     typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector;
189     
190     virtual bool isAccessibilityRenderObject() const { return false; };
191     virtual bool isAnchor() const { return false; };
192     virtual bool isAttachment() const { return false; };
193     virtual bool isHeading() const { return false; };
194     virtual bool isLink() const { return false; };
195     virtual bool isImage() const { return false; };
196     virtual bool isNativeImage() const { return false; };
197     virtual bool isImageButton() const { return false; };
198     virtual bool isPasswordField() const { return false; };
199     virtual bool isTextControl() const { return false; };
200     virtual bool isNativeTextControl() const { return false; };
201     virtual bool isWebArea() const { return false; };
202     virtual bool isCheckboxOrRadio() const { return false; };
203     virtual bool isListBox() const { return roleValue() == ListBoxRole; };
204     virtual bool isMenuRelated() const { return false; }
205     virtual bool isMenu() const { return false; }
206     virtual bool isMenuBar() const { return false; }
207     virtual bool isMenuButton() const { return false; }
208     virtual bool isMenuItem() const { return false; }
209     virtual bool isFileUploadButton() const { return false; };
210     virtual bool isProgressIndicator() const { return false; };
211     virtual bool isSlider() const { return false; };
212     virtual bool isControl() const { return false; };
213     
214     virtual bool isChecked() const { return false; };
215     virtual bool isEnabled() const { return false; };
216     virtual bool isSelected() const { return false; };
217     virtual bool isFocused() const { return false; };
218     virtual bool isHovered() const { return false; };
219     virtual bool isIndeterminate() const { return false; };
220     virtual bool isLoaded() const { return false; };
221     virtual bool isMultiSelect() const { return false; };
222     virtual bool isOffScreen() const { return false; };
223     virtual bool isPressed() const { return false; };
224     virtual bool isReadOnly() const { return false; };
225     virtual bool isVisited() const { return false; };
226
227     virtual bool canSetFocusAttribute() const { return false; };
228     virtual bool canSetTextRangeAttributes() const { return false; };
229     virtual bool canSetValueAttribute() const { return false; };
230     virtual bool canSetSelectedAttribute() const { return false; }
231     virtual bool canSetSelectedChildrenAttribute() const { return false; }
232     
233     virtual bool hasIntValue() const { return false; };
234
235     bool accessibilityShouldUseUniqueId() const { return true; };
236     virtual bool accessibilityIsIgnored() const  { return true; };
237
238     virtual int intValue() const;
239     virtual float valueForRange() const { return 0.0f; }
240     virtual float maxValueForRange() const { return 0.0f; }
241     virtual float minValueForRange() const {return 0.0f; }
242     virtual int layoutCount() const;
243     static bool isARIAControl(AccessibilityRole);
244     static bool isARIAInput(AccessibilityRole);
245     unsigned axObjectID() const;
246     
247     virtual AccessibilityObject* doAccessibilityHitTest(const IntPoint&) const;
248     virtual AccessibilityObject* focusedUIElement() const;
249     virtual AccessibilityObject* firstChild() const;
250     virtual AccessibilityObject* lastChild() const;
251     virtual AccessibilityObject* previousSibling() const;
252     virtual AccessibilityObject* nextSibling() const;
253     virtual AccessibilityObject* parentObject() const;
254     virtual AccessibilityObject* parentObjectUnignored() const;
255     virtual AccessibilityObject* observableObject() const;
256     virtual void linkedUIElements(AccessibilityChildrenVector&) const;
257     virtual AccessibilityObject* titleUIElement() const;
258     virtual AccessibilityRole ariaRoleAttribute() const;
259     virtual bool isPresentationalChildOfAriaRole() const;
260     virtual bool ariaRoleHasPresentationalChildren() const;
261
262     virtual AccessibilityRole roleValue() const;
263     virtual AXObjectCache* axObjectCache() const;
264     
265     virtual HTMLAnchorElement* anchorElement() const;
266     virtual Element* actionElement() const;
267     virtual IntRect boundingBoxRect() const;
268     virtual IntRect elementRect() const;
269     virtual IntSize size() const;
270     IntPoint clickPoint() const;
271     
272     virtual KURL url() const;
273     virtual PlainTextRange selectedTextRange() const;
274     virtual Selection selection() const;
275     unsigned selectionStart() const;
276     unsigned selectionEnd() const;
277     virtual String stringValue() const;
278     virtual String ariaAccessiblityName(const String&) const;
279     virtual String ariaLabeledByAttribute() const;
280     virtual String title() const;
281     virtual String ariaDescribedByAttribute() const;
282     virtual String accessibilityDescription() const;
283     virtual String helpText() const;
284     virtual String textUnderElement() const;
285     virtual String text() const;
286     virtual int textLength() const;
287     virtual PassRefPtr<Range> ariaSelectedTextDOMRange() const;
288     virtual String selectedText() const;
289     virtual const AtomicString& accessKey() const;
290     const String& actionVerb() const;
291     virtual Widget* widget() const;
292     virtual Widget* widgetForAttachmentView() const;
293     virtual void getDocumentLinks(Vector< RefPtr<AccessibilityObject> >&) const;
294     virtual Document* document() const { return 0; }
295     virtual FrameView* topDocumentFrameView() const { return 0; }
296     virtual FrameView* documentFrameView() const;
297
298     void setAXObjectID(unsigned);
299     virtual void setFocused(bool);
300     virtual void setSelectedText(const String&);
301     virtual void setSelectedTextRange(const PlainTextRange&);
302     virtual void setValue(const String&);
303     virtual void setSelected(bool);
304     
305     virtual void detach();
306     virtual void makeRangeVisible(const PlainTextRange&);
307     virtual bool press() const;
308     bool performDefaultAction() const { return press(); }
309     
310     virtual void childrenChanged();
311     virtual const AccessibilityChildrenVector& children() { return m_children; }
312     virtual void addChildren();
313     virtual bool hasChildren() const { return m_haveChildren; };
314     virtual void selectedChildren(AccessibilityChildrenVector&) = 0;
315     virtual void visibleChildren(AccessibilityChildrenVector&) = 0;
316     virtual bool shouldFocusActiveDescendant() const { return false; }
317     virtual AccessibilityObject* activeDescendant() const { return 0; }    
318     virtual void handleActiveDescendantChanged() { }
319
320     virtual VisiblePositionRange visiblePositionRange() const;
321     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const;
322     
323     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
324     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
325     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
326     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
327     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
328     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
329     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
330     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
331     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
332
333     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
334     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const;    
335     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
336     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const;
337
338     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const;
339     VisiblePosition nextVisiblePosition(const VisiblePosition&) const;
340     VisiblePosition previousVisiblePosition(const VisiblePosition&) const;
341     VisiblePosition nextWordEnd(const VisiblePosition&) const;
342     VisiblePosition previousWordStart(const VisiblePosition&) const;
343     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
344     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
345     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
346     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
347     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
348     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
349     virtual VisiblePosition visiblePositionForIndex(unsigned indexValue, bool lastIndexOK) const;
350     
351     virtual VisiblePosition visiblePositionForIndex(int) const;
352     virtual int indexForVisiblePosition(const VisiblePosition&) const;
353
354     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
355     unsigned lineForPosition(const VisiblePosition&) const;
356     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
357     virtual int index(const VisiblePosition&) const;
358
359     virtual PlainTextRange doAXRangeForLine(unsigned) const;
360     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
361     virtual PlainTextRange doAXRangeForIndex(unsigned) const;
362     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
363
364     virtual String doAXStringForRange(const PlainTextRange&) const;
365     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const;
366
367     unsigned doAXLineForIndex(unsigned);
368
369 #if HAVE(ACCESSIBILITY)
370 #if PLATFORM(GTK)
371     AccessibilityObjectWrapper* wrapper() const;
372     void setWrapper(AccessibilityObjectWrapper*);
373 #else
374     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
375     void setWrapper(AccessibilityObjectWrapper* wrapper) 
376     {
377         m_wrapper = wrapper;
378     }
379 #endif
380 #endif
381
382 protected:
383     unsigned m_id;
384     AccessibilityChildrenVector m_children;
385     mutable bool m_haveChildren;
386     
387     virtual void clearChildren();
388     virtual void removeAXObjectID();
389     virtual bool isDetached() const { return true; }
390
391 #if PLATFORM(MAC)
392     RetainPtr<AccessibilityObjectWrapper> m_wrapper;
393 #elif PLATFORM(WIN)
394     COMPtr<AccessibilityObjectWrapper> m_wrapper;
395 #elif PLATFORM(GTK)
396     AtkObject* m_wrapper;
397 #endif
398 };
399
400 } // namespace WebCore
401
402 #endif // AccessibilityObject_h