AX: implement @aria-roledescription
[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 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 "Path.h"
36 #include "TextIteratorBehavior.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(COCOA)
44 #include <wtf/RetainPtr.h>
45 #elif PLATFORM(WIN)
46 #include "AccessibilityObjectWrapperWin.h"
47 #include "COMPtr.h"
48 #endif
49
50 #if PLATFORM(COCOA)
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) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
66 typedef struct _AtkObject AtkObject;
67 typedef struct _AtkObject AccessibilityObjectWrapper;
68 #else
69 class AccessibilityObjectWrapper;
70 #endif
71
72 namespace WebCore {
73
74 class AccessibilityObject;
75 class AXObjectCache;
76 class Element;
77 class Frame;
78 class FrameView;
79 class HTMLAnchorElement;
80 class HTMLAreaElement;
81 class IntPoint;
82 class IntSize;
83 class MainFrame;
84 class Node;
85 class Page;
86 class RenderObject;
87 class RenderListItem;
88 class ScrollableArea;
89 class ScrollView;
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     AudioRole,
105     BlockquoteRole,
106     BrowserRole,
107     BusyIndicatorRole,
108     ButtonRole,
109     CanvasRole,
110     CaptionRole,
111     CellRole, 
112     CheckBoxRole,
113     ColorWellRole,
114     ColumnRole,
115     ColumnHeaderRole,
116     ComboBoxRole,
117     DefinitionRole,
118     DescriptionListRole,
119     DescriptionListTermRole,
120     DescriptionListDetailRole,
121     DetailsRole,
122     DirectoryRole,
123     DisclosureTriangleRole,
124     DivRole,
125     DocumentRole,
126     DocumentArticleRole,
127     DocumentMathRole,
128     DocumentNoteRole,
129     DocumentRegionRole,            
130     DrawerRole,
131     EditableTextRole,
132     FooterRole,
133     FormRole,
134     GridRole,
135     GroupRole,
136     GrowAreaRole,
137     HeadingRole,
138     HelpTagRole,
139     HorizontalRuleRole,
140     IgnoredRole,
141     InlineRole,
142     ImageRole,
143     ImageMapRole,
144     ImageMapLinkRole,
145     IncrementorRole,
146     LabelRole,
147     LandmarkApplicationRole,
148     LandmarkBannerRole,
149     LandmarkComplementaryRole,
150     LandmarkContentInfoRole,
151     LandmarkMainRole,
152     LandmarkNavigationRole,
153     LandmarkSearchRole,
154     LegendRole,
155     LinkRole,
156     ListRole,
157     ListBoxRole,
158     ListBoxOptionRole,
159     ListItemRole,
160     ListMarkerRole,
161     MathElementRole,
162     MatteRole,
163     MenuRole,
164     MenuBarRole,
165     MenuButtonRole,
166     MenuItemRole,
167     MenuItemCheckboxRole,
168     MenuItemRadioRole,
169     MenuListPopupRole,
170     MenuListOptionRole,
171     OutlineRole,
172     ParagraphRole,
173     PopUpButtonRole,
174     PreRole,
175     PresentationalRole,
176     ProgressIndicatorRole,
177     RadioButtonRole,
178     RadioGroupRole,
179     RowHeaderRole,
180     RowRole,
181     RubyBaseRole,
182     RubyBlockRole,
183     RubyInlineRole,
184     RubyRunRole,
185     RubyTextRole,
186     RulerRole,
187     RulerMarkerRole,
188     ScrollAreaRole,
189     ScrollBarRole,
190     SearchFieldRole,
191     SheetRole,
192     SliderRole,
193     SliderThumbRole,
194     SpinButtonRole,
195     SpinButtonPartRole,
196     SplitGroupRole,
197     SplitterRole,
198     StaticTextRole,
199     SummaryRole,
200     SwitchRole,
201     SystemWideRole,
202     SVGRootRole,
203     TabGroupRole,
204     TabListRole,
205     TabPanelRole,            
206     TabRole,
207     TableRole,
208     TableHeaderContainerRole,
209     TextAreaRole,
210     TreeRole,
211     TreeGridRole,
212     TreeItemRole,
213     TextFieldRole,
214     ToggleButtonRole,
215     ToolbarRole,
216     UnknownRole,
217     UserInterfaceTooltipRole,
218     ValueIndicatorRole,
219     VideoRole,
220     WebAreaRole,
221     WebCoreLinkRole,
222     WindowRole,
223 };
224
225 enum AccessibilityTextSource {
226     AlternativeText,
227     ChildrenText,
228     SummaryText,
229     HelpText,
230     VisibleText,
231     TitleTagText,
232     PlaceholderText,
233     LabelByElementText,
234 };
235     
236 struct AccessibilityText {
237     String text;
238     AccessibilityTextSource textSource;
239     Vector<RefPtr<AccessibilityObject>> textElements;
240     
241     AccessibilityText(const String& t, const AccessibilityTextSource& s)
242     : text(t)
243     , textSource(s)
244     { }
245
246     AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<RefPtr<AccessibilityObject>> elements)
247     : text(t)
248     , textSource(s)
249     , textElements(WTF::move(elements))
250     { }
251
252     AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AccessibilityObject> element)
253     : text(t)
254     , textSource(s)
255     {
256         textElements.append(element);
257     }
258 };
259
260 struct AccessibilityTextUnderElementMode {
261     enum ChildrenInclusion {
262         TextUnderElementModeSkipIgnoredChildren,
263         TextUnderElementModeIncludeAllChildren,
264         TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
265     };
266     
267     ChildrenInclusion childrenInclusion;
268     bool includeFocusableContent;
269     Node* ignoredChildNode;
270     
271     AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
272         : childrenInclusion(c)
273         , includeFocusableContent(i)
274         , ignoredChildNode(ignored)
275         { }
276 };
277     
278 enum AccessibilityOrientation {
279     AccessibilityOrientationVertical,
280     AccessibilityOrientationHorizontal,
281 };
282     
283 enum AccessibilityObjectInclusion {
284     IncludeObject,
285     IgnoreObject,
286     DefaultBehavior,
287 };
288     
289 enum AccessibilityButtonState {
290     ButtonStateOff = 0,
291     ButtonStateOn, 
292     ButtonStateMixed,
293 };
294     
295 enum AccessibilitySortDirection {
296     SortDirectionNone,
297     SortDirectionAscending,
298     SortDirectionDescending,
299     SortDirectionOther
300 };
301
302 enum AccessibilitySearchDirection {
303     SearchDirectionNext = 1,
304     SearchDirectionPrevious
305 };
306
307 enum AccessibilitySearchKey {
308     AnyTypeSearchKey = 1,
309     BlockquoteSameLevelSearchKey,
310     BlockquoteSearchKey,
311     BoldFontSearchKey,
312     ButtonSearchKey,
313     CheckBoxSearchKey,
314     ControlSearchKey,
315     DifferentTypeSearchKey,
316     FontChangeSearchKey,
317     FontColorChangeSearchKey,
318     FrameSearchKey,
319     GraphicSearchKey,
320     HeadingLevel1SearchKey,
321     HeadingLevel2SearchKey,
322     HeadingLevel3SearchKey,
323     HeadingLevel4SearchKey,
324     HeadingLevel5SearchKey,
325     HeadingLevel6SearchKey,
326     HeadingSameLevelSearchKey,
327     HeadingSearchKey,
328     HighlightedSearchKey,
329     ItalicFontSearchKey,
330     LandmarkSearchKey,
331     LinkSearchKey,
332     ListSearchKey,
333     LiveRegionSearchKey,
334     MisspelledWordSearchKey,
335     OutlineSearchKey,
336     PlainTextSearchKey,
337     RadioGroupSearchKey,
338     SameTypeSearchKey,
339     StaticTextSearchKey,
340     StyleChangeSearchKey,
341     TableSameLevelSearchKey,
342     TableSearchKey,
343     TextFieldSearchKey,
344     UnderlineSearchKey,
345     UnvisitedLinkSearchKey,
346     VisitedLinkSearchKey
347 };
348
349 enum AccessibilityVisiblePositionForBounds {
350     FirstVisiblePositionForBounds,
351     LastVisiblePositionForBounds
352 };
353
354 struct AccessibilitySearchCriteria {
355     AccessibilityObject* startObject;
356     AccessibilitySearchDirection searchDirection;
357     Vector<AccessibilitySearchKey> searchKeys;
358     String searchText;
359     unsigned resultsLimit;
360     bool visibleOnly;
361     bool immediateDescendantsOnly;
362     
363     AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
364         : startObject(startObject)
365         , searchDirection(searchDirection)
366         , searchText(searchText)
367         , resultsLimit(resultsLimit)
368         , visibleOnly(visibleOnly)
369         , immediateDescendantsOnly(immediateDescendantsOnly)
370     { }
371 };
372     
373 enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
374
375 struct VisiblePositionRange {
376
377     VisiblePosition start;
378     VisiblePosition end;
379
380     VisiblePositionRange() {}
381
382     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
383         : start(s)
384         , end(e)
385     { }
386
387     bool isNull() const { return start.isNull() || end.isNull(); }
388 };
389
390 struct PlainTextRange {
391         
392     unsigned start;
393     unsigned length;
394     
395     PlainTextRange()
396         : start(0)
397         , length(0)
398     { }
399     
400     PlainTextRange(unsigned s, unsigned l)
401         : start(s)
402         , length(l)
403     { }
404     
405     bool isNull() const { return !start && !length; }
406 };
407
408 enum AccessibilitySelectTextActivity {
409     FindAndReplaceActivity,
410     FindAndSelectActivity,
411     FindAndCapitalize,
412     FindAndLowercase,
413     FindAndUppercase
414 };
415
416 enum AccessibilitySelectTextAmbiguityResolution {
417     ClosestAfterSelectionAmbiguityResolution,
418     ClosestBeforeSelectionAmbiguityResolution,
419     ClosestToSelectionAmbiguityResolution
420 };
421
422 struct AccessibilitySelectTextCriteria {
423     AccessibilitySelectTextActivity activity;
424     AccessibilitySelectTextAmbiguityResolution ambiguityResolution;
425     String replacementString;
426     Vector<String> searchStrings;
427     
428     AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString)
429         : activity(activity)
430         , ambiguityResolution(ambiguityResolution)
431         , replacementString(replacementString)
432     { }
433 };
434
435 enum AccessibilityMathScriptObjectType { Subscript, Superscript };
436 enum AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
437
438 class AccessibilityObject : public RefCounted<AccessibilityObject> {
439 protected:
440     AccessibilityObject();
441     
442 public:
443     virtual ~AccessibilityObject();
444
445     // After constructing an AccessibilityObject, it must be given a
446     // unique ID, then added to AXObjectCache, and finally init() must
447     // be called last.
448     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
449     virtual void init() { }
450
451     // When the corresponding WebCore object that this AccessibilityObject
452     // wraps is deleted, it must be detached.
453     virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr);
454     virtual bool isDetached() const;
455
456     typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector;
457     
458     virtual bool isAccessibilityNodeObject() const { return false; }    
459     virtual bool isAccessibilityRenderObject() const { return false; }
460     virtual bool isAccessibilityScrollbar() const { return false; }
461     virtual bool isAccessibilityScrollView() const { return false; }
462     virtual bool isAccessibilitySVGRoot() const { return false; }
463
464     bool accessibilityObjectContainsText(String *) const;
465
466     virtual bool isAttachment() const { return false; }
467     virtual bool isHeading() const { return false; }
468     virtual bool isLink() const { return false; }
469     virtual bool isImage() const { return false; }
470     virtual bool isImageMap() const { return roleValue() == ImageMapRole; }
471     virtual bool isNativeImage() const { return false; }
472     virtual bool isImageButton() const { return false; }
473     virtual bool isPasswordField() const { return false; }
474     bool isContainedByPasswordField() const;
475     virtual AccessibilityObject* passwordFieldOrContainingPasswordField() { return nullptr; }
476     virtual bool isNativeTextControl() const { return false; }
477     virtual bool isSearchField() const { return false; }
478     bool isWebArea() const { return roleValue() == WebAreaRole; }
479     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
480     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
481     virtual bool isListBox() const { return roleValue() == ListBoxRole; }
482     virtual bool isListBoxOption() const { return false; }
483     virtual bool isMediaTimeline() const { return false; }
484     virtual bool isMenuRelated() const { return false; }
485     virtual bool isMenu() const { return false; }
486     virtual bool isMenuBar() const { return false; }
487     virtual bool isMenuButton() const { return false; }
488     virtual bool isMenuItem() const { return false; }
489     virtual bool isFileUploadButton() const { return false; }
490     virtual bool isInputImage() const { return false; }
491     virtual bool isProgressIndicator() const { return false; }
492     virtual bool isSlider() const { return false; }
493     virtual bool isSliderThumb() const { return false; }
494     virtual bool isInputSlider() const { return false; }
495     virtual bool isControl() const { return false; }
496     virtual bool isList() const { return false; }
497     virtual bool isTable() const { return false; }
498     virtual bool isDataTable() const { return false; }
499     virtual bool isTableRow() const { return false; }
500     virtual bool isTableColumn() const { return false; }
501     virtual bool isTableCell() const { return false; }
502     virtual bool isFieldset() const { return false; }
503     virtual bool isGroup() const { return false; }
504     virtual bool isARIATreeGridRow() const { return false; }
505     virtual bool isImageMapLink() const { return false; }
506     virtual bool isMenuList() const { return false; }
507     virtual bool isMenuListPopup() const { return false; }
508     virtual bool isMenuListOption() const { return false; }
509     virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
510     virtual bool isNativeSpinButton() const { return false; }
511     virtual bool isSpinButtonPart() const { return false; }
512     virtual bool isMockObject() const { return false; }
513     virtual bool isMediaControlLabel() const { return false; }
514     bool isSwitch() const { return roleValue() == SwitchRole; }
515     bool isToggleButton() const { return roleValue() == ToggleButtonRole; }
516     bool isTextControl() const;
517     bool isARIATextControl() const;
518     bool isTabList() const { return roleValue() == TabListRole; }
519     bool isTabItem() const { return roleValue() == TabRole; }
520     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
521     bool isComboBox() const { return roleValue() == ComboBoxRole; }
522     bool isTree() const { return roleValue() == TreeRole; }
523     bool isTreeItem() const { return roleValue() == TreeItemRole; }
524     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
525     bool isButton() const;
526     bool isListItem() const { return roleValue() == ListItemRole; }
527     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
528     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
529     bool isCanvas() const { return roleValue() == CanvasRole; }
530     bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
531     bool isBlockquote() const;
532     bool isLandmark() const;
533     bool isColorWell() const { return roleValue() == ColorWellRole; }
534     bool isRangeControl() const;
535     bool isMeter() const;
536
537     virtual bool isChecked() const { return false; }
538     virtual bool isEnabled() const { return false; }
539     virtual bool isSelected() const { return false; }
540     virtual bool isFocused() const { return false; }
541     virtual bool isHovered() const { return false; }
542     virtual bool isIndeterminate() const { return false; }
543     virtual bool isLoaded() const { return false; }
544     virtual bool isMultiSelectable() const { return false; }
545     virtual bool isOffScreen() const { return false; }
546     virtual bool isPressed() const { return false; }
547     virtual bool isReadOnly() const { return false; }
548     virtual bool isUnvisited() const { return false; }
549     virtual bool isVisited() const { return false; }
550     virtual bool isRequired() const { return false; }
551     virtual bool supportsRequiredAttribute() const { return false; }
552     virtual bool isLinked() const { return false; }
553     virtual bool isExpanded() const;
554     virtual bool isVisible() const { return true; }
555     virtual bool isCollapsed() const { return false; }
556     virtual void setIsExpanded(bool) { }
557
558     // In a multi-select list, many items can be selected but only one is active at a time.
559     virtual bool isSelectedOptionActive() const { return false; }
560
561     virtual bool hasBoldFont() const { return false; }
562     virtual bool hasItalicFont() const { return false; }
563     bool hasMisspelling() const;
564     virtual bool hasPlainText() const { return false; }
565     virtual bool hasSameFont(RenderObject*) const { return false; }
566     virtual bool hasSameFontColor(RenderObject*) const { return false; }
567     virtual bool hasSameStyle(RenderObject*) const { return false; }
568     bool isStaticText() const { return roleValue() == StaticTextRole; }
569     virtual bool hasUnderline() const { return false; }
570     bool hasHighlighting() const;
571
572     bool supportsDatetimeAttribute() const;
573
574     virtual bool canSetFocusAttribute() const { return false; }
575     virtual bool canSetTextRangeAttributes() const { return false; }
576     virtual bool canSetValueAttribute() const { return false; }
577     virtual bool canSetNumericValue() const { return false; }
578     virtual bool canSetSelectedAttribute() const { return false; }
579     virtual bool canSetSelectedChildrenAttribute() const { return false; }
580     virtual bool canSetExpandedAttribute() const { return false; }
581     
582     virtual Element* element() const;
583     virtual Node* node() const { return nullptr; }
584     virtual RenderObject* renderer() const { return nullptr; }
585     virtual bool accessibilityIsIgnored() const;
586     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
587     bool accessibilityIsIgnoredByDefault() const;
588     
589     int blockquoteLevel() const;
590     virtual int headingLevel() const { return 0; }
591     virtual int tableLevel() const { return 0; }
592     virtual AccessibilityButtonState checkboxOrRadioValue() const;
593     virtual String valueDescription() const { return String(); }
594     virtual float valueForRange() const { return 0.0f; }
595     virtual float maxValueForRange() const { return 0.0f; }
596     virtual float minValueForRange() const { return 0.0f; }
597     virtual float stepValueForRange() const { return 0.0f; }
598     virtual AccessibilityObject* selectedRadioButton() { return nullptr; }
599     virtual AccessibilityObject* selectedTabItem() { return nullptr; }
600     virtual int layoutCount() const { return 0; }
601     virtual double estimatedLoadingProgress() const { return 0; }
602     static bool isARIAControl(AccessibilityRole);
603     static bool isARIAInput(AccessibilityRole);
604     virtual bool supportsARIAOwns() const { return false; }
605     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
606     virtual bool supportsARIAFlowTo() const { return false; }
607     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
608     virtual bool supportsARIADescribedBy() const { return false; }
609     virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const { }
610     virtual bool supportsARIAControls() const { return false; }
611     virtual void ariaControlsElements(AccessibilityChildrenVector&) const { }
612     virtual bool ariaHasPopup() const { return false; }
613     bool ariaPressedIsPresent() const;
614     bool ariaIsMultiline() const;
615     String invalidStatus() const;
616     bool supportsARIAPressed() const;
617     bool supportsExpanded() const;
618     bool supportsChecked() const;
619     AccessibilitySortDirection sortDirection() const;
620     virtual bool canvasHasFallbackContent() const { return false; }
621     bool supportsRangeValue() const;
622     String identifierAttribute() const;
623     void classList(Vector<String>&) const;
624     const AtomicString& roleDescription() const;
625     
626     bool supportsARIASetSize() const;
627     bool supportsARIAPosInSet() const;
628     int ariaSetSize() const;
629     int ariaPosInSet() const;
630     
631     // ARIA drag and drop
632     virtual bool supportsARIADropping() const { return false; }
633     virtual bool supportsARIADragging() const { return false; }
634     virtual bool isARIAGrabbed() { return false; }
635     virtual void setARIAGrabbed(bool) { }
636     virtual void determineARIADropEffects(Vector<String>&) { }
637     
638     // Called on the root AX object to return the deepest available element.
639     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return nullptr; }
640     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
641     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
642
643     virtual AccessibilityObject* focusedUIElement() const;
644
645     virtual AccessibilityObject* firstChild() const { return nullptr; }
646     virtual AccessibilityObject* lastChild() const { return nullptr; }
647     virtual AccessibilityObject* previousSibling() const { return nullptr; }
648     virtual AccessibilityObject* nextSibling() const { return nullptr; }
649     virtual AccessibilityObject* nextSiblingUnignored(int limit) const;
650     virtual AccessibilityObject* previousSiblingUnignored(int limit) const;
651     virtual AccessibilityObject* parentObject() const = 0;
652     virtual AccessibilityObject* parentObjectUnignored() const;
653     virtual AccessibilityObject* parentObjectIfExists() const { return nullptr; }
654     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
655     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
656     virtual bool isDescendantOfBarrenParent() const { return false; }
657     
658     // Text selection
659     PassRefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String>&) const;
660     PassRefPtr<Range> selectionRange() const;
661     String selectText(AccessibilitySelectTextCriteria*);
662     
663     virtual AccessibilityObject* observableObject() const { return nullptr; }
664     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
665     virtual AccessibilityObject* titleUIElement() const { return nullptr; }
666     virtual bool exposesTitleUIElement() const { return true; }
667     virtual AccessibilityObject* correspondingLabelForControlElement() const { return nullptr; }
668     virtual AccessibilityObject* correspondingControlForLabelElement() const { return nullptr; }
669     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return nullptr; }
670     
671     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
672     virtual bool isPresentationalChildOfAriaRole() const { return false; }
673     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
674     virtual bool inheritsPresentationalRole() const { return false; }
675
676     // Accessibility Text
677     virtual void accessibilityText(Vector<AccessibilityText>&) { };
678     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
679     String computedLabel();
680     
681     // A programmatic way to set a name on an AccessibleObject.
682     virtual void setAccessibleName(const AtomicString&) { }
683     virtual bool hasAttributesRequiredForInclusion() const;
684
685     // Accessibility Text - (To be deprecated).
686     virtual String accessibilityDescription() const { return String(); }
687     virtual String title() const { return String(); }
688     virtual String helpText() const { return String(); }
689
690     // Methods for determining accessibility text.
691     virtual String stringValue() const { return String(); }
692     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); }
693     virtual String text() const { return String(); }
694     virtual int textLength() const { return 0; }
695     virtual String ariaLabeledByAttribute() const { return String(); }
696     virtual String ariaDescribedByAttribute() const { return String(); }
697     const AtomicString& placeholderValue() const;
698     bool accessibleNameDerivesFromContent() const;
699     
700     // Abbreviations
701     virtual String expandedTextValue() const { return String(); }
702     virtual bool supportsExpandedTextValue() const { return false; }
703     
704     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const;
705
706     // Only if isColorWell()
707     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
708
709     virtual AccessibilityRole roleValue() const { return m_role; }
710
711     virtual AXObjectCache* axObjectCache() const;
712     AXID axObjectID() const { return m_id; }
713     
714     static AccessibilityObject* anchorElementForNode(Node*);
715     static AccessibilityObject* headingElementForNode(Node*);
716     virtual Element* anchorElement() const { return nullptr; }
717     bool supportsPressAction() const;
718     virtual Element* actionElement() const { return nullptr; }
719     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
720     IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
721     virtual LayoutRect elementRect() const = 0;
722     LayoutSize size() const { return elementRect().size(); }
723     virtual IntPoint clickPoint();
724     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
725     virtual Path elementPath() const { return Path(); }
726     virtual bool supportsPath() const { return false; }
727     
728     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
729     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
730     unsigned selectionStart() const { return selectedTextRange().start; }
731     unsigned selectionEnd() const { return selectedTextRange().length; }
732     
733     virtual URL url() const { return URL(); }
734     virtual VisibleSelection selection() const { return VisibleSelection(); }
735     virtual String selectedText() const { return String(); }
736     virtual const AtomicString& accessKey() const { return nullAtom; }
737     const String& actionVerb() const;
738     virtual Widget* widget() const { return nullptr; }
739     virtual Widget* widgetForAttachmentView() const { return nullptr; }
740     Page* page() const;
741     virtual Document* document() const;
742     virtual FrameView* documentFrameView() const;
743     Frame* frame() const;
744     MainFrame* mainFrame() const;
745     Document* topDocument() const;
746     ScrollView* scrollViewAncestor() const;
747     String language() const;
748     // 1-based, to match the aria-level spec.
749     virtual unsigned hierarchicalLevel() const { return 0; }
750     
751     virtual void setFocused(bool) { }
752     virtual void setSelectedText(const String&) { }
753     virtual void setSelectedTextRange(const PlainTextRange&) { }
754     virtual void setValue(const String&) { }
755     virtual void setValue(float) { }
756     virtual void setSelected(bool) { }
757     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
758     
759     virtual void makeRangeVisible(const PlainTextRange&) { }
760     virtual bool press();
761     bool performDefaultAction() { return press(); }
762     
763     virtual AccessibilityOrientation orientation() const;
764     virtual void increment() { }
765     virtual void decrement() { }
766
767     virtual void childrenChanged() { }
768     virtual void textChanged() { }
769     virtual void updateAccessibilityRole() { }
770     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true);
771     virtual void addChildren() { }
772     virtual void addChild(AccessibilityObject*) { }
773     virtual void insertChild(AccessibilityObject*, unsigned) { }
774     
775     virtual bool canHaveChildren() const { return true; }
776     virtual bool hasChildren() const { return m_haveChildren; }
777     virtual void updateChildrenIfNecessary();
778     virtual void setNeedsToUpdateChildren() { }
779     virtual void clearChildren();
780 #if PLATFORM(COCOA)
781     virtual void detachFromParent();
782 #else
783     virtual void detachFromParent() { }
784 #endif
785     virtual bool isDetachedFromParent() { return false; }
786
787     virtual void selectedChildren(AccessibilityChildrenVector&) { }
788     virtual void visibleChildren(AccessibilityChildrenVector&) { }
789     virtual void tabChildren(AccessibilityChildrenVector&) { }
790     virtual bool shouldFocusActiveDescendant() const { return false; }
791     virtual AccessibilityObject* activeDescendant() const { return nullptr; }
792     virtual void handleActiveDescendantChanged() { }
793     virtual void handleAriaExpandedChanged() { }
794     bool isDescendantOfObject(const AccessibilityObject*) const;
795     bool isAncestorOfObject(const AccessibilityObject*) const;
796     AccessibilityObject* firstAnonymousBlockChild() const;
797
798     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
799     bool hasAttribute(const QualifiedName&) const;
800     const AtomicString& getAttribute(const QualifiedName&) const;
801     bool hasTagName(const QualifiedName&) const;
802
803     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
804     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
805     
806     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
807     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
808     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
809     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
810     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
811     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
812     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
813     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
814     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
815     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
816
817     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
818     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
819     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
820     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
821
822     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
823     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
824     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
825     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
826     VisiblePosition nextWordEnd(const VisiblePosition&) const;
827     VisiblePosition previousWordStart(const VisiblePosition&) const;
828     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
829     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
830     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
831     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
832     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
833     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
834     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
835     
836     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
837     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
838
839     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
840     int lineForPosition(const VisiblePosition&) const;
841     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
842     virtual int index(const VisiblePosition&) const { return -1; }
843
844     virtual void lineBreaks(Vector<int>&) const { }
845     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
846     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
847     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
848     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
849
850     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
851     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
852     String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
853
854     unsigned doAXLineForIndex(unsigned);
855
856     String computedRoleString() const;
857
858     virtual String stringValueForMSAA() const { return String(); }
859     virtual String stringRoleForMSAA() const { return String(); }
860     virtual String nameForMSAA() const { return String(); }
861     virtual String descriptionForMSAA() const { return String(); }
862     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
863
864     virtual String passwordFieldValue() const { return String(); }
865     bool isValueAutofilled() const;
866     
867     // Used by an ARIA tree to get all its rows.
868     void ariaTreeRows(AccessibilityChildrenVector&);
869     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
870     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
871     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
872     void ariaTreeItemContent(AccessibilityChildrenVector&);
873     
874     // ARIA live-region features.
875     bool supportsARIALiveRegion() const;
876     bool isInsideARIALiveRegion() const;
877     virtual const String ariaLiveRegionStatus() const { return String(); }
878     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
879     virtual bool ariaLiveRegionAtomic() const { return false; }
880     virtual bool ariaLiveRegionBusy() const { return false; }
881     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
882     static bool liveRegionStatusIsEnabled(const AtomicString&);
883     static bool contentEditableAttributeIsEnabled(Element*);
884     bool hasContentEditableAttributeSet() const;
885     
886     bool supportsARIAAttributes() const;
887     
888     // CSS3 Speech properties.
889     virtual ESpeak speakProperty() const { return SpeakNormal; }
890
891     // Make this object visible by scrolling as many nested scrollable views as needed.
892     virtual void scrollToMakeVisible() const;
893     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
894     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
895     // Scroll this object to a given point in global coordinates of the top-level window.
896     virtual void scrollToGlobalPoint(const IntPoint&) const;
897
898     bool lastKnownIsIgnoredValue();
899     void setLastKnownIsIgnoredValue(bool);
900
901     // Fires a children changed notification on the parent if the isIgnored value changed.
902     void notifyIfIgnoredValueChanged();
903
904     // All math elements return true for isMathElement().
905     virtual bool isMathElement() const { return false; }
906     virtual bool isMathFraction() const { return false; }
907     virtual bool isMathFenced() const { return false; }
908     virtual bool isMathSubscriptSuperscript() const { return false; }
909     virtual bool isMathRow() const { return false; }
910     virtual bool isMathUnderOver() const { return false; }
911     virtual bool isMathRoot() const { return false; }
912     virtual bool isMathSquareRoot() const { return false; }
913     virtual bool isMathText() const { return false; }
914     virtual bool isMathNumber() const { return false; }
915     virtual bool isMathOperator() const { return false; }
916     virtual bool isMathFenceOperator() const { return false; }
917     virtual bool isMathSeparatorOperator() const { return false; }
918     virtual bool isMathIdentifier() const { return false; }
919     virtual bool isMathTable() const { return false; }
920     virtual bool isMathTableRow() const { return false; }
921     virtual bool isMathTableCell() const { return false; }
922     virtual bool isMathMultiscript() const { return false; }
923     virtual bool isMathToken() const { return false; }
924     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const { return false; }
925     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const { return false; }
926
927     // Root components.
928     virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
929     virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
930     
931     // Under over components.
932     virtual AccessibilityObject* mathUnderObject() { return nullptr; }
933     virtual AccessibilityObject* mathOverObject() { return nullptr; }
934
935     // Fraction components.
936     virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
937     virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
938
939     // Subscript/superscript components.
940     virtual AccessibilityObject* mathBaseObject() { return nullptr; }
941     virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
942     virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
943     
944     // Fenced components.
945     virtual String mathFencedOpenString() const { return String(); }
946     virtual String mathFencedCloseString() const { return String(); }
947     virtual int mathLineThickness() const { return 0; }
948     
949     // Multiscripts components.
950     typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
951     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
952     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
953     
954     // Visibility.
955     bool isARIAHidden() const;
956     bool isDOMHidden() const;
957     bool isHidden() const { return isARIAHidden() || isDOMHidden(); }
958     
959 #if HAVE(ACCESSIBILITY)
960 #if PLATFORM(GTK) || PLATFORM(EFL)
961     AccessibilityObjectWrapper* wrapper() const;
962     void setWrapper(AccessibilityObjectWrapper*);
963 #else
964     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
965     void setWrapper(AccessibilityObjectWrapper* wrapper) 
966     {
967         m_wrapper = wrapper;
968     }
969 #endif
970 #endif
971     
972 #if PLATFORM(COCOA)
973     void overrideAttachmentParent(AccessibilityObject* parent);
974 #else
975     void overrideAttachmentParent(AccessibilityObject*) { }
976 #endif
977     
978 #if HAVE(ACCESSIBILITY)
979     // a platform-specific method for determining if an attachment is ignored
980     bool accessibilityIgnoreAttachment() const;
981     // gives platforms the opportunity to indicate if and how an object should be included
982     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
983 #else
984     bool accessibilityIgnoreAttachment() const { return true; }
985     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
986 #endif
987
988 #if PLATFORM(IOS)
989     int accessibilityPasswordFieldLength();
990 #endif
991     
992     // allows for an AccessibilityObject to update its render tree or perform
993     // other operations update type operations
994     void updateBackingStore();
995     
996 #if PLATFORM(COCOA)
997     bool preventKeyboardDOMEventDispatch() const;
998     void setPreventKeyboardDOMEventDispatch(bool);
999 #endif
1000     
1001 #if PLATFORM(COCOA) && !PLATFORM(IOS)
1002     bool caretBrowsingEnabled() const;
1003     void setCaretBrowsingEnabled(bool);
1004 #endif
1005     
1006 protected:
1007     AXID m_id;
1008     AccessibilityChildrenVector m_children;
1009     mutable bool m_haveChildren;
1010     AccessibilityRole m_role;
1011     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
1012
1013     virtual bool computeAccessibilityIsIgnored() const { return true; }
1014
1015     // If this object itself scrolls, return its ScrollableArea.
1016     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
1017     virtual void scrollTo(const IntPoint&) const { }
1018
1019     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
1020     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1021     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1022     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
1023     virtual AccessibilityRole buttonRoleType() const;
1024     bool isOnscreen() const;
1025     bool dispatchTouchEvent();
1026
1027 #if (PLATFORM(GTK) || PLATFORM(EFL)) && HAVE(ACCESSIBILITY)
1028     bool allowsTextRanges() const;
1029     unsigned getLengthForTextRange() const;
1030 #else
1031     bool allowsTextRanges() const { return isTextControl(); }
1032     unsigned getLengthForTextRange() const { return text().length(); }
1033 #endif
1034
1035 #if PLATFORM(COCOA)
1036     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1037 #elif PLATFORM(WIN)
1038     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1039 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
1040     AtkObject* m_wrapper;
1041 #endif
1042 };
1043
1044 #if !HAVE(ACCESSIBILITY)
1045 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1046 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1047 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1048 inline void AccessibilityObject::updateBackingStore() { }
1049 #endif
1050
1051 } // namespace WebCore
1052
1053 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
1054 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
1055     static bool isType(const WebCore::AccessibilityObject& object) { return object.predicate; } \
1056 SPECIALIZE_TYPE_TRAITS_END()
1057
1058 #endif // AccessibilityObject_h