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