40bcf09c9cbc7b286d6f8e1414c8fc2647876e44
[WebKit-https.git] / Source / WebCore / accessibility / AccessibilityObjectInterface.h
1 /*
2  * Copyright (C) 2019 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "HTMLTextFormControlElement.h"
29 #include "LayoutRect.h"
30 #include "Range.h"
31 #include "TextIteratorBehavior.h"
32 #include "VisiblePosition.h"
33 #include "VisibleSelection.h"
34 #include <wtf/RefCounted.h>
35
36 #if PLATFORM(WIN)
37 #include "AccessibilityObjectWrapperWin.h"
38 #include "COMPtr.h"
39 #endif
40
41 #if PLATFORM(COCOA)
42 OBJC_CLASS WebAccessibilityObjectWrapper;
43 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
44 #elif USE(ATK)
45 typedef struct _WebKitAccessible WebKitAccessible;
46 typedef struct _WebKitAccessible AccessibilityObjectWrapper;
47 #else
48 class AccessibilityObjectWrapper;
49 #endif
50
51 namespace WebCore {
52
53 class Node;
54 class Element;
55 class RenderObject;
56 class QualifiedName;
57 class Path;
58 class Widget;
59 class Page;
60 class Document;
61 class Frame;
62 class FrameView;
63 class ScrollView;
64 class AXObjectCache;
65 class AXCoreObject;
66 class AccessibilityScrollView;
67 struct AccessibilityText;
68 struct ScrollRectToVisibleOptions;
69
70 typedef unsigned AXID;
71 extern const AXID InvalidAXID;
72 typedef unsigned AXIsolatedTreeID;    
73
74 enum class AccessibilityRole {
75     Annotation = 1,
76     Application,
77     ApplicationAlert,
78     ApplicationAlertDialog,
79     ApplicationDialog,
80     ApplicationGroup,
81     ApplicationLog,
82     ApplicationMarquee,
83     ApplicationStatus,
84     ApplicationTextGroup,
85     ApplicationTimer,
86     Audio,
87     Blockquote,
88     Browser,
89     BusyIndicator,
90     Button,
91     Canvas,
92     Caption,
93     Cell,
94     CheckBox,
95     ColorWell,
96     Column,
97     ColumnHeader,
98     ComboBox,
99     Definition,
100     Deletion,
101     DescriptionList,
102     DescriptionListTerm,
103     DescriptionListDetail,
104     Details,
105     Directory,
106     DisclosureTriangle,
107     Div,
108     Document,
109     DocumentArticle,
110     DocumentMath,
111     DocumentNote,
112     Drawer,
113     EditableText,
114     Feed,
115     Figure,
116     Footer,
117     Footnote,
118     Form,
119     GraphicsDocument,
120     GraphicsObject,
121     GraphicsSymbol,
122     Grid,
123     GridCell,
124     Group,
125     GrowArea,
126     Heading,
127     HelpTag,
128     HorizontalRule,
129     Ignored,
130     Inline,
131     Image,
132     ImageMap,
133     ImageMapLink,
134     Incrementor,
135     Insertion,
136     Label,
137     LandmarkBanner,
138     LandmarkComplementary,
139     LandmarkContentInfo,
140     LandmarkDocRegion,
141     LandmarkMain,
142     LandmarkNavigation,
143     LandmarkRegion,
144     LandmarkSearch,
145     Legend,
146     Link,
147     List,
148     ListBox,
149     ListBoxOption,
150     ListItem,
151     ListMarker,
152     Mark,
153     MathElement,
154     Matte,
155     Menu,
156     MenuBar,
157     MenuButton,
158     MenuItem,
159     MenuItemCheckbox,
160     MenuItemRadio,
161     MenuListPopup,
162     MenuListOption,
163     Meter,
164     Outline,
165     Paragraph,
166     PopUpButton,
167     Pre,
168     Presentational,
169     ProgressIndicator,
170     RadioButton,
171     RadioGroup,
172     RowHeader,
173     Row,
174     RowGroup,
175     RubyBase,
176     RubyBlock,
177     RubyInline,
178     RubyRun,
179     RubyText,
180     Ruler,
181     RulerMarker,
182     ScrollArea,
183     ScrollBar,
184     SearchField,
185     Sheet,
186     Slider,
187     SliderThumb,
188     SpinButton,
189     SpinButtonPart,
190     SplitGroup,
191     Splitter,
192     StaticText,
193     Subscript,
194     Summary,
195     Superscript,
196     Switch,
197     SystemWide,
198     SVGRoot,
199     SVGText,
200     SVGTSpan,
201     SVGTextPath,
202     TabGroup,
203     TabList,
204     TabPanel,
205     Tab,
206     Table,
207     TableHeaderContainer,
208     TextArea,
209     TextGroup,
210     Term,
211     Time,
212     Tree,
213     TreeGrid,
214     TreeItem,
215     TextField,
216     ToggleButton,
217     Toolbar,
218     Unknown,
219     UserInterfaceTooltip,
220     ValueIndicator,
221     Video,
222     WebApplication,
223     WebArea,
224     WebCoreLink,
225     Window,
226 };
227
228 enum class AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed, ElementChange };
229
230 enum class AccessibilityConversionSpace { Screen, Page };
231
232 enum class AccessibilitySearchDirection {
233     Next = 1,
234     Previous,
235 };
236
237 enum class AccessibilitySearchKey {
238     AnyType = 1,
239     Article,
240     BlockquoteSameLevel,
241     Blockquote,
242     BoldFont,
243     Button,
244     CheckBox,
245     Control,
246     DifferentType,
247     FontChange,
248     FontColorChange,
249     Frame,
250     Graphic,
251     HeadingLevel1,
252     HeadingLevel2,
253     HeadingLevel3,
254     HeadingLevel4,
255     HeadingLevel5,
256     HeadingLevel6,
257     HeadingSameLevel,
258     Heading,
259     Highlighted,
260     ItalicFont,
261     KeyboardFocusable,
262     Landmark,
263     Link,
264     List,
265     LiveRegion,
266     MisspelledWord,
267     Outline,
268     PlainText,
269     RadioGroup,
270     SameType,
271     StaticText,
272     StyleChange,
273     TableSameLevel,
274     Table,
275     TextField,
276     Underline,
277     UnvisitedLink,
278     VisitedLink,
279 };
280
281 struct AccessibilitySearchCriteria {
282     AXCoreObject* startObject;
283     AccessibilitySearchDirection searchDirection;
284     Vector<AccessibilitySearchKey> searchKeys;
285     String searchText;
286     unsigned resultsLimit;
287     bool visibleOnly;
288     bool immediateDescendantsOnly;
289
290     AccessibilitySearchCriteria(AXCoreObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
291         : startObject(startObject)
292         , searchDirection(searchDirection)
293         , searchText(searchText)
294         , resultsLimit(resultsLimit)
295         , visibleOnly(visibleOnly)
296         , immediateDescendantsOnly(immediateDescendantsOnly)
297     { }
298 };
299
300 enum class AccessibilityObjectInclusion {
301     IncludeObject,
302     IgnoreObject,
303     DefaultBehavior,
304 };
305
306 enum class AccessibilityCurrentState { False, True, Page, Step, Location, Date, Time };
307
308 enum class AccessibilityButtonState {
309     Off = 0,
310     On,
311     Mixed,
312 };
313
314 enum class AccessibilitySortDirection {
315     None,
316     Ascending,
317     Descending,
318     Other,
319     Invalid,
320 };
321
322 enum class AccessibilitySearchTextStartFrom {
323     Begin, // Search from the beginning of the element.
324     Selection, // Search from the position of the current selection.
325     End // Search from the end of the element.
326 };
327
328 enum class AccessibilitySearchTextDirection {
329     Forward, // Occurrence after the starting range.
330     Backward, // Occurrence before the starting range.
331     Closest, // Closest occurrence to the starting range, whether after or before.
332     All // All occurrences
333 };
334
335 struct AccessibilitySearchTextCriteria {
336     Vector<String> searchStrings; // Text strings to search for.
337     AccessibilitySearchTextStartFrom start;
338     AccessibilitySearchTextDirection direction;
339
340     AccessibilitySearchTextCriteria()
341         : start(AccessibilitySearchTextStartFrom::Selection)
342         , direction(AccessibilitySearchTextDirection::Forward)
343     { }
344 };
345
346 enum class AccessibilityTextOperationType {
347     Select,
348     Replace,
349     Capitalize,
350     Lowercase,
351     Uppercase
352 };
353
354 struct AccessibilityTextOperation {
355     Vector<RefPtr<Range>> textRanges; // text on which perform the operation.
356     AccessibilityTextOperationType type;
357     String replacementText; // For type = replace.
358
359     AccessibilityTextOperation()
360         : type(AccessibilityTextOperationType::Select)
361     { }
362 };
363
364 enum class AccessibilityOrientation {
365     Vertical,
366     Horizontal,
367     Undefined,
368 };
369
370 struct AccessibilityTextUnderElementMode {
371     enum ChildrenInclusion {
372         TextUnderElementModeSkipIgnoredChildren,
373         TextUnderElementModeIncludeAllChildren,
374         TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
375     };
376
377     ChildrenInclusion childrenInclusion;
378     bool includeFocusableContent;
379     Node* ignoredChildNode;
380
381     AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
382         : childrenInclusion(c)
383         , includeFocusableContent(i)
384         , ignoredChildNode(ignored)
385     { }
386 };
387
388 #if PLATFORM(COCOA)
389 typedef struct _NSRange NSRange;
390 #endif
391
392 struct PlainTextRange {
393     unsigned start { 0 };
394     unsigned length { 0 };
395
396     PlainTextRange() = default;
397
398     PlainTextRange(unsigned s, unsigned l)
399         : start(s)
400         , length(l)
401     { }
402
403 #if PLATFORM(COCOA)
404     PlainTextRange(NSRange);
405 #endif
406
407     bool isNull() const { return !start && !length; }
408 };
409
410 enum class AccessibilityVisiblePositionForBounds {
411     First,
412     Last,
413 };
414
415 struct VisiblePositionRange {
416     VisiblePosition start;
417     VisiblePosition end;
418
419     VisiblePositionRange() = default;
420     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
421         : start(s)
422         , end(e)
423     { }
424
425     VisiblePositionRange(const VisibleSelection& selection)
426         : start(selection.start())
427         , end(selection.end())
428     { }
429
430     bool isNull() const { return start.isNull() || end.isNull(); }
431 };
432
433 enum class AccessibilityMathScriptObjectType { Subscript, Superscript };
434 enum class AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
435
436 // Use this struct to store the isIgnored data that depends on the parents, so that in addChildren()
437 // we avoid going up the parent chain for each element while traversing the tree with useful information already.
438 struct AccessibilityIsIgnoredFromParentData {
439     AXCoreObject* parent { nullptr };
440     bool isAXHidden { false };
441     bool isPresentationalChildOfAriaRole { false };
442     bool isDescendantOfBarrenParent { false };
443
444     AccessibilityIsIgnoredFromParentData(AXCoreObject* parent = nullptr)
445         : parent(parent)
446     { }
447
448     bool isNull() const { return !parent; }
449 };
450
451 class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
452 public:
453     virtual ~AXCoreObject() = default;
454
455     // After constructing an accessible object, it must be given a
456     // unique ID, then added to AXObjectCache, and finally init() must
457     // be called last.
458     virtual void setObjectID(AXID) = 0;
459     virtual AXID objectID() const = 0;
460     virtual void init() = 0;
461
462     // When the corresponding WebCore object that this accessible object
463     // represents is deleted, it must be detached.
464     virtual void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) = 0;
465     virtual bool isDetached() const = 0;
466
467     typedef Vector<RefPtr<AXCoreObject>> AccessibilityChildrenVector;
468
469     virtual bool isAccessibilityObject() const = 0;
470     virtual bool isAccessibilityNodeObject() const = 0;
471     virtual bool isAccessibilityRenderObject() const = 0;
472     virtual bool isAccessibilityScrollbar() const = 0;
473     virtual bool isAccessibilityScrollView() const = 0;
474     virtual bool isAccessibilitySVGRoot() const = 0;
475     virtual bool isAccessibilitySVGElement() const = 0;
476
477     virtual bool containsText(String *) const = 0;
478     virtual bool isAttachmentElement() const = 0;
479     virtual bool isHeading() const = 0;
480     virtual bool isLink() const = 0;
481     virtual bool isImage() const = 0;
482     virtual bool isImageMap() const = 0;
483     virtual bool isNativeImage() const = 0;
484     virtual bool isImageButton() const = 0;
485     virtual bool isPasswordField() const = 0;
486     virtual bool isContainedByPasswordField() const = 0;
487     virtual AXCoreObject* passwordFieldOrContainingPasswordField() = 0;
488     virtual bool isNativeTextControl() const = 0;
489     virtual bool isSearchField() const = 0;
490     virtual bool isWebArea() const = 0;
491     virtual bool isCheckbox() const = 0;
492     virtual bool isRadioButton() const = 0;
493     virtual bool isNativeListBox() const = 0;
494     virtual bool isListBox() const = 0;
495     virtual bool isListBoxOption() const = 0;
496     virtual bool isAttachment() const = 0;
497     virtual bool isMediaTimeline() const = 0;
498     virtual bool isMenuRelated() const = 0;
499     virtual bool isMenu() const = 0;
500     virtual bool isMenuBar() const = 0;
501     virtual bool isMenuButton() const = 0;
502     virtual bool isMenuItem() const = 0;
503     virtual bool isFileUploadButton() const = 0;
504     virtual bool isInputImage() const = 0;
505     virtual bool isProgressIndicator() const = 0;
506     virtual bool isSlider() const = 0;
507     virtual bool isSliderThumb() const = 0;
508     virtual bool isInputSlider() const = 0;
509     virtual bool isControl() const = 0;
510     virtual bool isLabel() const = 0;
511     virtual bool isList() const = 0;
512     virtual bool isTable() const = 0;
513     virtual bool isDataTable() const = 0;
514     virtual bool isTableRow() const = 0;
515     virtual bool isTableColumn() const = 0;
516     virtual bool isTableCell() const = 0;
517     virtual bool isFieldset() const = 0;
518     virtual bool isGroup() const = 0;
519     virtual bool isARIATreeGridRow() const = 0;
520     virtual bool isImageMapLink() const = 0;
521     virtual bool isMenuList() const = 0;
522     virtual bool isMenuListPopup() const = 0;
523     virtual bool isMenuListOption() const = 0;
524     virtual bool isSpinButton() const = 0;
525     virtual bool isNativeSpinButton() const = 0;
526     virtual bool isSpinButtonPart() const = 0;
527     virtual bool isMockObject() const = 0;
528     virtual bool isMediaControlLabel() const = 0;
529     virtual bool isMediaObject() const = 0;
530     virtual bool isSwitch() const = 0;
531     virtual bool isToggleButton() const = 0;
532     virtual bool isTextControl() const = 0;
533     virtual bool isARIATextControl() const = 0;
534     virtual bool isNonNativeTextControl() const = 0;
535     virtual bool isTabList() const = 0;
536     virtual bool isTabItem() const = 0;
537     virtual bool isRadioGroup() const = 0;
538     virtual bool isComboBox() const = 0;
539     virtual bool isTree() const = 0;
540     virtual bool isTreeGrid() const = 0;
541     virtual bool isTreeItem() const = 0;
542     virtual bool isScrollbar() const = 0;
543     virtual bool isButton() const = 0;
544     virtual bool isListItem() const = 0;
545     virtual bool isCheckboxOrRadio() const = 0;
546     virtual bool isScrollView() const = 0;
547     virtual bool isCanvas() const = 0;
548     virtual bool isPopUpButton() const = 0;
549     virtual bool isBlockquote() const = 0;
550     virtual bool isLandmark() const = 0;
551     virtual bool isColorWell() const = 0;
552     virtual bool isRangeControl() const = 0;
553     virtual bool isMeter() const = 0;
554     virtual bool isSplitter() const = 0;
555     virtual bool isToolbar() const = 0;
556     virtual bool isStyleFormatGroup() const = 0;
557     virtual bool isFigureElement() const = 0;
558     virtual bool isKeyboardFocusable() const = 0;
559     virtual bool isSummary() const = 0;
560     virtual bool isOutput() const = 0;
561
562     virtual bool isChecked() const = 0;
563     virtual bool isEnabled() const = 0;
564     virtual bool isSelected() const = 0;
565     virtual bool isFocused() const = 0;
566     virtual bool isHovered() const = 0;
567     virtual bool isIndeterminate() const = 0;
568     virtual bool isLoaded() const = 0;
569     virtual bool isMultiSelectable() const = 0;
570     // FIXME should need just one since onscreen should be !offscreen.
571     virtual bool isOnScreen() const = 0;
572     virtual bool isOffScreen() const = 0;
573     virtual bool isPressed() const = 0;
574     virtual bool isUnvisited() const = 0;
575     virtual bool isVisited() const = 0;
576     virtual bool isRequired() const = 0;
577     virtual bool supportsRequiredAttribute() const = 0;
578     virtual bool isLinked() const = 0;
579     virtual bool isExpanded() const = 0;
580     virtual bool isVisible() const = 0;
581     virtual bool isCollapsed() const = 0;
582     virtual void setIsExpanded(bool) = 0;
583     virtual FloatRect relativeFrame() const = 0;
584     virtual FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const = 0;
585
586     // In a multi-select list, many items can be selected but only one is active at a time.
587     virtual bool isSelectedOptionActive() const = 0;
588
589     virtual bool hasBoldFont() const = 0;
590     virtual bool hasItalicFont() const = 0;
591     virtual bool hasMisspelling() const = 0;
592     virtual RefPtr<Range> getMisspellingRange(RefPtr<Range> const& start, AccessibilitySearchDirection) const = 0;
593     virtual bool hasPlainText() const = 0;
594     virtual bool hasSameFont(RenderObject*) const = 0;
595     virtual bool hasSameFontColor(RenderObject*) const = 0;
596     virtual bool hasSameStyle(RenderObject*) const = 0;
597     virtual bool isStaticText() const = 0;
598     virtual bool hasUnderline() const = 0;
599     virtual bool hasHighlighting() const = 0;
600
601     virtual bool supportsDatetimeAttribute() const = 0;
602     virtual const AtomString& datetimeAttributeValue() const = 0;
603
604     virtual bool canSetFocusAttribute() const = 0;
605     virtual bool canSetTextRangeAttributes() const = 0;
606     virtual bool canSetValueAttribute() const = 0;
607     virtual bool canSetNumericValue() const = 0;
608     virtual bool canSetSelectedAttribute() const = 0;
609     virtual bool canSetSelectedChildrenAttribute() const = 0;
610     virtual bool canSetExpandedAttribute() const = 0;
611
612     virtual Element* element() const = 0;
613     virtual Node* node() const = 0;
614     virtual RenderObject* renderer() const = 0;
615
616     virtual bool accessibilityIsIgnored() const = 0;
617     virtual AccessibilityObjectInclusion defaultObjectInclusion() const = 0;
618     virtual bool accessibilityIsIgnoredByDefault() const = 0;
619
620     virtual bool isShowingValidationMessage() const = 0;
621     virtual String validationMessage() const = 0;
622
623     virtual unsigned blockquoteLevel() const = 0;
624     virtual int headingLevel() const = 0;
625     virtual int tableLevel() const = 0;
626     virtual AccessibilityButtonState checkboxOrRadioValue() const = 0;
627     virtual String valueDescription() const = 0;
628     virtual float valueForRange() const = 0;
629     virtual float maxValueForRange() const = 0;
630     virtual float minValueForRange() const = 0;
631     virtual float stepValueForRange() const = 0;
632     virtual AXCoreObject* selectedRadioButton() = 0;
633     virtual AXCoreObject* selectedTabItem() = 0;
634     virtual AXCoreObject* selectedListItem() = 0;
635     virtual int layoutCount() const = 0;
636     virtual double estimatedLoadingProgress() const = 0;
637
638     virtual bool supportsARIAOwns() const = 0;
639     virtual bool isActiveDescendantOfFocusedContainer() const = 0;
640     virtual void ariaActiveDescendantReferencingElements(AccessibilityChildrenVector&) const = 0;
641     virtual void ariaControlsElements(AccessibilityChildrenVector&) const = 0;
642     virtual void ariaControlsReferencingElements(AccessibilityChildrenVector&) const = 0;
643     virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const = 0;
644     virtual void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const = 0;
645     virtual void ariaDetailsElements(AccessibilityChildrenVector&) const = 0;
646     virtual void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const = 0;
647     virtual void ariaErrorMessageElements(AccessibilityChildrenVector&) const = 0;
648     virtual void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const = 0;
649     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const = 0;
650     virtual void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const = 0;
651     virtual void ariaLabelledByElements(AccessibilityChildrenVector&) const = 0;
652     virtual void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const = 0;
653     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const = 0;
654     virtual void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const = 0;
655
656     virtual bool hasPopup() const = 0;
657     virtual String popupValue() const = 0;
658     virtual bool hasDatalist() const = 0;
659     virtual bool supportsHasPopup() const = 0;
660     virtual bool pressedIsPresent() const = 0;
661     virtual bool ariaIsMultiline() const = 0;
662     virtual String invalidStatus() const = 0;
663     virtual bool supportsPressed() const = 0;
664     virtual bool supportsExpanded() const = 0;
665     virtual bool supportsChecked() const = 0;
666     virtual AccessibilitySortDirection sortDirection() const = 0;
667     virtual bool canvasHasFallbackContent() const = 0;
668     virtual bool supportsRangeValue() const = 0;
669     virtual const AtomString& identifierAttribute() const = 0;
670     virtual const AtomString& linkRelValue() const = 0;
671     virtual void classList(Vector<String>&) const = 0;
672     virtual AccessibilityCurrentState currentState() const = 0;
673     virtual String currentValue() const = 0;
674     virtual bool supportsCurrent() const = 0;
675     virtual const String keyShortcutsValue() const = 0;
676
677     // This function checks if the object should be ignored when there's a modal dialog displayed.
678     virtual bool ignoredFromModalPresence() const = 0;
679     virtual bool isModalDescendant(Node*) const = 0;
680     virtual bool isModalNode() const = 0;
681
682     virtual bool supportsSetSize() const = 0;
683     virtual bool supportsPosInSet() const = 0;
684     virtual int setSize() const = 0;
685     virtual int posInSet() const = 0;
686
687     // ARIA drag and drop
688     virtual bool supportsARIADropping() const = 0;
689     virtual bool supportsARIADragging() const = 0;
690     virtual bool isARIAGrabbed() = 0;
691     virtual void setARIAGrabbed(bool) = 0;
692     virtual Vector<String> determineARIADropEffects() = 0;
693
694     // Called on the root AX object to return the deepest available element.
695     virtual AXCoreObject* accessibilityHitTest(const IntPoint&) const = 0;
696     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
697     virtual AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const = 0;
698
699     virtual AXCoreObject* focusedUIElement() const = 0;
700
701     virtual AXCoreObject* firstChild() const = 0;
702     virtual AXCoreObject* lastChild() const = 0;
703     virtual AXCoreObject* previousSibling() const = 0;
704     virtual AXCoreObject* nextSibling() const = 0;
705     virtual AXCoreObject* nextSiblingUnignored(int limit) const = 0;
706     virtual AXCoreObject* previousSiblingUnignored(int limit) const = 0;
707     virtual AXCoreObject* parentObject() const = 0;
708     virtual AXCoreObject* parentObjectUnignored() const = 0;
709     virtual AXCoreObject* parentObjectIfExists() const = 0;
710     virtual void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) = 0;
711     virtual bool isDescendantOfBarrenParent() const = 0;
712     virtual bool isDescendantOfRole(AccessibilityRole) const = 0;
713
714     // Text selection
715     virtual Vector<RefPtr<Range>> findTextRanges(AccessibilitySearchTextCriteria const&) const = 0;
716     virtual Vector<String> performTextOperation(AccessibilityTextOperation const&) = 0;
717
718     virtual AXCoreObject* observableObject() const = 0;
719     virtual void linkedUIElements(AccessibilityChildrenVector&) const = 0;
720     virtual AXCoreObject* titleUIElement() const = 0;
721     virtual bool exposesTitleUIElement() const = 0;
722     virtual AXCoreObject* correspondingLabelForControlElement() const = 0;
723     virtual AXCoreObject* correspondingControlForLabelElement() const = 0;
724     virtual AXCoreObject* scrollBar(AccessibilityOrientation) = 0;
725
726     virtual AccessibilityRole ariaRoleAttribute() const = 0;
727     virtual bool isPresentationalChildOfAriaRole() const = 0;
728     virtual bool ariaRoleHasPresentationalChildren() const = 0;
729     virtual bool inheritsPresentationalRole() const = 0;
730
731     // Accessibility Text
732     virtual void accessibilityText(Vector<AccessibilityText>&) const = 0;
733     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
734     virtual String computedLabel() = 0;
735
736     // A programmatic way to set a name on an AccessibleObject.
737     virtual void setAccessibleName(const AtomString&) = 0;
738     virtual bool hasAttributesRequiredForInclusion() const = 0;
739
740     // Accessibility Text - (To be deprecated).
741     virtual String accessibilityDescription() const = 0;
742     virtual String title() const = 0;
743     virtual String helpText() const = 0;
744
745     // Methods for determining accessibility text.
746     virtual bool isARIAStaticText() const = 0;
747     virtual String stringValue() const = 0;
748     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const = 0;
749     virtual String text() const = 0;
750     virtual int textLength() const = 0;
751     virtual String ariaLabeledByAttribute() const = 0;
752     virtual String ariaDescribedByAttribute() const = 0;
753     virtual const String placeholderValue() const = 0;
754     virtual bool accessibleNameDerivesFromContent() const = 0;
755
756     // Abbreviations
757     virtual String expandedTextValue() const = 0;
758     virtual bool supportsExpandedTextValue() const = 0;
759
760     virtual void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const = 0;
761
762     // Only if isColorWell()
763     virtual void colorValue(int& r, int& g, int& b) const = 0;
764
765     virtual AccessibilityRole roleValue() const = 0;
766     // Non-localized string associated with the object role.
767     virtual String rolePlatformString() const = 0;
768     // Localized string that describes the object's role.
769     virtual String roleDescription() const = 0;
770     // Localized string that describes ARIA landmark roles.
771     virtual String ariaLandmarkRoleDescription() const = 0;
772
773     virtual AXObjectCache* axObjectCache() const = 0;
774
775     virtual Element* anchorElement() const = 0;
776     virtual bool supportsPressAction() const = 0;
777     virtual Element* actionElement() const = 0;
778     virtual LayoutRect boundingBoxRect() const = 0;
779     virtual IntRect pixelSnappedBoundingBoxRect() const = 0;
780     virtual LayoutRect elementRect() const = 0;
781     virtual LayoutSize size() const = 0;
782     virtual IntPoint clickPoint() = 0;
783     virtual Path elementPath() const = 0;
784     virtual bool supportsPath() const = 0;
785
786     virtual TextIteratorBehavior textIteratorBehaviorForTextRange() const = 0;
787     virtual PlainTextRange selectedTextRange() const = 0;
788     virtual unsigned selectionStart() const = 0;
789     virtual unsigned selectionEnd() const = 0;
790
791     virtual URL url() const = 0;
792     virtual VisibleSelection selection() const = 0;
793     virtual String selectedText() const = 0;
794     virtual const AtomString& accessKey() const = 0;
795     virtual const String& actionVerb() const = 0;
796     virtual Widget* widget() const = 0;
797     virtual Widget* widgetForAttachmentView() const = 0;
798     virtual Page* page() const = 0;
799     virtual Document* document() const = 0;
800     virtual FrameView* documentFrameView() const = 0;
801     virtual Frame* frame() const = 0;
802     virtual Frame* mainFrame() const = 0;
803     virtual Document* topDocument() const = 0;
804     virtual ScrollView* scrollViewAncestor() const = 0;
805     virtual String language() const = 0;
806     // 1-based, to match the aria-level spec.
807     virtual unsigned hierarchicalLevel() const = 0;
808
809     virtual void setFocused(bool) = 0;
810     virtual void setSelectedText(const String&) = 0;
811     virtual void setSelectedTextRange(const PlainTextRange&) = 0;
812     virtual void setValue(const String&) = 0;
813     virtual bool replaceTextInRange(const String&, const PlainTextRange&) = 0;
814     virtual bool insertText(const String&) = 0;
815
816     virtual void setValue(float) = 0;
817     virtual void setSelected(bool) = 0;
818     virtual void setSelectedRows(AccessibilityChildrenVector&) = 0;
819
820     virtual void makeRangeVisible(const PlainTextRange&) = 0;
821     virtual bool press() = 0;
822     virtual bool performDefaultAction() = 0;
823
824     virtual AccessibilityOrientation orientation() const = 0;
825     virtual void increment() = 0;
826     virtual void decrement() = 0;
827
828     virtual void childrenChanged() = 0;
829     virtual void textChanged() = 0;
830     virtual void updateAccessibilityRole() = 0;
831     virtual const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) = 0;
832     virtual void addChildren() = 0;
833     virtual void addChild(AXCoreObject*) = 0;
834     virtual void insertChild(AXCoreObject*, unsigned) = 0;
835
836     virtual bool shouldIgnoreAttributeRole() const = 0;
837
838     virtual bool canHaveChildren() const = 0;
839     virtual bool hasChildren() const = 0;
840     virtual void updateChildrenIfNecessary() = 0;
841     virtual void setNeedsToUpdateChildren() = 0;
842     virtual void setNeedsToUpdateSubtree() = 0;
843     virtual void clearChildren() = 0;
844     virtual bool needsToUpdateChildren() const = 0;
845     virtual void detachFromParent() = 0;
846     virtual bool isDetachedFromParent() = 0;
847
848     virtual bool canHaveSelectedChildren() const = 0;
849     virtual void selectedChildren(AccessibilityChildrenVector&) = 0;
850     virtual void visibleChildren(AccessibilityChildrenVector&) = 0;
851     virtual void tabChildren(AccessibilityChildrenVector&) = 0;
852     virtual bool shouldFocusActiveDescendant() const = 0;
853     virtual AXCoreObject* activeDescendant() const = 0;
854     virtual void handleActiveDescendantChanged() = 0;
855     virtual void handleAriaExpandedChanged() = 0;
856     virtual bool isDescendantOfObject(const AXCoreObject*) const = 0;
857     virtual bool isAncestorOfObject(const AXCoreObject*) const = 0;
858     virtual AXCoreObject* firstAnonymousBlockChild() const = 0;
859
860     virtual bool hasAttribute(const QualifiedName&) const = 0;
861     virtual const AtomString& getAttribute(const QualifiedName&) const = 0;
862     virtual bool hasTagName(const QualifiedName&) const = 0;
863
864     virtual VisiblePositionRange visiblePositionRange() const = 0;
865     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const = 0;
866     virtual RefPtr<Range> elementRange() const = 0;
867     virtual VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const = 0;
868     virtual VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const = 0;
869     virtual VisiblePositionRange positionOfRightWord(const VisiblePosition&) const = 0;
870     virtual VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const = 0;
871     virtual VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const = 0;
872     virtual VisiblePositionRange sentenceForPosition(const VisiblePosition&) const = 0;
873     virtual VisiblePositionRange paragraphForPosition(const VisiblePosition&) const = 0;
874     virtual VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const = 0;
875     virtual VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const = 0;
876     virtual VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const = 0;
877
878     virtual RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const = 0;
879
880     virtual String stringForRange(RefPtr<Range>) const = 0;
881     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const = 0;
882     virtual IntRect boundsForRange(const RefPtr<Range>) const = 0;
883     virtual int lengthForVisiblePositionRange(const VisiblePositionRange&) const = 0;
884     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const = 0;
885
886     virtual VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const = 0;
887     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const = 0;
888     virtual VisiblePosition nextVisiblePosition(const VisiblePosition&) const = 0;
889     virtual VisiblePosition previousVisiblePosition(const VisiblePosition&) const = 0;
890     virtual VisiblePosition nextWordEnd(const VisiblePosition&) const = 0;
891     virtual VisiblePosition previousWordStart(const VisiblePosition&) const = 0;
892     virtual VisiblePosition nextLineEndPosition(const VisiblePosition&) const = 0;
893     virtual VisiblePosition previousLineStartPosition(const VisiblePosition&) const = 0;
894     virtual VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const = 0;
895     virtual VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const = 0;
896     virtual VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const = 0;
897     virtual VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const = 0;
898     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const = 0;
899
900     virtual VisiblePosition visiblePositionForIndex(int) const = 0;
901     virtual int indexForVisiblePosition(const VisiblePosition&) const = 0;
902
903     virtual AXCoreObject* accessibilityObjectForPosition(const VisiblePosition&) const = 0;
904     virtual int lineForPosition(const VisiblePosition&) const = 0;
905     virtual PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const = 0;
906     virtual int index(const VisiblePosition&) const = 0;
907
908     virtual void lineBreaks(Vector<int>&) const = 0;
909     virtual PlainTextRange doAXRangeForLine(unsigned) const = 0;
910     virtual PlainTextRange doAXRangeForPosition(const IntPoint&) const = 0;
911     virtual PlainTextRange doAXRangeForIndex(unsigned) const = 0;
912     virtual PlainTextRange doAXStyleRangeForIndex(unsigned) const = 0;
913
914     virtual String doAXStringForRange(const PlainTextRange&) const = 0;
915     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const = 0;
916     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const = 0;
917
918     virtual unsigned doAXLineForIndex(unsigned) = 0;
919
920     virtual String computedRoleString() const = 0;
921
922     // MSAA
923     virtual String stringValueForMSAA() const = 0;
924     virtual String stringRoleForMSAA() const = 0;
925     virtual String nameForMSAA() const = 0;
926     virtual String descriptionForMSAA() const = 0;
927     virtual AccessibilityRole roleValueForMSAA() const = 0;
928
929     virtual String passwordFieldValue() const = 0;
930     virtual bool isValueAutofilled() const = 0;
931     virtual bool isValueAutofillAvailable() const = 0;
932     virtual AutoFillButtonType valueAutofillButtonType() const = 0;
933
934     // Used by an ARIA tree to get all its rows.
935     virtual void ariaTreeRows(AccessibilityChildrenVector&) = 0;
936     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
937     virtual void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&) = 0;
938     // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
939     virtual void ariaTreeItemContent(AccessibilityChildrenVector&) = 0;
940
941     // ARIA live-region features.
942     virtual bool supportsLiveRegion(bool excludeIfOff = true) const = 0;
943     virtual bool isInsideLiveRegion(bool excludeIfOff = true) const = 0;
944     virtual AXCoreObject* liveRegionAncestor(bool excludeIfOff = true) const = 0;
945     virtual const String liveRegionStatus() const = 0;
946     virtual const String liveRegionRelevant() const = 0;
947     virtual bool liveRegionAtomic() const = 0;
948     virtual bool isBusy() const = 0;
949
950     virtual bool hasContentEditableAttributeSet() const = 0;
951
952     virtual bool supportsReadOnly() const = 0;
953     virtual String readOnlyValue() const = 0;
954
955     virtual bool supportsAutoComplete() const = 0;
956     virtual String autoCompleteValue() const = 0;
957
958     virtual bool supportsARIAAttributes() const = 0;
959
960     // CSS3 Speech properties.
961     virtual OptionSet<SpeakAs> speakAsProperty() const = 0;
962
963     // Make this object visible by scrolling as many nested scrollable views as needed.
964     virtual void scrollToMakeVisible() const = 0;
965     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
966     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const = 0;
967     // Scroll this object to a given point in global coordinates of the top-level window.
968     virtual void scrollToGlobalPoint(const IntPoint&) const = 0;
969
970     enum class ScrollByPageDirection { Up, Down, Left, Right };
971     virtual bool scrollByPage(ScrollByPageDirection) const = 0;
972     virtual IntPoint scrollPosition() const = 0;
973     virtual IntSize scrollContentsSize() const = 0;
974     virtual IntRect scrollVisibleContentRect() const = 0;
975     virtual void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const = 0;
976
977     virtual bool lastKnownIsIgnoredValue() = 0;
978     virtual void setLastKnownIsIgnoredValue(bool) = 0;
979
980     // Fires a children changed notification on the parent if the isIgnored value changed.
981     virtual void notifyIfIgnoredValueChanged() = 0;
982
983     // All math elements return true for isMathElement().
984     virtual bool isMathElement() const = 0;
985     virtual bool isMathFraction() const = 0;
986     virtual bool isMathFenced() const = 0;
987     virtual bool isMathSubscriptSuperscript() const = 0;
988     virtual bool isMathRow() const = 0;
989     virtual bool isMathUnderOver() const = 0;
990     virtual bool isMathRoot() const = 0;
991     virtual bool isMathSquareRoot() const = 0;
992     virtual bool isMathText() const = 0;
993     virtual bool isMathNumber() const = 0;
994     virtual bool isMathOperator() const = 0;
995     virtual bool isMathFenceOperator() const = 0;
996     virtual bool isMathSeparatorOperator() const = 0;
997     virtual bool isMathIdentifier() const = 0;
998     virtual bool isMathTable() const = 0;
999     virtual bool isMathTableRow() const = 0;
1000     virtual bool isMathTableCell() const = 0;
1001     virtual bool isMathMultiscript() const = 0;
1002     virtual bool isMathToken() const = 0;
1003     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const = 0;
1004     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const = 0;
1005
1006     // Root components.
1007     virtual AXCoreObject* mathRadicandObject() = 0;
1008     virtual AXCoreObject* mathRootIndexObject() = 0;
1009
1010     // Under over components.
1011     virtual AXCoreObject* mathUnderObject() = 0;
1012     virtual AXCoreObject* mathOverObject() = 0;
1013
1014     // Fraction components.
1015     virtual AXCoreObject* mathNumeratorObject() = 0;
1016     virtual AXCoreObject* mathDenominatorObject() = 0;
1017
1018     // Subscript/superscript components.
1019     virtual AXCoreObject* mathBaseObject() = 0;
1020     virtual AXCoreObject* mathSubscriptObject() = 0;
1021     virtual AXCoreObject* mathSuperscriptObject() = 0;
1022
1023     // Fenced components.
1024     virtual String mathFencedOpenString() const = 0;
1025     virtual String mathFencedCloseString() const = 0;
1026     virtual int mathLineThickness() const = 0;
1027     virtual bool isAnonymousMathOperator() const = 0;
1028
1029     // Multiscripts components.
1030     typedef Vector<std::pair<AXCoreObject*, AXCoreObject*>> AccessibilityMathMultiscriptPairs;
1031     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) = 0;
1032     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) = 0;
1033
1034     // Visibility.
1035     virtual bool isAXHidden() const = 0;
1036     virtual bool isDOMHidden() const = 0;
1037     virtual bool isHidden() const = 0;
1038
1039     virtual AccessibilityObjectWrapper* wrapper() const = 0;
1040     virtual void setWrapper(AccessibilityObjectWrapper*) = 0;
1041
1042     virtual void overrideAttachmentParent(AXCoreObject* parent) = 0;
1043
1044     // a platform-specific method for determining if an attachment is ignored
1045     virtual bool accessibilityIgnoreAttachment() const = 0;
1046     // gives platforms the opportunity to indicate if and how an object should be included
1047     virtual AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const = 0;
1048
1049 #if PLATFORM(IOS_FAMILY)
1050     virtual int accessibilityPasswordFieldLength() = 0;
1051     virtual bool hasTouchEventListener() const = 0;
1052     virtual bool isInputTypePopupButton() const = 0;
1053 #endif
1054
1055     // allows for an AccessibilityObject to update its render tree or perform
1056     // other operations update type operations
1057     virtual void updateBackingStore() = 0;
1058
1059 #if PLATFORM(COCOA)
1060     virtual bool preventKeyboardDOMEventDispatch() const = 0;
1061     virtual void setPreventKeyboardDOMEventDispatch(bool) = 0;
1062     virtual bool fileUploadButtonReturnsValueInTitle() const = 0;
1063     virtual String speechHintAttributeValue() const = 0;
1064     virtual String descriptionAttributeValue() const = 0;
1065     virtual String helpTextAttributeValue() const = 0;
1066     virtual String titleAttributeValue() const = 0;
1067 #endif
1068
1069 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY)
1070     virtual bool caretBrowsingEnabled() const = 0;
1071     virtual void setCaretBrowsingEnabled(bool) = 0;
1072 #endif
1073
1074     virtual AXCoreObject* focusableAncestor() = 0;
1075     virtual AXCoreObject* editableAncestor() = 0;
1076     virtual AXCoreObject* highestEditableAncestor() = 0;
1077
1078     virtual const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const = 0;
1079
1080     virtual void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData&) = 0;
1081     virtual void clearIsIgnoredFromParentData() = 0;
1082     virtual void setIsIgnoredFromParentDataForChild(AXCoreObject*) = 0;
1083 };
1084
1085 namespace Accessibility {
1086
1087 template<typename T, typename F>
1088 T* findAncestor(const T& object, bool includeSelf, const F& matches)
1089 {
1090     T* parent;
1091     if (includeSelf)
1092         parent = const_cast<T*>(&object);
1093     else {
1094         auto* parentPtr = object.parentObject();
1095         if (!is<T>(parentPtr))
1096             return nullptr;
1097         parent = parentPtr;
1098     }
1099
1100     for (; parent; parent = parent->parentObject()) {
1101         if (matches(*parent))
1102             return parent;
1103     }
1104
1105     return nullptr;
1106 }
1107
1108 } // namespace Accessibility
1109
1110 } // namespace WebCore