AX ITM: ARIATreeItemContent, ARIATreeRows, and DisclosedRows properties need to be...
[webkit.git] / Source / WebCore / accessibility / AccessibilityObjectInterface.h
blobee396c62f7592936cd53de7d8f9ff72ff95befee
1 /*
2 * Copyright (C) 2019 Apple Inc. All rights reserved.
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.
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.
26 #pragma once
28 // FIXME: Should rename this file AXCoreObject.h.
30 #include "FrameLoaderClient.h"
31 #include "HTMLTextFormControlElement.h"
32 #include "LayoutRect.h"
33 #include "SimpleRange.h"
34 #include "TextIteratorBehavior.h"
35 #include "VisibleSelection.h"
36 #include "Widget.h"
37 #include <variant>
38 #include <wtf/HashSet.h>
39 #include <wtf/ObjectIdentifier.h>
40 #include <wtf/RefCounted.h>
42 #if PLATFORM(WIN)
43 #include "AccessibilityObjectWrapperWin.h"
44 #include "COMPtr.h"
45 #endif
47 #if USE(ATSPI)
48 #include "AccessibilityObjectAtspi.h"
49 #endif
51 #if PLATFORM(COCOA)
52 OBJC_CLASS WebAccessibilityObjectWrapper;
53 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
54 typedef struct _NSRange NSRange;
55 typedef const struct __AXTextMarker* AXTextMarkerRef;
56 typedef const struct __AXTextMarkerRange* AXTextMarkerRangeRef;
57 #elif USE(ATSPI)
58 typedef WebCore::AccessibilityObjectAtspi AccessibilityObjectWrapper;
59 #else
60 class AccessibilityObjectWrapper;
61 #endif
63 namespace PAL {
64 class SessionID;
67 namespace WTF {
68 class TextStream;
71 namespace WebCore {
73 class AXCoreObject;
74 class AXObjectCache;
75 class AccessibilityScrollView;
76 class Document;
77 class Element;
78 class Frame;
79 class FrameView;
80 class Node;
81 class Page;
82 class Path;
83 class QualifiedName;
84 class RenderObject;
85 class ScrollView;
87 struct AccessibilityText;
88 struct ScrollRectToVisibleOptions;
90 enum AXIDType { };
91 using AXID = ObjectIdentifier<AXIDType>;
93 enum class AXAncestorFlag : uint8_t {
94 // When the flags aren't initialized, it means the object hasn't been inserted into the tree,
95 // and thus we haven't set any of these ancestry flags.
96 FlagsInitialized = 1 << 0,
97 HasDocumentRoleAncestor = 1 << 1,
98 HasWebApplicationAncestor = 1 << 2,
99 IsInDescriptionListDetail = 1 << 3,
100 IsInDescriptionListTerm = 1 << 4,
101 IsInCell = 1 << 5,
103 // Bits 6 and 7 are free.
106 enum class AccessibilityRole {
107 Annotation = 1,
108 Application,
109 ApplicationAlert,
110 ApplicationAlertDialog,
111 ApplicationDialog,
112 ApplicationGroup,
113 ApplicationLog,
114 ApplicationMarquee,
115 ApplicationStatus,
116 ApplicationTextGroup,
117 ApplicationTimer,
118 Audio,
119 Blockquote,
120 Browser,
121 BusyIndicator,
122 Button,
123 Canvas,
124 Caption,
125 Cell,
126 CheckBox,
127 ColorWell,
128 Column,
129 ColumnHeader,
130 ComboBox,
131 Definition,
132 Deletion,
133 DescriptionList,
134 DescriptionListDetail,
135 DescriptionListTerm,
136 Details,
137 Directory,
138 DisclosureTriangle,
139 Div,
140 Document,
141 DocumentArticle,
142 DocumentMath,
143 DocumentNote,
144 Drawer,
145 EditableText,
146 Feed,
147 Figure,
148 Footer,
149 Footnote,
150 Form,
151 GraphicsDocument,
152 GraphicsObject,
153 GraphicsSymbol,
154 Grid,
155 GridCell,
156 Group,
157 GrowArea,
158 Heading,
159 HelpTag,
160 HorizontalRule,
161 Ignored,
162 Inline,
163 Image,
164 ImageMap,
165 ImageMapLink,
166 Incrementor,
167 Insertion,
168 Label,
169 LandmarkBanner,
170 LandmarkComplementary,
171 LandmarkContentInfo,
172 LandmarkDocRegion,
173 LandmarkMain,
174 LandmarkNavigation,
175 LandmarkRegion,
176 LandmarkSearch,
177 Legend,
178 Link,
179 List,
180 ListBox,
181 ListBoxOption,
182 ListItem,
183 ListMarker,
184 Mark,
185 MathElement,
186 Matte,
187 Menu,
188 MenuBar,
189 MenuButton,
190 MenuItem,
191 MenuItemCheckbox,
192 MenuItemRadio,
193 MenuListPopup,
194 MenuListOption,
195 Meter,
196 Model,
197 Outline,
198 Paragraph,
199 PopUpButton,
200 Pre,
201 Presentational,
202 ProgressIndicator,
203 RadioButton,
204 RadioGroup,
205 RowHeader,
206 Row,
207 RowGroup,
208 RubyBase,
209 RubyBlock,
210 RubyInline,
211 RubyRun,
212 RubyText,
213 Ruler,
214 RulerMarker,
215 ScrollArea,
216 ScrollBar,
217 SearchField,
218 Sheet,
219 Slider,
220 SliderThumb,
221 SpinButton,
222 SpinButtonPart,
223 SplitGroup,
224 Splitter,
225 StaticText,
226 Subscript,
227 Summary,
228 Superscript,
229 Switch,
230 SystemWide,
231 SVGRoot,
232 SVGText,
233 SVGTSpan,
234 SVGTextPath,
235 TabGroup,
236 TabList,
237 TabPanel,
238 Tab,
239 Table,
240 TableHeaderContainer,
241 Term,
242 TextArea,
243 TextField,
244 TextGroup,
245 Time,
246 Tree,
247 TreeGrid,
248 TreeItem,
249 ToggleButton,
250 Toolbar,
251 Unknown,
252 UserInterfaceTooltip,
253 ValueIndicator,
254 Video,
255 WebApplication,
256 WebArea,
257 WebCoreLink,
258 Window,
261 using AccessibilityRoleSet = HashSet<AccessibilityRole, IntHash<AccessibilityRole>, WTF::StrongEnumHashTraits<AccessibilityRole>>;
263 ALWAYS_INLINE String accessibilityRoleToString(AccessibilityRole role)
265 switch (role) {
266 case AccessibilityRole::Annotation:
267 return "Annotation"_s;
268 case AccessibilityRole::Application:
269 return "Application"_s;
270 case AccessibilityRole::ApplicationAlert:
271 return "ApplicationAlert"_s;
272 case AccessibilityRole::ApplicationAlertDialog:
273 return "ApplicationAlertDialog"_s;
274 case AccessibilityRole::ApplicationDialog:
275 return "ApplicationDialog"_s;
276 case AccessibilityRole::ApplicationGroup:
277 return "ApplicationGroup"_s;
278 case AccessibilityRole::ApplicationLog:
279 return "ApplicationLog"_s;
280 case AccessibilityRole::ApplicationMarquee:
281 return "ApplicationMarquee"_s;
282 case AccessibilityRole::ApplicationStatus:
283 return "ApplicationStatus"_s;
284 case AccessibilityRole::ApplicationTextGroup:
285 return "ApplicationTextGroup"_s;
286 case AccessibilityRole::ApplicationTimer:
287 return "ApplicationTimer"_s;
288 case AccessibilityRole::Audio:
289 return "Audio"_s;
290 case AccessibilityRole::Blockquote:
291 return "Blockquote"_s;
292 case AccessibilityRole::Browser:
293 return "Browser"_s;
294 case AccessibilityRole::BusyIndicator:
295 return "BusyIndicator"_s;
296 case AccessibilityRole::Button:
297 return "Button"_s;
298 case AccessibilityRole::Canvas:
299 return "Canvas"_s;
300 case AccessibilityRole::Caption:
301 return "Caption"_s;
302 case AccessibilityRole::Cell:
303 return "Cell"_s;
304 case AccessibilityRole::CheckBox:
305 return "CheckBox"_s;
306 case AccessibilityRole::ColorWell:
307 return "ColorWell"_s;
308 case AccessibilityRole::Column:
309 return "Column"_s;
310 case AccessibilityRole::ColumnHeader:
311 return "ColumnHeader"_s;
312 case AccessibilityRole::ComboBox:
313 return "ComboBox"_s;
314 case AccessibilityRole::Definition:
315 return "Definition"_s;
316 case AccessibilityRole::Deletion:
317 return "Deletion"_s;
318 case AccessibilityRole::DescriptionList:
319 return "DescriptionList"_s;
320 case AccessibilityRole::DescriptionListTerm:
321 return "DescriptionListTerm"_s;
322 case AccessibilityRole::DescriptionListDetail:
323 return "DescriptionListDetail"_s;
324 case AccessibilityRole::Details:
325 return "Details"_s;
326 case AccessibilityRole::Directory:
327 return "Directory"_s;
328 case AccessibilityRole::DisclosureTriangle:
329 return "DisclosureTriangle"_s;
330 case AccessibilityRole::Div:
331 return "Div"_s;
332 case AccessibilityRole::Document:
333 return "Document"_s;
334 case AccessibilityRole::DocumentArticle:
335 return "DocumentArticle"_s;
336 case AccessibilityRole::DocumentMath:
337 return "DocumentMath"_s;
338 case AccessibilityRole::DocumentNote:
339 return "DocumentNote"_s;
340 case AccessibilityRole::Drawer:
341 return "Drawer"_s;
342 case AccessibilityRole::EditableText:
343 return "EditableText"_s;
344 case AccessibilityRole::Feed:
345 return "Feed"_s;
346 case AccessibilityRole::Figure:
347 return "Figure"_s;
348 case AccessibilityRole::Footer:
349 return "Footer"_s;
350 case AccessibilityRole::Footnote:
351 return "Footnote"_s;
352 case AccessibilityRole::Form:
353 return "Form"_s;
354 case AccessibilityRole::GraphicsDocument:
355 return "GraphicsDocument"_s;
356 case AccessibilityRole::GraphicsObject:
357 return "GraphicsObject"_s;
358 case AccessibilityRole::GraphicsSymbol:
359 return "GraphicsSymbol"_s;
360 case AccessibilityRole::Grid:
361 return "Grid"_s;
362 case AccessibilityRole::GridCell:
363 return "GridCell"_s;
364 case AccessibilityRole::Group:
365 return "Group"_s;
366 case AccessibilityRole::GrowArea:
367 return "GrowArea"_s;
368 case AccessibilityRole::Heading:
369 return "Heading"_s;
370 case AccessibilityRole::HelpTag:
371 return "HelpTag"_s;
372 case AccessibilityRole::HorizontalRule:
373 return "HorizontalRule"_s;
374 case AccessibilityRole::Ignored:
375 return "Ignored"_s;
376 case AccessibilityRole::Inline:
377 return "Inline"_s;
378 case AccessibilityRole::Image:
379 return "Image"_s;
380 case AccessibilityRole::ImageMap:
381 return "ImageMap"_s;
382 case AccessibilityRole::ImageMapLink:
383 return "ImageMapLink"_s;
384 case AccessibilityRole::Incrementor:
385 return "Incrementor"_s;
386 case AccessibilityRole::Insertion:
387 return "Insertion"_s;
388 case AccessibilityRole::Label:
389 return "Label"_s;
390 case AccessibilityRole::LandmarkBanner:
391 return "LandmarkBanner"_s;
392 case AccessibilityRole::LandmarkComplementary:
393 return "LandmarkComplementary"_s;
394 case AccessibilityRole::LandmarkContentInfo:
395 return "LandmarkContentInfo"_s;
396 case AccessibilityRole::LandmarkDocRegion:
397 return "LandmarkDocRegion"_s;
398 case AccessibilityRole::LandmarkMain:
399 return "LandmarkMain"_s;
400 case AccessibilityRole::LandmarkNavigation:
401 return "LandmarkNavigation"_s;
402 case AccessibilityRole::LandmarkRegion:
403 return "LandmarkRegion"_s;
404 case AccessibilityRole::LandmarkSearch:
405 return "LandmarkSearch"_s;
406 case AccessibilityRole::Legend:
407 return "Legend"_s;
408 case AccessibilityRole::Link:
409 return "Link"_s;
410 case AccessibilityRole::List:
411 return "List"_s;
412 case AccessibilityRole::ListBox:
413 return "ListBox"_s;
414 case AccessibilityRole::ListBoxOption:
415 return "ListBoxOption"_s;
416 case AccessibilityRole::ListItem:
417 return "ListItem"_s;
418 case AccessibilityRole::ListMarker:
419 return "ListMarker"_s;
420 case AccessibilityRole::Mark:
421 return "Mark"_s;
422 case AccessibilityRole::MathElement:
423 return "MathElement"_s;
424 case AccessibilityRole::Matte:
425 return "Matte"_s;
426 case AccessibilityRole::Menu:
427 return "Menu"_s;
428 case AccessibilityRole::MenuBar:
429 return "MenuBar"_s;
430 case AccessibilityRole::MenuButton:
431 return "MenuButton"_s;
432 case AccessibilityRole::MenuItem:
433 return "MenuItem"_s;
434 case AccessibilityRole::MenuItemCheckbox:
435 return "MenuItemCheckbox"_s;
436 case AccessibilityRole::MenuItemRadio:
437 return "MenuItemRadio"_s;
438 case AccessibilityRole::MenuListPopup:
439 return "MenuListPopup"_s;
440 case AccessibilityRole::MenuListOption:
441 return "MenuListOption"_s;
442 case AccessibilityRole::Meter:
443 return "Meter"_s;
444 case AccessibilityRole::Model:
445 return "Model"_s;
446 case AccessibilityRole::Outline:
447 return "Outline"_s;
448 case AccessibilityRole::Paragraph:
449 return "Paragraph"_s;
450 case AccessibilityRole::PopUpButton:
451 return "PopUpButton"_s;
452 case AccessibilityRole::Pre:
453 return "Pre"_s;
454 case AccessibilityRole::Presentational:
455 return "Presentational"_s;
456 case AccessibilityRole::ProgressIndicator:
457 return "ProgressIndicator"_s;
458 case AccessibilityRole::RadioButton:
459 return "RadioButton"_s;
460 case AccessibilityRole::RadioGroup:
461 return "RadioGroup"_s;
462 case AccessibilityRole::RowHeader:
463 return "RowHeader"_s;
464 case AccessibilityRole::Row:
465 return "Row"_s;
466 case AccessibilityRole::RowGroup:
467 return "RowGroup"_s;
468 case AccessibilityRole::RubyBase:
469 return "RubyBase"_s;
470 case AccessibilityRole::RubyBlock:
471 return "RubyBlock"_s;
472 case AccessibilityRole::RubyInline:
473 return "RubyInline"_s;
474 case AccessibilityRole::RubyRun:
475 return "RubyRun"_s;
476 case AccessibilityRole::RubyText:
477 return "RubyText"_s;
478 case AccessibilityRole::Ruler:
479 return "Ruler"_s;
480 case AccessibilityRole::RulerMarker:
481 return "RulerMarker"_s;
482 case AccessibilityRole::ScrollArea:
483 return "ScrollArea"_s;
484 case AccessibilityRole::ScrollBar:
485 return "ScrollBar"_s;
486 case AccessibilityRole::SearchField:
487 return "SearchField"_s;
488 case AccessibilityRole::Sheet:
489 return "Sheet"_s;
490 case AccessibilityRole::Slider:
491 return "Slider"_s;
492 case AccessibilityRole::SliderThumb:
493 return "SliderThumb"_s;
494 case AccessibilityRole::SpinButton:
495 return "SpinButton"_s;
496 case AccessibilityRole::SpinButtonPart:
497 return "SpinButtonPart"_s;
498 case AccessibilityRole::SplitGroup:
499 return "SplitGroup"_s;
500 case AccessibilityRole::Splitter:
501 return "Splitter"_s;
502 case AccessibilityRole::StaticText:
503 return "StaticText"_s;
504 case AccessibilityRole::Subscript:
505 return "Subscript"_s;
506 case AccessibilityRole::Summary:
507 return "Summary"_s;
508 case AccessibilityRole::Superscript:
509 return "Superscript"_s;
510 case AccessibilityRole::Switch:
511 return "Switch"_s;
512 case AccessibilityRole::SystemWide:
513 return "SystemWide"_s;
514 case AccessibilityRole::SVGRoot:
515 return "SVGRoot"_s;
516 case AccessibilityRole::SVGText:
517 return "SVGText"_s;
518 case AccessibilityRole::SVGTSpan:
519 return "SVGTSpan"_s;
520 case AccessibilityRole::SVGTextPath:
521 return "SVGTextPath"_s;
522 case AccessibilityRole::TabGroup:
523 return "TabGroup"_s;
524 case AccessibilityRole::TabList:
525 return "TabList"_s;
526 case AccessibilityRole::TabPanel:
527 return "TabPanel"_s;
528 case AccessibilityRole::Tab:
529 return "Tab"_s;
530 case AccessibilityRole::Table:
531 return "Table"_s;
532 case AccessibilityRole::TableHeaderContainer:
533 return "TableHeaderContainer"_s;
534 case AccessibilityRole::Term:
535 return "Term"_s;
536 case AccessibilityRole::TextArea:
537 return "TextArea"_s;
538 case AccessibilityRole::TextField:
539 return "TextField"_s;
540 case AccessibilityRole::TextGroup:
541 return "TextGroup"_s;
542 case AccessibilityRole::Time:
543 return "Time"_s;
544 case AccessibilityRole::Tree:
545 return "Tree"_s;
546 case AccessibilityRole::TreeGrid:
547 return "TreeGrid"_s;
548 case AccessibilityRole::TreeItem:
549 return "TreeItem"_s;
550 case AccessibilityRole::ToggleButton:
551 return "ToggleButton"_s;
552 case AccessibilityRole::Toolbar:
553 return "Toolbar"_s;
554 case AccessibilityRole::Unknown:
555 return "Unknown"_s;
556 case AccessibilityRole::UserInterfaceTooltip:
557 return "UserInterfaceTooltip"_s;
558 case AccessibilityRole::ValueIndicator:
559 return "ValueIndicator"_s;
560 case AccessibilityRole::Video:
561 return "Video"_s;
562 case AccessibilityRole::WebApplication:
563 return "WebApplication"_s;
564 case AccessibilityRole::WebArea:
565 return "WebArea"_s;
566 case AccessibilityRole::WebCoreLink:
567 return "WebCoreLink"_s;
568 case AccessibilityRole::Window:
569 return "Window"_s;
571 UNREACHABLE();
572 return ""_s;
575 enum class AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed, ElementChanged };
577 enum class AccessibilityConversionSpace { Screen, Page };
579 enum class AccessibilitySearchDirection {
580 Next = 1,
581 Previous,
584 enum class AccessibilityTextSource {
585 Alternative,
586 Children,
587 Summary,
588 Help,
589 Visible,
590 TitleTag,
591 Placeholder,
592 LabelByElement,
593 Title,
594 Subtitle,
595 Action,
598 enum class AccessibilitySearchKey {
599 AnyType = 1,
600 Article,
601 BlockquoteSameLevel,
602 Blockquote,
603 BoldFont,
604 Button,
605 CheckBox,
606 Control,
607 DifferentType,
608 FontChange,
609 FontColorChange,
610 Frame,
611 Graphic,
612 HeadingLevel1,
613 HeadingLevel2,
614 HeadingLevel3,
615 HeadingLevel4,
616 HeadingLevel5,
617 HeadingLevel6,
618 HeadingSameLevel,
619 Heading,
620 Highlighted,
621 ItalicFont,
622 KeyboardFocusable,
623 Landmark,
624 Link,
625 List,
626 LiveRegion,
627 MisspelledWord,
628 Outline,
629 PlainText,
630 RadioGroup,
631 SameType,
632 StaticText,
633 StyleChange,
634 TableSameLevel,
635 Table,
636 TextField,
637 Underline,
638 UnvisitedLink,
639 VisitedLink,
642 using AXEditingStyleValueVariant = std::variant<String, bool, int>;
644 struct AccessibilitySearchCriteria {
645 AXCoreObject* anchorObject { nullptr };
646 AXCoreObject* startObject;
647 AccessibilitySearchDirection searchDirection;
648 Vector<AccessibilitySearchKey> searchKeys;
649 String searchText;
650 unsigned resultsLimit;
651 bool visibleOnly;
652 bool immediateDescendantsOnly;
654 AccessibilitySearchCriteria(AXCoreObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
655 : startObject(startObject)
656 , searchDirection(searchDirection)
657 , searchText(searchText)
658 , resultsLimit(resultsLimit)
659 , visibleOnly(visibleOnly)
660 , immediateDescendantsOnly(immediateDescendantsOnly)
664 enum class AccessibilityObjectInclusion {
665 IncludeObject,
666 IgnoreObject,
667 DefaultBehavior,
670 enum class AccessibilityCurrentState { False, True, Page, Step, Location, Date, Time };
672 enum class AccessibilityButtonState {
673 Off = 0,
675 Mixed,
678 enum class AccessibilitySortDirection {
679 None,
680 Ascending,
681 Descending,
682 Other,
683 Invalid,
686 enum class AccessibilitySearchTextStartFrom {
687 Begin, // Search from the beginning of the element.
688 Selection, // Search from the position of the current selection.
689 End // Search from the end of the element.
692 enum class AccessibilitySearchTextDirection {
693 Forward, // Occurrence after the starting range.
694 Backward, // Occurrence before the starting range.
695 Closest, // Closest occurrence to the starting range, whether after or before.
696 All // All occurrences
699 struct AccessibilitySearchTextCriteria {
700 Vector<String> searchStrings; // Text strings to search for.
701 AccessibilitySearchTextStartFrom start;
702 AccessibilitySearchTextDirection direction;
704 AccessibilitySearchTextCriteria()
705 : start(AccessibilitySearchTextStartFrom::Selection)
706 , direction(AccessibilitySearchTextDirection::Forward)
710 enum class AccessibilityTextOperationType {
711 Select,
712 Replace,
713 Capitalize,
714 Lowercase,
715 Uppercase
718 struct AccessibilityTextOperation {
719 Vector<SimpleRange> textRanges; // text on which perform the operation.
720 AccessibilityTextOperationType type;
721 String replacementText; // For type = replace.
723 AccessibilityTextOperation()
724 : type(AccessibilityTextOperationType::Select)
728 enum class AccessibilityOrientation {
729 Vertical,
730 Horizontal,
731 Undefined,
734 struct AccessibilityTextUnderElementMode {
735 enum ChildrenInclusion {
736 TextUnderElementModeSkipIgnoredChildren,
737 TextUnderElementModeIncludeAllChildren,
738 TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
741 ChildrenInclusion childrenInclusion;
742 bool includeFocusableContent;
743 Node* ignoredChildNode;
745 AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
746 : childrenInclusion(c)
747 , includeFocusableContent(i)
748 , ignoredChildNode(ignored)
752 // FIXME: Merge this with CharacterRange (by deleting this and using CharacterRange instead).
753 struct PlainTextRange {
754 unsigned start { 0 };
755 unsigned length { 0 };
757 PlainTextRange() = default;
759 PlainTextRange(unsigned s, unsigned l)
760 : start(s)
761 , length(l)
764 #if PLATFORM(COCOA)
765 PlainTextRange(NSRange);
766 #endif
768 bool isNull() const { return !start && !length; }
771 enum class AccessibilityVisiblePositionForBounds {
772 First,
773 Last,
776 enum class AccessibilityMathScriptObjectType { Subscript, Superscript };
777 enum class AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
779 // Use this struct to store the isIgnored data that depends on the parents, so that in addChildren()
780 // we avoid going up the parent chain for each element while traversing the tree with useful information already.
781 struct AccessibilityIsIgnoredFromParentData {
782 AXCoreObject* parent { nullptr };
783 bool isAXHidden { false };
784 bool isPresentationalChildOfAriaRole { false };
785 bool isDescendantOfBarrenParent { false };
787 AccessibilityIsIgnoredFromParentData(AXCoreObject* parent = nullptr)
788 : parent(parent)
791 bool isNull() const { return !parent; }
794 class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
795 public:
796 virtual ~AXCoreObject() = default;
798 // After constructing an accessible object, it must be given a
799 // unique ID, then added to AXObjectCache, and finally init() must
800 // be called last.
801 virtual void setObjectID(AXID) = 0;
802 virtual AXID objectID() const = 0;
803 virtual void init() = 0;
805 // When the corresponding WebCore object that this accessible object
806 // represents is deleted, it must be detached.
807 void detach(AccessibilityDetachmentType);
808 virtual bool isDetached() const = 0;
810 typedef Vector<RefPtr<AXCoreObject>> AccessibilityChildrenVector;
812 virtual bool isAccessibilityObject() const = 0;
813 virtual bool isAccessibilityNodeObject() const = 0;
814 virtual bool isAccessibilityRenderObject() const = 0;
815 virtual bool isAccessibilityScrollbar() const = 0;
816 virtual bool isAccessibilityScrollViewInstance() const = 0;
817 virtual bool isAXImageInstance() const = 0;
818 virtual bool isAccessibilitySVGRoot() const = 0;
819 virtual bool isAccessibilitySVGElement() const = 0;
820 virtual bool isAccessibilityTableInstance() const = 0;
821 virtual bool isAccessibilityTableColumnInstance() const = 0;
822 virtual bool isAccessibilityProgressIndicatorInstance() const = 0;
823 virtual bool isAccessibilityListBoxInstance() const = 0;
824 virtual bool isAXIsolatedObjectInstance() const = 0;
826 virtual bool isAttachmentElement() const = 0;
827 virtual bool isHeading() const = 0;
828 virtual bool isLink() const = 0;
829 bool isImage() const { return roleValue() == AccessibilityRole::Image; }
830 bool isImageMap() const { return roleValue() == AccessibilityRole::ImageMap; }
831 bool isVideo() const { return roleValue() == AccessibilityRole::Video; }
832 virtual bool isNativeImage() const = 0;
833 virtual bool isImageButton() const = 0;
834 virtual bool isPasswordField() const = 0;
835 virtual bool isContainedByPasswordField() const = 0;
836 virtual AXCoreObject* passwordFieldOrContainingPasswordField() = 0;
837 virtual bool isNativeTextControl() const = 0;
838 virtual bool isSearchField() const = 0;
839 bool isWebArea() const { return roleValue() == AccessibilityRole::WebArea; }
840 bool isCheckbox() const { return roleValue() == AccessibilityRole::CheckBox; }
841 bool isRadioButton() const { return roleValue() == AccessibilityRole::RadioButton; }
842 bool isListBox() const { return roleValue() == AccessibilityRole::ListBox; }
843 virtual bool isListBoxOption() const = 0;
844 virtual bool isAttachment() const = 0;
845 virtual bool isMediaTimeline() const = 0;
846 virtual bool isMenuRelated() const = 0;
847 virtual bool isMenu() const = 0;
848 virtual bool isMenuBar() const = 0;
849 virtual bool isMenuButton() const = 0;
850 virtual bool isMenuItem() const = 0;
851 virtual bool isFileUploadButton() const = 0;
852 virtual bool isInputImage() const = 0;
853 virtual bool isProgressIndicator() const = 0;
854 virtual bool isSlider() const = 0;
855 virtual bool isSliderThumb() const = 0;
856 virtual bool isInputSlider() const = 0;
857 virtual bool isControl() const = 0;
858 virtual bool isLabel() const = 0;
859 // lists support (l, ul, ol, dl)
860 virtual bool isList() const = 0;
861 virtual bool isUnorderedList() const = 0;
862 virtual bool isOrderedList() const = 0;
863 virtual bool isDescriptionList() const = 0;
865 // Table support.
866 virtual bool isTable() const = 0;
867 virtual bool isExposable() const = 0;
868 virtual bool isDataTable() const = 0;
869 virtual int tableLevel() const = 0;
870 virtual bool supportsSelectedRows() const = 0;
871 virtual AccessibilityChildrenVector columns() = 0;
872 virtual AccessibilityChildrenVector rows() = 0;
873 virtual unsigned columnCount() = 0;
874 virtual unsigned rowCount() = 0;
875 // All the cells in the table.
876 virtual AccessibilityChildrenVector cells() = 0;
877 virtual AXCoreObject* cellForColumnAndRow(unsigned column, unsigned row) = 0;
878 virtual AccessibilityChildrenVector columnHeaders() = 0;
879 virtual AccessibilityChildrenVector rowHeaders() = 0;
880 virtual AccessibilityChildrenVector visibleRows() = 0;
881 // Returns an object that contains, as children, all the objects that act as headers.
882 virtual AXCoreObject* headerContainer() = 0;
883 virtual int axColumnCount() const = 0;
884 virtual int axRowCount() const = 0;
886 // Table cell support.
887 virtual bool isTableCell() const = 0;
888 // Returns the start location and row span of the cell.
889 virtual std::pair<unsigned, unsigned> rowIndexRange() const = 0;
890 // Returns the start location and column span of the cell.
891 virtual std::pair<unsigned, unsigned> columnIndexRange() const = 0;
892 virtual bool isColumnHeaderCell() const = 0;
893 virtual bool isRowHeaderCell() const = 0;
894 virtual int axColumnIndex() const = 0;
895 virtual int axRowIndex() const = 0;
897 // Table column support.
898 virtual bool isTableColumn() const = 0;
899 virtual unsigned columnIndex() const = 0;
900 virtual AXCoreObject* columnHeader() = 0;
902 // Table row support.
903 virtual bool isTableRow() const = 0;
904 virtual unsigned rowIndex() const = 0;
906 // ARIA tree/grid row support.
907 virtual bool isARIATreeGridRow() const = 0;
908 virtual AccessibilityChildrenVector disclosedRows() = 0; // Also implemented by ARIATreeItems.
909 virtual AXCoreObject* disclosedByRow() const = 0;
911 virtual bool isFieldset() const = 0;
912 virtual bool isGroup() const = 0;
913 virtual bool isImageMapLink() const = 0;
914 virtual bool isMenuList() const = 0;
915 virtual bool isMenuListPopup() const = 0;
916 virtual bool isMenuListOption() const = 0;
918 // Native spin buttons.
919 bool isSpinButton() const { return roleValue() == AccessibilityRole::SpinButton; }
920 virtual bool isNativeSpinButton() const = 0;
921 virtual AXCoreObject* incrementButton() = 0;
922 virtual AXCoreObject* decrementButton() = 0;
923 virtual bool isSpinButtonPart() const = 0;
924 virtual bool isIncrementor() const = 0;
926 virtual bool isMockObject() const = 0;
927 virtual bool isMediaObject() const = 0;
928 bool isSwitch() const { return roleValue() == AccessibilityRole::Switch; }
929 bool isToggleButton() const { return roleValue() == AccessibilityRole::ToggleButton; }
930 virtual bool isTextControl() const = 0;
931 virtual bool isARIATextControl() const = 0;
932 virtual bool isNonNativeTextControl() const = 0;
933 bool isTabList() const { return roleValue() == AccessibilityRole::TabList; }
934 bool isTabItem() const { return roleValue() == AccessibilityRole::Tab; }
935 bool isRadioGroup() const { return roleValue() == AccessibilityRole::RadioGroup; }
936 bool isComboBox() const { return roleValue() == AccessibilityRole::ComboBox; }
937 bool isTree() const { return roleValue() == AccessibilityRole::Tree; }
938 bool isTreeGrid() const { return roleValue() == AccessibilityRole::TreeGrid; }
939 bool isTreeItem() const { return roleValue() == AccessibilityRole::TreeItem; }
940 bool isScrollbar() const { return roleValue() == AccessibilityRole::ScrollBar; }
941 virtual bool isButton() const = 0;
943 virtual HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const = 0;
945 bool isListItem() const { return roleValue() == AccessibilityRole::ListItem; }
946 bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
947 bool isScrollView() const { return roleValue() == AccessibilityRole::ScrollArea; }
948 bool isCanvas() const { return roleValue() == AccessibilityRole::Canvas; }
949 bool isPopUpButton() const { return roleValue() == AccessibilityRole::PopUpButton; }
950 bool isColorWell() const { return roleValue() == AccessibilityRole::ColorWell; }
951 bool isSplitter() const { return roleValue() == AccessibilityRole::Splitter; }
952 bool isToolbar() const { return roleValue() == AccessibilityRole::Toolbar; }
953 bool isSummary() const { return roleValue() == AccessibilityRole::Summary; }
954 bool isBlockquote() const { return roleValue() == AccessibilityRole::Blockquote; }
955 #if ENABLE(MODEL_ELEMENT)
956 bool isModel() const { return roleValue() == AccessibilityRole::Model; }
957 #endif
959 virtual bool isLandmark() const = 0;
960 virtual bool isRangeControl() const = 0;
961 virtual bool isMeter() const = 0;
962 virtual bool isStyleFormatGroup() const = 0;
963 virtual bool isFigureElement() const = 0;
964 virtual bool isKeyboardFocusable() const = 0;
965 virtual bool isOutput() const = 0;
967 virtual bool isChecked() const = 0;
968 virtual bool isEnabled() const = 0;
969 virtual bool isSelected() const = 0;
970 virtual bool isFocused() const = 0;
971 virtual bool isHovered() const = 0;
972 virtual bool isIndeterminate() const = 0;
973 virtual bool isLoaded() const = 0;
974 virtual bool isMultiSelectable() const = 0;
975 // FIXME: should need just one since onscreen should be !offscreen.
976 virtual bool isOnScreen() const = 0;
977 virtual bool isOffScreen() const = 0;
978 virtual bool isPressed() const = 0;
979 virtual bool isUnvisited() const = 0;
980 virtual bool isVisited() const = 0;
981 virtual bool isRequired() const = 0;
982 virtual bool supportsRequiredAttribute() const = 0;
983 virtual bool isLinked() const = 0;
984 virtual bool isExpanded() const = 0;
985 virtual bool isVisible() const = 0;
986 virtual bool isCollapsed() const = 0;
987 virtual void setIsExpanded(bool) = 0;
988 virtual FloatRect relativeFrame() const = 0;
989 virtual FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const = 0;
990 virtual FloatRect unobscuredContentRect() const = 0;
991 virtual bool supportsCheckedState() const = 0;
993 // In a multi-select list, many items can be selected but only one is active at a time.
994 virtual bool isSelectedOptionActive() const = 0;
996 virtual bool hasBoldFont() const = 0;
997 virtual bool hasItalicFont() const = 0;
998 virtual bool hasMisspelling() const = 0;
999 virtual std::optional<SimpleRange> misspellingRange(const SimpleRange& start, AccessibilitySearchDirection) const = 0;
1000 virtual std::optional<SimpleRange> visibleCharacterRange() const = 0;
1001 virtual bool hasPlainText() const = 0;
1002 virtual bool hasSameFont(const AXCoreObject&) const = 0;
1003 virtual bool hasSameFontColor(const AXCoreObject&) const = 0;
1004 virtual bool hasSameStyle(const AXCoreObject&) const = 0;
1005 bool isStaticText() const { return roleValue() == AccessibilityRole::StaticText; }
1006 virtual bool hasUnderline() const = 0;
1007 virtual bool hasHighlighting() const = 0;
1009 virtual bool supportsDatetimeAttribute() const = 0;
1010 virtual String datetimeAttributeValue() const = 0;
1012 virtual bool canSetFocusAttribute() const = 0;
1013 virtual bool canSetTextRangeAttributes() const = 0;
1014 virtual bool canSetValueAttribute() const = 0;
1015 virtual bool canSetNumericValue() const = 0;
1016 virtual bool canSetSelectedAttribute() const = 0;
1017 virtual bool canSetSelectedChildren() const = 0;
1018 virtual bool canSetExpandedAttribute() const = 0;
1020 virtual Element* element() const = 0;
1021 virtual Node* node() const = 0;
1022 virtual RenderObject* renderer() const = 0;
1024 virtual bool accessibilityIsIgnored() const = 0;
1025 virtual AccessibilityObjectInclusion defaultObjectInclusion() const = 0;
1026 virtual bool accessibilityIsIgnoredByDefault() const = 0;
1028 virtual bool isShowingValidationMessage() const = 0;
1029 virtual String validationMessage() const = 0;
1031 virtual unsigned blockquoteLevel() const = 0;
1032 virtual unsigned headingLevel() const = 0;
1033 virtual AccessibilityButtonState checkboxOrRadioValue() const = 0;
1034 virtual String valueDescription() const = 0;
1035 virtual float valueForRange() const = 0;
1036 virtual float maxValueForRange() const = 0;
1037 virtual float minValueForRange() const = 0;
1038 virtual float stepValueForRange() const = 0;
1039 virtual AXCoreObject* selectedRadioButton() = 0;
1040 virtual AXCoreObject* selectedTabItem() = 0;
1041 virtual AXCoreObject* selectedListItem() = 0;
1042 virtual int layoutCount() const = 0;
1043 virtual double loadingProgress() const = 0;
1044 virtual String brailleLabel() const = 0;
1045 virtual String brailleRoleDescription() const = 0;
1046 virtual String embeddedImageDescription() const = 0;
1047 virtual std::optional<AccessibilityChildrenVector> imageOverlayElements() = 0;
1049 virtual bool supportsARIAOwns() const = 0;
1050 virtual bool isActiveDescendantOfFocusedContainer() const = 0;
1051 virtual void ariaActiveDescendantReferencingElements(AccessibilityChildrenVector&) const = 0;
1052 virtual void ariaControlsElements(AccessibilityChildrenVector&) const = 0;
1053 virtual void ariaControlsReferencingElements(AccessibilityChildrenVector&) const = 0;
1054 virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const = 0;
1055 virtual void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const = 0;
1056 virtual void ariaDetailsElements(AccessibilityChildrenVector&) const = 0;
1057 virtual void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const = 0;
1058 virtual void ariaErrorMessageElements(AccessibilityChildrenVector&) const = 0;
1059 virtual void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const = 0;
1060 virtual void ariaFlowToElements(AccessibilityChildrenVector&) const = 0;
1061 virtual void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const = 0;
1062 virtual void ariaLabelledByElements(AccessibilityChildrenVector&) const = 0;
1063 virtual void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const = 0;
1064 virtual void ariaOwnsElements(AccessibilityChildrenVector&) const = 0;
1065 virtual void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const = 0;
1067 virtual bool hasPopup() const = 0;
1068 virtual String popupValue() const = 0;
1069 virtual bool hasDatalist() const = 0;
1070 virtual bool supportsHasPopup() const = 0;
1071 virtual bool pressedIsPresent() const = 0;
1072 virtual bool ariaIsMultiline() const = 0;
1073 virtual String invalidStatus() const = 0;
1074 virtual bool supportsPressed() const = 0;
1075 virtual bool supportsExpanded() const = 0;
1076 virtual bool supportsChecked() const = 0;
1077 virtual bool supportsRowCountChange() const = 0;
1078 virtual AccessibilitySortDirection sortDirection() const = 0;
1079 virtual bool canvasHasFallbackContent() const = 0;
1080 virtual bool supportsRangeValue() const = 0;
1081 virtual String identifierAttribute() const = 0;
1082 virtual String linkRelValue() const = 0;
1083 virtual void classList(Vector<String>&) const = 0;
1084 virtual AccessibilityCurrentState currentState() const = 0;
1085 virtual String currentValue() const = 0;
1086 virtual bool supportsCurrent() const = 0;
1087 virtual const String keyShortcutsValue() const = 0;
1089 // This function checks if the object should be ignored when there's a modal dialog displayed.
1090 virtual bool isModalDescendant(Node*) const = 0;
1091 virtual bool isModalNode() const = 0;
1093 virtual bool supportsSetSize() const = 0;
1094 virtual bool supportsPosInSet() const = 0;
1095 virtual int setSize() const = 0;
1096 virtual int posInSet() const = 0;
1098 // ARIA drag and drop
1099 virtual bool supportsDropping() const = 0;
1100 virtual bool supportsDragging() const = 0;
1101 virtual bool isGrabbed() = 0;
1102 virtual void setARIAGrabbed(bool) = 0;
1103 virtual Vector<String> determineDropEffects() const = 0;
1105 // Called on the root AX object to return the deepest available element.
1106 virtual AXCoreObject* accessibilityHitTest(const IntPoint&) const = 0;
1107 // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
1108 virtual AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const = 0;
1110 virtual AXCoreObject* focusedUIElement() const = 0;
1112 virtual AXCoreObject* parentObject() const = 0;
1113 virtual AXCoreObject* parentObjectUnignored() const = 0;
1114 virtual AXCoreObject* parentObjectIfExists() const = 0;
1116 virtual void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) = 0;
1117 virtual bool isDescendantOfBarrenParent() const = 0;
1118 virtual bool isDescendantOfRole(AccessibilityRole) const = 0;
1120 virtual bool hasDocumentRoleAncestor() const = 0;
1121 virtual bool hasWebApplicationAncestor() const = 0;
1122 virtual bool isInDescriptionListDetail() const = 0;
1123 virtual bool isInDescriptionListTerm() const = 0;
1124 virtual bool isInCell() const = 0;
1126 // Text selection
1127 virtual Vector<SimpleRange> findTextRanges(const AccessibilitySearchTextCriteria&) const = 0;
1128 virtual Vector<String> performTextOperation(AccessibilityTextOperation const&) = 0;
1130 virtual AXCoreObject* observableObject() const = 0;
1131 virtual void linkedUIElements(AccessibilityChildrenVector&) const = 0;
1132 virtual AXCoreObject* titleUIElement() const = 0;
1133 virtual AXCoreObject* correspondingLabelForControlElement() const = 0;
1134 virtual AXCoreObject* correspondingControlForLabelElement() const = 0;
1135 virtual AXCoreObject* scrollBar(AccessibilityOrientation) = 0;
1137 virtual AccessibilityRole ariaRoleAttribute() const = 0;
1138 virtual bool isPresentationalChildOfAriaRole() const = 0;
1139 virtual bool ariaRoleHasPresentationalChildren() const = 0;
1140 virtual bool inheritsPresentationalRole() const = 0;
1142 using AXValue = std::variant<bool, unsigned, float, String, AccessibilityButtonState, AXCoreObject*>;
1143 AXValue value();
1145 // Accessibility Text
1146 virtual void accessibilityText(Vector<AccessibilityText>&) const = 0;
1147 // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
1148 virtual String computedLabel() = 0;
1150 // A programmatic way to set a name on an AccessibleObject.
1151 virtual void setAccessibleName(const AtomString&) = 0;
1152 virtual bool hasAttributesRequiredForInclusion() const = 0;
1154 // Accessibility Text - (To be deprecated).
1155 virtual String accessibilityDescription() const = 0;
1156 virtual String title() const = 0;
1157 virtual String helpText() const = 0;
1159 // Methods for determining accessibility text.
1160 virtual bool isARIAStaticText() const = 0;
1161 virtual String stringValue() const = 0;
1162 virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const = 0;
1163 virtual String text() const = 0;
1164 virtual int textLength() const = 0;
1165 virtual String ariaLabeledByAttribute() const = 0;
1166 virtual String ariaDescribedByAttribute() const = 0;
1167 virtual const String placeholderValue() const = 0;
1168 virtual bool accessibleNameDerivesFromContent() const = 0;
1170 // Abbreviations
1171 virtual String expandedTextValue() const = 0;
1172 virtual bool supportsExpandedTextValue() const = 0;
1174 virtual void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const = 0;
1176 // Only if isColorWell()
1177 virtual SRGBA<uint8_t> colorValue() const = 0;
1179 virtual AccessibilityRole roleValue() const = 0;
1180 // Non-localized string associated with the object role.
1181 virtual String rolePlatformString() const = 0;
1182 // Localized string that describes the object's role.
1183 virtual String roleDescription() const = 0;
1184 // Localized string that describes ARIA landmark roles.
1185 virtual String ariaLandmarkRoleDescription() const = 0;
1186 // Non-localized string associated with the object's subrole.
1187 virtual String subrolePlatformString() const = 0;
1189 virtual AXObjectCache* axObjectCache() const = 0;
1191 virtual Element* anchorElement() const = 0;
1192 virtual bool supportsPressAction() const = 0;
1193 virtual Element* actionElement() const = 0;
1194 virtual LayoutRect boundingBoxRect() const = 0;
1195 IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
1196 virtual LayoutRect elementRect() const = 0;
1197 LayoutSize size() const { return elementRect().size(); }
1198 virtual IntPoint clickPoint() = 0;
1199 virtual Path elementPath() const = 0;
1200 virtual bool supportsPath() const = 0;
1202 virtual TextIteratorBehaviors textIteratorBehaviorForTextRange() const = 0;
1203 virtual PlainTextRange selectedTextRange() const = 0;
1204 virtual int insertionPointLineNumber() const = 0;
1206 virtual URL url() const = 0;
1207 virtual VisibleSelection selection() const = 0;
1208 virtual String selectedText() const = 0;
1209 virtual String accessKey() const = 0;
1210 virtual String localizedActionVerb() const = 0;
1211 virtual String actionVerb() const = 0;
1213 // Widget support.
1214 virtual bool isWidget() const = 0;
1215 virtual Widget* widget() const = 0;
1216 virtual PlatformWidget platformWidget() const = 0;
1217 virtual Widget* widgetForAttachmentView() const = 0;
1219 #if PLATFORM(COCOA)
1220 virtual RemoteAXObjectRef remoteParentObject() const = 0;
1221 virtual FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const = 0;
1222 #endif
1223 virtual Page* page() const = 0;
1224 virtual Document* document() const = 0;
1225 virtual FrameView* documentFrameView() const = 0;
1226 virtual Frame* frame() const = 0;
1227 virtual Frame* mainFrame() const = 0;
1228 virtual Document* topDocument() const = 0;
1229 virtual ScrollView* scrollView() const = 0;
1230 virtual ScrollView* scrollViewAncestor() const = 0;
1231 virtual String language() const = 0;
1232 // 1-based, to match the aria-level spec.
1233 virtual unsigned hierarchicalLevel() const = 0;
1234 virtual bool isInlineText() const = 0;
1236 virtual void setFocused(bool) = 0;
1237 virtual void setSelectedText(const String&) = 0;
1238 virtual void setSelectedTextRange(const PlainTextRange&) = 0;
1239 virtual bool setValue(const String&) = 0;
1240 virtual bool replaceTextInRange(const String&, const PlainTextRange&) = 0;
1241 virtual bool insertText(const String&) = 0;
1243 virtual bool setValue(float) = 0;
1244 virtual void setSelected(bool) = 0;
1245 virtual void setSelectedRows(AccessibilityChildrenVector&) = 0;
1247 virtual void makeRangeVisible(const PlainTextRange&) = 0;
1248 virtual bool press() = 0;
1249 virtual bool performDefaultAction() = 0;
1250 virtual bool performDismissAction() { return false; }
1252 virtual AccessibilityOrientation orientation() const = 0;
1253 virtual void increment() = 0;
1254 virtual void decrement() = 0;
1256 virtual const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) = 0;
1257 Vector<AXID> childrenIDs(bool updateChildrenIfNecessary = true);
1258 virtual void updateChildrenIfNecessary() = 0;
1259 virtual void detachFromParent() = 0;
1260 virtual bool isDetachedFromParent() = 0;
1262 virtual bool canHaveSelectedChildren() const = 0;
1263 virtual void selectedChildren(AccessibilityChildrenVector&) = 0;
1264 virtual void setSelectedChildren(const AccessibilityChildrenVector&) = 0;
1265 virtual void visibleChildren(AccessibilityChildrenVector&) = 0;
1266 virtual void tabChildren(AccessibilityChildrenVector&) = 0;
1267 virtual bool shouldFocusActiveDescendant() const = 0;
1268 virtual AXCoreObject* activeDescendant() const = 0;
1269 virtual void handleActiveDescendantChanged() = 0;
1270 bool isDescendantOfObject(const AXCoreObject*) const;
1271 bool isAncestorOfObject(const AXCoreObject*) const;
1272 virtual AXCoreObject* firstAnonymousBlockChild() const = 0;
1274 virtual std::optional<String> attributeValue(const String&) const = 0;
1275 virtual bool hasTagName(const QualifiedName&) const = 0;
1276 virtual String tagName() const = 0;
1278 virtual VisiblePositionRange visiblePositionRange() const = 0;
1279 virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const = 0;
1280 virtual std::optional<SimpleRange> elementRange() const = 0;
1281 virtual VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const = 0;
1282 virtual VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const = 0;
1283 virtual VisiblePositionRange positionOfRightWord(const VisiblePosition&) const = 0;
1284 virtual VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const = 0;
1285 virtual VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const = 0;
1286 virtual VisiblePositionRange sentenceForPosition(const VisiblePosition&) const = 0;
1287 virtual VisiblePositionRange paragraphForPosition(const VisiblePosition&) const = 0;
1288 virtual VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const = 0;
1289 virtual VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const = 0;
1290 virtual VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const = 0;
1291 virtual VisiblePositionRange selectedVisiblePositionRange() const = 0;
1293 virtual std::optional<SimpleRange> rangeForPlainTextRange(const PlainTextRange&) const = 0;
1294 #if PLATFORM(MAC)
1295 // FIXME: make this a COCOA method.
1296 virtual AXTextMarkerRangeRef textMarkerRangeForNSRange(const NSRange&) const = 0;
1297 #endif
1299 virtual String stringForRange(const SimpleRange&) const = 0;
1300 virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const = 0;
1301 virtual IntRect boundsForRange(const SimpleRange&) const = 0;
1302 virtual int lengthForVisiblePositionRange(const VisiblePositionRange&) const = 0;
1303 virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const = 0;
1305 virtual VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const = 0;
1306 virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const = 0;
1307 virtual VisiblePosition nextVisiblePosition(const VisiblePosition&) const = 0;
1308 virtual VisiblePosition previousVisiblePosition(const VisiblePosition&) const = 0;
1309 virtual VisiblePosition nextWordEnd(const VisiblePosition&) const = 0;
1310 virtual VisiblePosition previousWordStart(const VisiblePosition&) const = 0;
1311 virtual VisiblePosition nextLineEndPosition(const VisiblePosition&) const = 0;
1312 virtual VisiblePosition previousLineStartPosition(const VisiblePosition&) const = 0;
1313 virtual VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const = 0;
1314 virtual VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const = 0;
1315 virtual VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const = 0;
1316 virtual VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const = 0;
1317 virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const = 0;
1319 virtual VisiblePosition visiblePositionForIndex(int) const = 0;
1320 virtual int indexForVisiblePosition(const VisiblePosition&) const = 0;
1322 virtual AXCoreObject* accessibilityObjectForPosition(const VisiblePosition&) const = 0;
1323 virtual int lineForPosition(const VisiblePosition&) const = 0;
1324 virtual PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const = 0;
1325 virtual int index(const VisiblePosition&) const = 0;
1327 virtual void lineBreaks(Vector<int>&) const = 0;
1328 virtual PlainTextRange doAXRangeForLine(unsigned) const = 0;
1329 virtual PlainTextRange doAXRangeForPosition(const IntPoint&) const = 0;
1330 virtual PlainTextRange doAXRangeForIndex(unsigned) const = 0;
1331 virtual PlainTextRange doAXStyleRangeForIndex(unsigned) const = 0;
1333 virtual String doAXStringForRange(const PlainTextRange&) const = 0;
1334 virtual IntRect doAXBoundsForRange(const PlainTextRange&) const = 0;
1335 virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const = 0;
1337 virtual unsigned doAXLineForIndex(unsigned) = 0;
1339 virtual String computedRoleString() const = 0;
1341 // MSAA
1342 virtual String stringValueForMSAA() const = 0;
1343 virtual String stringRoleForMSAA() const = 0;
1344 virtual String nameForMSAA() const = 0;
1345 virtual String descriptionForMSAA() const = 0;
1346 virtual AccessibilityRole roleValueForMSAA() const = 0;
1348 virtual String passwordFieldValue() const = 0;
1349 virtual bool isValueAutofilled() const = 0;
1350 virtual bool isValueAutofillAvailable() const = 0;
1351 virtual AutoFillButtonType valueAutofillButtonType() const = 0;
1352 virtual bool hasARIAValueNow() const = 0;
1354 // Used by an ARIA tree to get all its rows.
1355 virtual void ariaTreeRows(AccessibilityChildrenVector&) = 0;
1356 // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
1357 virtual AccessibilityChildrenVector ariaTreeItemContent() = 0;
1359 // ARIA live-region features.
1360 virtual bool supportsLiveRegion(bool excludeIfOff = true) const = 0;
1361 virtual bool isInsideLiveRegion(bool excludeIfOff = true) const = 0;
1362 virtual AXCoreObject* liveRegionAncestor(bool excludeIfOff = true) const = 0;
1363 virtual const String liveRegionStatus() const = 0;
1364 virtual const String liveRegionRelevant() const = 0;
1365 virtual bool liveRegionAtomic() const = 0;
1366 virtual bool isBusy() const = 0;
1368 virtual bool hasContentEditableAttributeSet() const = 0;
1370 virtual bool supportsReadOnly() const = 0;
1371 virtual String readOnlyValue() const = 0;
1373 virtual bool supportsAutoComplete() const = 0;
1374 virtual String autoCompleteValue() const = 0;
1376 virtual bool supportsARIAAttributes() const = 0;
1378 // CSS3 Speech properties.
1379 virtual OptionSet<SpeakAs> speakAsProperty() const = 0;
1381 // Make this object visible by scrolling as many nested scrollable views as needed.
1382 virtual void scrollToMakeVisible() const = 0;
1383 // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
1384 virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const = 0;
1385 // Scroll this object to a given point in global coordinates of the top-level window.
1386 virtual void scrollToGlobalPoint(const IntPoint&) const = 0;
1388 enum class ScrollByPageDirection { Up, Down, Left, Right };
1389 virtual bool scrollByPage(ScrollByPageDirection) const = 0;
1390 virtual IntPoint scrollPosition() const = 0;
1391 virtual AccessibilityChildrenVector contents() = 0;
1392 virtual IntSize scrollContentsSize() const = 0;
1393 virtual IntRect scrollVisibleContentRect() const = 0;
1394 virtual void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const = 0;
1396 // All math elements return true for isMathElement().
1397 virtual bool isMathElement() const = 0;
1398 virtual bool isMathFraction() const = 0;
1399 virtual bool isMathFenced() const = 0;
1400 virtual bool isMathSubscriptSuperscript() const = 0;
1401 virtual bool isMathRow() const = 0;
1402 virtual bool isMathUnderOver() const = 0;
1403 virtual bool isMathRoot() const = 0;
1404 virtual bool isMathSquareRoot() const = 0;
1405 virtual bool isMathText() const = 0;
1406 virtual bool isMathNumber() const = 0;
1407 virtual bool isMathOperator() const = 0;
1408 virtual bool isMathFenceOperator() const = 0;
1409 virtual bool isMathSeparatorOperator() const = 0;
1410 virtual bool isMathIdentifier() const = 0;
1411 virtual bool isMathTable() const = 0;
1412 virtual bool isMathTableRow() const = 0;
1413 virtual bool isMathTableCell() const = 0;
1414 virtual bool isMathMultiscript() const = 0;
1415 virtual bool isMathToken() const = 0;
1416 virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const = 0;
1417 virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const = 0;
1419 // Root components.
1420 virtual std::optional<AccessibilityChildrenVector> mathRadicand() = 0;
1421 virtual AXCoreObject* mathRootIndexObject() = 0;
1423 // Under over components.
1424 virtual AXCoreObject* mathUnderObject() = 0;
1425 virtual AXCoreObject* mathOverObject() = 0;
1427 // Fraction components.
1428 virtual AXCoreObject* mathNumeratorObject() = 0;
1429 virtual AXCoreObject* mathDenominatorObject() = 0;
1431 // Subscript/superscript components.
1432 virtual AXCoreObject* mathBaseObject() = 0;
1433 virtual AXCoreObject* mathSubscriptObject() = 0;
1434 virtual AXCoreObject* mathSuperscriptObject() = 0;
1436 // Fenced components.
1437 virtual String mathFencedOpenString() const = 0;
1438 virtual String mathFencedCloseString() const = 0;
1439 virtual int mathLineThickness() const = 0;
1440 virtual bool isAnonymousMathOperator() const = 0;
1442 // Multiscripts components.
1443 typedef std::pair<AXCoreObject*, AXCoreObject*> AccessibilityMathMultiscriptPair;
1444 typedef Vector<AccessibilityMathMultiscriptPair> AccessibilityMathMultiscriptPairs;
1445 virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) = 0;
1446 virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) = 0;
1448 // Visibility.
1449 virtual bool isAXHidden() const = 0;
1450 virtual bool isDOMHidden() const = 0;
1451 virtual bool isHidden() const = 0;
1453 #if ENABLE(ACCESSIBILITY)
1454 AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
1455 void setWrapper(AccessibilityObjectWrapper* wrapper) { m_wrapper = wrapper; }
1456 void detachWrapper(AccessibilityDetachmentType);
1457 #else
1458 AccessibilityObjectWrapper* wrapper() const { return nullptr; }
1459 void setWrapper(AccessibilityObjectWrapper*) { }
1460 void detachWrapper(AccessibilityDetachmentType) { }
1461 #endif
1463 virtual void overrideAttachmentParent(AXCoreObject* parent) = 0;
1465 // a platform-specific method for determining if an attachment is ignored
1466 virtual bool accessibilityIgnoreAttachment() const = 0;
1467 // gives platforms the opportunity to indicate if and how an object should be included
1468 virtual AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const = 0;
1470 #if PLATFORM(IOS_FAMILY)
1471 virtual int accessibilityPasswordFieldLength() = 0;
1472 virtual bool hasTouchEventListener() const = 0;
1473 virtual bool isInputTypePopupButton() const = 0;
1474 #endif
1476 // allows for an AccessibilityObject to update its render tree or perform
1477 // other operations update type operations
1478 virtual void updateBackingStore() = 0;
1480 #if PLATFORM(COCOA)
1481 virtual bool preventKeyboardDOMEventDispatch() const = 0;
1482 virtual void setPreventKeyboardDOMEventDispatch(bool) = 0;
1483 virtual bool fileUploadButtonReturnsValueInTitle() const = 0;
1484 virtual String speechHintAttributeValue() const = 0;
1485 virtual String descriptionAttributeValue() const = 0;
1486 virtual String helpTextAttributeValue() const = 0;
1487 // This should be the visible text that's actually on the screen if possible.
1488 // If there's alternative text, that can override the title.
1489 virtual String titleAttributeValue() const = 0;
1491 virtual bool hasApplePDFAnnotationAttribute() const = 0;
1492 #endif
1494 #if PLATFORM(MAC)
1495 virtual bool caretBrowsingEnabled() const = 0;
1496 virtual void setCaretBrowsingEnabled(bool) = 0;
1497 #endif
1499 virtual AXCoreObject* focusableAncestor() = 0;
1500 virtual AXCoreObject* editableAncestor() = 0;
1501 virtual AXCoreObject* highestEditableAncestor() = 0;
1503 virtual const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const = 0;
1504 virtual AXCoreObject* webAreaObject() const = 0;
1506 virtual void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData&) = 0;
1507 virtual void clearIsIgnoredFromParentData() = 0;
1508 virtual void setIsIgnoredFromParentDataForChild(AXCoreObject*) = 0;
1510 virtual PAL::SessionID sessionID() const = 0;
1511 virtual String documentURI() const = 0;
1512 virtual String documentEncoding() const = 0;
1513 virtual AccessibilityChildrenVector documentLinks() = 0;
1515 virtual String innerHTML() const = 0;
1516 virtual String outerHTML() const = 0;
1519 #if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
1520 virtual Vector<RetainPtr<id>> modelElementChildren() = 0;
1521 #endif
1523 private:
1524 // Detaches this object from the objects it references and it is referenced by.
1525 virtual void detachRemoteParts(AccessibilityDetachmentType) = 0;
1527 #if PLATFORM(COCOA)
1528 RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1529 #elif PLATFORM(WIN)
1530 COMPtr<AccessibilityObjectWrapper> m_wrapper;
1531 #elif USE(ATSPI)
1532 RefPtr<AccessibilityObjectAtspi> m_wrapper;
1533 #endif
1534 virtual void detachPlatformWrapper(AccessibilityDetachmentType) = 0;
1537 inline AXCoreObject::AXValue AXCoreObject::value()
1539 if (supportsRangeValue())
1540 return valueForRange();
1542 if (roleValue() == AccessibilityRole::SliderThumb)
1543 return parentObject()->valueForRange();
1545 if (isHeading())
1546 return headingLevel();
1548 if (supportsCheckedState())
1549 return checkboxOrRadioValue();
1551 // Radio groups return the selected radio button as the AXValue.
1552 if (isRadioGroup())
1553 return selectedRadioButton();
1555 if (isTabList())
1556 return selectedTabItem();
1558 if (isTabItem())
1559 return isSelected();
1561 if (isColorWell()) {
1562 auto color = convertColor<SRGBA<float>>(colorValue()).resolved();
1563 return makeString("rgb ", String::numberToStringFixedPrecision(color.red, 6, KeepTrailingZeros), " ", String::numberToStringFixedPrecision(color.green, 6, KeepTrailingZeros), " ", String::numberToStringFixedPrecision(color.blue, 6, KeepTrailingZeros), " 1");
1566 return stringValue();
1569 inline void AXCoreObject::detach(AccessibilityDetachmentType detachmentType)
1571 detachWrapper(detachmentType);
1572 if (detachmentType != AccessibilityDetachmentType::ElementChanged)
1573 detachRemoteParts(detachmentType);
1574 setObjectID({ });
1577 #if ENABLE(ACCESSIBILITY)
1578 inline void AXCoreObject::detachWrapper(AccessibilityDetachmentType detachmentType)
1580 detachPlatformWrapper(detachmentType);
1581 m_wrapper = nullptr;
1583 #endif
1585 inline Vector<AXID> AXCoreObject::childrenIDs(bool updateChildrenIfNecessary)
1587 return children(updateChildrenIfNecessary).map([] (auto& axObject) -> AXID {
1588 return axObject->objectID();
1592 namespace Accessibility {
1594 template<typename T, typename F>
1595 T* findAncestor(const T& object, bool includeSelf, const F& matches)
1597 T* parent;
1598 if (includeSelf)
1599 parent = const_cast<T*>(&object);
1600 else {
1601 auto* parentPtr = object.parentObject();
1602 if (!is<T>(parentPtr))
1603 return nullptr;
1604 parent = parentPtr;
1607 for (; parent; parent = parent->parentObject()) {
1608 if (matches(*parent))
1609 return parent;
1612 return nullptr;
1615 void findMatchingObjects(AccessibilitySearchCriteria const&, AXCoreObject::AccessibilityChildrenVector&);
1617 template<typename T, typename F>
1618 void enumerateAncestors(const T& object, bool includeSelf, const F& lambda)
1620 if (includeSelf)
1621 lambda(object);
1623 if (auto* parent = object.parentObject())
1624 enumerateAncestors(*parent, true, lambda);
1627 template<typename T, typename F>
1628 void enumerateDescendants(T& object, bool includeSelf, const F& lambda)
1630 if (includeSelf)
1631 lambda(object);
1633 for (const auto& child : object.children())
1634 enumerateDescendants(*child, true, lambda);
1637 template<typename U> inline void performFunctionOnMainThread(U&& lambda)
1639 callOnMainThreadAndWait([&lambda] {
1640 lambda();
1644 template<typename T, typename U> inline T retrieveValueFromMainThread(U&& lambda)
1646 T value;
1647 callOnMainThreadAndWait([&value, &lambda] {
1648 value = lambda();
1650 return value;
1653 #if PLATFORM(COCOA)
1654 template<typename T, typename U> inline T retrieveAutoreleasedValueFromMainThread(U&& lambda)
1656 RetainPtr<T> value;
1657 callOnMainThreadAndWait([&value, &lambda] {
1658 value = lambda();
1660 return value.autorelease();
1662 #endif
1664 } // namespace Accessibility
1666 inline bool AXCoreObject::isDescendantOfObject(const AXCoreObject* axObject) const
1668 return axObject && Accessibility::findAncestor<AXCoreObject>(*this, false, [axObject] (const AXCoreObject& object) {
1669 return &object == axObject;
1670 }) != nullptr;
1673 inline bool AXCoreObject::isAncestorOfObject(const AXCoreObject* axObject) const
1675 return axObject && (this == axObject || axObject->isDescendantOfObject(this));
1678 // Logging helpers.
1679 WTF::TextStream& operator<<(WTF::TextStream&, AccessibilityRole);
1680 WTF::TextStream& operator<<(WTF::TextStream&, AccessibilitySearchDirection);
1681 WTF::TextStream& operator<<(WTF::TextStream&, AccessibilitySearchKey);
1682 WTF::TextStream& operator<<(WTF::TextStream&, const AccessibilitySearchCriteria&);
1683 WTF::TextStream& operator<<(WTF::TextStream&, AccessibilityObjectInclusion);
1684 WTF::TextStream& operator<<(WTF::TextStream&, const AXCoreObject&);
1686 } // namespace WebCore