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