AX: cleanup style and naming and code in accessibility search mechanism
[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 AccessibilitySearchCriteria {
277     AccessibilityObject* startObject;
278     AccessibilitySearchDirection searchDirection;
279     AccessibilitySearchKey searchKey;
280     String* searchText;
281     unsigned resultsLimit;
282 };
283
284 struct VisiblePositionRange {
285
286     VisiblePosition start;
287     VisiblePosition end;
288
289     VisiblePositionRange() {}
290
291     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
292         : start(s)
293         , end(e)
294     { }
295
296     bool isNull() const { return start.isNull() || end.isNull(); }
297 };
298
299 struct PlainTextRange {
300         
301     unsigned start;
302     unsigned length;
303     
304     PlainTextRange()
305         : start(0)
306         , length(0)
307     { }
308     
309     PlainTextRange(unsigned s, unsigned l)
310         : start(s)
311         , length(l)
312     { }
313     
314     bool isNull() const { return !start && !length; }
315 };
316
317 class AccessibilityObject : public RefCounted<AccessibilityObject> {
318 protected:
319     AccessibilityObject();
320     
321 public:
322     virtual ~AccessibilityObject();
323     virtual void detach();
324         
325     typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector;
326     
327     virtual bool isAccessibilityRenderObject() const { return false; }
328     virtual bool isAccessibilityScrollbar() const { return false; }
329     virtual bool isAccessibilityScrollView() const { return false; }
330     
331     bool accessibilityObjectContainsText(String *) const;
332     
333     virtual bool isAnchor() const { return false; }
334     virtual bool isAttachment() const { return false; }
335     virtual bool isHeading() const { return false; }
336     virtual bool isLink() const { return false; }
337     virtual bool isImage() const { return false; }
338     virtual bool isNativeImage() const { return false; }
339     virtual bool isImageButton() const { return false; }
340     virtual bool isPasswordField() const { return false; }
341     virtual bool isNativeTextControl() const { return false; }
342     virtual bool isWebArea() const { return false; }
343     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
344     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
345     virtual bool isListBox() const { return roleValue() == ListBoxRole; }
346     virtual bool isMediaTimeline() const { return false; }
347     virtual bool isMenuRelated() const { return false; }
348     virtual bool isMenu() const { return false; }
349     virtual bool isMenuBar() const { return false; }
350     virtual bool isMenuButton() const { return false; }
351     virtual bool isMenuItem() const { return false; }
352     virtual bool isFileUploadButton() const { return false; }
353     virtual bool isInputImage() const { return false; }
354     virtual bool isProgressIndicator() const { return false; }
355     virtual bool isSlider() const { return false; }
356     virtual bool isInputSlider() const { return false; }
357     virtual bool isControl() const { return false; }
358     virtual bool isList() const { return false; }
359     virtual bool isAccessibilityTable() const { return false; }
360     virtual bool isDataTable() const { return false; }
361     virtual bool isTableRow() const { return false; }
362     virtual bool isTableColumn() const { return false; }
363     virtual bool isTableCell() const { return false; }
364     virtual bool isFieldset() const { return false; }
365     virtual bool isGroup() const { return false; }
366     virtual bool isARIATreeGridRow() const { return false; }
367     virtual bool isImageMapLink() const { return false; }
368     virtual bool isMenuList() const { return false; }
369     virtual bool isMenuListPopup() const { return false; }
370     virtual bool isMenuListOption() const { return false; }
371     virtual bool isSpinButton() const { return false; }
372     virtual bool isSpinButtonPart() const { return false; }
373     virtual bool isMockObject() const { return false; }
374     bool isTextControl() const { return roleValue() == TextAreaRole || roleValue() == TextFieldRole; }
375     bool isARIATextControl() const;
376     bool isTabList() const { return roleValue() == TabListRole; }
377     bool isTabItem() const { return roleValue() == TabRole; }
378     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
379     bool isComboBox() const { return roleValue() == ComboBoxRole; }
380     bool isTree() const { return roleValue() == TreeRole; }
381     bool isTreeItem() const { return roleValue() == TreeItemRole; }
382     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
383     bool isButton() const { return roleValue() == ButtonRole; }
384     bool isListItem() const { return roleValue() == ListItemRole; }
385     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
386     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
387     bool isBlockquote() const;
388     bool isLandmark() const;
389     
390     virtual bool isChecked() const { return false; }
391     virtual bool isEnabled() const { return false; }
392     virtual bool isSelected() const { return false; }
393     virtual bool isFocused() const { return false; }
394     virtual bool isHovered() const { return false; }
395     virtual bool isIndeterminate() const { return false; }
396     virtual bool isLoaded() const { return false; }
397     virtual bool isMultiSelectable() const { return false; }
398     virtual bool isOffScreen() const { return false; }
399     virtual bool isPressed() const { return false; }
400     virtual bool isReadOnly() const { return false; }
401     virtual bool isUnvisited() const { return false; }
402     virtual bool isVisited() const { return false; }
403     virtual bool isRequired() const { return false; }
404     virtual bool isLinked() const { return false; }
405     virtual bool isExpanded() const;
406     virtual bool isVisible() const { return true; }
407     virtual bool isCollapsed() const { return false; }
408     virtual void setIsExpanded(bool) { }
409
410     virtual bool hasBoldFont() const { return false; }
411     virtual bool hasItalicFont() const { return false; }
412     bool hasMisspelling() const;
413     virtual bool hasPlainText() const { return false; }
414     virtual bool hasSameFont(RenderObject*) const { return false; }
415     virtual bool hasSameFontColor(RenderObject*) const { return false; }
416     virtual bool hasSameStyle(RenderObject*) const { return false; }
417     bool hasStaticText() const { return roleValue() == StaticTextRole; }
418     virtual bool hasUnderline() const { return false; }
419
420     virtual bool canSetFocusAttribute() const { return false; }
421     virtual bool canSetTextRangeAttributes() const { return false; }
422     virtual bool canSetValueAttribute() const { return false; }
423     virtual bool canSetNumericValue() const { return false; }
424     virtual bool canSetSelectedAttribute() const { return false; }
425     virtual bool canSetSelectedChildrenAttribute() const { return false; }
426     virtual bool canSetExpandedAttribute() const { return false; }
427     
428     // A programmatic way to set a name on an AccessibleObject.
429     virtual void setAccessibleName(const AtomicString&) { }
430     
431     virtual Node* node() const { return 0; }
432     virtual RenderObject* renderer() const { return 0; }
433     virtual bool accessibilityIsIgnored() const  { return true; }
434
435     int blockquoteLevel() const;
436     virtual int headingLevel() const { return 0; }
437     virtual int tableLevel() const { return 0; }
438     virtual AccessibilityButtonState checkboxOrRadioValue() const;
439     virtual String valueDescription() const { return String(); }
440     virtual float valueForRange() const { return 0.0f; }
441     virtual float maxValueForRange() const { return 0.0f; }
442     virtual float minValueForRange() const { return 0.0f; }
443     virtual float stepValueForRange() const { return 0.0f; }
444     virtual AccessibilityObject* selectedRadioButton() { return 0; }
445     virtual AccessibilityObject* selectedTabItem() { return 0; }    
446     virtual int layoutCount() const { return 0; }
447     virtual double estimatedLoadingProgress() const { return 0; }
448     static bool isARIAControl(AccessibilityRole);
449     static bool isARIAInput(AccessibilityRole);
450     virtual bool supportsARIAOwns() const { return false; }
451     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
452     virtual bool supportsARIAFlowTo() const { return false; }
453     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
454     virtual bool ariaHasPopup() const { return false; }
455     bool ariaIsMultiline() const;
456     virtual const AtomicString& invalidStatus() const;
457     bool supportsARIAExpanded() const;
458     AccessibilitySortDirection sortDirection() const;
459     
460     // ARIA drag and drop
461     virtual bool supportsARIADropping() const { return false; }
462     virtual bool supportsARIADragging() const { return false; }
463     virtual bool isARIAGrabbed() { return false; }
464     virtual void setARIAGrabbed(bool) { }
465     virtual void determineARIADropEffects(Vector<String>&) { }
466     
467     // Called on the root AX object to return the deepest available element.
468     virtual AccessibilityObject* accessibilityHitTest(const LayoutPoint&) const { return 0; }
469     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
470     virtual AccessibilityObject* elementAccessibilityHitTest(const LayoutPoint&) const;
471
472     virtual AccessibilityObject* focusedUIElement() const;
473
474     virtual AccessibilityObject* firstChild() const { return 0; }
475     virtual AccessibilityObject* lastChild() const { return 0; }
476     virtual AccessibilityObject* previousSibling() const { return 0; }
477     virtual AccessibilityObject* nextSibling() const { return 0; }
478     virtual AccessibilityObject* parentObject() const = 0;
479     virtual AccessibilityObject* parentObjectUnignored() const;
480     virtual AccessibilityObject* parentObjectIfExists() const { return 0; }
481     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
482     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
483
484     virtual AccessibilityObject* observableObject() const { return 0; }
485     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
486     virtual AccessibilityObject* titleUIElement() const { return 0; }
487     virtual bool exposesTitleUIElement() const { return true; }
488     virtual AccessibilityObject* correspondingLabelForControlElement() const { return 0; }
489     virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; }
490     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) const { return 0; }
491     
492     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
493     virtual bool isPresentationalChildOfAriaRole() const { return false; }
494     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
495
496     void setRoleValue(AccessibilityRole role) { m_role = role; }
497     virtual AccessibilityRole roleValue() const { return m_role; }
498     virtual String ariaLabeledByAttribute() const { return String(); }
499     virtual String ariaDescribedByAttribute() const { return String(); }
500     virtual String accessibilityDescription() const { return String(); }
501
502     virtual AXObjectCache* axObjectCache() const;
503     AXID axObjectID() const { return m_id; }
504     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
505     
506     static AccessibilityObject* anchorElementForNode(Node*);
507     virtual Element* anchorElement() const { return 0; }
508     virtual Element* actionElement() const { return 0; }
509     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
510     virtual LayoutRect elementRect() const = 0;
511     virtual LayoutSize size() const { return elementRect().size(); }
512     virtual LayoutPoint clickPoint();
513     static LayoutRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
514     
515     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
516     unsigned selectionStart() const { return selectedTextRange().start; }
517     unsigned selectionEnd() const { return selectedTextRange().length; }
518     
519     virtual KURL url() const { return KURL(); }
520     virtual VisibleSelection selection() const { return VisibleSelection(); }
521     virtual String stringValue() const { return String(); }
522     virtual String title() const { return String(); }
523     virtual String helpText() const { return String(); }
524     virtual String textUnderElement() const { return String(); }
525     virtual String text() const { return String(); }
526     virtual int textLength() const { return 0; }
527     virtual String selectedText() const { return String(); }
528     virtual const AtomicString& accessKey() const { return nullAtom; }
529     const String& actionVerb() const;
530     virtual Widget* widget() const { return 0; }
531     virtual Widget* widgetForAttachmentView() const { return 0; }
532     Page* page() const;
533     virtual Document* document() const;
534     virtual FrameView* topDocumentFrameView() const { return 0; }
535     virtual FrameView* documentFrameView() const;
536     String language() const;
537     virtual unsigned hierarchicalLevel() const { return 0; }
538     const AtomicString& placeholderValue() const;
539     
540     virtual void setFocused(bool) { }
541     virtual void setSelectedText(const String&) { }
542     virtual void setSelectedTextRange(const PlainTextRange&) { }
543     virtual void setValue(const String&) { }
544     virtual void setValue(float) { }
545     virtual void setSelected(bool) { }
546     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
547     
548     virtual void makeRangeVisible(const PlainTextRange&) { }
549     virtual bool press() const;
550     bool performDefaultAction() const { return press(); }
551     
552     virtual AccessibilityOrientation orientation() const;
553     virtual void increment() { }
554     virtual void decrement() { }
555
556     virtual void childrenChanged() { }
557     virtual void contentChanged() { }
558     const AccessibilityChildrenVector& children();
559     virtual void addChildren() { }
560     virtual bool canHaveChildren() const { return true; }
561     virtual bool hasChildren() const { return m_haveChildren; }
562     virtual void updateChildrenIfNecessary();
563     virtual void setNeedsToUpdateChildren() { }
564     virtual void clearChildren();
565     virtual void detachFromParent() { }
566
567     virtual void selectedChildren(AccessibilityChildrenVector&) { }
568     virtual void visibleChildren(AccessibilityChildrenVector&) { }
569     virtual void tabChildren(AccessibilityChildrenVector&) { }
570     virtual bool shouldFocusActiveDescendant() const { return false; }
571     virtual AccessibilityObject* activeDescendant() const { return 0; }    
572     virtual void handleActiveDescendantChanged() { }
573     virtual void handleAriaExpandedChanged() { }
574     
575     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
576     const AtomicString& getAttribute(const QualifiedName&) const;
577
578     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
579     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
580     
581     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
582     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
583     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
584     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
585     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
586     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
587     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
588     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
589     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
590
591     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
592     virtual LayoutRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return LayoutRect(); }
593     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
594     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
595
596     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
597     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
598     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
599     VisiblePosition nextWordEnd(const VisiblePosition&) const;
600     VisiblePosition previousWordStart(const VisiblePosition&) const;
601     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
602     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
603     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
604     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
605     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
606     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
607     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
608     
609     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
610     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
611
612     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
613     int lineForPosition(const VisiblePosition&) const;
614     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
615     virtual int index(const VisiblePosition&) const { return -1; }
616
617     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
618     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
619     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
620     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
621
622     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
623     virtual LayoutRect doAXBoundsForRange(const PlainTextRange&) const { return LayoutRect(); }
624     String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
625
626     unsigned doAXLineForIndex(unsigned);
627
628     virtual String stringValueForMSAA() const { return String(); }
629     virtual String stringRoleForMSAA() const { return String(); }
630     virtual String nameForMSAA() const { return String(); }
631     virtual String descriptionForMSAA() const { return String(); }
632     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
633
634     // Used by an ARIA tree to get all its rows.
635     void ariaTreeRows(AccessibilityChildrenVector&);
636     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
637     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
638     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
639     void ariaTreeItemContent(AccessibilityChildrenVector&);
640     
641     // ARIA live-region features.
642     bool supportsARIALiveRegion() const;
643     bool isInsideARIALiveRegion() const;
644     virtual const AtomicString& ariaLiveRegionStatus() const { return nullAtom; }
645     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
646     virtual bool ariaLiveRegionAtomic() const { return false; }
647     virtual bool ariaLiveRegionBusy() const { return false; }
648     
649     bool supportsARIAAttributes() const;
650     
651     // CSS3 Speech properties.
652     virtual ESpeak speakProperty() const { return SpeakNormal; }
653     
654 #if HAVE(ACCESSIBILITY)
655 #if PLATFORM(GTK)
656     AccessibilityObjectWrapper* wrapper() const;
657     void setWrapper(AccessibilityObjectWrapper*);
658 #else
659     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
660     void setWrapper(AccessibilityObjectWrapper* wrapper) 
661     {
662         m_wrapper = wrapper;
663     }
664 #endif
665 #endif
666
667 #if HAVE(ACCESSIBILITY)
668     // a platform-specific method for determining if an attachment is ignored
669     bool accessibilityIgnoreAttachment() const;
670     // gives platforms the opportunity to indicate if and how an object should be included
671     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
672 #else
673     bool accessibilityIgnoreAttachment() const { return true; }
674     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
675 #endif
676
677     // allows for an AccessibilityObject to update its render tree or perform
678     // other operations update type operations
679     void updateBackingStore();
680     
681 protected:
682     AXID m_id;
683     AccessibilityChildrenVector m_children;
684     mutable bool m_haveChildren;
685     AccessibilityRole m_role;
686     
687     virtual bool isDetached() const { return true; }
688     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
689     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
690
691 #if PLATFORM(GTK)
692     bool allowsTextRanges() const;
693     unsigned getLengthForTextRange() const;
694 #else
695     bool allowsTextRanges() const { return isTextControl(); }
696     unsigned getLengthForTextRange() const { return text().length(); }
697 #endif
698
699 #if PLATFORM(MAC)
700     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
701 #elif PLATFORM(WIN) && !OS(WINCE)
702     COMPtr<AccessibilityObjectWrapper> m_wrapper;
703 #elif PLATFORM(GTK)
704     AtkObject* m_wrapper;
705 #elif PLATFORM(CHROMIUM)
706     RefPtr<AccessibilityObjectWrapper> m_wrapper;
707 #endif
708 };
709
710 } // namespace WebCore
711
712 #endif // AccessibilityObject_h