204c98ae558f089b48a8229f73c14d0a1371779f
[WebKit-https.git] / Source / WebCore / accessibility / AccessibilityObjectInterface.h
1 /*
2  * Copyright (C) 2019 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "HTMLTextFormControlElement.h"
29 #include "LayoutRect.h"
30 #include "Range.h"
31 #include "TextIterator.h"
32 #include "TextIteratorBehavior.h"
33 #include "VisiblePosition.h"
34 #include "VisibleSelection.h"
35 #include <wtf/RefCounted.h>
36
37 #if PLATFORM(WIN)
38 #include "AccessibilityObjectWrapperWin.h"
39 #include "COMPtr.h"
40 #endif
41
42 #if PLATFORM(COCOA)
43 OBJC_CLASS WebAccessibilityObjectWrapper;
44 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
45 #elif USE(ATK)
46 typedef struct _WebKitAccessible WebKitAccessible;
47 typedef struct _WebKitAccessible AccessibilityObjectWrapper;
48 #else
49 class AccessibilityObjectWrapper;
50 #endif
51
52 namespace WebCore {
53
54 class Node;
55 class Element;
56 class RenderObject;
57 class QualifiedName;
58 class Path;
59 class Widget;
60 class Page;
61 class Document;
62 class Frame;
63 class FrameView;
64 class ScrollView;
65 class AXObjectCache;
66 class AXCoreObject;
67 class AccessibilityScrollView;
68 struct AccessibilityText;
69 struct ScrollRectToVisibleOptions;
70
71 typedef unsigned AXID;
72 extern const AXID InvalidAXID;
73
74 enum class AccessibilityRole {
75     Annotation = 1,
76     Application,
77     ApplicationAlert,
78     ApplicationAlertDialog,
79     ApplicationDialog,
80     ApplicationGroup,
81     ApplicationLog,
82     ApplicationMarquee,
83     ApplicationStatus,
84     ApplicationTextGroup,
85     ApplicationTimer,
86     Audio,
87     Blockquote,
88     Browser,
89     BusyIndicator,
90     Button,
91     Canvas,
92     Caption,
93     Cell,
94     CheckBox,
95     ColorWell,
96     Column,
97     ColumnHeader,
98     ComboBox,
99     Definition,
100     Deletion,
101     DescriptionList,
102     DescriptionListTerm,
103     DescriptionListDetail,
104     Details,
105     Directory,
106     DisclosureTriangle,
107     Div,
108     Document,
109     DocumentArticle,
110     DocumentMath,
111     DocumentNote,
112     Drawer,
113     EditableText,
114     Feed,
115     Figure,
116     Footer,
117     Footnote,
118     Form,
119     GraphicsDocument,
120     GraphicsObject,
121     GraphicsSymbol,
122     Grid,
123     GridCell,
124     Group,
125     GrowArea,
126     Heading,
127     HelpTag,
128     HorizontalRule,
129     Ignored,
130     Inline,
131     Image,
132     ImageMap,
133     ImageMapLink,
134     Incrementor,
135     Insertion,
136     Label,
137     LandmarkBanner,
138     LandmarkComplementary,
139     LandmarkContentInfo,
140     LandmarkDocRegion,
141     LandmarkMain,
142     LandmarkNavigation,
143     LandmarkRegion,
144     LandmarkSearch,
145     Legend,
146     Link,
147     List,
148     ListBox,
149     ListBoxOption,
150     ListItem,
151     ListMarker,
152     Mark,
153     MathElement,
154     Matte,
155     Menu,
156     MenuBar,
157     MenuButton,
158     MenuItem,
159     MenuItemCheckbox,
160     MenuItemRadio,
161     MenuListPopup,
162     MenuListOption,
163     Meter,
164     Outline,
165     Paragraph,
166     PopUpButton,
167     Pre,
168     Presentational,
169     ProgressIndicator,
170     RadioButton,
171     RadioGroup,
172     RowHeader,
173     Row,
174     RowGroup,
175     RubyBase,
176     RubyBlock,
177     RubyInline,
178     RubyRun,
179     RubyText,
180     Ruler,
181     RulerMarker,
182     ScrollArea,
183     ScrollBar,
184     SearchField,
185     Sheet,
186     Slider,
187     SliderThumb,
188     SpinButton,
189     SpinButtonPart,
190     SplitGroup,
191     Splitter,
192     StaticText,
193     Subscript,
194     Summary,
195     Superscript,
196     Switch,
197     SystemWide,
198     SVGRoot,
199     SVGText,
200     SVGTSpan,
201     SVGTextPath,
202     TabGroup,
203     TabList,
204     TabPanel,
205     Tab,
206     Table,
207     TableHeaderContainer,
208     TextArea,
209     TextGroup,
210     Term,
211     Time,
212     Tree,
213     TreeGrid,
214     TreeItem,
215     TextField,
216     ToggleButton,
217     Toolbar,
218     Unknown,
219     UserInterfaceTooltip,
220     ValueIndicator,
221     Video,
222     WebApplication,
223     WebArea,
224     WebCoreLink,
225     Window,
226 };
227
228 enum class AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed, ElementChange };
229
230 enum class AccessibilityConversionSpace { Screen, Page };
231
232 enum class AccessibilitySearchDirection {
233     Next = 1,
234     Previous,
235 };
236
237 enum class AccessibilityTextSource {
238     Alternative,
239     Children,
240     Summary,
241     Help,
242     Visible,
243     TitleTag,
244     Placeholder,
245     LabelByElement,
246     Title,
247     Subtitle,
248     Action,
249 };
250
251 enum class AccessibilitySearchKey {
252     AnyType = 1,
253     Article,
254     BlockquoteSameLevel,
255     Blockquote,
256     BoldFont,
257     Button,
258     CheckBox,
259     Control,
260     DifferentType,
261     FontChange,
262     FontColorChange,
263     Frame,
264     Graphic,
265     HeadingLevel1,
266     HeadingLevel2,
267     HeadingLevel3,
268     HeadingLevel4,
269     HeadingLevel5,
270     HeadingLevel6,
271     HeadingSameLevel,
272     Heading,
273     Highlighted,
274     ItalicFont,
275     KeyboardFocusable,
276     Landmark,
277     Link,
278     List,
279     LiveRegion,
280     MisspelledWord,
281     Outline,
282     PlainText,
283     RadioGroup,
284     SameType,
285     StaticText,
286     StyleChange,
287     TableSameLevel,
288     Table,
289     TextField,
290     Underline,
291     UnvisitedLink,
292     VisitedLink,
293 };
294
295 struct AccessibilitySearchCriteria {
296     AXCoreObject* anchorObject { nullptr };
297     AXCoreObject* startObject;
298     AccessibilitySearchDirection searchDirection;
299     Vector<AccessibilitySearchKey> searchKeys;
300     String searchText;
301     unsigned resultsLimit;
302     bool visibleOnly;
303     bool immediateDescendantsOnly;
304
305     AccessibilitySearchCriteria(AXCoreObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
306         : startObject(startObject)
307         , searchDirection(searchDirection)
308         , searchText(searchText)
309         , resultsLimit(resultsLimit)
310         , visibleOnly(visibleOnly)
311         , immediateDescendantsOnly(immediateDescendantsOnly)
312     { }
313 };
314
315 enum class AccessibilityObjectInclusion {
316     IncludeObject,
317     IgnoreObject,
318     DefaultBehavior,
319 };
320
321 enum class AccessibilityCurrentState { False, True, Page, Step, Location, Date, Time };
322
323 enum class AccessibilityButtonState {
324     Off = 0,
325     On,
326     Mixed,
327 };
328
329 enum class AccessibilitySortDirection {
330     None,
331     Ascending,
332     Descending,
333     Other,
334     Invalid,
335 };
336
337 enum class AccessibilitySearchTextStartFrom {
338     Begin, // Search from the beginning of the element.
339     Selection, // Search from the position of the current selection.
340     End // Search from the end of the element.
341 };
342
343 enum class AccessibilitySearchTextDirection {
344     Forward, // Occurrence after the starting range.
345     Backward, // Occurrence before the starting range.
346     Closest, // Closest occurrence to the starting range, whether after or before.
347     All // All occurrences
348 };
349
350 struct AccessibilitySearchTextCriteria {
351     Vector<String> searchStrings; // Text strings to search for.
352     AccessibilitySearchTextStartFrom start;
353     AccessibilitySearchTextDirection direction;
354
355     AccessibilitySearchTextCriteria()
356         : start(AccessibilitySearchTextStartFrom::Selection)
357         , direction(AccessibilitySearchTextDirection::Forward)
358     { }
359 };
360
361 enum class AccessibilityTextOperationType {
362     Select,
363     Replace,
364     Capitalize,
365     Lowercase,
366     Uppercase
367 };
368
369 struct AccessibilityTextOperation {
370     Vector<RefPtr<Range>> textRanges; // text on which perform the operation.
371     AccessibilityTextOperationType type;
372     String replacementText; // For type = replace.
373
374     AccessibilityTextOperation()
375         : type(AccessibilityTextOperationType::Select)
376     { }
377 };
378
379 enum class AccessibilityOrientation {
380     Vertical,
381     Horizontal,
382     Undefined,
383 };
384
385 struct AccessibilityTextUnderElementMode {
386     enum ChildrenInclusion {
387         TextUnderElementModeSkipIgnoredChildren,
388         TextUnderElementModeIncludeAllChildren,
389         TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
390     };
391
392     ChildrenInclusion childrenInclusion;
393     bool includeFocusableContent;
394     Node* ignoredChildNode;
395
396     AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
397         : childrenInclusion(c)
398         , includeFocusableContent(i)
399         , ignoredChildNode(ignored)
400     { }
401 };
402
403 #if PLATFORM(COCOA)
404 typedef struct _NSRange NSRange;
405 #endif
406
407 struct PlainTextRange {
408     unsigned start { 0 };
409     unsigned length { 0 };
410
411     PlainTextRange() = default;
412
413     PlainTextRange(unsigned s, unsigned l)
414         : start(s)
415         , length(l)
416     { }
417
418 #if PLATFORM(COCOA)
419     PlainTextRange(NSRange);
420 #endif
421
422     bool isNull() const { return !start && !length; }
423 };
424
425 enum class AccessibilityVisiblePositionForBounds {
426     First,
427     Last,
428 };
429
430 struct VisiblePositionRange {
431     VisiblePosition start;
432     VisiblePosition end;
433
434     VisiblePositionRange() = default;
435     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
436         : start(s)
437         , end(e)
438     { }
439
440     VisiblePositionRange(const VisibleSelection& selection)
441         : start(selection.start())
442         , end(selection.end())
443     { }
444
445     bool isNull() const { return start.isNull() || end.isNull(); }
446 };
447
448 enum class AccessibilityMathScriptObjectType { Subscript, Superscript };
449 enum class AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
450
451 // Use this struct to store the isIgnored data that depends on the parents, so that in addChildren()
452 // we avoid going up the parent chain for each element while traversing the tree with useful information already.
453 struct AccessibilityIsIgnoredFromParentData {
454     AXCoreObject* parent { nullptr };
455     bool isAXHidden { false };
456     bool isPresentationalChildOfAriaRole { false };
457     bool isDescendantOfBarrenParent { false };
458
459     AccessibilityIsIgnoredFromParentData(AXCoreObject* parent = nullptr)
460         : parent(parent)
461     { }
462
463     bool isNull() const { return !parent; }
464 };
465
466 class AXCoreObject : public ThreadSafeRefCounted<AXCoreObject> {
467 public:
468     virtual ~AXCoreObject() = default;
469
470     // After constructing an accessible object, it must be given a
471     // unique ID, then added to AXObjectCache, and finally init() must
472     // be called last.
473     virtual void setObjectID(AXID) = 0;
474     virtual AXID objectID() const = 0;
475     virtual void init() = 0;
476
477     // When the corresponding WebCore object that this accessible object
478     // represents is deleted, it must be detached.
479     void detach(AccessibilityDetachmentType);
480     virtual bool isDetached() const = 0;
481
482     typedef Vector<RefPtr<AXCoreObject>> AccessibilityChildrenVector;
483
484     virtual bool isAccessibilityObject() const = 0;
485     virtual bool isAccessibilityNodeObject() const = 0;
486     virtual bool isAccessibilityRenderObject() const = 0;
487     virtual bool isAccessibilityScrollbar() const = 0;
488     virtual bool isAccessibilityScrollView() const = 0;
489     virtual bool isAccessibilitySVGRoot() const = 0;
490     virtual bool isAccessibilitySVGElement() const = 0;
491     virtual bool isAccessibilityTableInstance() const = 0;
492     virtual bool isAccessibilityTableColumnInstance() const = 0;
493     virtual bool isAccessibilityProgressIndicatorInstance() const = 0;
494
495     virtual bool isAttachmentElement() const = 0;
496     virtual bool isHeading() const = 0;
497     virtual bool isLink() const = 0;
498     virtual bool isImage() const = 0;
499     bool isImageMap() const { return roleValue() == AccessibilityRole::ImageMap; }
500     virtual bool isNativeImage() const = 0;
501     virtual bool isImageButton() const = 0;
502     virtual bool isPasswordField() const = 0;
503     virtual bool isContainedByPasswordField() const = 0;
504     virtual AXCoreObject* passwordFieldOrContainingPasswordField() = 0;
505     virtual bool isNativeTextControl() const = 0;
506     virtual bool isSearchField() const = 0;
507     bool isWebArea() const { return roleValue() == AccessibilityRole::WebArea; }
508     bool isCheckbox() const { return roleValue() == AccessibilityRole::CheckBox; }
509     bool isRadioButton() const { return roleValue() == AccessibilityRole::RadioButton; }
510     bool isListBox() const { return roleValue() == AccessibilityRole::ListBox; }
511     virtual bool isNativeListBox() const = 0;
512     virtual bool isListBoxOption() const = 0;
513     virtual bool isAttachment() const = 0;
514     virtual bool isMediaTimeline() const = 0;
515     virtual bool isMenuRelated() const = 0;
516     virtual bool isMenu() const = 0;
517     virtual bool isMenuBar() const = 0;
518     virtual bool isMenuButton() const = 0;
519     virtual bool isMenuItem() const = 0;
520     virtual bool isFileUploadButton() const = 0;
521     virtual bool isInputImage() const = 0;
522     virtual bool isProgressIndicator() const = 0;
523     virtual bool isSlider() const = 0;
524     virtual bool isSliderThumb() const = 0;
525     virtual bool isInputSlider() const = 0;
526     virtual bool isControl() const = 0;
527     virtual bool isLabel() const = 0;
528     // lists support (l, ul, ol, dl)
529     virtual bool isList() const = 0;
530     virtual bool isUnorderedList() const = 0;
531     virtual bool isOrderedList() const = 0;
532     virtual bool isDescriptionList() const = 0;
533
534     // Table support.
535     virtual bool isTable() const = 0;
536     virtual bool isExposable() const = 0;
537     virtual bool isDataTable() const = 0;
538     virtual int tableLevel() const = 0;
539     virtual bool supportsSelectedRows() const = 0;
540     virtual AccessibilityChildrenVector columns() = 0;
541     virtual AccessibilityChildrenVector rows() = 0;
542     virtual unsigned columnCount() = 0;
543     virtual unsigned rowCount() = 0;
544     // All the cells in the table.
545     virtual AccessibilityChildrenVector cells() = 0;
546     virtual AXCoreObject* cellForColumnAndRow(unsigned column, unsigned row) = 0;
547     virtual AccessibilityChildrenVector columnHeaders() = 0;
548     virtual AccessibilityChildrenVector rowHeaders() = 0;
549     virtual AccessibilityChildrenVector visibleRows() = 0;
550     // Returns an object that contains, as children, all the objects that act as headers.
551     virtual AXCoreObject* headerContainer() = 0;
552     virtual int axColumnCount() const = 0;
553     virtual int axRowCount() const = 0;
554
555     // Table cell support.
556     virtual bool isTableCell() const = 0;
557     // Returns the start location and row span of the cell.
558     virtual std::pair<unsigned, unsigned> rowIndexRange() const = 0;
559     // Returns the start location and column span of the cell.
560     virtual std::pair<unsigned, unsigned> columnIndexRange() const = 0;
561     virtual int axColumnIndex() const = 0;
562     virtual int axRowIndex() const = 0;
563
564     virtual bool isTableRow() const = 0;
565
566     // Table column support.
567     virtual bool isTableColumn() const = 0;
568     virtual unsigned columnIndex() const = 0;
569     virtual AXCoreObject* columnHeader() = 0;
570
571     virtual bool isFieldset() const = 0;
572     virtual bool isGroup() const = 0;
573     virtual bool isARIATreeGridRow() const = 0;
574     virtual bool isImageMapLink() const = 0;
575     virtual bool isMenuList() const = 0;
576     virtual bool isMenuListPopup() const = 0;
577     virtual bool isMenuListOption() const = 0;
578
579     // Native spin buttons.
580     bool isSpinButton() const { return roleValue() == AccessibilityRole::SpinButton; }
581     virtual bool isNativeSpinButton() const = 0;
582     virtual AXCoreObject* incrementButton() = 0;
583     virtual AXCoreObject* decrementButton() = 0;
584     virtual bool isSpinButtonPart() const = 0;
585     virtual bool isIncrementor() const = 0;
586
587     virtual bool isMockObject() const = 0;
588     virtual bool isMediaObject() const = 0;
589     bool isSwitch() const { return roleValue() == AccessibilityRole::Switch; }
590     bool isToggleButton() const { return roleValue() == AccessibilityRole::ToggleButton; }
591     virtual bool isTextControl() const = 0;
592     virtual bool isARIATextControl() const = 0;
593     virtual bool isNonNativeTextControl() const = 0;
594     bool isTabList() const { return roleValue() == AccessibilityRole::TabList; }
595     bool isTabItem() const { return roleValue() == AccessibilityRole::Tab; }
596     bool isRadioGroup() const { return roleValue() == AccessibilityRole::RadioGroup; }
597     bool isComboBox() const { return roleValue() == AccessibilityRole::ComboBox; }
598     bool isTree() const { return roleValue() == AccessibilityRole::Tree; }
599     bool isTreeGrid() const { return roleValue() == AccessibilityRole::TreeGrid; }
600     bool isTreeItem() const { return roleValue() == AccessibilityRole::TreeItem; }
601     bool isScrollbar() const { return roleValue() == AccessibilityRole::ScrollBar; }
602     virtual bool isButton() const = 0;
603
604     bool isListItem() const { return roleValue() == AccessibilityRole::ListItem; }
605     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
606     bool isScrollView() const { return roleValue() == AccessibilityRole::ScrollArea; }
607     bool isCanvas() const { return roleValue() == AccessibilityRole::Canvas; }
608     bool isPopUpButton() const { return roleValue() == AccessibilityRole::PopUpButton; }
609     bool isColorWell() const { return roleValue() == AccessibilityRole::ColorWell; }
610     bool isSplitter() const { return roleValue() == AccessibilityRole::Splitter; }
611     bool isToolbar() const { return roleValue() == AccessibilityRole::Toolbar; }
612     bool isSummary() const { return roleValue() == AccessibilityRole::Summary; }
613
614     virtual bool isBlockquote() const = 0;
615     virtual bool isLandmark() const = 0;
616     virtual bool isRangeControl() const = 0;
617     virtual bool isMeter() const = 0;
618     virtual bool isStyleFormatGroup() const = 0;
619     virtual bool isFigureElement() const = 0;
620     virtual bool isKeyboardFocusable() const = 0;
621     virtual bool isOutput() const = 0;
622
623     virtual bool isChecked() const = 0;
624     virtual bool isEnabled() const = 0;
625     virtual bool isSelected() const = 0;
626     virtual bool isFocused() const = 0;
627     virtual bool isHovered() const = 0;
628     virtual bool isIndeterminate() const = 0;
629     virtual bool isLoaded() const = 0;
630     virtual bool isMultiSelectable() const = 0;
631     // FIXME should need just one since onscreen should be !offscreen.
632     virtual bool isOnScreen() const = 0;
633     virtual bool isOffScreen() const = 0;
634     virtual bool isPressed() const = 0;
635     virtual bool isUnvisited() const = 0;
636     virtual bool isVisited() const = 0;
637     virtual bool isRequired() const = 0;
638     virtual bool supportsRequiredAttribute() const = 0;
639     virtual bool isLinked() const = 0;
640     virtual bool isExpanded() const = 0;
641     virtual bool isVisible() const = 0;
642     virtual bool isCollapsed() const = 0;
643     virtual void setIsExpanded(bool) = 0;
644     virtual FloatRect relativeFrame() const = 0;
645     virtual FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const = 0;
646
647     // In a multi-select list, many items can be selected but only one is active at a time.
648     virtual bool isSelectedOptionActive() const = 0;
649
650     virtual bool hasBoldFont() const = 0;
651     virtual bool hasItalicFont() const = 0;
652     virtual bool hasMisspelling() const = 0;
653     virtual RefPtr<Range> getMisspellingRange(RefPtr<Range> const& start, AccessibilitySearchDirection) const = 0;
654     virtual bool hasPlainText() const = 0;
655     virtual bool hasSameFont(RenderObject*) const = 0;
656     virtual bool hasSameFontColor(RenderObject*) const = 0;
657     virtual bool hasSameStyle(RenderObject*) const = 0;
658     bool isStaticText() const { return roleValue() == AccessibilityRole::StaticText; }
659     virtual bool hasUnderline() const = 0;
660     virtual bool hasHighlighting() const = 0;
661
662     virtual bool supportsDatetimeAttribute() const = 0;
663     virtual String datetimeAttributeValue() const = 0;
664
665     virtual bool canSetFocusAttribute() const = 0;
666     virtual bool canSetTextRangeAttributes() const = 0;
667     virtual bool canSetValueAttribute() const = 0;
668     virtual bool canSetNumericValue() const = 0;
669     virtual bool canSetSelectedAttribute() const = 0;
670     virtual bool canSetSelectedChildrenAttribute() const = 0;
671     virtual bool canSetExpandedAttribute() const = 0;
672
673     virtual Element* element() const = 0;
674     virtual Node* node() const = 0;
675     virtual RenderObject* renderer() const = 0;
676
677     virtual bool accessibilityIsIgnored() const = 0;
678     virtual AccessibilityObjectInclusion defaultObjectInclusion() const = 0;
679     virtual bool accessibilityIsIgnoredByDefault() const = 0;
680
681     virtual bool isShowingValidationMessage() const = 0;
682     virtual String validationMessage() const = 0;
683
684     virtual unsigned blockquoteLevel() const = 0;
685     virtual int headingLevel() const = 0;
686     virtual AccessibilityButtonState checkboxOrRadioValue() const = 0;
687     virtual String valueDescription() const = 0;
688     virtual float valueForRange() const = 0;
689     virtual float maxValueForRange() const = 0;
690     virtual float minValueForRange() const = 0;
691     virtual float stepValueForRange() const = 0;
692     virtual AXCoreObject* selectedRadioButton() = 0;
693     virtual AXCoreObject* selectedTabItem() = 0;
694     virtual AXCoreObject* selectedListItem() = 0;
695     virtual int layoutCount() const = 0;
696     virtual double estimatedLoadingProgress() const = 0;
697
698     virtual bool supportsARIAOwns() const = 0;
699     virtual bool isActiveDescendantOfFocusedContainer() const = 0;
700     virtual void ariaActiveDescendantReferencingElements(AccessibilityChildrenVector&) const = 0;
701     virtual void ariaControlsElements(AccessibilityChildrenVector&) const = 0;
702     virtual void ariaControlsReferencingElements(AccessibilityChildrenVector&) const = 0;
703     virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const = 0;
704     virtual void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const = 0;
705     virtual void ariaDetailsElements(AccessibilityChildrenVector&) const = 0;
706     virtual void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const = 0;
707     virtual void ariaErrorMessageElements(AccessibilityChildrenVector&) const = 0;
708     virtual void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const = 0;
709     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const = 0;
710     virtual void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const = 0;
711     virtual void ariaLabelledByElements(AccessibilityChildrenVector&) const = 0;
712     virtual void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const = 0;
713     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const = 0;
714     virtual void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const = 0;
715
716     virtual bool hasPopup() const = 0;
717     virtual String popupValue() const = 0;
718     virtual bool hasDatalist() const = 0;
719     virtual bool supportsHasPopup() const = 0;
720     virtual bool pressedIsPresent() const = 0;
721     virtual bool ariaIsMultiline() const = 0;
722     virtual String invalidStatus() const = 0;
723     virtual bool supportsPressed() const = 0;
724     virtual bool supportsExpanded() const = 0;
725     virtual bool supportsChecked() const = 0;
726     virtual AccessibilitySortDirection sortDirection() const = 0;
727     virtual bool canvasHasFallbackContent() const = 0;
728     virtual bool supportsRangeValue() const = 0;
729     virtual String identifierAttribute() const = 0;
730     virtual String linkRelValue() const = 0;
731     virtual void classList(Vector<String>&) const = 0;
732     virtual AccessibilityCurrentState currentState() const = 0;
733     virtual String currentValue() const = 0;
734     virtual bool supportsCurrent() const = 0;
735     virtual const String keyShortcutsValue() const = 0;
736
737     // This function checks if the object should be ignored when there's a modal dialog displayed.
738     virtual bool ignoredFromModalPresence() const = 0;
739     virtual bool isModalDescendant(Node*) const = 0;
740     virtual bool isModalNode() const = 0;
741
742     virtual bool supportsSetSize() const = 0;
743     virtual bool supportsPosInSet() const = 0;
744     virtual int setSize() const = 0;
745     virtual int posInSet() const = 0;
746
747     // ARIA drag and drop
748     virtual bool supportsARIADropping() const = 0;
749     virtual bool supportsARIADragging() const = 0;
750     virtual bool isARIAGrabbed() = 0;
751     virtual void setARIAGrabbed(bool) = 0;
752     virtual Vector<String> determineARIADropEffects() = 0;
753
754     // Called on the root AX object to return the deepest available element.
755     virtual AXCoreObject* accessibilityHitTest(const IntPoint&) const = 0;
756     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
757     virtual AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const = 0;
758
759     virtual AXCoreObject* focusedUIElement() const = 0;
760
761     virtual AXCoreObject* firstChild() const = 0;
762     virtual AXCoreObject* lastChild() const = 0;
763     virtual AXCoreObject* previousSibling() const = 0;
764     virtual AXCoreObject* nextSibling() const = 0;
765     virtual AXCoreObject* nextSiblingUnignored(int limit) const = 0;
766     virtual AXCoreObject* previousSiblingUnignored(int limit) const = 0;
767     virtual AXCoreObject* parentObject() const = 0;
768     virtual AXCoreObject* parentObjectUnignored() const = 0;
769     virtual AXCoreObject* parentObjectIfExists() const = 0;
770     virtual void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) = 0;
771     virtual bool isDescendantOfBarrenParent() const = 0;
772     virtual bool isDescendantOfRole(AccessibilityRole) const = 0;
773
774     // Text selection
775     virtual Vector<RefPtr<Range>> findTextRanges(AccessibilitySearchTextCriteria const&) const = 0;
776     virtual Vector<String> performTextOperation(AccessibilityTextOperation const&) = 0;
777
778     virtual AXCoreObject* observableObject() const = 0;
779     virtual void linkedUIElements(AccessibilityChildrenVector&) const = 0;
780     virtual AXCoreObject* titleUIElement() const = 0;
781     virtual bool exposesTitleUIElement() const = 0;
782     virtual AXCoreObject* correspondingLabelForControlElement() const = 0;
783     virtual AXCoreObject* correspondingControlForLabelElement() const = 0;
784     virtual AXCoreObject* scrollBar(AccessibilityOrientation) = 0;
785
786     virtual AccessibilityRole ariaRoleAttribute() const = 0;
787     virtual bool isPresentationalChildOfAriaRole() const = 0;
788     virtual bool ariaRoleHasPresentationalChildren() const = 0;
789     virtual bool inheritsPresentationalRole() const = 0;
790
791     // Accessibility Text
792     virtual void accessibilityText(Vector<AccessibilityText>&) const = 0;
793     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
794     virtual String computedLabel() = 0;
795
796     // A programmatic way to set a name on an AccessibleObject.
797     virtual void setAccessibleName(const AtomString&) = 0;
798     virtual bool hasAttributesRequiredForInclusion() const = 0;
799
800     // Accessibility Text - (To be deprecated).
801     virtual String accessibilityDescription() const = 0;
802     virtual String title() const = 0;
803     virtual String helpText() const = 0;
804     bool containsText(String const& text) const
805     {
806         // If text is empty we return true.
807         return text.isEmpty()
808             || findPlainText(title(), text, CaseInsensitive)
809             || findPlainText(accessibilityDescription(), text, CaseInsensitive)
810             || findPlainText(stringValue(), text, CaseInsensitive);
811     }
812
813     // Methods for determining accessibility text.
814     virtual bool isARIAStaticText() const = 0;
815     virtual String stringValue() const = 0;
816     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const = 0;
817     virtual String text() const = 0;
818     virtual int textLength() const = 0;
819     virtual String ariaLabeledByAttribute() const = 0;
820     virtual String ariaDescribedByAttribute() const = 0;
821     virtual const String placeholderValue() const = 0;
822     virtual bool accessibleNameDerivesFromContent() const = 0;
823
824     // Abbreviations
825     virtual String expandedTextValue() const = 0;
826     virtual bool supportsExpandedTextValue() const = 0;
827
828     virtual void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const = 0;
829
830     // Only if isColorWell()
831     virtual void colorValue(int& r, int& g, int& b) const = 0;
832
833     virtual AccessibilityRole roleValue() const = 0;
834     // Non-localized string associated with the object role.
835     virtual String rolePlatformString() const = 0;
836     // Localized string that describes the object's role.
837     virtual String roleDescription() const = 0;
838     // Localized string that describes ARIA landmark roles.
839     virtual String ariaLandmarkRoleDescription() const = 0;
840
841     virtual AXObjectCache* axObjectCache() const = 0;
842
843     virtual Element* anchorElement() const = 0;
844     virtual bool supportsPressAction() const = 0;
845     virtual Element* actionElement() const = 0;
846     virtual LayoutRect boundingBoxRect() const = 0;
847     IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
848     virtual LayoutRect elementRect() const = 0;
849     LayoutSize size() const { return elementRect().size(); }
850     virtual IntPoint clickPoint() = 0;
851     virtual Path elementPath() const = 0;
852     virtual bool supportsPath() const = 0;
853
854     virtual TextIteratorBehavior textIteratorBehaviorForTextRange() const = 0;
855     virtual PlainTextRange selectedTextRange() const = 0;
856     virtual unsigned selectionStart() const = 0;
857     virtual unsigned selectionEnd() const = 0;
858
859     virtual URL url() const = 0;
860     virtual VisibleSelection selection() const = 0;
861     virtual String selectedText() const = 0;
862     virtual String accessKey() const = 0;
863     virtual String actionVerb() const = 0;
864     virtual Widget* widget() const = 0;
865     virtual Widget* widgetForAttachmentView() const = 0;
866     virtual Page* page() const = 0;
867     virtual Document* document() const = 0;
868     virtual FrameView* documentFrameView() const = 0;
869     virtual Frame* frame() const = 0;
870     virtual Frame* mainFrame() const = 0;
871     virtual Document* topDocument() const = 0;
872     virtual ScrollView* scrollViewAncestor() const = 0;
873     virtual String language() const = 0;
874     // 1-based, to match the aria-level spec.
875     virtual unsigned hierarchicalLevel() const = 0;
876     virtual bool isInlineText() const = 0;
877     
878     virtual void setFocused(bool) = 0;
879     virtual void setSelectedText(const String&) = 0;
880     virtual void setSelectedTextRange(const PlainTextRange&) = 0;
881     virtual void setValue(const String&) = 0;
882     virtual bool replaceTextInRange(const String&, const PlainTextRange&) = 0;
883     virtual bool insertText(const String&) = 0;
884
885     virtual void setValue(float) = 0;
886     virtual void setSelected(bool) = 0;
887     virtual void setSelectedRows(AccessibilityChildrenVector&) = 0;
888
889     virtual void makeRangeVisible(const PlainTextRange&) = 0;
890     virtual bool press() = 0;
891     virtual bool performDefaultAction() = 0;
892
893     virtual AccessibilityOrientation orientation() const = 0;
894     virtual void increment() = 0;
895     virtual void decrement() = 0;
896
897     virtual void childrenChanged() = 0;
898     virtual void textChanged() = 0;
899     virtual void updateAccessibilityRole() = 0;
900     virtual const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) = 0;
901     virtual void addChildren() = 0;
902     virtual void addChild(AXCoreObject*) = 0;
903     virtual void insertChild(AXCoreObject*, unsigned) = 0;
904
905     virtual bool shouldIgnoreAttributeRole() const = 0;
906
907     virtual bool canHaveChildren() const = 0;
908     virtual bool hasChildren() const = 0;
909     virtual void updateChildrenIfNecessary() = 0;
910     virtual void setNeedsToUpdateChildren() = 0;
911     virtual void setNeedsToUpdateSubtree() = 0;
912     virtual void clearChildren() = 0;
913     virtual bool needsToUpdateChildren() const = 0;
914     virtual void detachFromParent() = 0;
915     virtual bool isDetachedFromParent() = 0;
916
917     virtual bool canHaveSelectedChildren() const = 0;
918     virtual void selectedChildren(AccessibilityChildrenVector&) = 0;
919     virtual void visibleChildren(AccessibilityChildrenVector&) = 0;
920     virtual void tabChildren(AccessibilityChildrenVector&) = 0;
921     virtual bool shouldFocusActiveDescendant() const = 0;
922     virtual AXCoreObject* activeDescendant() const = 0;
923     virtual void handleActiveDescendantChanged() = 0;
924     virtual void handleAriaExpandedChanged() = 0;
925     bool isDescendantOfObject(const AXCoreObject*) const;
926     bool isAncestorOfObject(const AXCoreObject*) const;
927     virtual AXCoreObject* firstAnonymousBlockChild() const = 0;
928
929     virtual bool hasAttribute(const QualifiedName&) const = 0;
930     virtual const AtomString& getAttribute(const QualifiedName&) const = 0;
931     virtual bool hasTagName(const QualifiedName&) const = 0;
932     virtual String tagName() const = 0;
933
934     virtual VisiblePositionRange visiblePositionRange() const = 0;
935     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const = 0;
936     virtual RefPtr<Range> elementRange() const = 0;
937     virtual VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const = 0;
938     virtual VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const = 0;
939     virtual VisiblePositionRange positionOfRightWord(const VisiblePosition&) const = 0;
940     virtual VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const = 0;
941     virtual VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const = 0;
942     virtual VisiblePositionRange sentenceForPosition(const VisiblePosition&) const = 0;
943     virtual VisiblePositionRange paragraphForPosition(const VisiblePosition&) const = 0;
944     virtual VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const = 0;
945     virtual VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const = 0;
946     virtual VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const = 0;
947
948     virtual RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const = 0;
949
950     virtual String stringForRange(RefPtr<Range>) const = 0;
951     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const = 0;
952     virtual IntRect boundsForRange(const RefPtr<Range>) const = 0;
953     virtual int lengthForVisiblePositionRange(const VisiblePositionRange&) const = 0;
954     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const = 0;
955
956     virtual VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const = 0;
957     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const = 0;
958     virtual VisiblePosition nextVisiblePosition(const VisiblePosition&) const = 0;
959     virtual VisiblePosition previousVisiblePosition(const VisiblePosition&) const = 0;
960     virtual VisiblePosition nextWordEnd(const VisiblePosition&) const = 0;
961     virtual VisiblePosition previousWordStart(const VisiblePosition&) const = 0;
962     virtual VisiblePosition nextLineEndPosition(const VisiblePosition&) const = 0;
963     virtual VisiblePosition previousLineStartPosition(const VisiblePosition&) const = 0;
964     virtual VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const = 0;
965     virtual VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const = 0;
966     virtual VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const = 0;
967     virtual VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const = 0;
968     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const = 0;
969
970     virtual VisiblePosition visiblePositionForIndex(int) const = 0;
971     virtual int indexForVisiblePosition(const VisiblePosition&) const = 0;
972
973     virtual AXCoreObject* accessibilityObjectForPosition(const VisiblePosition&) const = 0;
974     virtual int lineForPosition(const VisiblePosition&) const = 0;
975     virtual PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const = 0;
976     virtual int index(const VisiblePosition&) const = 0;
977
978     virtual void lineBreaks(Vector<int>&) const = 0;
979     virtual PlainTextRange doAXRangeForLine(unsigned) const = 0;
980     virtual PlainTextRange doAXRangeForPosition(const IntPoint&) const = 0;
981     virtual PlainTextRange doAXRangeForIndex(unsigned) const = 0;
982     virtual PlainTextRange doAXStyleRangeForIndex(unsigned) const = 0;
983
984     virtual String doAXStringForRange(const PlainTextRange&) const = 0;
985     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const = 0;
986     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const = 0;
987
988     virtual unsigned doAXLineForIndex(unsigned) = 0;
989
990     virtual String computedRoleString() const = 0;
991
992     // MSAA
993     virtual String stringValueForMSAA() const = 0;
994     virtual String stringRoleForMSAA() const = 0;
995     virtual String nameForMSAA() const = 0;
996     virtual String descriptionForMSAA() const = 0;
997     virtual AccessibilityRole roleValueForMSAA() const = 0;
998
999     virtual String passwordFieldValue() const = 0;
1000     virtual bool isValueAutofilled() const = 0;
1001     virtual bool isValueAutofillAvailable() const = 0;
1002     virtual AutoFillButtonType valueAutofillButtonType() const = 0;
1003     virtual bool hasARIAValueNow() const = 0;
1004
1005     // Used by an ARIA tree to get all its rows.
1006     virtual void ariaTreeRows(AccessibilityChildrenVector&) = 0;
1007     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
1008     virtual void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&) = 0;
1009     // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
1010     virtual void ariaTreeItemContent(AccessibilityChildrenVector&) = 0;
1011
1012     // ARIA live-region features.
1013     virtual bool supportsLiveRegion(bool excludeIfOff = true) const = 0;
1014     virtual bool isInsideLiveRegion(bool excludeIfOff = true) const = 0;
1015     virtual AXCoreObject* liveRegionAncestor(bool excludeIfOff = true) const = 0;
1016     virtual const String liveRegionStatus() const = 0;
1017     virtual const String liveRegionRelevant() const = 0;
1018     virtual bool liveRegionAtomic() const = 0;
1019     virtual bool isBusy() const = 0;
1020
1021     virtual bool hasContentEditableAttributeSet() const = 0;
1022
1023     virtual bool supportsReadOnly() const = 0;
1024     virtual String readOnlyValue() const = 0;
1025
1026     virtual bool supportsAutoComplete() const = 0;
1027     virtual String autoCompleteValue() const = 0;
1028
1029     virtual bool supportsARIAAttributes() const = 0;
1030
1031     // CSS3 Speech properties.
1032     virtual OptionSet<SpeakAs> speakAsProperty() const = 0;
1033
1034     // Make this object visible by scrolling as many nested scrollable views as needed.
1035     virtual void scrollToMakeVisible() const = 0;
1036     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
1037     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const = 0;
1038     // Scroll this object to a given point in global coordinates of the top-level window.
1039     virtual void scrollToGlobalPoint(const IntPoint&) const = 0;
1040
1041     enum class ScrollByPageDirection { Up, Down, Left, Right };
1042     virtual bool scrollByPage(ScrollByPageDirection) const = 0;
1043     virtual IntPoint scrollPosition() const = 0;
1044     virtual IntSize scrollContentsSize() const = 0;
1045     virtual IntRect scrollVisibleContentRect() const = 0;
1046     virtual void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const = 0;
1047
1048     virtual bool lastKnownIsIgnoredValue() = 0;
1049     virtual void setLastKnownIsIgnoredValue(bool) = 0;
1050
1051     // Fires a children changed notification on the parent if the isIgnored value changed.
1052     virtual void notifyIfIgnoredValueChanged() = 0;
1053
1054     // All math elements return true for isMathElement().
1055     virtual bool isMathElement() const = 0;
1056     virtual bool isMathFraction() const = 0;
1057     virtual bool isMathFenced() const = 0;
1058     virtual bool isMathSubscriptSuperscript() const = 0;
1059     virtual bool isMathRow() const = 0;
1060     virtual bool isMathUnderOver() const = 0;
1061     virtual bool isMathRoot() const = 0;
1062     virtual bool isMathSquareRoot() const = 0;
1063     virtual bool isMathText() const = 0;
1064     virtual bool isMathNumber() const = 0;
1065     virtual bool isMathOperator() const = 0;
1066     virtual bool isMathFenceOperator() const = 0;
1067     virtual bool isMathSeparatorOperator() const = 0;
1068     virtual bool isMathIdentifier() const = 0;
1069     virtual bool isMathTable() const = 0;
1070     virtual bool isMathTableRow() const = 0;
1071     virtual bool isMathTableCell() const = 0;
1072     virtual bool isMathMultiscript() const = 0;
1073     virtual bool isMathToken() const = 0;
1074     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const = 0;
1075     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const = 0;
1076
1077     // Root components.
1078     virtual AXCoreObject* mathRadicandObject() = 0;
1079     virtual AXCoreObject* mathRootIndexObject() = 0;
1080
1081     // Under over components.
1082     virtual AXCoreObject* mathUnderObject() = 0;
1083     virtual AXCoreObject* mathOverObject() = 0;
1084
1085     // Fraction components.
1086     virtual AXCoreObject* mathNumeratorObject() = 0;
1087     virtual AXCoreObject* mathDenominatorObject() = 0;
1088
1089     // Subscript/superscript components.
1090     virtual AXCoreObject* mathBaseObject() = 0;
1091     virtual AXCoreObject* mathSubscriptObject() = 0;
1092     virtual AXCoreObject* mathSuperscriptObject() = 0;
1093
1094     // Fenced components.
1095     virtual String mathFencedOpenString() const = 0;
1096     virtual String mathFencedCloseString() const = 0;
1097     virtual int mathLineThickness() const = 0;
1098     virtual bool isAnonymousMathOperator() const = 0;
1099
1100     // Multiscripts components.
1101     typedef std::pair<AXCoreObject*, AXCoreObject*> AccessibilityMathMultiscriptPair;
1102     typedef Vector<AccessibilityMathMultiscriptPair> AccessibilityMathMultiscriptPairs;
1103     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) = 0;
1104     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) = 0;
1105
1106     // Visibility.
1107     virtual bool isAXHidden() const = 0;
1108     virtual bool isDOMHidden() const = 0;
1109     virtual bool isHidden() const = 0;
1110
1111 #if ENABLE(ACCESSIBILITY)
1112     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
1113     void setWrapper(AccessibilityObjectWrapper* wrapper) { m_wrapper = wrapper; }
1114     void detachWrapper(AccessibilityDetachmentType);
1115 #else
1116     AccessibilityObjectWrapper* wrapper() const { return nullptr; }
1117     void setWrapper(AccessibilityObjectWrapper*) { }
1118     void detachWrapper(AccessibilityDetachmentType) { }
1119 #endif
1120
1121     virtual void overrideAttachmentParent(AXCoreObject* parent) = 0;
1122
1123     // a platform-specific method for determining if an attachment is ignored
1124     virtual bool accessibilityIgnoreAttachment() const = 0;
1125     // gives platforms the opportunity to indicate if and how an object should be included
1126     virtual AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const = 0;
1127
1128 #if PLATFORM(IOS_FAMILY)
1129     virtual int accessibilityPasswordFieldLength() = 0;
1130     virtual bool hasTouchEventListener() const = 0;
1131     virtual bool isInputTypePopupButton() const = 0;
1132 #endif
1133
1134     // allows for an AccessibilityObject to update its render tree or perform
1135     // other operations update type operations
1136     virtual void updateBackingStore() = 0;
1137
1138 #if PLATFORM(COCOA)
1139     virtual bool preventKeyboardDOMEventDispatch() const = 0;
1140     virtual void setPreventKeyboardDOMEventDispatch(bool) = 0;
1141     virtual bool fileUploadButtonReturnsValueInTitle() const = 0;
1142     virtual String speechHintAttributeValue() const = 0;
1143     virtual String descriptionAttributeValue() const = 0;
1144     virtual String helpTextAttributeValue() const = 0;
1145     virtual String titleAttributeValue() const = 0;
1146     virtual bool hasApplePDFAnnotationAttribute() const = 0;
1147 #endif
1148
1149 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY)
1150     virtual bool caretBrowsingEnabled() const = 0;
1151     virtual void setCaretBrowsingEnabled(bool) = 0;
1152 #endif
1153
1154     virtual AXCoreObject* focusableAncestor() = 0;
1155     virtual AXCoreObject* editableAncestor() = 0;
1156     virtual AXCoreObject* highestEditableAncestor() = 0;
1157
1158     virtual const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const = 0;
1159
1160     virtual void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData&) = 0;
1161     virtual void clearIsIgnoredFromParentData() = 0;
1162     virtual void setIsIgnoredFromParentDataForChild(AXCoreObject*) = 0;
1163     
1164     virtual uint64_t sessionID() const = 0;
1165     virtual String documentURI() const = 0;
1166     virtual String documentEncoding() const = 0;
1167 private:
1168     // Detaches this object from the objects it references and it is referenced by.
1169     virtual void detachRemoteParts(AccessibilityDetachmentType) = 0;
1170
1171 #if PLATFORM(COCOA)
1172     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1173 #elif PLATFORM(WIN)
1174     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1175 #elif USE(ATK)
1176     GRefPtr<WebKitAccessible> m_wrapper;
1177 #endif
1178     virtual void detachPlatformWrapper(AccessibilityDetachmentType) = 0;
1179 };
1180
1181 inline void AXCoreObject::detach(AccessibilityDetachmentType detachmentType)
1182 {
1183     detachWrapper(detachmentType);
1184     detachRemoteParts(detachmentType);
1185     setObjectID(InvalidAXID);
1186 }
1187
1188 #if ENABLE(ACCESSIBILITY)
1189 inline void AXCoreObject::detachWrapper(AccessibilityDetachmentType detachmentType)
1190 {
1191     detachPlatformWrapper(detachmentType);
1192     m_wrapper = nullptr;
1193 }
1194 #endif
1195
1196 namespace Accessibility {
1197
1198 template<typename T, typename F>
1199 T* findAncestor(const T& object, bool includeSelf, const F& matches)
1200 {
1201     T* parent;
1202     if (includeSelf)
1203         parent = const_cast<T*>(&object);
1204     else {
1205         auto* parentPtr = object.parentObject();
1206         if (!is<T>(parentPtr))
1207             return nullptr;
1208         parent = parentPtr;
1209     }
1210
1211     for (; parent; parent = parent->parentObject()) {
1212         if (matches(*parent))
1213             return parent;
1214     }
1215
1216     return nullptr;
1217 }
1218
1219 void findMatchingObjects(AccessibilitySearchCriteria const&, AXCoreObject::AccessibilityChildrenVector&);
1220
1221 template<typename U> inline void performFunctionOnMainThread(U&& lambda)
1222 {
1223     if (isMainThread())
1224         return lambda();
1225
1226     callOnMainThread([&lambda] {
1227         lambda();
1228     });
1229 }
1230
1231 template<typename T, typename U> inline T retrieveValueFromMainThread(U&& lambda)
1232 {
1233     if (isMainThread())
1234         return lambda();
1235
1236     T value;
1237     callOnMainThreadAndWait([&value, &lambda] {
1238         value = lambda();
1239     });
1240     return value;
1241 }
1242
1243 #if PLATFORM(COCOA)
1244 template<typename T, typename U> inline T retrieveAutoreleasedValueFromMainThread(U&& lambda)
1245 {
1246     if (isMainThread())
1247         return lambda().autorelease();
1248
1249     RetainPtr<T> value;
1250     callOnMainThreadAndWait([&value, &lambda] {
1251         value = lambda();
1252     });
1253     return value.autorelease();
1254 }
1255 #endif
1256
1257 } // namespace Accessibility
1258
1259 inline bool AXCoreObject::isDescendantOfObject(const AXCoreObject* axObject) const
1260 {
1261     return axObject && axObject->hasChildren()
1262         && Accessibility::findAncestor<AXCoreObject>(*this, false, [axObject] (const AXCoreObject& object) {
1263             return &object == axObject;
1264         }) != nullptr;
1265 }
1266
1267 inline bool AXCoreObject::isAncestorOfObject(const AXCoreObject* axObject) const
1268 {
1269     return axObject && (this == axObject || axObject->isDescendantOfObject(this));
1270 }
1271
1272 } // namespace WebCore