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