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