Rubber-stamped by Brady Eidson.
[webbrowser.git] / WebCore / accessibility / AccessibilityObject.h
blob8e463119a5c7b70f07389857fee1504d5cb20392
1 /*
2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nuanti Ltd.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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.
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.
30 #ifndef AccessibilityObject_h
31 #define AccessibilityObject_h
33 #include "IntRect.h"
34 #include "Range.h"
35 #include "VisiblePosition.h"
36 #include "VisibleSelection.h"
37 #include <wtf/Platform.h>
38 #include <wtf/RefPtr.h>
39 #include <wtf/Vector.h>
41 #if PLATFORM(MAC)
42 #include <wtf/RetainPtr.h>
43 #elif PLATFORM(WIN) && !PLATFORM(WINCE)
44 #include "AccessibilityObjectWrapperWin.h"
45 #include "COMPtr.h"
46 #elif PLATFORM(CHROMIUM)
47 #include "AccessibilityObjectWrapper.h"
48 #endif
50 typedef struct _NSRange NSRange;
52 #ifdef __OBJC__
53 @class AccessibilityObjectWrapper;
54 @class NSArray;
55 @class NSAttributedString;
56 @class NSData;
57 @class NSMutableAttributedString;
58 @class NSString;
59 @class NSValue;
60 @class NSView;
61 #else
62 class NSArray;
63 class NSAttributedString;
64 class NSData;
65 class NSMutableAttributedString;
66 class NSString;
67 class NSValue;
68 class NSView;
69 #if PLATFORM(GTK)
70 typedef struct _AtkObject AtkObject;
71 typedef struct _AtkObject AccessibilityObjectWrapper;
72 #else
73 class AccessibilityObjectWrapper;
74 #endif
75 #endif
77 namespace WebCore {
79 class AXObjectCache;
80 class Element;
81 class Frame;
82 class FrameView;
83 class HTMLAnchorElement;
84 class HTMLAreaElement;
85 class IntPoint;
86 class IntSize;
87 class Node;
88 class RenderObject;
89 class RenderListItem;
90 class VisibleSelection;
91 class String;
92 class Widget;
94 typedef unsigned AXID;
96 enum AccessibilityRole {
97 UnknownRole = 1,
98 ButtonRole,
99 RadioButtonRole,
100 CheckBoxRole,
101 SliderRole,
102 TabGroupRole,
103 TextFieldRole,
104 StaticTextRole,
105 TextAreaRole,
106 ScrollAreaRole,
107 PopUpButtonRole,
108 MenuButtonRole,
109 TableRole,
110 ApplicationRole,
111 GroupRole,
112 RadioGroupRole,
113 ListRole,
114 ScrollBarRole,
115 ValueIndicatorRole,
116 ImageRole,
117 MenuBarRole,
118 MenuRole,
119 MenuItemRole,
120 ColumnRole,
121 RowRole,
122 ToolbarRole,
123 BusyIndicatorRole,
124 ProgressIndicatorRole,
125 WindowRole,
126 DrawerRole,
127 SystemWideRole,
128 OutlineRole,
129 IncrementorRole,
130 BrowserRole,
131 ComboBoxRole,
132 SplitGroupRole,
133 SplitterRole,
134 ColorWellRole,
135 GrowAreaRole,
136 SheetRole,
137 HelpTagRole,
138 MatteRole,
139 RulerRole,
140 RulerMarkerRole,
141 LinkRole,
142 DisclosureTriangleRole,
143 GridRole,
144 CellRole,
145 ColumnHeaderRole,
146 RowHeaderRole,
147 // AppKit includes SortButtonRole but it is misnamed and really a subrole of ButtonRole so we do not include it here.
149 // WebCore-specific roles
150 WebCoreLinkRole,
151 ImageMapLinkRole,
152 ImageMapRole,
153 ListMarkerRole,
154 WebAreaRole,
155 HeadingRole,
156 ListBoxRole,
157 ListBoxOptionRole,
158 TableHeaderContainerRole,
159 DefinitionListTermRole,
160 DefinitionListDefinitionRole,
161 AnnotationRole,
162 SliderThumbRole,
163 IgnoredRole,
164 TabRole,
165 TabListRole,
166 TabPanelRole,
167 TreeRole,
168 TreeItemRole,
169 DirectoryRole,
171 // ARIA Grouping roles
172 LandmarkApplicationRole,
173 LandmarkBannerRole,
174 LandmarkComplementaryRole,
175 LandmarkContentInfoRole,
176 LandmarkMainRole,
177 LandmarkNavigationRole,
178 LandmarkSearchRole,
180 ApplicationAlertRole,
181 ApplicationAlertDialogRole,
182 ApplicationDialogRole,
183 ApplicationLogRole,
184 ApplicationMarqueeRole,
185 ApplicationStatusRole,
186 ApplicationTimerRole,
188 DocumentRole,
189 DocumentArticleRole,
190 DocumentMathRole,
191 DocumentNoteRole,
192 DocumentRegionRole,
194 UserInterfaceTooltipRole
197 enum AccessibilityOrientation {
198 AccessibilityOrientationVertical,
199 AccessibilityOrientationHorizontal,
202 enum AccessibilityObjectPlatformInclusion {
203 IncludeObject,
204 IgnoreObject,
205 DefaultBehavior,
208 struct VisiblePositionRange {
210 VisiblePosition start;
211 VisiblePosition end;
213 VisiblePositionRange() {}
215 VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
216 : start(s)
217 , end(e)
220 bool isNull() const { return start.isNull() || end.isNull(); }
223 struct PlainTextRange {
225 unsigned start;
226 unsigned length;
228 PlainTextRange()
229 : start(0)
230 , length(0)
233 PlainTextRange(unsigned s, unsigned l)
234 : start(s)
235 , length(l)
238 bool isNull() const { return !start && !length; }
241 class AccessibilityObject : public RefCounted<AccessibilityObject> {
242 protected:
243 AccessibilityObject();
244 public:
245 virtual ~AccessibilityObject();
246 virtual void detach();
248 typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector;
250 virtual bool isAccessibilityRenderObject() const { return false; }
251 virtual bool isAnchor() const { return false; }
252 virtual bool isAttachment() const { return false; }
253 virtual bool isHeading() const { return false; }
254 virtual bool isLink() const { return false; }
255 virtual bool isImage() const { return false; }
256 virtual bool isNativeImage() const { return false; }
257 virtual bool isImageButton() const { return false; }
258 virtual bool isPasswordField() const { return false; }
259 virtual bool isTextControl() const { return false; }
260 virtual bool isNativeTextControl() const { return false; }
261 virtual bool isWebArea() const { return false; }
262 virtual bool isCheckboxOrRadio() const { return false; }
263 virtual bool isListBox() const { return roleValue() == ListBoxRole; }
264 virtual bool isMediaTimeline() const { return false; }
265 virtual bool isMenuRelated() const { return false; }
266 virtual bool isMenu() const { return false; }
267 virtual bool isMenuBar() const { return false; }
268 virtual bool isMenuButton() const { return false; }
269 virtual bool isMenuItem() const { return false; }
270 virtual bool isFileUploadButton() const { return false; }
271 virtual bool isInputImage() const { return false; }
272 virtual bool isProgressIndicator() const { return false; }
273 virtual bool isSlider() const { return false; }
274 virtual bool isControl() const { return false; }
275 virtual bool isList() const { return false; }
276 virtual bool isDataTable() const { return false; }
277 virtual bool isTableRow() const { return false; }
278 virtual bool isTableColumn() const { return false; }
279 virtual bool isTableCell() const { return false; }
280 virtual bool isFieldset() const { return false; }
281 virtual bool isGroup() const { return false; }
282 bool isTabList() const { return roleValue() == TabListRole; }
283 bool isTabItem() const { return roleValue() == TabRole; }
284 bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
285 bool isComboBox() const { return roleValue() == ComboBoxRole; }
286 bool isTree() const { return roleValue() == TreeRole; }
287 bool isTreeItem() const { return roleValue() == TreeItemRole; }
288 bool isScrollbar() const { return roleValue() == ScrollBarRole; }
289 bool isButton() const { return roleValue() == ButtonRole; }
291 virtual bool isChecked() const { return false; }
292 virtual bool isEnabled() const { return false; }
293 virtual bool isSelected() const { return false; }
294 virtual bool isFocused() const { return false; }
295 virtual bool isHovered() const { return false; }
296 virtual bool isIndeterminate() const { return false; }
297 virtual bool isLoaded() const { return false; }
298 virtual bool isMultiSelect() const { return false; }
299 virtual bool isOffScreen() const { return false; }
300 virtual bool isPressed() const { return false; }
301 virtual bool isReadOnly() const { return false; }
302 virtual bool isVisited() const { return false; }
303 virtual bool isRequired() const { return false; }
304 virtual bool isLinked() const { return false; }
305 virtual bool isExpanded() const { return false; }
306 virtual void setIsExpanded(bool) { }
308 virtual bool canSetFocusAttribute() const { return false; }
309 virtual bool canSetTextRangeAttributes() const { return false; }
310 virtual bool canSetValueAttribute() const { return false; }
311 virtual bool canSetSelectedAttribute() const { return false; }
312 virtual bool canSetSelectedChildrenAttribute() const { return false; }
313 virtual bool canSetExpandedAttribute() const { return false; }
315 virtual bool hasIntValue() const { return false; }
317 bool accessibilityShouldUseUniqueId() const { return true; }
318 virtual bool accessibilityIsIgnored() const { return true; }
320 virtual int headingLevel() const { return 0; }
321 virtual int intValue() const { return 0; }
322 virtual String valueDescription() const { return String(); }
323 virtual float valueForRange() const { return 0.0f; }
324 virtual float maxValueForRange() const { return 0.0f; }
325 virtual float minValueForRange() const { return 0.0f; }
326 virtual AccessibilityObject* selectedRadioButton() { return 0; }
327 virtual AccessibilityObject* selectedTabItem() { return 0; }
328 virtual int layoutCount() const { return 0; }
329 static bool isARIAControl(AccessibilityRole);
330 static bool isARIAInput(AccessibilityRole);
331 virtual bool supportsARIAOwns() const { return false; }
332 virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
333 virtual bool supportsARIAFlowTo() const { return false; }
334 virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
336 // ARIA drag and drop
337 virtual bool supportsARIADropping() { return false; }
338 virtual bool supportsARIADragging() { return false; }
339 virtual bool isARIAGrabbed() { return false; }
340 virtual void setARIAGrabbed(bool) { }
341 virtual void determineARIADropEffects(Vector<String>&) { }
343 virtual AccessibilityObject* doAccessibilityHitTest(const IntPoint&) const { return 0; }
344 virtual AccessibilityObject* focusedUIElement() const { return 0; }
346 virtual AccessibilityObject* firstChild() const { return 0; }
347 virtual AccessibilityObject* lastChild() const { return 0; }
348 virtual AccessibilityObject* previousSibling() const { return 0; }
349 virtual AccessibilityObject* nextSibling() const { return 0; }
350 virtual AccessibilityObject* parentObject() const = 0;
351 virtual AccessibilityObject* parentObjectUnignored() const;
352 virtual AccessibilityObject* parentObjectIfExists() const { return 0; }
353 static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
355 virtual AccessibilityObject* observableObject() const { return 0; }
356 virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
357 virtual AccessibilityObject* titleUIElement() const { return 0; }
358 virtual bool exposesTitleUIElement() const { return true; }
359 virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; }
361 virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
362 virtual bool isPresentationalChildOfAriaRole() const { return false; }
363 virtual bool ariaRoleHasPresentationalChildren() const { return false; }
365 void setRoleValue(AccessibilityRole role) { m_role = role; }
366 virtual AccessibilityRole roleValue() const { return m_role; }
367 virtual String ariaLabeledByAttribute() const { return String(); }
368 virtual String ariaDescribedByAttribute() const { return String(); }
369 virtual String accessibilityDescription() const { return String(); }
370 virtual PassRefPtr<Range> ariaSelectedTextDOMRange() const { return 0; }
372 virtual AXObjectCache* axObjectCache() const { return 0; }
373 AXID axObjectID() const { return m_id; }
374 void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
376 static AccessibilityObject* anchorElementForNode(Node*);
377 virtual Element* anchorElement() const { return 0; }
378 virtual Element* actionElement() const { return 0; }
379 virtual IntRect boundingBoxRect() const { return IntRect(); }
380 virtual IntRect elementRect() const = 0;
381 virtual IntSize size() const = 0;
382 virtual IntPoint clickPoint() const;
384 virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
385 unsigned selectionStart() const { return selectedTextRange().start; }
386 unsigned selectionEnd() const { return selectedTextRange().length; }
388 virtual KURL url() const { return KURL(); }
389 virtual VisibleSelection selection() const { return VisibleSelection(); }
390 virtual String stringValue() const { return String(); }
391 virtual String title() const { return String(); }
392 virtual String helpText() const { return String(); }
393 virtual String textUnderElement() const { return String(); }
394 virtual String text() const { return String(); }
395 virtual int textLength() const { return 0; }
396 virtual String selectedText() const { return String(); }
397 virtual const AtomicString& accessKey() const { return nullAtom; }
398 const String& actionVerb() const;
399 virtual Widget* widget() const { return 0; }
400 virtual Widget* widgetForAttachmentView() const { return 0; }
401 virtual Document* document() const { return 0; }
402 virtual FrameView* topDocumentFrameView() const { return 0; }
403 virtual FrameView* documentFrameView() const;
404 virtual String language() const;
405 virtual unsigned hierarchicalLevel() const { return 0; }
407 virtual void setFocused(bool) { }
408 virtual void setSelectedText(const String&) { }
409 virtual void setSelectedTextRange(const PlainTextRange&) { }
410 virtual void setValue(const String&) { }
411 virtual void setSelected(bool) { }
412 virtual void setSelectedRows(AccessibilityChildrenVector&) { }
414 virtual void makeRangeVisible(const PlainTextRange&) { }
415 virtual bool press() const;
416 bool performDefaultAction() const { return press(); }
418 virtual AccessibilityOrientation orientation() const;
419 virtual void increment() { }
420 virtual void decrement() { }
422 virtual void childrenChanged() { }
423 virtual const AccessibilityChildrenVector& children() { return m_children; }
424 virtual void addChildren() { }
425 virtual bool canHaveChildren() const { return true; }
426 virtual bool hasChildren() const { return m_haveChildren; }
427 virtual void selectedChildren(AccessibilityChildrenVector&) { }
428 virtual void visibleChildren(AccessibilityChildrenVector&) { }
429 virtual void tabChildren(AccessibilityChildrenVector&) { }
430 virtual bool shouldFocusActiveDescendant() const { return false; }
431 virtual AccessibilityObject* activeDescendant() const { return 0; }
432 virtual void handleActiveDescendantChanged() { }
434 static AccessibilityRole ariaRoleToWebCoreRole(const String&);
436 virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
437 virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
439 VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
440 VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
441 VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
442 VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
443 VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
444 VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
445 VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
446 VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
447 VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
449 String stringForVisiblePositionRange(const VisiblePositionRange&) const;
450 virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
451 int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
452 virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
454 virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
455 VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
456 VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
457 VisiblePosition nextWordEnd(const VisiblePosition&) const;
458 VisiblePosition previousWordStart(const VisiblePosition&) const;
459 VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
460 VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
461 VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
462 VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
463 VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
464 VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
465 virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
467 virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
468 virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
470 AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
471 int lineForPosition(const VisiblePosition&) const;
472 PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
473 virtual int index(const VisiblePosition&) const { return -1; }
475 virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
476 PlainTextRange doAXRangeForPosition(const IntPoint&) const;
477 virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
478 PlainTextRange doAXStyleRangeForIndex(unsigned) const;
480 virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
481 virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
482 String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
484 unsigned doAXLineForIndex(unsigned);
486 virtual String stringValueForMSAA() const { return String(); }
487 virtual String stringRoleForMSAA() const { return String(); }
488 virtual String nameForMSAA() const { return String(); }
489 virtual String descriptionForMSAA() const { return String(); }
491 // Used by an ARIA tree to get all its rows.
492 void ariaTreeRows(AccessibilityChildrenVector&);
493 // Used by an ARIA tree item to get all of its direct rows that it can disclose.
494 void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
495 // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
496 void ariaTreeItemContent(AccessibilityChildrenVector&);
498 #if HAVE(ACCESSIBILITY)
499 #if PLATFORM(GTK)
500 AccessibilityObjectWrapper* wrapper() const;
501 void setWrapper(AccessibilityObjectWrapper*);
502 #else
503 AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
504 void setWrapper(AccessibilityObjectWrapper* wrapper)
506 m_wrapper = wrapper;
508 #endif
509 #endif
511 // a platform-specific method for determining if an attachment is ignored
512 #if HAVE(ACCESSIBILITY)
513 bool accessibilityIgnoreAttachment() const;
514 #else
515 bool accessibilityIgnoreAttachment() const { return true; }
516 #endif
518 // gives platforms the opportunity to indicate if and how an object should be included
519 #if HAVE(ACCESSIBILITY)
520 AccessibilityObjectPlatformInclusion accessibilityPlatformIncludesObject() const;
521 #else
522 AccessibilityObjectPlatformInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
523 #endif
525 // allows for an AccessibilityObject to update its render tree or perform
526 // other operations update type operations
527 virtual void updateBackingStore() { }
529 protected:
530 AXID m_id;
531 AccessibilityChildrenVector m_children;
532 mutable bool m_haveChildren;
533 AccessibilityRole m_role;
535 virtual void clearChildren();
536 virtual bool isDetached() const { return true; }
537 RenderListItem* renderListItemContainerForNode(Node* node) const;
539 #if PLATFORM(MAC)
540 RetainPtr<AccessibilityObjectWrapper> m_wrapper;
541 #elif PLATFORM(WIN) && !PLATFORM(WINCE)
542 COMPtr<AccessibilityObjectWrapper> m_wrapper;
543 #elif PLATFORM(GTK)
544 AtkObject* m_wrapper;
545 #elif PLATFORM(CHROMIUM)
546 RefPtr<AccessibilityObjectWrapper> m_wrapper;
547 #endif
550 } // namespace WebCore
552 #endif // AccessibilityObject_h