b402f3d1e13b85822469b724cf27b1529827913c
[WebKit-https.git] / Source / WebCore / accessibility / AccessibilityObject.h
1 /*
2  * Copyright (C) 2008, 2009, 2011 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 "FloatQuad.h"
34 #include "LayoutTypes.h"
35 #include "VisiblePosition.h"
36 #include "VisibleSelection.h"
37 #include <wtf/Forward.h>
38 #include <wtf/RefPtr.h>
39 #include <wtf/Vector.h>
40
41 #if PLATFORM(MAC)
42 #include <wtf/RetainPtr.h>
43 #elif PLATFORM(WIN) && !OS(WINCE)
44 #include "AccessibilityObjectWrapperWin.h"
45 #include "COMPtr.h"
46 #elif PLATFORM(CHROMIUM)
47 #include "AccessibilityObjectWrapper.h"
48 #endif
49
50 typedef struct _NSRange NSRange;
51
52 #ifdef __OBJC__
53 @class NSArray;
54 @class NSAttributedString;
55 @class NSData;
56 @class NSMutableAttributedString;
57 @class NSString;
58 @class NSValue;
59 @class NSView;
60 @class WebAccessibilityObjectWrapper;
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 #elif PLATFORM(MAC)
73 class WebAccessibilityObjectWrapper;
74 #else
75 class AccessibilityObjectWrapper;
76 #endif
77 #endif
78
79 #if PLATFORM(MAC)
80 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
81 #endif
82
83 namespace WebCore {
84
85 class AccessibilityObject;
86 class AXObjectCache;
87 class Element;
88 class Frame;
89 class FrameView;
90 class HTMLAnchorElement;
91 class HTMLAreaElement;
92 class IntPoint;
93 class IntSize;
94 class Node;
95 class Page;
96 class RenderObject;
97 class RenderListItem;
98 class VisibleSelection;
99 class Widget;
100
101 typedef unsigned AXID;
102
103 enum AccessibilityRole {
104     AnnotationRole = 1,
105     ApplicationRole,
106     ApplicationAlertRole,
107     ApplicationAlertDialogRole,
108     ApplicationDialogRole,
109     ApplicationLogRole,
110     ApplicationMarqueeRole,
111     ApplicationStatusRole,
112     ApplicationTimerRole, 
113     BrowserRole,
114     BusyIndicatorRole,
115     ButtonRole,
116     CellRole, 
117     CheckBoxRole,
118     ColorWellRole,
119     ColumnRole,
120     ColumnHeaderRole,
121     ComboBoxRole,
122     DefinitionListTermRole,
123     DefinitionListDefinitionRole,
124     DirectoryRole,
125     DisclosureTriangleRole,
126     DivRole,
127     DocumentRole,
128     DocumentArticleRole,
129     DocumentMathRole,
130     DocumentNoteRole,
131     DocumentRegionRole,            
132     DrawerRole,
133     EditableTextRole,
134     FormRole,
135     GridRole,
136     GroupRole,
137     GrowAreaRole,
138     HeadingRole,
139     HelpTagRole,
140     IgnoredRole,
141     ImageRole,
142     ImageMapRole,
143     ImageMapLinkRole,
144     IncrementorRole,
145     LabelRole,
146     LandmarkApplicationRole,
147     LandmarkBannerRole,
148     LandmarkComplementaryRole,
149     LandmarkContentInfoRole,
150     LandmarkMainRole,
151     LandmarkNavigationRole,
152     LandmarkSearchRole,
153     LinkRole,
154     ListRole,
155     ListBoxRole,
156     ListBoxOptionRole,
157     ListItemRole,
158     ListMarkerRole,
159     MatteRole,
160     MenuRole,
161     MenuBarRole,
162     MenuButtonRole,
163     MenuItemRole,
164     MenuListPopupRole,
165     MenuListOptionRole,
166     OutlineRole,
167     ParagraphRole,
168     PopUpButtonRole,
169     PresentationalRole,
170     ProgressIndicatorRole,
171     RadioButtonRole,
172     RadioGroupRole,
173     RowHeaderRole,
174     RowRole,
175     RulerRole,
176     RulerMarkerRole,
177     ScrollAreaRole,
178     ScrollBarRole,
179     SheetRole,
180     SliderRole,
181     SliderThumbRole,
182     SpinButtonRole,
183     SpinButtonPartRole,
184     SplitGroupRole,
185     SplitterRole,
186     StaticTextRole,
187     SystemWideRole,
188     TabGroupRole,
189     TabListRole,
190     TabPanelRole,            
191     TabRole,
192     TableRole,
193     TableHeaderContainerRole,
194     TextAreaRole,
195     TreeRole,
196     TreeGridRole,
197     TreeItemRole,
198     TextFieldRole,
199     ToolbarRole,
200     UnknownRole,
201     UserInterfaceTooltipRole,
202     ValueIndicatorRole,            
203     WebAreaRole,
204     WebCoreLinkRole,
205     WindowRole,
206 };
207
208 enum AccessibilityOrientation {
209     AccessibilityOrientationVertical,
210     AccessibilityOrientationHorizontal,
211 };
212     
213 enum AccessibilityObjectInclusion {
214     IncludeObject,
215     IgnoreObject,
216     DefaultBehavior,
217 };
218     
219 enum AccessibilityButtonState {
220     ButtonStateOff = 0,
221     ButtonStateOn, 
222     ButtonStateMixed,
223 };
224     
225 enum AccessibilitySortDirection {
226     SortDirectionNone,
227     SortDirectionAscending,
228     SortDirectionDescending,
229 };
230
231 enum AccessibilitySearchDirection {
232     SearchDirectionNext = 1,
233     SearchDirectionPrevious
234 };
235
236 enum AccessibilitySearchKey {
237     AnyTypeSearchKey = 1,
238     BlockquoteSameLevelSearchKey,
239     BlockquoteSearchKey,
240     BoldFontSearchKey,
241     ButtonSearchKey,
242     CheckBoxSearchKey,
243     ControlSearchKey,
244     DifferentTypeSearchKey,
245     FontChangeSearchKey,
246     FontColorChangeSearchKey,
247     FrameSearchKey,
248     GraphicSearchKey,
249     HeadingLevel1SearchKey,
250     HeadingLevel2SearchKey,
251     HeadingLevel3SearchKey,
252     HeadingLevel4SearchKey,
253     HeadingLevel5SearchKey,
254     HeadingLevel6SearchKey,
255     HeadingSameLevelSearchKey,
256     HeadingSearchKey,
257     ItalicFontSearchKey,
258     LandmarkSearchKey,
259     LinkSearchKey,
260     ListSearchKey,
261     LiveRegionSearchKey,
262     MisspelledWordSearchKey,
263     PlainTextSearchKey,
264     RadioGroupSearchKey,
265     SameTypeSearchKey,
266     StaticTextSearchKey,
267     StyleChangeSearchKey,
268     TableSameLevelSearchKey,
269     TableSearchKey,
270     TextFieldSearchKey,
271     UnderlineSearchKey,
272     UnvisitedLinkSearchKey,
273     VisitedLinkSearchKey
274 };
275
276 struct AccessibilitySearchPredicate {
277     AccessibilityObject* axContainerObject;
278     AccessibilityObject* axStartObject;
279     AccessibilitySearchDirection axSearchDirection;
280     AccessibilitySearchKey axSearchKey;
281     String* searchText;
282     unsigned resultsLimit;
283 };
284
285 struct VisiblePositionRange {
286
287     VisiblePosition start;
288     VisiblePosition end;
289
290     VisiblePositionRange() {}
291
292     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
293         : start(s)
294         , end(e)
295     { }
296
297     bool isNull() const { return start.isNull() || end.isNull(); }
298 };
299
300 struct PlainTextRange {
301         
302     unsigned start;
303     unsigned length;
304     
305     PlainTextRange()
306         : start(0)
307         , length(0)
308     { }
309     
310     PlainTextRange(unsigned s, unsigned l)
311         : start(s)
312         , length(l)
313     { }
314     
315     bool isNull() const { return !start && !length; }
316 };
317
318 class AccessibilityObject : public RefCounted<AccessibilityObject> {
319 protected:
320     AccessibilityObject();
321     
322     // Should only be called by accessibleObjectsWithAccessibilitySearchPredicate for AccessibilityObject searching.
323     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchPredicate*);
324     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchPredicate*);
325 public:
326     virtual ~AccessibilityObject();
327     virtual void detach();
328         
329     typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector;
330     
331     virtual bool isAccessibilityRenderObject() const { return false; }
332     virtual bool isAccessibilityScrollbar() const { return false; }
333     virtual bool isAccessibilityScrollView() const { return false; }
334     
335     bool accessibilityObjectContainsText(String *) const;
336     
337     virtual bool isAnchor() const { return false; }
338     virtual bool isAttachment() const { return false; }
339     virtual bool isHeading() const { return false; }
340     virtual bool isLink() const { return false; }
341     virtual bool isImage() const { return false; }
342     virtual bool isNativeImage() const { return false; }
343     virtual bool isImageButton() const { return false; }
344     virtual bool isPasswordField() const { return false; }
345     virtual bool isNativeTextControl() const { return false; }
346     virtual bool isWebArea() const { return false; }
347     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
348     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
349     virtual bool isListBox() const { return roleValue() == ListBoxRole; }
350     virtual bool isMediaTimeline() const { return false; }
351     virtual bool isMenuRelated() const { return false; }
352     virtual bool isMenu() const { return false; }
353     virtual bool isMenuBar() const { return false; }
354     virtual bool isMenuButton() const { return false; }
355     virtual bool isMenuItem() const { return false; }
356     virtual bool isFileUploadButton() const { return false; }
357     virtual bool isInputImage() const { return false; }
358     virtual bool isProgressIndicator() const { return false; }
359     virtual bool isSlider() const { return false; }
360     virtual bool isInputSlider() const { return false; }
361     virtual bool isControl() const { return false; }
362     virtual bool isList() const { return false; }
363     virtual bool isAccessibilityTable() const { return false; }
364     virtual bool isDataTable() const { return false; }
365     virtual bool isTableRow() const { return false; }
366     virtual bool isTableColumn() const { return false; }
367     virtual bool isTableCell() const { return false; }
368     virtual bool isFieldset() const { return false; }
369     virtual bool isGroup() const { return false; }
370     virtual bool isARIATreeGridRow() const { return false; }
371     virtual bool isImageMapLink() const { return false; }
372     virtual bool isMenuList() const { return false; }
373     virtual bool isMenuListPopup() const { return false; }
374     virtual bool isMenuListOption() const { return false; }
375     virtual bool isSpinButton() const { return false; }
376     virtual bool isSpinButtonPart() const { return false; }
377     virtual bool isMockObject() const { return false; }
378     bool isTextControl() const { return roleValue() == TextAreaRole || roleValue() == TextFieldRole; }
379     bool isARIATextControl() const;
380     bool isTabList() const { return roleValue() == TabListRole; }
381     bool isTabItem() const { return roleValue() == TabRole; }
382     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
383     bool isComboBox() const { return roleValue() == ComboBoxRole; }
384     bool isTree() const { return roleValue() == TreeRole; }
385     bool isTreeItem() const { return roleValue() == TreeItemRole; }
386     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
387     bool isButton() const { return roleValue() == ButtonRole; }
388     bool isListItem() const { return roleValue() == ListItemRole; }
389     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
390     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
391     bool isBlockquote() const;
392     bool isLandmark() const;
393     
394     virtual bool isChecked() const { return false; }
395     virtual bool isEnabled() const { return false; }
396     virtual bool isSelected() const { return false; }
397     virtual bool isFocused() const { return false; }
398     virtual bool isHovered() const { return false; }
399     virtual bool isIndeterminate() const { return false; }
400     virtual bool isLoaded() const { return false; }
401     virtual bool isMultiSelectable() const { return false; }
402     virtual bool isOffScreen() const { return false; }
403     virtual bool isPressed() const { return false; }
404     virtual bool isReadOnly() const { return false; }
405     virtual bool isUnvisited() const { return false; }
406     virtual bool isVisited() const { return false; }
407     virtual bool isRequired() const { return false; }
408     virtual bool isLinked() const { return false; }
409     virtual bool isExpanded() const;
410     virtual bool isVisible() const { return true; }
411     virtual bool isCollapsed() const { return false; }
412     virtual void setIsExpanded(bool) { }
413
414     virtual bool hasBoldFont() const { return false; }
415     virtual bool hasItalicFont() const { return false; }
416     bool hasMisspelling() const;
417     virtual bool hasPlainText() const { return false; }
418     virtual bool hasSameFont(RenderObject*) const { return false; }
419     virtual bool hasSameFontColor(RenderObject*) const { return false; }
420     virtual bool hasSameStyle(RenderObject*) const { return false; }
421     bool hasStaticText() const { return roleValue() == StaticTextRole; }
422     virtual bool hasUnderline() const { return false; }
423
424     virtual bool canSetFocusAttribute() const { return false; }
425     virtual bool canSetTextRangeAttributes() const { return false; }
426     virtual bool canSetValueAttribute() const { return false; }
427     virtual bool canSetNumericValue() const { return false; }
428     virtual bool canSetSelectedAttribute() const { return false; }
429     virtual bool canSetSelectedChildrenAttribute() const { return false; }
430     virtual bool canSetExpandedAttribute() const { return false; }
431     
432     // A programmatic way to set a name on an AccessibleObject.
433     virtual void setAccessibleName(const AtomicString&) { }
434     
435     virtual Node* node() const { return 0; }
436     virtual RenderObject* renderer() const { return 0; }
437     virtual bool accessibilityIsIgnored() const  { return true; }
438
439     int blockquoteLevel() const;
440     virtual int headingLevel() const { return 0; }
441     virtual int tableLevel() const { return 0; }
442     virtual AccessibilityButtonState checkboxOrRadioValue() const;
443     virtual String valueDescription() const { return String(); }
444     virtual float valueForRange() const { return 0.0f; }
445     virtual float maxValueForRange() const { return 0.0f; }
446     virtual float minValueForRange() const { return 0.0f; }
447     virtual float stepValueForRange() const { return 0.0f; }
448     virtual AccessibilityObject* selectedRadioButton() { return 0; }
449     virtual AccessibilityObject* selectedTabItem() { return 0; }    
450     virtual int layoutCount() const { return 0; }
451     virtual double estimatedLoadingProgress() const { return 0; }
452     static bool isARIAControl(AccessibilityRole);
453     static bool isARIAInput(AccessibilityRole);
454     virtual bool supportsARIAOwns() const { return false; }
455     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
456     virtual bool supportsARIAFlowTo() const { return false; }
457     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
458     virtual bool ariaHasPopup() const { return false; }
459     bool ariaIsMultiline() const;
460     virtual const AtomicString& invalidStatus() const;
461     bool supportsARIAExpanded() const;
462     AccessibilitySortDirection sortDirection() const;
463     
464     // ARIA drag and drop
465     virtual bool supportsARIADropping() const { return false; }
466     virtual bool supportsARIADragging() const { return false; }
467     virtual bool isARIAGrabbed() { return false; }
468     virtual void setARIAGrabbed(bool) { }
469     virtual void determineARIADropEffects(Vector<String>&) { }
470     
471     // Called on the root AX object to return the deepest available element.
472     virtual AccessibilityObject* accessibilityHitTest(const LayoutPoint&) const { return 0; }
473     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
474     virtual AccessibilityObject* elementAccessibilityHitTest(const LayoutPoint&) const;
475
476     virtual AccessibilityObject* focusedUIElement() const;
477
478     virtual AccessibilityObject* firstChild() const { return 0; }
479     virtual AccessibilityObject* lastChild() const { return 0; }
480     virtual AccessibilityObject* previousSibling() const { return 0; }
481     virtual AccessibilityObject* nextSibling() const { return 0; }
482     virtual AccessibilityObject* parentObject() const = 0;
483     virtual AccessibilityObject* parentObjectUnignored() const;
484     virtual AccessibilityObject* parentObjectIfExists() const { return 0; }
485     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
486     static void accessibleObjectsWithAccessibilitySearchPredicate(AccessibilitySearchPredicate*, AccessibilityChildrenVector&);
487
488     virtual AccessibilityObject* observableObject() const { return 0; }
489     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
490     virtual AccessibilityObject* titleUIElement() const { return 0; }
491     virtual bool exposesTitleUIElement() const { return true; }
492     virtual AccessibilityObject* correspondingLabelForControlElement() const { return 0; }
493     virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; }
494     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) const { return 0; }
495     
496     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
497     virtual bool isPresentationalChildOfAriaRole() const { return false; }
498     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
499
500     void setRoleValue(AccessibilityRole role) { m_role = role; }
501     virtual AccessibilityRole roleValue() const { return m_role; }
502     virtual String ariaLabeledByAttribute() const { return String(); }
503     virtual String ariaDescribedByAttribute() const { return String(); }
504     virtual String accessibilityDescription() const { return String(); }
505
506     virtual AXObjectCache* axObjectCache() const;
507     AXID axObjectID() const { return m_id; }
508     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
509     
510     static AccessibilityObject* anchorElementForNode(Node*);
511     virtual Element* anchorElement() const { return 0; }
512     virtual Element* actionElement() const { return 0; }
513     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
514     virtual LayoutRect elementRect() const = 0;
515     virtual LayoutSize size() const { return elementRect().size(); }
516     virtual LayoutPoint clickPoint();
517     static LayoutRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
518     
519     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
520     unsigned selectionStart() const { return selectedTextRange().start; }
521     unsigned selectionEnd() const { return selectedTextRange().length; }
522     
523     virtual KURL url() const { return KURL(); }
524     virtual VisibleSelection selection() const { return VisibleSelection(); }
525     virtual String stringValue() const { return String(); }
526     virtual String title() const { return String(); }
527     virtual String helpText() const { return String(); }
528     virtual String textUnderElement() const { return String(); }
529     virtual String text() const { return String(); }
530     virtual int textLength() const { return 0; }
531     virtual String selectedText() const { return String(); }
532     virtual const AtomicString& accessKey() const { return nullAtom; }
533     const String& actionVerb() const;
534     virtual Widget* widget() const { return 0; }
535     virtual Widget* widgetForAttachmentView() const { return 0; }
536     Page* page() const;
537     virtual Document* document() const;
538     virtual FrameView* topDocumentFrameView() const { return 0; }
539     virtual FrameView* documentFrameView() const;
540     String language() const;
541     virtual unsigned hierarchicalLevel() const { return 0; }
542     const AtomicString& placeholderValue() const;
543     
544     virtual void setFocused(bool) { }
545     virtual void setSelectedText(const String&) { }
546     virtual void setSelectedTextRange(const PlainTextRange&) { }
547     virtual void setValue(const String&) { }
548     virtual void setValue(float) { }
549     virtual void setSelected(bool) { }
550     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
551     
552     virtual void makeRangeVisible(const PlainTextRange&) { }
553     virtual bool press() const;
554     bool performDefaultAction() const { return press(); }
555     
556     virtual AccessibilityOrientation orientation() const;
557     virtual void increment() { }
558     virtual void decrement() { }
559
560     virtual void childrenChanged() { }
561     virtual void contentChanged() { }
562     const AccessibilityChildrenVector& children();
563     virtual void addChildren() { }
564     virtual bool canHaveChildren() const { return true; }
565     virtual bool hasChildren() const { return m_haveChildren; }
566     virtual void updateChildrenIfNecessary();
567     virtual void setNeedsToUpdateChildren() { }
568     virtual void clearChildren();
569     virtual void detachFromParent() { }
570
571     virtual void selectedChildren(AccessibilityChildrenVector&) { }
572     virtual void visibleChildren(AccessibilityChildrenVector&) { }
573     virtual void tabChildren(AccessibilityChildrenVector&) { }
574     virtual bool shouldFocusActiveDescendant() const { return false; }
575     virtual AccessibilityObject* activeDescendant() const { return 0; }    
576     virtual void handleActiveDescendantChanged() { }
577     virtual void handleAriaExpandedChanged() { }
578     
579     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
580     const AtomicString& getAttribute(const QualifiedName&) const;
581
582     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
583     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
584     
585     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
586     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
587     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
588     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
589     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
590     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
591     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
592     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
593     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
594
595     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
596     virtual LayoutRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return LayoutRect(); }
597     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
598     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
599
600     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
601     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
602     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
603     VisiblePosition nextWordEnd(const VisiblePosition&) const;
604     VisiblePosition previousWordStart(const VisiblePosition&) const;
605     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
606     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
607     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
608     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
609     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
610     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
611     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
612     
613     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
614     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
615
616     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
617     int lineForPosition(const VisiblePosition&) const;
618     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
619     virtual int index(const VisiblePosition&) const { return -1; }
620
621     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
622     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
623     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
624     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
625
626     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
627     virtual LayoutRect doAXBoundsForRange(const PlainTextRange&) const { return LayoutRect(); }
628     String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
629
630     unsigned doAXLineForIndex(unsigned);
631
632     virtual String stringValueForMSAA() const { return String(); }
633     virtual String stringRoleForMSAA() const { return String(); }
634     virtual String nameForMSAA() const { return String(); }
635     virtual String descriptionForMSAA() const { return String(); }
636     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
637
638     // Used by an ARIA tree to get all its rows.
639     void ariaTreeRows(AccessibilityChildrenVector&);
640     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
641     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
642     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
643     void ariaTreeItemContent(AccessibilityChildrenVector&);
644     
645     // ARIA live-region features.
646     bool supportsARIALiveRegion() const;
647     bool isInsideARIALiveRegion() const;
648     virtual const AtomicString& ariaLiveRegionStatus() const { return nullAtom; }
649     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
650     virtual bool ariaLiveRegionAtomic() const { return false; }
651     virtual bool ariaLiveRegionBusy() const { return false; }
652     
653     bool supportsARIAAttributes() const;
654     
655     // CSS3 Speech properties.
656     virtual ESpeak speakProperty() const { return SpeakNormal; }
657     
658 #if HAVE(ACCESSIBILITY)
659 #if PLATFORM(GTK)
660     AccessibilityObjectWrapper* wrapper() const;
661     void setWrapper(AccessibilityObjectWrapper*);
662 #else
663     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
664     void setWrapper(AccessibilityObjectWrapper* wrapper) 
665     {
666         m_wrapper = wrapper;
667     }
668 #endif
669 #endif
670
671 #if HAVE(ACCESSIBILITY)
672     // a platform-specific method for determining if an attachment is ignored
673     bool accessibilityIgnoreAttachment() const;
674     // gives platforms the opportunity to indicate if and how an object should be included
675     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
676 #else
677     bool accessibilityIgnoreAttachment() const { return true; }
678     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
679 #endif
680
681     // allows for an AccessibilityObject to update its render tree or perform
682     // other operations update type operations
683     void updateBackingStore();
684     
685 protected:
686     AXID m_id;
687     AccessibilityChildrenVector m_children;
688     mutable bool m_haveChildren;
689     AccessibilityRole m_role;
690     
691     virtual bool isDetached() const { return true; }
692     
693 #if PLATFORM(GTK)
694     bool allowsTextRanges() const;
695     unsigned getLengthForTextRange() const;
696 #else
697     bool allowsTextRanges() const { return isTextControl(); }
698     unsigned getLengthForTextRange() const { return text().length(); }
699 #endif
700
701 #if PLATFORM(MAC)
702     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
703 #elif PLATFORM(WIN) && !OS(WINCE)
704     COMPtr<AccessibilityObjectWrapper> m_wrapper;
705 #elif PLATFORM(GTK)
706     AtkObject* m_wrapper;
707 #elif PLATFORM(CHROMIUM)
708     RefPtr<AccessibilityObjectWrapper> m_wrapper;
709 #endif
710 };
711
712 } // namespace WebCore
713
714 #endif // AccessibilityObject_h