Fix for LayoutTests/accessibility/mac/search-text/search-text.html in IsolatedTree...
[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     // Table column support.
565     virtual bool isTableColumn() const = 0;
566     virtual unsigned columnIndex() const = 0;
567     virtual AXCoreObject* columnHeader() = 0;
568
569     // Table row support.
570     virtual bool isTableRow() const = 0;
571     virtual unsigned rowIndex() const = 0;
572
573     // ARIA tree/grid row support.
574     virtual bool isARIATreeGridRow() const = 0;
575     virtual AccessibilityChildrenVector disclosedRows() = 0; // Also implemented by ARIATreeItems.
576     virtual AXCoreObject* disclosedByRow() const = 0;
577
578     virtual bool isFieldset() const = 0;
579     virtual bool isGroup() const = 0;
580     virtual bool isImageMapLink() const = 0;
581     virtual bool isMenuList() const = 0;
582     virtual bool isMenuListPopup() const = 0;
583     virtual bool isMenuListOption() const = 0;
584
585     // Native spin buttons.
586     bool isSpinButton() const { return roleValue() == AccessibilityRole::SpinButton; }
587     virtual bool isNativeSpinButton() const = 0;
588     virtual AXCoreObject* incrementButton() = 0;
589     virtual AXCoreObject* decrementButton() = 0;
590     virtual bool isSpinButtonPart() const = 0;
591     virtual bool isIncrementor() const = 0;
592
593     virtual bool isMockObject() const = 0;
594     virtual bool isMediaObject() const = 0;
595     bool isSwitch() const { return roleValue() == AccessibilityRole::Switch; }
596     bool isToggleButton() const { return roleValue() == AccessibilityRole::ToggleButton; }
597     virtual bool isTextControl() const = 0;
598     virtual bool isARIATextControl() const = 0;
599     virtual bool isNonNativeTextControl() const = 0;
600     bool isTabList() const { return roleValue() == AccessibilityRole::TabList; }
601     bool isTabItem() const { return roleValue() == AccessibilityRole::Tab; }
602     bool isRadioGroup() const { return roleValue() == AccessibilityRole::RadioGroup; }
603     bool isComboBox() const { return roleValue() == AccessibilityRole::ComboBox; }
604     bool isTree() const { return roleValue() == AccessibilityRole::Tree; }
605     bool isTreeGrid() const { return roleValue() == AccessibilityRole::TreeGrid; }
606     bool isTreeItem() const { return roleValue() == AccessibilityRole::TreeItem; }
607     bool isScrollbar() const { return roleValue() == AccessibilityRole::ScrollBar; }
608     virtual bool isButton() const = 0;
609
610     bool isListItem() const { return roleValue() == AccessibilityRole::ListItem; }
611     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
612     bool isScrollView() const { return roleValue() == AccessibilityRole::ScrollArea; }
613     bool isCanvas() const { return roleValue() == AccessibilityRole::Canvas; }
614     bool isPopUpButton() const { return roleValue() == AccessibilityRole::PopUpButton; }
615     bool isColorWell() const { return roleValue() == AccessibilityRole::ColorWell; }
616     bool isSplitter() const { return roleValue() == AccessibilityRole::Splitter; }
617     bool isToolbar() const { return roleValue() == AccessibilityRole::Toolbar; }
618     bool isSummary() const { return roleValue() == AccessibilityRole::Summary; }
619
620     virtual bool isBlockquote() const = 0;
621     virtual bool isLandmark() const = 0;
622     virtual bool isRangeControl() const = 0;
623     virtual bool isMeter() const = 0;
624     virtual bool isStyleFormatGroup() const = 0;
625     virtual bool isFigureElement() const = 0;
626     virtual bool isKeyboardFocusable() const = 0;
627     virtual bool isOutput() const = 0;
628
629     virtual bool isChecked() const = 0;
630     virtual bool isEnabled() const = 0;
631     virtual bool isSelected() const = 0;
632     virtual bool isFocused() const = 0;
633     virtual bool isHovered() const = 0;
634     virtual bool isIndeterminate() const = 0;
635     virtual bool isLoaded() const = 0;
636     virtual bool isMultiSelectable() const = 0;
637     // FIXME should need just one since onscreen should be !offscreen.
638     virtual bool isOnScreen() const = 0;
639     virtual bool isOffScreen() const = 0;
640     virtual bool isPressed() const = 0;
641     virtual bool isUnvisited() const = 0;
642     virtual bool isVisited() const = 0;
643     virtual bool isRequired() const = 0;
644     virtual bool supportsRequiredAttribute() const = 0;
645     virtual bool isLinked() const = 0;
646     virtual bool isExpanded() const = 0;
647     virtual bool isVisible() const = 0;
648     virtual bool isCollapsed() const = 0;
649     virtual void setIsExpanded(bool) = 0;
650     virtual FloatRect relativeFrame() const = 0;
651     virtual FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const = 0;
652
653     // In a multi-select list, many items can be selected but only one is active at a time.
654     virtual bool isSelectedOptionActive() const = 0;
655
656     virtual bool hasBoldFont() const = 0;
657     virtual bool hasItalicFont() const = 0;
658     virtual bool hasMisspelling() const = 0;
659     virtual RefPtr<Range> getMisspellingRange(RefPtr<Range> const& start, AccessibilitySearchDirection) const = 0;
660     virtual bool hasPlainText() const = 0;
661     virtual bool hasSameFont(RenderObject*) const = 0;
662     virtual bool hasSameFontColor(RenderObject*) const = 0;
663     virtual bool hasSameStyle(RenderObject*) const = 0;
664     bool isStaticText() const { return roleValue() == AccessibilityRole::StaticText; }
665     virtual bool hasUnderline() const = 0;
666     virtual bool hasHighlighting() const = 0;
667
668     virtual bool supportsDatetimeAttribute() const = 0;
669     virtual String datetimeAttributeValue() const = 0;
670
671     virtual bool canSetFocusAttribute() const = 0;
672     virtual bool canSetTextRangeAttributes() const = 0;
673     virtual bool canSetValueAttribute() const = 0;
674     virtual bool canSetNumericValue() const = 0;
675     virtual bool canSetSelectedAttribute() const = 0;
676     virtual bool canSetSelectedChildrenAttribute() const = 0;
677     virtual bool canSetExpandedAttribute() const = 0;
678
679     virtual Element* element() const = 0;
680     virtual Node* node() const = 0;
681     virtual RenderObject* renderer() const = 0;
682
683     virtual bool accessibilityIsIgnored() const = 0;
684     virtual AccessibilityObjectInclusion defaultObjectInclusion() const = 0;
685     virtual bool accessibilityIsIgnoredByDefault() const = 0;
686
687     virtual bool isShowingValidationMessage() const = 0;
688     virtual String validationMessage() const = 0;
689
690     virtual unsigned blockquoteLevel() const = 0;
691     virtual int headingLevel() const = 0;
692     virtual AccessibilityButtonState checkboxOrRadioValue() const = 0;
693     virtual String valueDescription() const = 0;
694     virtual float valueForRange() const = 0;
695     virtual float maxValueForRange() const = 0;
696     virtual float minValueForRange() const = 0;
697     virtual float stepValueForRange() const = 0;
698     virtual AXCoreObject* selectedRadioButton() = 0;
699     virtual AXCoreObject* selectedTabItem() = 0;
700     virtual AXCoreObject* selectedListItem() = 0;
701     virtual int layoutCount() const = 0;
702     virtual double estimatedLoadingProgress() const = 0;
703
704     virtual bool supportsARIAOwns() const = 0;
705     virtual bool isActiveDescendantOfFocusedContainer() const = 0;
706     virtual void ariaActiveDescendantReferencingElements(AccessibilityChildrenVector&) const = 0;
707     virtual void ariaControlsElements(AccessibilityChildrenVector&) const = 0;
708     virtual void ariaControlsReferencingElements(AccessibilityChildrenVector&) const = 0;
709     virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const = 0;
710     virtual void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const = 0;
711     virtual void ariaDetailsElements(AccessibilityChildrenVector&) const = 0;
712     virtual void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const = 0;
713     virtual void ariaErrorMessageElements(AccessibilityChildrenVector&) const = 0;
714     virtual void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const = 0;
715     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const = 0;
716     virtual void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const = 0;
717     virtual void ariaLabelledByElements(AccessibilityChildrenVector&) const = 0;
718     virtual void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const = 0;
719     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const = 0;
720     virtual void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const = 0;
721
722     virtual bool hasPopup() const = 0;
723     virtual String popupValue() const = 0;
724     virtual bool hasDatalist() const = 0;
725     virtual bool supportsHasPopup() const = 0;
726     virtual bool pressedIsPresent() const = 0;
727     virtual bool ariaIsMultiline() const = 0;
728     virtual String invalidStatus() const = 0;
729     virtual bool supportsPressed() const = 0;
730     virtual bool supportsExpanded() const = 0;
731     virtual bool supportsChecked() const = 0;
732     virtual AccessibilitySortDirection sortDirection() const = 0;
733     virtual bool canvasHasFallbackContent() const = 0;
734     virtual bool supportsRangeValue() const = 0;
735     virtual String identifierAttribute() const = 0;
736     virtual String linkRelValue() const = 0;
737     virtual void classList(Vector<String>&) const = 0;
738     virtual AccessibilityCurrentState currentState() const = 0;
739     virtual String currentValue() const = 0;
740     virtual bool supportsCurrent() const = 0;
741     virtual const String keyShortcutsValue() const = 0;
742
743     // This function checks if the object should be ignored when there's a modal dialog displayed.
744     virtual bool ignoredFromModalPresence() const = 0;
745     virtual bool isModalDescendant(Node*) const = 0;
746     virtual bool isModalNode() const = 0;
747
748     virtual bool supportsSetSize() const = 0;
749     virtual bool supportsPosInSet() const = 0;
750     virtual int setSize() const = 0;
751     virtual int posInSet() const = 0;
752
753     // ARIA drag and drop
754     virtual bool supportsARIADropping() const = 0;
755     virtual bool supportsARIADragging() const = 0;
756     virtual bool isARIAGrabbed() = 0;
757     virtual void setARIAGrabbed(bool) = 0;
758     virtual Vector<String> determineARIADropEffects() = 0;
759
760     // Called on the root AX object to return the deepest available element.
761     virtual AXCoreObject* accessibilityHitTest(const IntPoint&) const = 0;
762     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
763     virtual AXCoreObject* elementAccessibilityHitTest(const IntPoint&) const = 0;
764
765     virtual AXCoreObject* focusedUIElement() const = 0;
766
767     virtual AXCoreObject* firstChild() const = 0;
768     virtual AXCoreObject* lastChild() const = 0;
769     virtual AXCoreObject* previousSibling() const = 0;
770     virtual AXCoreObject* nextSibling() const = 0;
771     virtual AXCoreObject* nextSiblingUnignored(int limit) const = 0;
772     virtual AXCoreObject* previousSiblingUnignored(int limit) const = 0;
773     virtual AXCoreObject* parentObject() const = 0;
774     virtual AXCoreObject* parentObjectUnignored() const = 0;
775     virtual AXCoreObject* parentObjectIfExists() const = 0;
776     virtual void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&) = 0;
777     virtual bool isDescendantOfBarrenParent() const = 0;
778     virtual bool isDescendantOfRole(AccessibilityRole) const = 0;
779
780     // Text selection
781     virtual Vector<RefPtr<Range>> findTextRanges(AccessibilitySearchTextCriteria const&) const = 0;
782     virtual Vector<String> performTextOperation(AccessibilityTextOperation const&) = 0;
783
784     virtual AXCoreObject* observableObject() const = 0;
785     virtual void linkedUIElements(AccessibilityChildrenVector&) const = 0;
786     virtual AXCoreObject* titleUIElement() const = 0;
787     virtual bool exposesTitleUIElement() const = 0;
788     virtual AXCoreObject* correspondingLabelForControlElement() const = 0;
789     virtual AXCoreObject* correspondingControlForLabelElement() const = 0;
790     virtual AXCoreObject* scrollBar(AccessibilityOrientation) = 0;
791
792     virtual AccessibilityRole ariaRoleAttribute() const = 0;
793     virtual bool isPresentationalChildOfAriaRole() const = 0;
794     virtual bool ariaRoleHasPresentationalChildren() const = 0;
795     virtual bool inheritsPresentationalRole() const = 0;
796
797     // Accessibility Text
798     virtual void accessibilityText(Vector<AccessibilityText>&) const = 0;
799     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
800     virtual String computedLabel() = 0;
801
802     // A programmatic way to set a name on an AccessibleObject.
803     virtual void setAccessibleName(const AtomString&) = 0;
804     virtual bool hasAttributesRequiredForInclusion() const = 0;
805
806     // Accessibility Text - (To be deprecated).
807     virtual String accessibilityDescription() const = 0;
808     virtual String title() const = 0;
809     virtual String helpText() const = 0;
810     bool containsText(String const& text) const
811     {
812         // If text is empty we return true.
813         return text.isEmpty()
814             || findPlainText(title(), text, CaseInsensitive)
815             || findPlainText(accessibilityDescription(), text, CaseInsensitive)
816             || findPlainText(stringValue(), text, CaseInsensitive);
817     }
818
819     // Methods for determining accessibility text.
820     virtual bool isARIAStaticText() const = 0;
821     virtual String stringValue() const = 0;
822     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const = 0;
823     virtual String text() const = 0;
824     virtual int textLength() const = 0;
825     virtual String ariaLabeledByAttribute() const = 0;
826     virtual String ariaDescribedByAttribute() const = 0;
827     virtual const String placeholderValue() const = 0;
828     virtual bool accessibleNameDerivesFromContent() const = 0;
829
830     // Abbreviations
831     virtual String expandedTextValue() const = 0;
832     virtual bool supportsExpandedTextValue() const = 0;
833
834     virtual void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const = 0;
835
836     // Only if isColorWell()
837     virtual void colorValue(int& r, int& g, int& b) const = 0;
838
839     virtual AccessibilityRole roleValue() const = 0;
840     // Non-localized string associated with the object role.
841     virtual String rolePlatformString() const = 0;
842     // Localized string that describes the object's role.
843     virtual String roleDescription() const = 0;
844     // Localized string that describes ARIA landmark roles.
845     virtual String ariaLandmarkRoleDescription() const = 0;
846
847     virtual AXObjectCache* axObjectCache() const = 0;
848
849     virtual Element* anchorElement() const = 0;
850     virtual bool supportsPressAction() const = 0;
851     virtual Element* actionElement() const = 0;
852     virtual LayoutRect boundingBoxRect() const = 0;
853     IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
854     virtual LayoutRect elementRect() const = 0;
855     LayoutSize size() const { return elementRect().size(); }
856     virtual IntPoint clickPoint() = 0;
857     virtual Path elementPath() const = 0;
858     virtual bool supportsPath() const = 0;
859
860     virtual TextIteratorBehavior textIteratorBehaviorForTextRange() const = 0;
861     virtual PlainTextRange selectedTextRange() const = 0;
862     virtual unsigned selectionStart() const = 0;
863     virtual unsigned selectionEnd() const = 0;
864
865     virtual URL url() const = 0;
866     virtual VisibleSelection selection() const = 0;
867     virtual String selectedText() const = 0;
868     virtual String accessKey() const = 0;
869     virtual String actionVerb() const = 0;
870     virtual Widget* widget() const = 0;
871     virtual Widget* widgetForAttachmentView() const = 0;
872     virtual Page* page() const = 0;
873     virtual Document* document() const = 0;
874     virtual FrameView* documentFrameView() const = 0;
875     virtual Frame* frame() const = 0;
876     virtual Frame* mainFrame() const = 0;
877     virtual Document* topDocument() const = 0;
878     virtual ScrollView* scrollViewAncestor() const = 0;
879     virtual String language() const = 0;
880     // 1-based, to match the aria-level spec.
881     virtual unsigned hierarchicalLevel() const = 0;
882     virtual bool isInlineText() const = 0;
883     
884     virtual void setFocused(bool) = 0;
885     virtual void setSelectedText(const String&) = 0;
886     virtual void setSelectedTextRange(const PlainTextRange&) = 0;
887     virtual void setValue(const String&) = 0;
888     virtual bool replaceTextInRange(const String&, const PlainTextRange&) = 0;
889     virtual bool insertText(const String&) = 0;
890
891     virtual void setValue(float) = 0;
892     virtual void setSelected(bool) = 0;
893     virtual void setSelectedRows(AccessibilityChildrenVector&) = 0;
894
895     virtual void makeRangeVisible(const PlainTextRange&) = 0;
896     virtual bool press() = 0;
897     virtual bool performDefaultAction() = 0;
898
899     virtual AccessibilityOrientation orientation() const = 0;
900     virtual void increment() = 0;
901     virtual void decrement() = 0;
902
903     virtual void childrenChanged() = 0;
904     virtual void textChanged() = 0;
905     virtual void updateAccessibilityRole() = 0;
906     virtual const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true) = 0;
907     virtual void addChildren() = 0;
908     virtual void addChild(AXCoreObject*) = 0;
909     virtual void insertChild(AXCoreObject*, unsigned) = 0;
910
911     virtual bool shouldIgnoreAttributeRole() const = 0;
912
913     virtual bool canHaveChildren() const = 0;
914     virtual bool hasChildren() const = 0;
915     virtual void updateChildrenIfNecessary() = 0;
916     virtual void setNeedsToUpdateChildren() = 0;
917     virtual void setNeedsToUpdateSubtree() = 0;
918     virtual void clearChildren() = 0;
919     virtual bool needsToUpdateChildren() const = 0;
920     virtual void detachFromParent() = 0;
921     virtual bool isDetachedFromParent() = 0;
922
923     virtual bool canHaveSelectedChildren() const = 0;
924     virtual void selectedChildren(AccessibilityChildrenVector&) = 0;
925     virtual void visibleChildren(AccessibilityChildrenVector&) = 0;
926     virtual void tabChildren(AccessibilityChildrenVector&) = 0;
927     virtual bool shouldFocusActiveDescendant() const = 0;
928     virtual AXCoreObject* activeDescendant() const = 0;
929     virtual void handleActiveDescendantChanged() = 0;
930     virtual void handleAriaExpandedChanged() = 0;
931     bool isDescendantOfObject(const AXCoreObject*) const;
932     bool isAncestorOfObject(const AXCoreObject*) const;
933     virtual AXCoreObject* firstAnonymousBlockChild() const = 0;
934
935     virtual bool hasAttribute(const QualifiedName&) const = 0;
936     virtual const AtomString& getAttribute(const QualifiedName&) const = 0;
937     virtual bool hasTagName(const QualifiedName&) const = 0;
938     virtual String tagName() const = 0;
939
940     virtual VisiblePositionRange visiblePositionRange() const = 0;
941     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const = 0;
942     virtual RefPtr<Range> elementRange() const = 0;
943     virtual VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const = 0;
944     virtual VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const = 0;
945     virtual VisiblePositionRange positionOfRightWord(const VisiblePosition&) const = 0;
946     virtual VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const = 0;
947     virtual VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const = 0;
948     virtual VisiblePositionRange sentenceForPosition(const VisiblePosition&) const = 0;
949     virtual VisiblePositionRange paragraphForPosition(const VisiblePosition&) const = 0;
950     virtual VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const = 0;
951     virtual VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const = 0;
952     virtual VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const = 0;
953
954     virtual RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const = 0;
955
956     virtual String stringForRange(RefPtr<Range>) const = 0;
957     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const = 0;
958     virtual IntRect boundsForRange(const RefPtr<Range>) const = 0;
959     virtual int lengthForVisiblePositionRange(const VisiblePositionRange&) const = 0;
960     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const = 0;
961
962     virtual VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const = 0;
963     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const = 0;
964     virtual VisiblePosition nextVisiblePosition(const VisiblePosition&) const = 0;
965     virtual VisiblePosition previousVisiblePosition(const VisiblePosition&) const = 0;
966     virtual VisiblePosition nextWordEnd(const VisiblePosition&) const = 0;
967     virtual VisiblePosition previousWordStart(const VisiblePosition&) const = 0;
968     virtual VisiblePosition nextLineEndPosition(const VisiblePosition&) const = 0;
969     virtual VisiblePosition previousLineStartPosition(const VisiblePosition&) const = 0;
970     virtual VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const = 0;
971     virtual VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const = 0;
972     virtual VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const = 0;
973     virtual VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const = 0;
974     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const = 0;
975
976     virtual VisiblePosition visiblePositionForIndex(int) const = 0;
977     virtual int indexForVisiblePosition(const VisiblePosition&) const = 0;
978
979     virtual AXCoreObject* accessibilityObjectForPosition(const VisiblePosition&) const = 0;
980     virtual int lineForPosition(const VisiblePosition&) const = 0;
981     virtual PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const = 0;
982     virtual int index(const VisiblePosition&) const = 0;
983
984     virtual void lineBreaks(Vector<int>&) const = 0;
985     virtual PlainTextRange doAXRangeForLine(unsigned) const = 0;
986     virtual PlainTextRange doAXRangeForPosition(const IntPoint&) const = 0;
987     virtual PlainTextRange doAXRangeForIndex(unsigned) const = 0;
988     virtual PlainTextRange doAXStyleRangeForIndex(unsigned) const = 0;
989
990     virtual String doAXStringForRange(const PlainTextRange&) const = 0;
991     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const = 0;
992     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const = 0;
993
994     virtual unsigned doAXLineForIndex(unsigned) = 0;
995
996     virtual String computedRoleString() const = 0;
997
998     // MSAA
999     virtual String stringValueForMSAA() const = 0;
1000     virtual String stringRoleForMSAA() const = 0;
1001     virtual String nameForMSAA() const = 0;
1002     virtual String descriptionForMSAA() const = 0;
1003     virtual AccessibilityRole roleValueForMSAA() const = 0;
1004
1005     virtual String passwordFieldValue() const = 0;
1006     virtual bool isValueAutofilled() const = 0;
1007     virtual bool isValueAutofillAvailable() const = 0;
1008     virtual AutoFillButtonType valueAutofillButtonType() const = 0;
1009     virtual bool hasARIAValueNow() const = 0;
1010
1011     // Used by an ARIA tree to get all its rows.
1012     virtual void ariaTreeRows(AccessibilityChildrenVector&) = 0;
1013     // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
1014     virtual void ariaTreeItemContent(AccessibilityChildrenVector&) = 0;
1015
1016     // ARIA live-region features.
1017     virtual bool supportsLiveRegion(bool excludeIfOff = true) const = 0;
1018     virtual bool isInsideLiveRegion(bool excludeIfOff = true) const = 0;
1019     virtual AXCoreObject* liveRegionAncestor(bool excludeIfOff = true) const = 0;
1020     virtual const String liveRegionStatus() const = 0;
1021     virtual const String liveRegionRelevant() const = 0;
1022     virtual bool liveRegionAtomic() const = 0;
1023     virtual bool isBusy() const = 0;
1024
1025     virtual bool hasContentEditableAttributeSet() const = 0;
1026
1027     virtual bool supportsReadOnly() const = 0;
1028     virtual String readOnlyValue() const = 0;
1029
1030     virtual bool supportsAutoComplete() const = 0;
1031     virtual String autoCompleteValue() const = 0;
1032
1033     virtual bool supportsARIAAttributes() const = 0;
1034
1035     // CSS3 Speech properties.
1036     virtual OptionSet<SpeakAs> speakAsProperty() const = 0;
1037
1038     // Make this object visible by scrolling as many nested scrollable views as needed.
1039     virtual void scrollToMakeVisible() const = 0;
1040     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
1041     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const = 0;
1042     // Scroll this object to a given point in global coordinates of the top-level window.
1043     virtual void scrollToGlobalPoint(const IntPoint&) const = 0;
1044
1045     enum class ScrollByPageDirection { Up, Down, Left, Right };
1046     virtual bool scrollByPage(ScrollByPageDirection) const = 0;
1047     virtual IntPoint scrollPosition() const = 0;
1048     virtual IntSize scrollContentsSize() const = 0;
1049     virtual IntRect scrollVisibleContentRect() const = 0;
1050     virtual void scrollToMakeVisible(const ScrollRectToVisibleOptions&) const = 0;
1051
1052     virtual bool lastKnownIsIgnoredValue() = 0;
1053     virtual void setLastKnownIsIgnoredValue(bool) = 0;
1054
1055     // Fires a children changed notification on the parent if the isIgnored value changed.
1056     virtual void notifyIfIgnoredValueChanged() = 0;
1057
1058     // All math elements return true for isMathElement().
1059     virtual bool isMathElement() const = 0;
1060     virtual bool isMathFraction() const = 0;
1061     virtual bool isMathFenced() const = 0;
1062     virtual bool isMathSubscriptSuperscript() const = 0;
1063     virtual bool isMathRow() const = 0;
1064     virtual bool isMathUnderOver() const = 0;
1065     virtual bool isMathRoot() const = 0;
1066     virtual bool isMathSquareRoot() const = 0;
1067     virtual bool isMathText() const = 0;
1068     virtual bool isMathNumber() const = 0;
1069     virtual bool isMathOperator() const = 0;
1070     virtual bool isMathFenceOperator() const = 0;
1071     virtual bool isMathSeparatorOperator() const = 0;
1072     virtual bool isMathIdentifier() const = 0;
1073     virtual bool isMathTable() const = 0;
1074     virtual bool isMathTableRow() const = 0;
1075     virtual bool isMathTableCell() const = 0;
1076     virtual bool isMathMultiscript() const = 0;
1077     virtual bool isMathToken() const = 0;
1078     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const = 0;
1079     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const = 0;
1080
1081     // Root components.
1082     virtual AXCoreObject* mathRadicandObject() = 0;
1083     virtual AXCoreObject* mathRootIndexObject() = 0;
1084
1085     // Under over components.
1086     virtual AXCoreObject* mathUnderObject() = 0;
1087     virtual AXCoreObject* mathOverObject() = 0;
1088
1089     // Fraction components.
1090     virtual AXCoreObject* mathNumeratorObject() = 0;
1091     virtual AXCoreObject* mathDenominatorObject() = 0;
1092
1093     // Subscript/superscript components.
1094     virtual AXCoreObject* mathBaseObject() = 0;
1095     virtual AXCoreObject* mathSubscriptObject() = 0;
1096     virtual AXCoreObject* mathSuperscriptObject() = 0;
1097
1098     // Fenced components.
1099     virtual String mathFencedOpenString() const = 0;
1100     virtual String mathFencedCloseString() const = 0;
1101     virtual int mathLineThickness() const = 0;
1102     virtual bool isAnonymousMathOperator() const = 0;
1103
1104     // Multiscripts components.
1105     typedef std::pair<AXCoreObject*, AXCoreObject*> AccessibilityMathMultiscriptPair;
1106     typedef Vector<AccessibilityMathMultiscriptPair> AccessibilityMathMultiscriptPairs;
1107     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) = 0;
1108     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) = 0;
1109
1110     // Visibility.
1111     virtual bool isAXHidden() const = 0;
1112     virtual bool isDOMHidden() const = 0;
1113     virtual bool isHidden() const = 0;
1114
1115 #if ENABLE(ACCESSIBILITY)
1116     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
1117     void setWrapper(AccessibilityObjectWrapper* wrapper) { m_wrapper = wrapper; }
1118     void detachWrapper(AccessibilityDetachmentType);
1119 #else
1120     AccessibilityObjectWrapper* wrapper() const { return nullptr; }
1121     void setWrapper(AccessibilityObjectWrapper*) { }
1122     void detachWrapper(AccessibilityDetachmentType) { }
1123 #endif
1124
1125     virtual void overrideAttachmentParent(AXCoreObject* parent) = 0;
1126
1127     // a platform-specific method for determining if an attachment is ignored
1128     virtual bool accessibilityIgnoreAttachment() const = 0;
1129     // gives platforms the opportunity to indicate if and how an object should be included
1130     virtual AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const = 0;
1131
1132 #if PLATFORM(IOS_FAMILY)
1133     virtual int accessibilityPasswordFieldLength() = 0;
1134     virtual bool hasTouchEventListener() const = 0;
1135     virtual bool isInputTypePopupButton() const = 0;
1136 #endif
1137
1138     // allows for an AccessibilityObject to update its render tree or perform
1139     // other operations update type operations
1140     virtual void updateBackingStore() = 0;
1141
1142 #if PLATFORM(COCOA)
1143     virtual bool preventKeyboardDOMEventDispatch() const = 0;
1144     virtual void setPreventKeyboardDOMEventDispatch(bool) = 0;
1145     virtual bool fileUploadButtonReturnsValueInTitle() const = 0;
1146     virtual String speechHintAttributeValue() const = 0;
1147     virtual String descriptionAttributeValue() const = 0;
1148     virtual String helpTextAttributeValue() const = 0;
1149     virtual String titleAttributeValue() const = 0;
1150     virtual bool hasApplePDFAnnotationAttribute() const = 0;
1151 #endif
1152
1153 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY)
1154     virtual bool caretBrowsingEnabled() const = 0;
1155     virtual void setCaretBrowsingEnabled(bool) = 0;
1156 #endif
1157
1158     virtual AXCoreObject* focusableAncestor() = 0;
1159     virtual AXCoreObject* editableAncestor() = 0;
1160     virtual AXCoreObject* highestEditableAncestor() = 0;
1161
1162     virtual const AccessibilityScrollView* ancestorAccessibilityScrollView(bool includeSelf) const = 0;
1163     virtual AXCoreObject* webAreaObject() const = 0;
1164
1165     virtual void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData&) = 0;
1166     virtual void clearIsIgnoredFromParentData() = 0;
1167     virtual void setIsIgnoredFromParentDataForChild(AXCoreObject*) = 0;
1168     
1169     virtual uint64_t sessionID() const = 0;
1170     virtual String documentURI() const = 0;
1171     virtual String documentEncoding() const = 0;
1172 private:
1173     // Detaches this object from the objects it references and it is referenced by.
1174     virtual void detachRemoteParts(AccessibilityDetachmentType) = 0;
1175
1176 #if PLATFORM(COCOA)
1177     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1178 #elif PLATFORM(WIN)
1179     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1180 #elif USE(ATK)
1181     GRefPtr<WebKitAccessible> m_wrapper;
1182 #endif
1183     virtual void detachPlatformWrapper(AccessibilityDetachmentType) = 0;
1184 };
1185
1186 inline void AXCoreObject::detach(AccessibilityDetachmentType detachmentType)
1187 {
1188     detachWrapper(detachmentType);
1189     detachRemoteParts(detachmentType);
1190     setObjectID(InvalidAXID);
1191 }
1192
1193 #if ENABLE(ACCESSIBILITY)
1194 inline void AXCoreObject::detachWrapper(AccessibilityDetachmentType detachmentType)
1195 {
1196     detachPlatformWrapper(detachmentType);
1197     m_wrapper = nullptr;
1198 }
1199 #endif
1200
1201 namespace Accessibility {
1202
1203 template<typename T, typename F>
1204 T* findAncestor(const T& object, bool includeSelf, const F& matches)
1205 {
1206     T* parent;
1207     if (includeSelf)
1208         parent = const_cast<T*>(&object);
1209     else {
1210         auto* parentPtr = object.parentObject();
1211         if (!is<T>(parentPtr))
1212             return nullptr;
1213         parent = parentPtr;
1214     }
1215
1216     for (; parent; parent = parent->parentObject()) {
1217         if (matches(*parent))
1218             return parent;
1219     }
1220
1221     return nullptr;
1222 }
1223
1224 void findMatchingObjects(AccessibilitySearchCriteria const&, AXCoreObject::AccessibilityChildrenVector&);
1225
1226 template<typename U> inline void performFunctionOnMainThread(U&& lambda)
1227 {
1228     if (isMainThread())
1229         return lambda();
1230
1231     callOnMainThread([&lambda] {
1232         lambda();
1233     });
1234 }
1235
1236 template<typename T, typename U> inline T retrieveValueFromMainThread(U&& lambda)
1237 {
1238     if (isMainThread())
1239         return lambda();
1240
1241     T value;
1242     callOnMainThreadAndWait([&value, &lambda] {
1243         value = lambda();
1244     });
1245     return value;
1246 }
1247
1248 #if PLATFORM(COCOA)
1249 template<typename T, typename U> inline T retrieveAutoreleasedValueFromMainThread(U&& lambda)
1250 {
1251     if (isMainThread())
1252         return lambda().autorelease();
1253
1254     RetainPtr<T> value;
1255     callOnMainThreadAndWait([&value, &lambda] {
1256         value = lambda();
1257     });
1258     return value.autorelease();
1259 }
1260 #endif
1261
1262 } // namespace Accessibility
1263
1264 inline bool AXCoreObject::isDescendantOfObject(const AXCoreObject* axObject) const
1265 {
1266     return axObject && axObject->hasChildren()
1267         && Accessibility::findAncestor<AXCoreObject>(*this, false, [axObject] (const AXCoreObject& object) {
1268             return &object == axObject;
1269         }) != nullptr;
1270 }
1271
1272 inline bool AXCoreObject::isAncestorOfObject(const AXCoreObject* axObject) const
1273 {
1274     return axObject && (this == axObject || axObject->isDescendantOfObject(this));
1275 }
1276
1277 } // namespace WebCore