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