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