AX: AOM: Implement boolean type 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 supportsARIASetSize() const;
712     bool supportsARIAPosInSet() const;
713     int ariaSetSize() const;
714     int ariaPosInSet() 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
900     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
901     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
902     
903     RefPtr<Range> elementRange() const;
904     static bool replacedNodeNeedsCharacter(Node* replacedNode);
905     
906     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
907     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
908     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
909     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
910     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
911     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
912     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
913     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
914     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
915     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
916     
917     RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const;
918
919     static String stringForVisiblePositionRange(const VisiblePositionRange&);
920     String stringForRange(RefPtr<Range>) const;
921     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
922     virtual IntRect boundsForRange(const RefPtr<Range>) const { return IntRect(); }
923     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
924     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
925
926     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
927     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
928     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
929     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
930     VisiblePosition nextWordEnd(const VisiblePosition&) const;
931     VisiblePosition previousWordStart(const VisiblePosition&) const;
932     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
933     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
934     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
935     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
936     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
937     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
938     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
939     
940     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
941     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
942
943     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
944     int lineForPosition(const VisiblePosition&) const;
945     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
946     virtual int index(const VisiblePosition&) const { return -1; }
947
948     virtual void lineBreaks(Vector<int>&) const { }
949     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
950     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
951     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
952     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
953
954     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
955     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
956     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const { return IntRect(); }
957     static String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
958
959     unsigned doAXLineForIndex(unsigned);
960
961     String computedRoleString() const;
962
963     virtual String stringValueForMSAA() const { return String(); }
964     virtual String stringRoleForMSAA() const { return String(); }
965     virtual String nameForMSAA() const { return String(); }
966     virtual String descriptionForMSAA() const { return String(); }
967     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
968
969     virtual String passwordFieldValue() const { return String(); }
970     bool isValueAutofilled() const;
971     bool isValueAutofillAvailable() const;
972     AutoFillButtonType valueAutofillButtonType() const;
973     
974     // Used by an ARIA tree to get all its rows.
975     void ariaTreeRows(AccessibilityChildrenVector&);
976     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
977     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
978     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
979     void ariaTreeItemContent(AccessibilityChildrenVector&);
980     
981     // ARIA live-region features.
982     bool supportsLiveRegion(bool excludeIfOff = true) const;
983     bool isInsideLiveRegion(bool excludeIfOff = true) const;
984     AccessibilityObject* liveRegionAncestor(bool excludeIfOff = true) const;
985     virtual const String liveRegionStatus() const { return String(); }
986     virtual const String liveRegionRelevant() const { return nullAtom(); }
987     virtual bool liveRegionAtomic() const { return false; }
988     virtual bool isBusy() const { return false; }
989     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
990     static bool liveRegionStatusIsEnabled(const AtomicString&);
991     static bool contentEditableAttributeIsEnabled(Element*);
992     bool hasContentEditableAttributeSet() const;
993
994     bool supportsReadOnly() const;
995     virtual String readOnlyValue() const;
996
997     bool supportsAutoComplete() const;
998     String autoCompleteValue() const;
999     
1000     bool supportsARIAAttributes() const;
1001     
1002     // CSS3 Speech properties.
1003     virtual ESpeak speakProperty() const { return SpeakNormal; }
1004
1005     // Make this object visible by scrolling as many nested scrollable views as needed.
1006     virtual void scrollToMakeVisible() const;
1007     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
1008     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
1009     // Scroll this object to a given point in global coordinates of the top-level window.
1010     virtual void scrollToGlobalPoint(const IntPoint&) const;
1011     
1012     enum class ScrollByPageDirection { Up, Down, Left, Right };
1013     bool scrollByPage(ScrollByPageDirection) const;
1014     IntPoint scrollPosition() const;
1015     IntSize scrollContentsSize() const;    
1016     IntRect scrollVisibleContentRect() const;
1017     
1018     bool lastKnownIsIgnoredValue();
1019     void setLastKnownIsIgnoredValue(bool);
1020
1021     // Fires a children changed notification on the parent if the isIgnored value changed.
1022     void notifyIfIgnoredValueChanged();
1023
1024     // All math elements return true for isMathElement().
1025     virtual bool isMathElement() const { return false; }
1026     virtual bool isMathFraction() const { return false; }
1027     virtual bool isMathFenced() const { return false; }
1028     virtual bool isMathSubscriptSuperscript() const { return false; }
1029     virtual bool isMathRow() const { return false; }
1030     virtual bool isMathUnderOver() const { return false; }
1031     virtual bool isMathRoot() const { return false; }
1032     virtual bool isMathSquareRoot() const { return false; }
1033     virtual bool isMathText() const { return false; }
1034     virtual bool isMathNumber() const { return false; }
1035     virtual bool isMathOperator() const { return false; }
1036     virtual bool isMathFenceOperator() const { return false; }
1037     virtual bool isMathSeparatorOperator() const { return false; }
1038     virtual bool isMathIdentifier() const { return false; }
1039     virtual bool isMathTable() const { return false; }
1040     virtual bool isMathTableRow() const { return false; }
1041     virtual bool isMathTableCell() const { return false; }
1042     virtual bool isMathMultiscript() const { return false; }
1043     virtual bool isMathToken() const { return false; }
1044     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const { return false; }
1045     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const { return false; }
1046
1047     // Root components.
1048     virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
1049     virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
1050     
1051     // Under over components.
1052     virtual AccessibilityObject* mathUnderObject() { return nullptr; }
1053     virtual AccessibilityObject* mathOverObject() { return nullptr; }
1054
1055     // Fraction components.
1056     virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
1057     virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
1058
1059     // Subscript/superscript components.
1060     virtual AccessibilityObject* mathBaseObject() { return nullptr; }
1061     virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
1062     virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
1063     
1064     // Fenced components.
1065     virtual String mathFencedOpenString() const { return String(); }
1066     virtual String mathFencedCloseString() const { return String(); }
1067     virtual int mathLineThickness() const { return 0; }
1068     virtual bool isAnonymousMathOperator() const { return false; }
1069     
1070     // Multiscripts components.
1071     typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
1072     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
1073     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
1074     
1075     // Visibility.
1076     bool isAXHidden() const;
1077     bool isDOMHidden() const;
1078     bool isHidden() const { return isAXHidden() || isDOMHidden(); }
1079     
1080 #if HAVE(ACCESSIBILITY)
1081 #if PLATFORM(GTK)
1082     AccessibilityObjectWrapper* wrapper() const;
1083     void setWrapper(AccessibilityObjectWrapper*);
1084 #else
1085     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
1086     void setWrapper(AccessibilityObjectWrapper* wrapper) 
1087     {
1088         m_wrapper = wrapper;
1089     }
1090 #endif
1091 #endif
1092     
1093 #if PLATFORM(COCOA)
1094     void overrideAttachmentParent(AccessibilityObject* parent);
1095 #else
1096     void overrideAttachmentParent(AccessibilityObject*) { }
1097 #endif
1098     
1099 #if HAVE(ACCESSIBILITY)
1100     // a platform-specific method for determining if an attachment is ignored
1101     bool accessibilityIgnoreAttachment() const;
1102     // gives platforms the opportunity to indicate if and how an object should be included
1103     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
1104 #else
1105     bool accessibilityIgnoreAttachment() const { return true; }
1106     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return AccessibilityObjectInclusion::DefaultBehavior; }
1107 #endif
1108
1109 #if PLATFORM(IOS)
1110     int accessibilityPasswordFieldLength();
1111     bool hasTouchEventListener() const;
1112     bool isInputTypePopupButton() const;
1113 #endif
1114     
1115     // allows for an AccessibilityObject to update its render tree or perform
1116     // other operations update type operations
1117     void updateBackingStore();
1118     
1119 #if PLATFORM(COCOA)
1120     bool preventKeyboardDOMEventDispatch() const;
1121     void setPreventKeyboardDOMEventDispatch(bool);
1122 #endif
1123     
1124 #if PLATFORM(COCOA) && !PLATFORM(IOS)
1125     bool caretBrowsingEnabled() const;
1126     void setCaretBrowsingEnabled(bool);
1127 #endif
1128
1129     AccessibilityObject* focusableAncestor();
1130     AccessibilityObject* editableAncestor();
1131     AccessibilityObject* highestEditableAncestor();
1132     
1133     static const AccessibilityObject* matchedParent(const AccessibilityObject&, bool includeSelf, const WTF::Function<bool(const AccessibilityObject&)>&);
1134     
1135     void clearIsIgnoredFromParentData() { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
1136     void setIsIgnoredFromParentDataForChild(AccessibilityObject*);
1137     
1138 protected:
1139     AXID m_id { 0 };
1140     AccessibilityChildrenVector m_children;
1141     mutable bool m_haveChildren { false };
1142     AccessibilityRole m_role { AccessibilityRole::Unknown };
1143     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
1144     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData { };
1145     bool m_childrenDirty { false };
1146     bool m_subtreeDirty { false };
1147
1148     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) { m_isIgnoredFromParentData = data; }
1149
1150     virtual bool computeAccessibilityIsIgnored() const { return true; }
1151
1152     // If this object itself scrolls, return its ScrollableArea.
1153     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
1154     virtual void scrollTo(const IntPoint&) const { }
1155     ScrollableArea* scrollableAreaAncestor() const;
1156     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
1157     
1158     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
1159     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1160     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1161     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
1162     virtual AccessibilityRole buttonRoleType() const;
1163     bool isOnscreen() const;
1164     bool dispatchTouchEvent();
1165
1166     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1167     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1168
1169     AccessibilityObject* radioGroupAncestor() const;
1170
1171 #if PLATFORM(GTK) && HAVE(ACCESSIBILITY)
1172     bool allowsTextRanges() const;
1173     unsigned getLengthForTextRange() const;
1174 #else
1175     bool allowsTextRanges() const { return isTextControl(); }
1176     unsigned getLengthForTextRange() const { return text().length(); }
1177 #endif
1178
1179 #if PLATFORM(COCOA)
1180     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1181 #elif PLATFORM(WIN)
1182     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1183 #elif PLATFORM(GTK)
1184     AtkObject* m_wrapper { nullptr };
1185 #elif PLATFORM(WPE)
1186     RefPtr<AccessibilityObjectWrapper> m_wrapper;
1187 #endif
1188 };
1189
1190 #if !HAVE(ACCESSIBILITY)
1191 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1192 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1193 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1194 inline void AccessibilityObject::updateBackingStore() { }
1195 #endif
1196
1197 } // namespace WebCore
1198
1199 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
1200 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
1201     static bool isType(const WebCore::AccessibilityObject& object) { return object.predicate; } \
1202 SPECIALIZE_TYPE_TRAITS_END()