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