2008-04-01 Darin Adler <darin@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/RefPtr.h>
34 #include <wtf/Vector.h>
35
36 #if PLATFORM(MAC)
37 #include <wtf/RetainPtr.h>
38 #endif
39
40 typedef struct _NSRange NSRange;
41
42 #ifdef __OBJC__
43 @class AccessibilityObjectWrapper;
44 @class NSArray;
45 @class NSAttributedString;
46 @class NSData;
47 @class NSMutableAttributedString;
48 @class NSString;
49 @class NSValue;
50 @class NSView;
51 @class WebCoreTextMarker;
52 @class WebCoreTextMarkerRange;
53 #else
54 class AccessibilityObjectWrapper;
55 class NSArray;
56 class NSAttributedString;
57 class NSData;
58 class NSMutableAttributedString;
59 class NSString;
60 class NSValue;
61 class NSView;
62 class WebCoreTextMarker;
63 class WebCoreTextMarkerRange;
64 #endif
65
66 namespace WebCore {
67
68 class AXObjectCache;
69 class Element;
70 class Frame;
71 class FrameView;
72 class HTMLAnchorElement;
73 class HTMLAreaElement;
74 class IntPoint;
75 class IntSize;
76 class Node;
77 class RenderObject;
78 class RenderTextControl;
79 class Selection;
80 class String;
81 class Widget;
82
83 enum AccessibilityRole {
84     UnknownRole = 1,
85     ButtonRole,
86     RadioButtonRole,
87     CheckBoxRole,
88     SliderRole,
89     TabGroupRole,
90     TextFieldRole,
91     StaticTextRole,
92     TextAreaRole,
93     ScrollAreaRole,
94     PopUpButtonRole,
95     MenuButtonRole,
96     TableRole,
97     ApplicationRole,
98     GroupRole,
99     RadioGroupRole,
100     ListRole,
101     ScrollBarRole,
102     ValueIndicatorRole,
103     ImageRole,
104     MenuBarRole,
105     MenuRole,
106     MenuItemRole,
107     ColumnRole,
108     RowRole,
109     ToolbarRole,
110     BusyIndicatorRole,
111     ProgressIndicatorRole,
112     WindowRole,
113     DrawerRole,
114     SystemWideRole,
115     OutlineRole,
116     IncrementorRole,
117     BrowserRole,
118     ComboBoxRole,
119     SplitGroupRole,
120     SplitterRole,
121     ColorWellRole,
122     GrowAreaRole,
123     SheetRole,
124     HelpTagRole,
125     MatteRole,
126     RulerRole,
127     RulerMarkerRole,
128     SortButtonRole,
129     LinkRole,
130     DisclosureTriangleRole,
131     GridRole,
132     // WebCore-specific roles
133     WebCoreLinkRole,
134     ImageMapRole,
135     ListMarkerRole,
136     WebAreaRole,
137     HeadingRole
138 };
139
140 struct VisiblePositionRange {
141     
142     VisiblePosition start;
143     VisiblePosition end;
144
145     VisiblePositionRange() {}
146
147     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
148         : start(s)
149         , end(e) 
150     { }
151     
152     bool isNull() const { return start.isNull() || end.isNull(); }
153 };
154
155 class AccessibilityObject : public RefCounted<AccessibilityObject> {
156 private:
157     AccessibilityObject(RenderObject*);
158 public:
159     static PassRefPtr<AccessibilityObject> create(RenderObject*);
160     ~AccessibilityObject();
161     
162     bool detached() const { return !m_renderer; };
163
164     void detach();
165     
166     AccessibilityObject* firstChild();
167     AccessibilityObject* lastChild();
168     AccessibilityObject* previousSibling();
169     AccessibilityObject* nextSibling();
170     AccessibilityObject* parentObject();
171     AccessibilityObject* parentObjectUnignored();
172     AccessibilityObject* observableObject();
173     
174     void childrenChanged();
175
176     unsigned axObjectID();
177     void setAXObjectID(unsigned);
178     void removeAXObjectID();
179
180     struct PlainTextRange {
181
182         unsigned start;
183         unsigned length;
184
185         PlainTextRange()
186             : start(0)
187             , length(0) 
188         { }
189         
190         PlainTextRange(unsigned s, unsigned l)
191             : start(s)
192             , length(l)
193         { }
194             
195         bool isNull() const { return start == 0 && length == 0; }
196         
197     };
198
199     bool isWebArea() const;
200     bool isImageButton() const;
201     bool isAnchor() const;
202     bool isTextControl() const;
203     bool isImage() const;
204     bool isAttachment() const;
205     bool isPasswordField() const;
206     bool isHeading() const;
207     int headingLevel(Node*) const;
208
209     HTMLAnchorElement* anchorElement();
210     Element* actionElement();    
211     Element* mouseButtonListener();
212     
213     String helpText();
214     String textUnderElement();
215     String stringForReplacedNode(Node*);
216     bool hasIntValue();
217     int intValue();
218     String stringValue();
219     String title();
220     String accessibilityDescription();
221     IntRect boundingBoxRect();
222     IntSize size();
223     AccessibilityObject* linkedUIElement();
224     bool accessibilityShouldUseUniqueId();
225     bool accessibilityIsIgnored();
226     bool loaded();
227     int layoutCount();
228     int textLength();
229     String selectedText();
230     Selection selection();
231     PlainTextRange selectedTextRange();
232     void setSelectedText(String);
233     void setSelectedTextRange(PlainTextRange);
234     void makeRangeVisible(PlainTextRange range);
235     KURL url();
236     bool isVisited();
237     bool isFocused();
238     void setFocused(bool);
239     void setValue(String);
240     bool isEnabled();
241     void press();
242     RenderObject* renderer() { return m_renderer; }
243     RenderObject* topRenderer();
244     RenderTextControl* textControl();
245     Widget* widget();
246     AXObjectCache* axObjectCache();
247     void documentLinks(Vector<RefPtr<AccessibilityObject> >&);
248     FrameView* frameViewIfRenderView();
249     FrameView* documentFrameView();
250
251     VisiblePositionRange visiblePositionRange();
252     VisiblePositionRange doAXTextMarkerRangeForLine(unsigned);
253     VisiblePositionRange doAXTextMarkerRangeForUnorderedTextMarkers(const VisiblePosition&, const VisiblePosition&);
254     VisiblePositionRange doAXLeftWordTextMarkerRangeForTextMarker(const VisiblePosition&);
255     VisiblePositionRange doAXRightWordTextMarkerRangeForTextMarker(const VisiblePosition&);
256     VisiblePositionRange doAXLeftLineTextMarkerRangeForTextMarker(const VisiblePosition&);
257     VisiblePositionRange doAXRightLineTextMarkerRangeForTextMarker(const VisiblePosition&);
258     VisiblePositionRange doAXSentenceTextMarkerRangeForTextMarker(const VisiblePosition&);
259     VisiblePositionRange doAXParagraphTextMarkerRangeForTextMarker(const VisiblePosition&);
260     VisiblePositionRange doAXStyleTextMarkerRangeForTextMarker(const VisiblePosition&);
261     VisiblePositionRange textMarkerRangeForRange(const PlainTextRange&, RenderTextControl*);
262
263     IntRect convertViewRectToScreenCoords(const IntRect&);
264     IntPoint convertAbsolutePointToViewCoords(const IntPoint&, const FrameView*);
265
266     String doAXStringForTextMarkerRange(VisiblePositionRange&);
267     IntRect doAXBoundsForTextMarkerRange(VisiblePositionRange);
268     int doAXLengthForTextMarkerRange(VisiblePositionRange);
269     void doSetAXSelectedTextMarkerRange(VisiblePositionRange);
270     PlainTextRange rangeForTextMarkerRange(const VisiblePositionRange&);
271
272     VisiblePosition doAXTextMarkerForPosition(const IntPoint&);
273     VisiblePosition doAXNextTextMarkerForTextMarker(const VisiblePosition&);
274     VisiblePosition doAXPreviousTextMarkerForTextMarker(const VisiblePosition&);
275     VisiblePosition doAXNextWordEndTextMarkerForTextMarker(const VisiblePosition&);
276     VisiblePosition doAXPreviousWordStartTextMarkerForTextMarker(const VisiblePosition&);
277     VisiblePosition doAXNextLineEndTextMarkerForTextMarker(const VisiblePosition&);
278     VisiblePosition doAXPreviousLineStartTextMarkerForTextMarker(const VisiblePosition&);
279     VisiblePosition doAXNextSentenceEndTextMarkerForTextMarker(const VisiblePosition&);
280     VisiblePosition doAXPreviousSentenceStartTextMarkerForTextMarker(const VisiblePosition&);
281     VisiblePosition doAXNextParagraphEndTextMarkerForTextMarker(const VisiblePosition&);
282     VisiblePosition doAXPreviousParagraphStartTextMarkerForTextMarker(const VisiblePosition&);
283     VisiblePosition textMarkerForIndex(unsigned indexValue, bool lastIndexOK);
284
285     AccessibilityObject* doAXUIElementForTextMarker(const VisiblePosition&);
286     unsigned doAXLineForTextMarker(const VisiblePosition&);
287     int indexForTextMarker(VisiblePosition);
288
289     PlainTextRange doAXRangeForLine(unsigned);
290     PlainTextRange doAXRangeForPosition(const IntPoint&);
291     PlainTextRange doAXRangeForIndex(unsigned);
292     PlainTextRange doAXStyleRangeForIndex(unsigned);
293
294     String doAXStringForRange(const PlainTextRange&);
295     IntRect doAXBoundsForRange(PlainTextRange);
296
297     unsigned doAXLineForIndex(unsigned);
298     AccessibilityObject* doAccessibilityHitTest(IntPoint);
299     AccessibilityObject* focusedUIElement();
300     AccessibilityRole roleValue();
301
302     bool canSetFocusAttribute();
303     bool canSetValueAttribute();
304     bool canSetTextRangeAttributes();
305
306     void clearChildren();
307     void addChildren();
308     bool hasChildren();
309     const Vector<RefPtr<AccessibilityObject> >& children() const { return m_children; }
310
311 #if PLATFORM(MAC)
312     AccessibilityObjectWrapper* wrapper() { return m_wrapper.get(); }
313     void setWrapper(AccessibilityObjectWrapper* wrapper) { m_wrapper = wrapper; }
314
315     NSView* attachmentView();
316     void performPressActionForAttachment();
317     NSArray* accessibilityAttributeNames();
318     WebCoreTextMarkerRange* textMarkerRange(WebCoreTextMarker* fromMarker, WebCoreTextMarker* toMarker);
319     WebCoreTextMarker* textMarkerForVisiblePosition(VisiblePosition);
320     WebCoreTextMarker* startTextMarker();
321     VisiblePositionRange visiblePositionRangeForTextMarkerRange(WebCoreTextMarkerRange*);
322     VisiblePosition visiblePositionForTextMarker(WebCoreTextMarker*);
323     VisiblePosition visiblePositionForStartOfTextMarkerRange(WebCoreTextMarkerRange*);
324     VisiblePosition visiblePositionForEndOfTextMarkerRange(WebCoreTextMarkerRange*);
325     WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(VisiblePosition startPosition, VisiblePosition endPosition);
326     WebCoreTextMarkerRange* textMarkerRangeForSelection();
327     WebCoreTextMarkerRange* textMarkerRange();
328     WebCoreTextMarkerRange* textMarkerRangeFromMarkers(WebCoreTextMarker*, WebCoreTextMarker*);
329     NSAttributedString* doAXAttributedStringForTextMarkerRange(WebCoreTextMarkerRange*);
330     NSAttributedString* doAXAttributedStringForRange(NSRange);
331     NSData* doAXRTFForRange(NSRange);
332
333     NSArray* convertChildrenToNSArray();
334     NSArray* convertWidgetChildrenToNSArray();
335    
336     NSValue* position(); 
337     NSString* role();
338     NSString* subrole();
339     NSString* roleDescription();
340     
341     void AXAttributeStringSetElement(NSMutableAttributedString*, NSString*, AccessibilityObject*, NSRange);
342     void AXAttributeStringSetHeadingLevel(NSMutableAttributedString*, RenderObject*, NSRange);
343     void AXAttributedStringAppendText(NSMutableAttributedString*, Node*, int offset, const UChar* chars, int length);
344     AccessibilityObject* AXLinkElementForNode(Node*);
345 #endif
346     
347 private:
348     RenderObject* m_renderer;
349     RefPtr<HTMLAreaElement> m_areaElement;
350     Vector<RefPtr<AccessibilityObject> >m_children;
351     unsigned m_id; 
352
353 #if PLATFORM(MAC)
354     RetainPtr<AccessibilityObjectWrapper> m_wrapper;
355 #endif
356 };
357
358 bool isPasswordFieldElement(Node*);
359
360 } // namespace WebCore
361
362 #endif // AccessibilityObject_h