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