AX: [ATK] Explicitly-set aria-sort value of "none" should be exposed as an object...
[WebKit-https.git] / Source / WebCore / accessibility / AccessibilityObject.h
1 /*
2  * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Nuanti Ltd.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #pragma once
31
32 #include "FloatQuad.h"
33 #include "HTMLTextFormControlElement.h"
34 #include "LayoutRect.h"
35 #include "Path.h"
36 #include "Range.h"
37 #include "TextIteratorBehavior.h"
38 #include "VisiblePosition.h"
39 #include "VisibleSelection.h"
40 #include <wtf/Forward.h>
41 #include <wtf/Function.h>
42 #include <wtf/RefPtr.h>
43 #include <wtf/Vector.h>
44
45 #if PLATFORM(COCOA)
46 #include <wtf/RetainPtr.h>
47 #elif PLATFORM(WIN)
48 #include "AccessibilityObjectWrapperWin.h"
49 #include "COMPtr.h"
50 #endif
51
52 #if PLATFORM(COCOA)
53
54 typedef struct _NSRange NSRange;
55
56 OBJC_CLASS NSArray;
57 OBJC_CLASS NSAttributedString;
58 OBJC_CLASS NSData;
59 OBJC_CLASS NSMutableAttributedString;
60 OBJC_CLASS NSString;
61 OBJC_CLASS NSValue;
62 OBJC_CLASS NSView;
63 OBJC_CLASS WebAccessibilityObjectWrapper;
64
65 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
66
67 #elif PLATFORM(GTK)
68 typedef struct _AtkObject AtkObject;
69 typedef struct _AtkObject AccessibilityObjectWrapper;
70 #elif PLATFORM(WPE)
71 class AccessibilityObjectWrapper : public RefCounted<AccessibilityObjectWrapper> { };
72 #else
73 class AccessibilityObjectWrapper;
74 #endif
75
76 namespace WebCore {
77
78 class AccessibilityObject;
79 class AXObjectCache;
80 class Element;
81 class Frame;
82 class FrameView;
83 class IntPoint;
84 class IntSize;
85 class MainFrame;
86 class Node;
87 class Page;
88 class RenderObject;
89 class ScrollableArea;
90 class ScrollView;
91 class Widget;
92
93 typedef unsigned AXID;
94
95 enum AccessibilityRole {
96     AnnotationRole = 1,
97     ApplicationRole,
98     ApplicationAlertRole,
99     ApplicationAlertDialogRole,
100     ApplicationDialogRole,
101     ApplicationGroupRole,
102     ApplicationLogRole,
103     ApplicationMarqueeRole,
104     ApplicationStatusRole,
105     ApplicationTextGroupRole,
106     ApplicationTimerRole,
107     AudioRole,
108     BlockquoteRole,
109     BrowserRole,
110     BusyIndicatorRole,
111     ButtonRole,
112     CanvasRole,
113     CaptionRole,
114     CellRole, 
115     CheckBoxRole,
116     ColorWellRole,
117     ColumnRole,
118     ColumnHeaderRole,
119     ComboBoxRole,
120     DefinitionRole,
121     DescriptionListRole,
122     DescriptionListTermRole,
123     DescriptionListDetailRole,
124     DetailsRole,
125     DirectoryRole,
126     DisclosureTriangleRole,
127     DivRole,
128     DocumentRole,
129     DocumentArticleRole,
130     DocumentMathRole,
131     DocumentNoteRole,
132     DrawerRole,
133     EditableTextRole,
134     FeedRole,
135     FigureRole,
136     FooterRole,
137     FootnoteRole,
138     FormRole,
139     GridRole,
140     GridCellRole,
141     GroupRole,
142     GrowAreaRole,
143     HeadingRole,
144     HelpTagRole,
145     HorizontalRuleRole,
146     IgnoredRole,
147     InlineRole,
148     ImageRole,
149     ImageMapRole,
150     ImageMapLinkRole,
151     IncrementorRole,
152     LabelRole,
153     LandmarkBannerRole,
154     LandmarkComplementaryRole,
155     LandmarkContentInfoRole,
156     LandmarkDocRegionRole,
157     LandmarkMainRole,
158     LandmarkNavigationRole,
159     LandmarkRegionRole,
160     LandmarkSearchRole,
161     LegendRole,
162     LinkRole,
163     ListRole,
164     ListBoxRole,
165     ListBoxOptionRole,
166     ListItemRole,
167     ListMarkerRole,
168     MarkRole,
169     MathElementRole,
170     MatteRole,
171     MenuRole,
172     MenuBarRole,
173     MenuButtonRole,
174     MenuItemRole,
175     MenuItemCheckboxRole,
176     MenuItemRadioRole,
177     MenuListPopupRole,
178     MenuListOptionRole,
179     OutlineRole,
180     ParagraphRole,
181     PopUpButtonRole,
182     PreRole,
183     PresentationalRole,
184     ProgressIndicatorRole,
185     RadioButtonRole,
186     RadioGroupRole,
187     RowHeaderRole,
188     RowRole,
189     RowGroupRole,
190     RubyBaseRole,
191     RubyBlockRole,
192     RubyInlineRole,
193     RubyRunRole,
194     RubyTextRole,
195     RulerRole,
196     RulerMarkerRole,
197     ScrollAreaRole,
198     ScrollBarRole,
199     SearchFieldRole,
200     SheetRole,
201     SliderRole,
202     SliderThumbRole,
203     SpinButtonRole,
204     SpinButtonPartRole,
205     SplitGroupRole,
206     SplitterRole,
207     StaticTextRole,
208     SummaryRole,
209     SwitchRole,
210     SystemWideRole,
211     SVGRootRole,
212     SVGTextRole,
213     SVGTSpanRole,
214     SVGTextPathRole,
215     TabGroupRole,
216     TabListRole,
217     TabPanelRole,            
218     TabRole,
219     TableRole,
220     TableHeaderContainerRole,
221     TextAreaRole,
222     TextGroupRole,
223     TermRole,
224     TimeRole,
225     TreeRole,
226     TreeGridRole,
227     TreeItemRole,
228     TextFieldRole,
229     ToggleButtonRole,
230     ToolbarRole,
231     UnknownRole,
232     UserInterfaceTooltipRole,
233     ValueIndicatorRole,
234     VideoRole,
235     WebApplicationRole,
236     WebAreaRole,
237     WebCoreLinkRole,
238     WindowRole,
239 };
240
241 enum AccessibilityTextSource {
242     AlternativeText,
243     ChildrenText,
244     SummaryText,
245     HelpText,
246     VisibleText,
247     TitleTagText,
248     PlaceholderText,
249     LabelByElementText,
250     TitleText,
251     SubtitleText,
252     ActionText,
253 };
254     
255 struct AccessibilityText {
256     String text;
257     AccessibilityTextSource textSource;
258     Vector<RefPtr<AccessibilityObject>> textElements;
259     
260     AccessibilityText(const String& t, const AccessibilityTextSource& s)
261     : text(t)
262     , textSource(s)
263     { }
264
265     AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<RefPtr<AccessibilityObject>> elements)
266     : text(t)
267     , textSource(s)
268     , textElements(WTFMove(elements))
269     { }
270
271     AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AccessibilityObject> element)
272     : text(t)
273     , textSource(s)
274     {
275         textElements.append(element);
276     }
277 };
278
279 struct AccessibilityTextUnderElementMode {
280     enum ChildrenInclusion {
281         TextUnderElementModeSkipIgnoredChildren,
282         TextUnderElementModeIncludeAllChildren,
283         TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
284     };
285     
286     ChildrenInclusion childrenInclusion;
287     bool includeFocusableContent;
288     Node* ignoredChildNode;
289     
290     AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
291         : childrenInclusion(c)
292         , includeFocusableContent(i)
293         , ignoredChildNode(ignored)
294         { }
295 };
296
297 // Use this struct to store the isIgnored data that depends on the parents, so that in addChildren()
298 // we avoid going up the parent chain for each element while traversing the tree with useful information already.
299 struct AccessibilityIsIgnoredFromParentData {
300     AccessibilityObject* parent;
301     bool isARIAHidden;
302     bool isPresentationalChildOfAriaRole;
303     bool isDescendantOfBarrenParent;
304     
305     AccessibilityIsIgnoredFromParentData(AccessibilityObject* parent = nullptr)
306         : parent(parent)
307         , isARIAHidden(false)
308         , isPresentationalChildOfAriaRole(false)
309         , isDescendantOfBarrenParent(false)
310         { }
311     
312     bool isNull() const { return !parent; }
313 };
314     
315 enum AccessibilityOrientation {
316     AccessibilityOrientationVertical,
317     AccessibilityOrientationHorizontal,
318     AccessibilityOrientationUndefined,
319 };
320     
321 enum AccessibilityObjectInclusion {
322     IncludeObject,
323     IgnoreObject,
324     DefaultBehavior,
325 };
326     
327 enum AccessibilityButtonState {
328     ButtonStateOff = 0,
329     ButtonStateOn, 
330     ButtonStateMixed,
331 };
332     
333 enum AccessibilitySortDirection {
334     SortDirectionNone,
335     SortDirectionAscending,
336     SortDirectionDescending,
337     SortDirectionOther,
338     SortDirectionInvalid
339 };
340
341 enum AccessibilitySearchDirection {
342     SearchDirectionNext = 1,
343     SearchDirectionPrevious
344 };
345
346 enum AccessibilitySearchKey {
347     AnyTypeSearchKey = 1,
348     ArticleSearchKey,
349     BlockquoteSameLevelSearchKey,
350     BlockquoteSearchKey,
351     BoldFontSearchKey,
352     ButtonSearchKey,
353     CheckBoxSearchKey,
354     ControlSearchKey,
355     DifferentTypeSearchKey,
356     FontChangeSearchKey,
357     FontColorChangeSearchKey,
358     FrameSearchKey,
359     GraphicSearchKey,
360     HeadingLevel1SearchKey,
361     HeadingLevel2SearchKey,
362     HeadingLevel3SearchKey,
363     HeadingLevel4SearchKey,
364     HeadingLevel5SearchKey,
365     HeadingLevel6SearchKey,
366     HeadingSameLevelSearchKey,
367     HeadingSearchKey,
368     HighlightedSearchKey,
369     ItalicFontSearchKey,
370     LandmarkSearchKey,
371     LinkSearchKey,
372     ListSearchKey,
373     LiveRegionSearchKey,
374     MisspelledWordSearchKey,
375     OutlineSearchKey,
376     PlainTextSearchKey,
377     RadioGroupSearchKey,
378     SameTypeSearchKey,
379     StaticTextSearchKey,
380     StyleChangeSearchKey,
381     TableSameLevelSearchKey,
382     TableSearchKey,
383     TextFieldSearchKey,
384     UnderlineSearchKey,
385     UnvisitedLinkSearchKey,
386     VisitedLinkSearchKey
387 };
388
389 enum AccessibilityVisiblePositionForBounds {
390     FirstVisiblePositionForBounds,
391     LastVisiblePositionForBounds
392 };
393
394 struct AccessibilitySearchCriteria {
395     AccessibilityObject* startObject;
396     AccessibilitySearchDirection searchDirection;
397     Vector<AccessibilitySearchKey> searchKeys;
398     String searchText;
399     unsigned resultsLimit;
400     bool visibleOnly;
401     bool immediateDescendantsOnly;
402     
403     AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
404         : startObject(startObject)
405         , searchDirection(searchDirection)
406         , searchText(searchText)
407         , resultsLimit(resultsLimit)
408         , visibleOnly(visibleOnly)
409         , immediateDescendantsOnly(immediateDescendantsOnly)
410     { }
411 };
412     
413 enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
414
415 struct VisiblePositionRange {
416
417     VisiblePosition start;
418     VisiblePosition end;
419
420     VisiblePositionRange() {}
421
422     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
423         : start(s)
424         , end(e)
425     { }
426
427     VisiblePositionRange(const VisibleSelection& selection)
428         : start(selection.start())
429         , end(selection.end())
430     { }
431
432     bool isNull() const { return start.isNull() || end.isNull(); }
433 };
434
435 struct PlainTextRange {
436         
437     unsigned start;
438     unsigned length;
439     
440     PlainTextRange()
441         : start(0)
442         , length(0)
443     { }
444     
445     PlainTextRange(unsigned s, unsigned l)
446         : start(s)
447         , length(l)
448     { }
449     
450     bool isNull() const { return !start && !length; }
451 };
452
453 enum AccessibilitySelectTextActivity {
454     FindAndReplaceActivity,
455     FindAndSelectActivity,
456     FindAndCapitalize,
457     FindAndLowercase,
458     FindAndUppercase
459 };
460
461 enum AccessibilitySelectTextAmbiguityResolution {
462     ClosestAfterSelectionAmbiguityResolution,
463     ClosestBeforeSelectionAmbiguityResolution,
464     ClosestToSelectionAmbiguityResolution
465 };
466
467 struct AccessibilitySelectTextCriteria {
468     AccessibilitySelectTextActivity activity;
469     AccessibilitySelectTextAmbiguityResolution ambiguityResolution;
470     String replacementString;
471     Vector<String> searchStrings;
472     
473     AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString)
474         : activity(activity)
475         , ambiguityResolution(ambiguityResolution)
476         , replacementString(replacementString)
477     { }
478 };
479
480 enum AccessibilityMathScriptObjectType { Subscript, Superscript };
481 enum AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
482
483 enum AccessibilityARIACurrentState { ARIACurrentFalse, ARIACurrentTrue, ARIACurrentPage, ARIACurrentStep, ARIACurrentLocation, ARIACurrentDate, ARIACurrentTime };
484     
485 bool nodeHasPresentationRole(Node*);
486     
487 class AccessibilityObject : public RefCounted<AccessibilityObject> {
488 protected:
489     AccessibilityObject();
490     
491 public:
492     virtual ~AccessibilityObject();
493
494     // After constructing an AccessibilityObject, it must be given a
495     // unique ID, then added to AXObjectCache, and finally init() must
496     // be called last.
497     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
498     virtual void init() { }
499
500     // When the corresponding WebCore object that this AccessibilityObject
501     // wraps is deleted, it must be detached.
502     virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr);
503     virtual bool isDetached() const;
504
505     typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector;
506     
507     virtual bool isAccessibilityNodeObject() const { return false; }    
508     virtual bool isAccessibilityRenderObject() const { return false; }
509     virtual bool isAccessibilityScrollbar() const { return false; }
510     virtual bool isAccessibilityScrollView() const { return false; }
511     virtual bool isAccessibilitySVGRoot() const { return false; }
512     virtual bool isAccessibilitySVGElement() const { return false; }
513
514     bool accessibilityObjectContainsText(String *) const;
515
516     virtual bool isAttachmentElement() const { return false; }
517     virtual bool isHeading() const { return false; }
518     virtual bool isLink() const { return false; }
519     virtual bool isImage() const { return false; }
520     virtual bool isImageMap() const { return roleValue() == ImageMapRole; }
521     virtual bool isNativeImage() const { return false; }
522     virtual bool isImageButton() const { return false; }
523     virtual bool isPasswordField() const { return false; }
524     bool isContainedByPasswordField() const;
525     virtual AccessibilityObject* passwordFieldOrContainingPasswordField() { return nullptr; }
526     virtual bool isNativeTextControl() const { return false; }
527     virtual bool isSearchField() const { return false; }
528     bool isWebArea() const { return roleValue() == WebAreaRole; }
529     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
530     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
531     virtual bool isNativeListBox() const { return false; }
532     bool isListBox() const { return roleValue() == ListBoxRole; }
533     virtual bool isListBoxOption() const { return false; }
534     virtual bool isAttachment() const { return false; }
535     virtual bool isMediaTimeline() const { return false; }
536     virtual bool isMenuRelated() const { return false; }
537     virtual bool isMenu() const { return false; }
538     virtual bool isMenuBar() const { return false; }
539     virtual bool isMenuButton() const { return false; }
540     virtual bool isMenuItem() const { return false; }
541     virtual bool isFileUploadButton() const { return false; }
542     virtual bool isInputImage() const { return false; }
543     virtual bool isProgressIndicator() const { return false; }
544     virtual bool isSlider() const { return false; }
545     virtual bool isSliderThumb() const { return false; }
546     virtual bool isInputSlider() const { return false; }
547     virtual bool isControl() const { return false; }
548     virtual bool isLabel() const { return false; }
549     virtual bool isList() const { return false; }
550     virtual bool isTable() const { return false; }
551     virtual bool isDataTable() const { return false; }
552     virtual bool isTableRow() const { return false; }
553     virtual bool isTableColumn() const { return false; }
554     virtual bool isTableCell() const { return false; }
555     virtual bool isFieldset() const { return false; }
556     virtual bool isGroup() const { return false; }
557     virtual bool isARIATreeGridRow() const { return false; }
558     virtual bool isImageMapLink() const { return false; }
559     virtual bool isMenuList() const { return false; }
560     virtual bool isMenuListPopup() const { return false; }
561     virtual bool isMenuListOption() const { return false; }
562     virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
563     virtual bool isNativeSpinButton() const { return false; }
564     virtual bool isSpinButtonPart() const { return false; }
565     virtual bool isMockObject() const { return false; }
566     virtual bool isMediaControlLabel() const { return false; }
567     virtual bool isMediaObject() const { return false; }
568     bool isSwitch() const { return roleValue() == SwitchRole; }
569     bool isToggleButton() const { return roleValue() == ToggleButtonRole; }
570     bool isTextControl() const;
571     bool isARIATextControl() const;
572     bool isNonNativeTextControl() const;
573     bool isTabList() const { return roleValue() == TabListRole; }
574     bool isTabItem() const { return roleValue() == TabRole; }
575     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
576     bool isComboBox() const { return roleValue() == ComboBoxRole; }
577     bool isTree() const { return roleValue() == TreeRole; }
578     bool isTreeGrid() const { return roleValue() == TreeGridRole; }
579     bool isTreeItem() const { return roleValue() == TreeItemRole; }
580     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
581     bool isButton() const;
582     bool isListItem() const { return roleValue() == ListItemRole; }
583     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
584     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
585     bool isCanvas() const { return roleValue() == CanvasRole; }
586     bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
587     bool isBlockquote() const;
588     bool isLandmark() const;
589     bool isColorWell() const { return roleValue() == ColorWellRole; }
590     bool isRangeControl() const;
591     bool isMeter() const;
592     bool isSplitter() const { return roleValue() == SplitterRole; }
593     bool isToolbar() const { return roleValue() == ToolbarRole; }
594     bool isStyleFormatGroup() const;
595     bool isSubscriptStyleGroup() const;
596     bool isSuperscriptStyleGroup() const;
597     bool isFigureElement() const;
598     bool isSummary() const { return roleValue() == SummaryRole; }
599     bool isOutput() const;
600     
601     virtual bool isChecked() const { return false; }
602     virtual bool isEnabled() const { return false; }
603     virtual bool isSelected() const { return false; }
604     virtual bool isFocused() const { return false; }
605     virtual bool isHovered() const { return false; }
606     virtual bool isIndeterminate() const { return false; }
607     virtual bool isLoaded() const { return false; }
608     virtual bool isMultiSelectable() const { return false; }
609     virtual bool isOffScreen() const { return false; }
610     virtual bool isPressed() const { return false; }
611     virtual bool isUnvisited() const { return false; }
612     virtual bool isVisited() const { return false; }
613     virtual bool isRequired() const { return false; }
614     virtual bool supportsRequiredAttribute() const { return false; }
615     virtual bool isLinked() const { return false; }
616     virtual bool isExpanded() const;
617     virtual bool isVisible() const { return true; }
618     virtual bool isCollapsed() const { return false; }
619     virtual void setIsExpanded(bool) { }
620
621     // In a multi-select list, many items can be selected but only one is active at a time.
622     virtual bool isSelectedOptionActive() const { return false; }
623
624     virtual bool hasBoldFont() const { return false; }
625     virtual bool hasItalicFont() const { return false; }
626     bool hasMisspelling() const;
627     virtual bool hasPlainText() const { return false; }
628     virtual bool hasSameFont(RenderObject*) const { return false; }
629     virtual bool hasSameFontColor(RenderObject*) const { return false; }
630     virtual bool hasSameStyle(RenderObject*) const { return false; }
631     bool isStaticText() const { return roleValue() == StaticTextRole; }
632     virtual bool hasUnderline() const { return false; }
633     bool hasHighlighting() const;
634
635     bool supportsDatetimeAttribute() const;
636     const AtomicString& datetimeAttributeValue() const;
637     
638     virtual bool canSetFocusAttribute() const { return false; }
639     virtual bool canSetTextRangeAttributes() const { return false; }
640     virtual bool canSetValueAttribute() const { return false; }
641     virtual bool canSetNumericValue() const { return false; }
642     virtual bool canSetSelectedAttribute() const { return false; }
643     virtual bool canSetSelectedChildrenAttribute() const { return false; }
644     virtual bool canSetExpandedAttribute() const { return false; }
645     
646     virtual Element* element() const;
647     virtual Node* node() const { return nullptr; }
648     virtual RenderObject* renderer() const { return nullptr; }
649     virtual bool accessibilityIsIgnored() const;
650     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
651     bool accessibilityIsIgnoredByDefault() const;
652     
653     bool isShowingValidationMessage() const;
654     String validationMessage() const;
655     
656     unsigned blockquoteLevel() const;
657     virtual int headingLevel() const { return 0; }
658     virtual int tableLevel() const { return 0; }
659     virtual AccessibilityButtonState checkboxOrRadioValue() const;
660     virtual String valueDescription() const { return String(); }
661     virtual float valueForRange() const { return 0.0f; }
662     virtual float maxValueForRange() const { return 0.0f; }
663     virtual float minValueForRange() const { return 0.0f; }
664     virtual float stepValueForRange() const { return 0.0f; }
665     virtual AccessibilityObject* selectedRadioButton() { return nullptr; }
666     virtual AccessibilityObject* selectedTabItem() { return nullptr; }
667     virtual int layoutCount() const { return 0; }
668     virtual double estimatedLoadingProgress() const { return 0; }
669     static bool isARIAControl(AccessibilityRole);
670     static bool isARIAInput(AccessibilityRole);
671
672     virtual bool supportsARIAOwns() const { return false; }
673     void ariaControlsElements(AccessibilityChildrenVector&) const;
674     void ariaControlsReferencingElements(AccessibilityChildrenVector&) const;
675     void ariaDescribedByElements(AccessibilityChildrenVector&) const;
676     void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const;
677     void ariaDetailsElements(AccessibilityChildrenVector&) const;
678     void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const;
679     void ariaErrorMessageElements(AccessibilityChildrenVector&) const;
680     void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const;
681     void ariaFlowToElements(AccessibilityChildrenVector&) const;
682     void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const;
683     void ariaLabelledByElements(AccessibilityChildrenVector&) const;
684     void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const;
685     void ariaOwnsElements(AccessibilityChildrenVector&) const;
686     void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const;
687
688     virtual bool ariaHasPopup() const { return false; }
689     String ariaPopupValue() const;
690     bool supportsARIAHasPopup() const;
691     bool ariaPressedIsPresent() const;
692     bool ariaIsMultiline() const;
693     String invalidStatus() const;
694     bool supportsARIAPressed() const;
695     bool supportsExpanded() const;
696     bool supportsChecked() const;
697     AccessibilitySortDirection sortDirection() const;
698     virtual bool canvasHasFallbackContent() const { return false; }
699     bool supportsRangeValue() const;
700     const AtomicString& identifierAttribute() const;
701     void classList(Vector<String>&) const;
702     virtual String roleDescription() const;
703     AccessibilityARIACurrentState ariaCurrentState() const;
704     String ariaCurrentValue() const;
705     bool supportsARIACurrent() const;
706     
707     // This function checks if the object should be ignored when there's a modal dialog displayed.
708     bool ignoredFromARIAModalPresence() const;
709     bool isAriaModalDescendant(Node*) const;
710     bool isAriaModalNode() const;
711     
712     bool supportsARIASetSize() const;
713     bool supportsARIAPosInSet() const;
714     int ariaSetSize() const;
715     int ariaPosInSet() const;
716     
717     // ARIA drag and drop
718     virtual bool supportsARIADropping() const { return false; }
719     virtual bool supportsARIADragging() const { return false; }
720     virtual bool isARIAGrabbed() { return false; }
721     virtual void setARIAGrabbed(bool) { }
722     virtual void determineARIADropEffects(Vector<String>&) { }
723     
724     // Called on the root AX object to return the deepest available element.
725     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return nullptr; }
726     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
727     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
728
729     virtual AccessibilityObject* focusedUIElement() const;
730
731     virtual AccessibilityObject* firstChild() const { return nullptr; }
732     virtual AccessibilityObject* lastChild() const { return nullptr; }
733     virtual AccessibilityObject* previousSibling() const { return nullptr; }
734     virtual AccessibilityObject* nextSibling() const { return nullptr; }
735     virtual AccessibilityObject* nextSiblingUnignored(int limit) const;
736     virtual AccessibilityObject* previousSiblingUnignored(int limit) const;
737     virtual AccessibilityObject* parentObject() const = 0;
738     virtual AccessibilityObject* parentObjectUnignored() const;
739     virtual AccessibilityObject* parentObjectIfExists() const { return nullptr; }
740     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
741     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
742     virtual bool isDescendantOfBarrenParent() const { return false; }
743
744     bool isDescendantOfRole(AccessibilityRole) const;
745     
746     // Text selection
747     RefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String>&) const;
748     RefPtr<Range> selectionRange() const;
749     String selectText(AccessibilitySelectTextCriteria*);
750     
751     virtual AccessibilityObject* observableObject() const { return nullptr; }
752     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
753     virtual AccessibilityObject* titleUIElement() const { return nullptr; }
754     virtual bool exposesTitleUIElement() const { return true; }
755     virtual AccessibilityObject* correspondingLabelForControlElement() const { return nullptr; }
756     virtual AccessibilityObject* correspondingControlForLabelElement() const { return nullptr; }
757     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return nullptr; }
758     
759     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
760     virtual bool isPresentationalChildOfAriaRole() const { return false; }
761     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
762     virtual bool inheritsPresentationalRole() const { return false; }
763
764     // Accessibility Text
765     virtual void accessibilityText(Vector<AccessibilityText>&) { };
766     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
767     String computedLabel();
768     
769     // A programmatic way to set a name on an AccessibleObject.
770     virtual void setAccessibleName(const AtomicString&) { }
771     virtual bool hasAttributesRequiredForInclusion() const;
772
773     // Accessibility Text - (To be deprecated).
774     virtual String accessibilityDescription() const { return String(); }
775     virtual String title() const { return String(); }
776     virtual String helpText() const { return String(); }
777
778     // Methods for determining accessibility text.
779     virtual String stringValue() const { return String(); }
780     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); }
781     virtual String text() const { return String(); }
782     virtual int textLength() const { return 0; }
783     virtual String ariaLabeledByAttribute() const { return String(); }
784     virtual String ariaDescribedByAttribute() const { return String(); }
785     const AtomicString& placeholderValue() const;
786     bool accessibleNameDerivesFromContent() const;
787     
788     // Abbreviations
789     virtual String expandedTextValue() const { return String(); }
790     virtual bool supportsExpandedTextValue() const { return false; }
791     
792     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const;
793
794     // Only if isColorWell()
795     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
796
797     virtual AccessibilityRole roleValue() const { return m_role; }
798
799     virtual AXObjectCache* axObjectCache() const;
800     AXID axObjectID() const { return m_id; }
801     
802     static AccessibilityObject* anchorElementForNode(Node*);
803     static AccessibilityObject* headingElementForNode(Node*);
804     virtual Element* anchorElement() const { return nullptr; }
805     bool supportsPressAction() const;
806     virtual Element* actionElement() const { return nullptr; }
807     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
808     IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
809     virtual LayoutRect elementRect() const = 0;
810     LayoutSize size() const { return elementRect().size(); }
811     virtual IntPoint clickPoint();
812     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
813     virtual Path elementPath() const { return Path(); }
814     virtual bool supportsPath() const { return false; }
815     
816     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
817     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
818     unsigned selectionStart() const { return selectedTextRange().start; }
819     unsigned selectionEnd() const { return selectedTextRange().length; }
820     
821     virtual URL url() const { return URL(); }
822     virtual VisibleSelection selection() const { return VisibleSelection(); }
823     virtual String selectedText() const { return String(); }
824     virtual const AtomicString& accessKey() const { return nullAtom(); }
825     const String& actionVerb() const;
826     virtual Widget* widget() const { return nullptr; }
827     virtual Widget* widgetForAttachmentView() const { return nullptr; }
828     Page* page() const;
829     virtual Document* document() const;
830     virtual FrameView* documentFrameView() const;
831     Frame* frame() const;
832     MainFrame* mainFrame() const;
833     Document* topDocument() const;
834     ScrollView* scrollViewAncestor() const;
835     String language() const;
836     // 1-based, to match the aria-level spec.
837     virtual unsigned hierarchicalLevel() const { return 0; }
838     
839     virtual void setFocused(bool) { }
840     virtual void setSelectedText(const String&) { }
841     virtual void setSelectedTextRange(const PlainTextRange&) { }
842     virtual void setValue(const String&) { }
843     virtual void setValue(float) { }
844     virtual void setSelected(bool) { }
845     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
846     
847     virtual void makeRangeVisible(const PlainTextRange&) { }
848     virtual bool press();
849     bool performDefaultAction() { return press(); }
850     
851     virtual AccessibilityOrientation orientation() const;
852     virtual void increment() { }
853     virtual void decrement() { }
854
855     virtual void childrenChanged() { }
856     virtual void textChanged() { }
857     virtual void updateAccessibilityRole() { }
858     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true);
859     virtual void addChildren() { }
860     virtual void addChild(AccessibilityObject*);
861     virtual void insertChild(AccessibilityObject*, unsigned);
862
863     virtual bool shouldIgnoreAttributeRole() const { return false; }
864     
865     virtual bool canHaveChildren() const { return true; }
866     virtual bool hasChildren() const { return m_haveChildren; }
867     virtual void updateChildrenIfNecessary();
868     virtual void setNeedsToUpdateChildren() { }
869     virtual void setNeedsToUpdateSubtree() { }
870     virtual void clearChildren();
871     virtual bool needsToUpdateChildren() const { return false; }
872 #if PLATFORM(COCOA)
873     virtual void detachFromParent();
874 #else
875     virtual void detachFromParent() { }
876 #endif
877     virtual bool isDetachedFromParent() { return false; }
878
879     virtual bool canHaveSelectedChildren() const { return false; }
880     virtual void selectedChildren(AccessibilityChildrenVector&) { }
881     virtual void visibleChildren(AccessibilityChildrenVector&) { }
882     virtual void tabChildren(AccessibilityChildrenVector&) { }
883     virtual bool shouldFocusActiveDescendant() const { return false; }
884     virtual AccessibilityObject* activeDescendant() const { return nullptr; }
885     virtual void handleActiveDescendantChanged() { }
886     virtual void handleAriaExpandedChanged() { }
887     bool isDescendantOfObject(const AccessibilityObject*) const;
888     bool isAncestorOfObject(const AccessibilityObject*) const;
889     AccessibilityObject* firstAnonymousBlockChild() const;
890
891     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
892     bool hasAttribute(const QualifiedName&) const;
893     const AtomicString& getAttribute(const QualifiedName&) const;
894     bool hasTagName(const QualifiedName&) const;
895
896     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
897     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
898     
899     RefPtr<Range> elementRange() const;
900     static bool replacedNodeNeedsCharacter(Node* replacedNode);
901     
902     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
903     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
904     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
905     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
906     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
907     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
908     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
909     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
910     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
911     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
912     
913     RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const;
914
915     static String stringForVisiblePositionRange(const VisiblePositionRange&);
916     String stringForRange(RefPtr<Range>) const;
917     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
918     virtual IntRect boundsForRange(const RefPtr<Range>) const { return IntRect(); }
919     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
920     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
921
922     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
923     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
924     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
925     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
926     VisiblePosition nextWordEnd(const VisiblePosition&) const;
927     VisiblePosition previousWordStart(const VisiblePosition&) const;
928     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
929     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
930     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
931     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
932     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
933     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
934     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
935     
936     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
937     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
938
939     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
940     int lineForPosition(const VisiblePosition&) const;
941     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
942     virtual int index(const VisiblePosition&) const { return -1; }
943
944     virtual void lineBreaks(Vector<int>&) const { }
945     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
946     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
947     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
948     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
949
950     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
951     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
952     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const { return IntRect(); }
953     static String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
954
955     unsigned doAXLineForIndex(unsigned);
956
957     String computedRoleString() const;
958
959     virtual String stringValueForMSAA() const { return String(); }
960     virtual String stringRoleForMSAA() const { return String(); }
961     virtual String nameForMSAA() const { return String(); }
962     virtual String descriptionForMSAA() const { return String(); }
963     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
964
965     virtual String passwordFieldValue() const { return String(); }
966     bool isValueAutofilled() const;
967     bool isValueAutofillAvailable() const;
968     AutoFillButtonType valueAutofillButtonType() const;
969     
970     // Used by an ARIA tree to get all its rows.
971     void ariaTreeRows(AccessibilityChildrenVector&);
972     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
973     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
974     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
975     void ariaTreeItemContent(AccessibilityChildrenVector&);
976     
977     // ARIA live-region features.
978     bool supportsARIALiveRegion(bool excludeIfOff = true) const;
979     bool isInsideARIALiveRegion(bool excludeIfOff = true) const;
980     AccessibilityObject* ariaLiveRegionAncestor(bool excludeIfOff = true) const;
981     virtual const String ariaLiveRegionStatus() const { return String(); }
982     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom(); }
983     virtual bool ariaLiveRegionAtomic() const { return false; }
984     virtual bool isBusy() const { return false; }
985     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
986     static bool liveRegionStatusIsEnabled(const AtomicString&);
987     static bool contentEditableAttributeIsEnabled(Element*);
988     bool hasContentEditableAttributeSet() const;
989
990     bool supportsARIAReadOnly() const;
991     virtual String ariaReadOnlyValue() const;
992
993     bool supportsARIAAutoComplete() const;
994     String ariaAutoCompleteValue() const;
995     
996     bool supportsARIAAttributes() const;
997     
998     // CSS3 Speech properties.
999     virtual ESpeak speakProperty() const { return SpeakNormal; }
1000
1001     // Make this object visible by scrolling as many nested scrollable views as needed.
1002     virtual void scrollToMakeVisible() const;
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;
1005     // Scroll this object to a given point in global coordinates of the top-level window.
1006     virtual void scrollToGlobalPoint(const IntPoint&) const;
1007     
1008     enum ScrollByPageDirection { Up, Down, Left, Right };
1009     bool scrollByPage(ScrollByPageDirection) const;
1010     IntPoint scrollPosition() const;
1011     IntSize scrollContentsSize() const;    
1012     IntRect scrollVisibleContentRect() const;
1013     
1014     bool lastKnownIsIgnoredValue();
1015     void setLastKnownIsIgnoredValue(bool);
1016
1017     // Fires a children changed notification on the parent if the isIgnored value changed.
1018     void notifyIfIgnoredValueChanged();
1019
1020     // All math elements return true for isMathElement().
1021     virtual bool isMathElement() const { return false; }
1022     virtual bool isMathFraction() const { return false; }
1023     virtual bool isMathFenced() const { return false; }
1024     virtual bool isMathSubscriptSuperscript() const { return false; }
1025     virtual bool isMathRow() const { return false; }
1026     virtual bool isMathUnderOver() const { return false; }
1027     virtual bool isMathRoot() const { return false; }
1028     virtual bool isMathSquareRoot() const { return false; }
1029     virtual bool isMathText() const { return false; }
1030     virtual bool isMathNumber() const { return false; }
1031     virtual bool isMathOperator() const { return false; }
1032     virtual bool isMathFenceOperator() const { return false; }
1033     virtual bool isMathSeparatorOperator() const { return false; }
1034     virtual bool isMathIdentifier() const { return false; }
1035     virtual bool isMathTable() const { return false; }
1036     virtual bool isMathTableRow() const { return false; }
1037     virtual bool isMathTableCell() const { return false; }
1038     virtual bool isMathMultiscript() const { return false; }
1039     virtual bool isMathToken() const { return false; }
1040     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const { return false; }
1041     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const { return false; }
1042
1043     // Root components.
1044     virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
1045     virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
1046     
1047     // Under over components.
1048     virtual AccessibilityObject* mathUnderObject() { return nullptr; }
1049     virtual AccessibilityObject* mathOverObject() { return nullptr; }
1050
1051     // Fraction components.
1052     virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
1053     virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
1054
1055     // Subscript/superscript components.
1056     virtual AccessibilityObject* mathBaseObject() { return nullptr; }
1057     virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
1058     virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
1059     
1060     // Fenced components.
1061     virtual String mathFencedOpenString() const { return String(); }
1062     virtual String mathFencedCloseString() const { return String(); }
1063     virtual int mathLineThickness() const { return 0; }
1064     virtual bool isAnonymousMathOperator() const { return false; }
1065     
1066     // Multiscripts components.
1067     typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
1068     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
1069     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
1070     
1071     // Visibility.
1072     bool isARIAHidden() const;
1073     bool isDOMHidden() const;
1074     bool isHidden() const { return isARIAHidden() || isDOMHidden(); }
1075     
1076 #if HAVE(ACCESSIBILITY)
1077 #if PLATFORM(GTK)
1078     AccessibilityObjectWrapper* wrapper() const;
1079     void setWrapper(AccessibilityObjectWrapper*);
1080 #else
1081     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
1082     void setWrapper(AccessibilityObjectWrapper* wrapper) 
1083     {
1084         m_wrapper = wrapper;
1085     }
1086 #endif
1087 #endif
1088     
1089 #if PLATFORM(COCOA)
1090     void overrideAttachmentParent(AccessibilityObject* parent);
1091 #else
1092     void overrideAttachmentParent(AccessibilityObject*) { }
1093 #endif
1094     
1095 #if HAVE(ACCESSIBILITY)
1096     // a platform-specific method for determining if an attachment is ignored
1097     bool accessibilityIgnoreAttachment() const;
1098     // gives platforms the opportunity to indicate if and how an object should be included
1099     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
1100 #else
1101     bool accessibilityIgnoreAttachment() const { return true; }
1102     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
1103 #endif
1104
1105 #if PLATFORM(IOS)
1106     int accessibilityPasswordFieldLength();
1107     bool hasTouchEventListener() const;
1108     bool isInputTypePopupButton() const;
1109 #endif
1110     
1111     // allows for an AccessibilityObject to update its render tree or perform
1112     // other operations update type operations
1113     void updateBackingStore();
1114     
1115 #if PLATFORM(COCOA)
1116     bool preventKeyboardDOMEventDispatch() const;
1117     void setPreventKeyboardDOMEventDispatch(bool);
1118 #endif
1119     
1120 #if PLATFORM(COCOA) && !PLATFORM(IOS)
1121     bool caretBrowsingEnabled() const;
1122     void setCaretBrowsingEnabled(bool);
1123 #endif
1124
1125     AccessibilityObject* focusableAncestor();
1126     AccessibilityObject* editableAncestor();
1127     AccessibilityObject* highestEditableAncestor();
1128     
1129     static const AccessibilityObject* matchedParent(const AccessibilityObject&, bool includeSelf, const WTF::Function<bool(const AccessibilityObject&)>&);
1130     
1131     void clearIsIgnoredFromParentData() { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
1132     void setIsIgnoredFromParentDataForChild(AccessibilityObject*);
1133     
1134 protected:
1135     AXID m_id;
1136     AccessibilityChildrenVector m_children;
1137     mutable bool m_haveChildren;
1138     AccessibilityRole m_role;
1139     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
1140     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData;
1141     bool m_childrenDirty;
1142     bool m_subtreeDirty;
1143
1144     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) { m_isIgnoredFromParentData = data; }
1145
1146     virtual bool computeAccessibilityIsIgnored() const { return true; }
1147
1148     // If this object itself scrolls, return its ScrollableArea.
1149     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
1150     virtual void scrollTo(const IntPoint&) const { }
1151     ScrollableArea* scrollableAreaAncestor() const;
1152     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
1153     
1154     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
1155     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1156     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1157     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
1158     virtual AccessibilityRole buttonRoleType() const;
1159     bool isOnscreen() const;
1160     bool dispatchTouchEvent();
1161
1162     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1163     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1164
1165 #if PLATFORM(GTK) && HAVE(ACCESSIBILITY)
1166     bool allowsTextRanges() const;
1167     unsigned getLengthForTextRange() const;
1168 #else
1169     bool allowsTextRanges() const { return isTextControl(); }
1170     unsigned getLengthForTextRange() const { return text().length(); }
1171 #endif
1172
1173 #if PLATFORM(COCOA)
1174     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1175 #elif PLATFORM(WIN)
1176     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1177 #elif PLATFORM(GTK)
1178     AtkObject* m_wrapper;
1179 #elif PLATFORM(WPE)
1180     RefPtr<AccessibilityObjectWrapper> m_wrapper;
1181 #endif
1182 };
1183
1184 #if !HAVE(ACCESSIBILITY)
1185 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1186 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1187 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1188 inline void AccessibilityObject::updateBackingStore() { }
1189 #endif
1190
1191 } // namespace WebCore
1192
1193 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
1194 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
1195     static bool isType(const WebCore::AccessibilityObject& object) { return object.predicate; } \
1196 SPECIALIZE_TYPE_TRAITS_END()