Fix accessibility/mac/aria-label-on-label-element.html after r224074
[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     virtual String stringValue() const { return String(); }
777     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); }
778     virtual String text() const { return String(); }
779     virtual int textLength() const { return 0; }
780     virtual String ariaLabeledByAttribute() const { return String(); }
781     virtual String ariaDescribedByAttribute() const { return String(); }
782     const AtomicString& placeholderValue() const;
783     bool accessibleNameDerivesFromContent() const;
784     
785     // Abbreviations
786     virtual String expandedTextValue() const { return String(); }
787     virtual bool supportsExpandedTextValue() const { return false; }
788     
789     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const;
790
791     // Only if isColorWell()
792     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
793
794     virtual AccessibilityRole roleValue() const { return m_role; }
795
796     virtual AXObjectCache* axObjectCache() const;
797     AXID axObjectID() const { return m_id; }
798     
799     static AccessibilityObject* anchorElementForNode(Node*);
800     static AccessibilityObject* headingElementForNode(Node*);
801     virtual Element* anchorElement() const { return nullptr; }
802     bool supportsPressAction() const;
803     virtual Element* actionElement() const { return nullptr; }
804     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
805     IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
806     virtual LayoutRect elementRect() const = 0;
807     LayoutSize size() const { return elementRect().size(); }
808     virtual IntPoint clickPoint();
809     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
810     virtual Path elementPath() const { return Path(); }
811     virtual bool supportsPath() const { return false; }
812     
813     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
814     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
815     unsigned selectionStart() const { return selectedTextRange().start; }
816     unsigned selectionEnd() const { return selectedTextRange().length; }
817     
818     virtual URL url() const { return URL(); }
819     virtual VisibleSelection selection() const { return VisibleSelection(); }
820     virtual String selectedText() const { return String(); }
821     virtual const AtomicString& accessKey() const { return nullAtom(); }
822     const String& actionVerb() const;
823     virtual Widget* widget() const { return nullptr; }
824     virtual Widget* widgetForAttachmentView() const { return nullptr; }
825     Page* page() const;
826     virtual Document* document() const;
827     virtual FrameView* documentFrameView() const;
828     Frame* frame() const;
829     MainFrame* mainFrame() const;
830     Document* topDocument() const;
831     ScrollView* scrollViewAncestor() const;
832     String language() const;
833     // 1-based, to match the aria-level spec.
834     virtual unsigned hierarchicalLevel() const { return 0; }
835     
836     virtual void setFocused(bool) { }
837     virtual void setSelectedText(const String&) { }
838     virtual void setSelectedTextRange(const PlainTextRange&) { }
839     virtual void setValue(const String&) { }
840     virtual void setValue(float) { }
841     virtual void setSelected(bool) { }
842     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
843     
844     virtual void makeRangeVisible(const PlainTextRange&) { }
845     virtual bool press();
846     bool performDefaultAction() { return press(); }
847     
848     virtual AccessibilityOrientation orientation() const;
849     virtual void increment() { }
850     virtual void decrement() { }
851
852     virtual void childrenChanged() { }
853     virtual void textChanged() { }
854     virtual void updateAccessibilityRole() { }
855     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true);
856     virtual void addChildren() { }
857     virtual void addChild(AccessibilityObject*);
858     virtual void insertChild(AccessibilityObject*, unsigned);
859
860     virtual bool shouldIgnoreAttributeRole() const { return false; }
861     
862     virtual bool canHaveChildren() const { return true; }
863     virtual bool hasChildren() const { return m_haveChildren; }
864     virtual void updateChildrenIfNecessary();
865     virtual void setNeedsToUpdateChildren() { }
866     virtual void setNeedsToUpdateSubtree() { }
867     virtual void clearChildren();
868     virtual bool needsToUpdateChildren() const { return false; }
869 #if PLATFORM(COCOA)
870     virtual void detachFromParent();
871 #else
872     virtual void detachFromParent() { }
873 #endif
874     virtual bool isDetachedFromParent() { return false; }
875
876     virtual bool canHaveSelectedChildren() const { return false; }
877     virtual void selectedChildren(AccessibilityChildrenVector&) { }
878     virtual void visibleChildren(AccessibilityChildrenVector&) { }
879     virtual void tabChildren(AccessibilityChildrenVector&) { }
880     virtual bool shouldFocusActiveDescendant() const { return false; }
881     virtual AccessibilityObject* activeDescendant() const { return nullptr; }
882     virtual void handleActiveDescendantChanged() { }
883     virtual void handleAriaExpandedChanged() { }
884     bool isDescendantOfObject(const AccessibilityObject*) const;
885     bool isAncestorOfObject(const AccessibilityObject*) const;
886     AccessibilityObject* firstAnonymousBlockChild() const;
887
888     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
889     bool hasAttribute(const QualifiedName&) const;
890     const AtomicString& getAttribute(const QualifiedName&) const;
891     bool hasTagName(const QualifiedName&) const;
892
893     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
894     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
895     
896     RefPtr<Range> elementRange() const;
897     static bool replacedNodeNeedsCharacter(Node* replacedNode);
898     
899     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
900     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
901     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
902     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
903     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
904     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
905     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
906     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
907     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
908     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
909     
910     RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const;
911
912     static String stringForVisiblePositionRange(const VisiblePositionRange&);
913     String stringForRange(RefPtr<Range>) const;
914     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
915     virtual IntRect boundsForRange(const RefPtr<Range>) const { return IntRect(); }
916     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
917     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
918
919     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
920     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
921     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
922     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
923     VisiblePosition nextWordEnd(const VisiblePosition&) const;
924     VisiblePosition previousWordStart(const VisiblePosition&) const;
925     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
926     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
927     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
928     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
929     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
930     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
931     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
932     
933     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
934     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
935
936     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
937     int lineForPosition(const VisiblePosition&) const;
938     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
939     virtual int index(const VisiblePosition&) const { return -1; }
940
941     virtual void lineBreaks(Vector<int>&) const { }
942     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
943     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
944     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
945     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
946
947     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
948     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
949     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const { return IntRect(); }
950     static String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
951
952     unsigned doAXLineForIndex(unsigned);
953
954     String computedRoleString() const;
955
956     virtual String stringValueForMSAA() const { return String(); }
957     virtual String stringRoleForMSAA() const { return String(); }
958     virtual String nameForMSAA() const { return String(); }
959     virtual String descriptionForMSAA() const { return String(); }
960     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
961
962     virtual String passwordFieldValue() const { return String(); }
963     bool isValueAutofilled() const;
964     bool isValueAutofillAvailable() const;
965     AutoFillButtonType valueAutofillButtonType() const;
966     
967     // Used by an ARIA tree to get all its rows.
968     void ariaTreeRows(AccessibilityChildrenVector&);
969     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
970     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
971     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
972     void ariaTreeItemContent(AccessibilityChildrenVector&);
973     
974     // ARIA live-region features.
975     bool supportsARIALiveRegion(bool excludeIfOff = true) const;
976     bool isInsideARIALiveRegion(bool excludeIfOff = true) const;
977     AccessibilityObject* ariaLiveRegionAncestor(bool excludeIfOff = true) const;
978     virtual const String ariaLiveRegionStatus() const { return String(); }
979     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom(); }
980     virtual bool ariaLiveRegionAtomic() const { return false; }
981     virtual bool isBusy() const { return false; }
982     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
983     static bool liveRegionStatusIsEnabled(const AtomicString&);
984     static bool contentEditableAttributeIsEnabled(Element*);
985     bool hasContentEditableAttributeSet() const;
986
987     bool supportsARIAReadOnly() const;
988     virtual String ariaReadOnlyValue() const;
989
990     bool supportsARIAAutoComplete() const;
991     String ariaAutoCompleteValue() const;
992     
993     bool supportsARIAAttributes() const;
994     
995     // CSS3 Speech properties.
996     virtual ESpeak speakProperty() const { return SpeakNormal; }
997
998     // Make this object visible by scrolling as many nested scrollable views as needed.
999     virtual void scrollToMakeVisible() const;
1000     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
1001     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
1002     // Scroll this object to a given point in global coordinates of the top-level window.
1003     virtual void scrollToGlobalPoint(const IntPoint&) const;
1004     
1005     enum class ScrollByPageDirection { Up, Down, Left, Right };
1006     bool scrollByPage(ScrollByPageDirection) const;
1007     IntPoint scrollPosition() const;
1008     IntSize scrollContentsSize() const;    
1009     IntRect scrollVisibleContentRect() const;
1010     
1011     bool lastKnownIsIgnoredValue();
1012     void setLastKnownIsIgnoredValue(bool);
1013
1014     // Fires a children changed notification on the parent if the isIgnored value changed.
1015     void notifyIfIgnoredValueChanged();
1016
1017     // All math elements return true for isMathElement().
1018     virtual bool isMathElement() const { return false; }
1019     virtual bool isMathFraction() const { return false; }
1020     virtual bool isMathFenced() const { return false; }
1021     virtual bool isMathSubscriptSuperscript() const { return false; }
1022     virtual bool isMathRow() const { return false; }
1023     virtual bool isMathUnderOver() const { return false; }
1024     virtual bool isMathRoot() const { return false; }
1025     virtual bool isMathSquareRoot() const { return false; }
1026     virtual bool isMathText() const { return false; }
1027     virtual bool isMathNumber() const { return false; }
1028     virtual bool isMathOperator() const { return false; }
1029     virtual bool isMathFenceOperator() const { return false; }
1030     virtual bool isMathSeparatorOperator() const { return false; }
1031     virtual bool isMathIdentifier() const { return false; }
1032     virtual bool isMathTable() const { return false; }
1033     virtual bool isMathTableRow() const { return false; }
1034     virtual bool isMathTableCell() const { return false; }
1035     virtual bool isMathMultiscript() const { return false; }
1036     virtual bool isMathToken() const { return false; }
1037     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const { return false; }
1038     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const { return false; }
1039
1040     // Root components.
1041     virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
1042     virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
1043     
1044     // Under over components.
1045     virtual AccessibilityObject* mathUnderObject() { return nullptr; }
1046     virtual AccessibilityObject* mathOverObject() { return nullptr; }
1047
1048     // Fraction components.
1049     virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
1050     virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
1051
1052     // Subscript/superscript components.
1053     virtual AccessibilityObject* mathBaseObject() { return nullptr; }
1054     virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
1055     virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
1056     
1057     // Fenced components.
1058     virtual String mathFencedOpenString() const { return String(); }
1059     virtual String mathFencedCloseString() const { return String(); }
1060     virtual int mathLineThickness() const { return 0; }
1061     virtual bool isAnonymousMathOperator() const { return false; }
1062     
1063     // Multiscripts components.
1064     typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
1065     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
1066     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
1067     
1068     // Visibility.
1069     bool isARIAHidden() const;
1070     bool isDOMHidden() const;
1071     bool isHidden() const { return isARIAHidden() || isDOMHidden(); }
1072     
1073 #if HAVE(ACCESSIBILITY)
1074 #if PLATFORM(GTK)
1075     AccessibilityObjectWrapper* wrapper() const;
1076     void setWrapper(AccessibilityObjectWrapper*);
1077 #else
1078     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
1079     void setWrapper(AccessibilityObjectWrapper* wrapper) 
1080     {
1081         m_wrapper = wrapper;
1082     }
1083 #endif
1084 #endif
1085     
1086 #if PLATFORM(COCOA)
1087     void overrideAttachmentParent(AccessibilityObject* parent);
1088 #else
1089     void overrideAttachmentParent(AccessibilityObject*) { }
1090 #endif
1091     
1092 #if HAVE(ACCESSIBILITY)
1093     // a platform-specific method for determining if an attachment is ignored
1094     bool accessibilityIgnoreAttachment() const;
1095     // gives platforms the opportunity to indicate if and how an object should be included
1096     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
1097 #else
1098     bool accessibilityIgnoreAttachment() const { return true; }
1099     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return AccessibilityObjectInclusion::DefaultBehavior; }
1100 #endif
1101
1102 #if PLATFORM(IOS)
1103     int accessibilityPasswordFieldLength();
1104     bool hasTouchEventListener() const;
1105     bool isInputTypePopupButton() const;
1106 #endif
1107     
1108     // allows for an AccessibilityObject to update its render tree or perform
1109     // other operations update type operations
1110     void updateBackingStore();
1111     
1112 #if PLATFORM(COCOA)
1113     bool preventKeyboardDOMEventDispatch() const;
1114     void setPreventKeyboardDOMEventDispatch(bool);
1115 #endif
1116     
1117 #if PLATFORM(COCOA) && !PLATFORM(IOS)
1118     bool caretBrowsingEnabled() const;
1119     void setCaretBrowsingEnabled(bool);
1120 #endif
1121
1122     AccessibilityObject* focusableAncestor();
1123     AccessibilityObject* editableAncestor();
1124     AccessibilityObject* highestEditableAncestor();
1125     
1126     static const AccessibilityObject* matchedParent(const AccessibilityObject&, bool includeSelf, const WTF::Function<bool(const AccessibilityObject&)>&);
1127     
1128     void clearIsIgnoredFromParentData() { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
1129     void setIsIgnoredFromParentDataForChild(AccessibilityObject*);
1130     
1131 protected:
1132     AXID m_id { 0 };
1133     AccessibilityChildrenVector m_children;
1134     mutable bool m_haveChildren { false };
1135     AccessibilityRole m_role { AccessibilityRole::Unknown };
1136     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
1137     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData { };
1138     bool m_childrenDirty { false };
1139     bool m_subtreeDirty { false };
1140
1141     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) { m_isIgnoredFromParentData = data; }
1142
1143     virtual bool computeAccessibilityIsIgnored() const { return true; }
1144
1145     // If this object itself scrolls, return its ScrollableArea.
1146     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
1147     virtual void scrollTo(const IntPoint&) const { }
1148     ScrollableArea* scrollableAreaAncestor() const;
1149     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
1150     
1151     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
1152     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1153     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1154     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
1155     virtual AccessibilityRole buttonRoleType() const;
1156     bool isOnscreen() const;
1157     bool dispatchTouchEvent();
1158
1159     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1160     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1161
1162     AccessibilityObject* radioGroupAncestor() const;
1163
1164 #if PLATFORM(GTK) && HAVE(ACCESSIBILITY)
1165     bool allowsTextRanges() const;
1166     unsigned getLengthForTextRange() const;
1167 #else
1168     bool allowsTextRanges() const { return isTextControl(); }
1169     unsigned getLengthForTextRange() const { return text().length(); }
1170 #endif
1171
1172 #if PLATFORM(COCOA)
1173     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1174 #elif PLATFORM(WIN)
1175     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1176 #elif PLATFORM(GTK)
1177     AtkObject* m_wrapper { nullptr };
1178 #elif PLATFORM(WPE)
1179     RefPtr<AccessibilityObjectWrapper> m_wrapper;
1180 #endif
1181 };
1182
1183 #if !HAVE(ACCESSIBILITY)
1184 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1185 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1186 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1187 inline void AccessibilityObject::updateBackingStore() { }
1188 #endif
1189
1190 } // namespace WebCore
1191
1192 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
1193 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
1194     static bool isType(const WebCore::AccessibilityObject& object) { return object.predicate; } \
1195 SPECIALIZE_TYPE_TRAITS_END()