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