[ATK] Object attributes are missing for ARIA live region roles
[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 };
339
340 enum AccessibilitySearchDirection {
341     SearchDirectionNext = 1,
342     SearchDirectionPrevious
343 };
344
345 enum AccessibilitySearchKey {
346     AnyTypeSearchKey = 1,
347     ArticleSearchKey,
348     BlockquoteSameLevelSearchKey,
349     BlockquoteSearchKey,
350     BoldFontSearchKey,
351     ButtonSearchKey,
352     CheckBoxSearchKey,
353     ControlSearchKey,
354     DifferentTypeSearchKey,
355     FontChangeSearchKey,
356     FontColorChangeSearchKey,
357     FrameSearchKey,
358     GraphicSearchKey,
359     HeadingLevel1SearchKey,
360     HeadingLevel2SearchKey,
361     HeadingLevel3SearchKey,
362     HeadingLevel4SearchKey,
363     HeadingLevel5SearchKey,
364     HeadingLevel6SearchKey,
365     HeadingSameLevelSearchKey,
366     HeadingSearchKey,
367     HighlightedSearchKey,
368     ItalicFontSearchKey,
369     LandmarkSearchKey,
370     LinkSearchKey,
371     ListSearchKey,
372     LiveRegionSearchKey,
373     MisspelledWordSearchKey,
374     OutlineSearchKey,
375     PlainTextSearchKey,
376     RadioGroupSearchKey,
377     SameTypeSearchKey,
378     StaticTextSearchKey,
379     StyleChangeSearchKey,
380     TableSameLevelSearchKey,
381     TableSearchKey,
382     TextFieldSearchKey,
383     UnderlineSearchKey,
384     UnvisitedLinkSearchKey,
385     VisitedLinkSearchKey
386 };
387
388 enum AccessibilityVisiblePositionForBounds {
389     FirstVisiblePositionForBounds,
390     LastVisiblePositionForBounds
391 };
392
393 struct AccessibilitySearchCriteria {
394     AccessibilityObject* startObject;
395     AccessibilitySearchDirection searchDirection;
396     Vector<AccessibilitySearchKey> searchKeys;
397     String searchText;
398     unsigned resultsLimit;
399     bool visibleOnly;
400     bool immediateDescendantsOnly;
401     
402     AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
403         : startObject(startObject)
404         , searchDirection(searchDirection)
405         , searchText(searchText)
406         , resultsLimit(resultsLimit)
407         , visibleOnly(visibleOnly)
408         , immediateDescendantsOnly(immediateDescendantsOnly)
409     { }
410 };
411     
412 enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
413
414 struct VisiblePositionRange {
415
416     VisiblePosition start;
417     VisiblePosition end;
418
419     VisiblePositionRange() {}
420
421     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
422         : start(s)
423         , end(e)
424     { }
425
426     VisiblePositionRange(const VisibleSelection& selection)
427         : start(selection.start())
428         , end(selection.end())
429     { }
430
431     bool isNull() const { return start.isNull() || end.isNull(); }
432 };
433
434 struct PlainTextRange {
435         
436     unsigned start;
437     unsigned length;
438     
439     PlainTextRange()
440         : start(0)
441         , length(0)
442     { }
443     
444     PlainTextRange(unsigned s, unsigned l)
445         : start(s)
446         , length(l)
447     { }
448     
449     bool isNull() const { return !start && !length; }
450 };
451
452 enum AccessibilitySelectTextActivity {
453     FindAndReplaceActivity,
454     FindAndSelectActivity,
455     FindAndCapitalize,
456     FindAndLowercase,
457     FindAndUppercase
458 };
459
460 enum AccessibilitySelectTextAmbiguityResolution {
461     ClosestAfterSelectionAmbiguityResolution,
462     ClosestBeforeSelectionAmbiguityResolution,
463     ClosestToSelectionAmbiguityResolution
464 };
465
466 struct AccessibilitySelectTextCriteria {
467     AccessibilitySelectTextActivity activity;
468     AccessibilitySelectTextAmbiguityResolution ambiguityResolution;
469     String replacementString;
470     Vector<String> searchStrings;
471     
472     AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString)
473         : activity(activity)
474         , ambiguityResolution(ambiguityResolution)
475         , replacementString(replacementString)
476     { }
477 };
478
479 enum AccessibilityMathScriptObjectType { Subscript, Superscript };
480 enum AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
481
482 enum AccessibilityARIACurrentState { ARIACurrentFalse, ARIACurrentTrue, ARIACurrentPage, ARIACurrentStep, ARIACurrentLocation, ARIACurrentDate, ARIACurrentTime };
483     
484 bool nodeHasPresentationRole(Node*);
485     
486 class AccessibilityObject : public RefCounted<AccessibilityObject> {
487 protected:
488     AccessibilityObject();
489     
490 public:
491     virtual ~AccessibilityObject();
492
493     // After constructing an AccessibilityObject, it must be given a
494     // unique ID, then added to AXObjectCache, and finally init() must
495     // be called last.
496     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
497     virtual void init() { }
498
499     // When the corresponding WebCore object that this AccessibilityObject
500     // wraps is deleted, it must be detached.
501     virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr);
502     virtual bool isDetached() const;
503
504     typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector;
505     
506     virtual bool isAccessibilityNodeObject() const { return false; }    
507     virtual bool isAccessibilityRenderObject() const { return false; }
508     virtual bool isAccessibilityScrollbar() const { return false; }
509     virtual bool isAccessibilityScrollView() const { return false; }
510     virtual bool isAccessibilitySVGRoot() const { return false; }
511     virtual bool isAccessibilitySVGElement() const { return false; }
512
513     bool accessibilityObjectContainsText(String *) const;
514
515     virtual bool isAttachmentElement() const { return false; }
516     virtual bool isHeading() const { return false; }
517     virtual bool isLink() const { return false; }
518     virtual bool isImage() const { return false; }
519     virtual bool isImageMap() const { return roleValue() == ImageMapRole; }
520     virtual bool isNativeImage() const { return false; }
521     virtual bool isImageButton() const { return false; }
522     virtual bool isPasswordField() const { return false; }
523     bool isContainedByPasswordField() const;
524     virtual AccessibilityObject* passwordFieldOrContainingPasswordField() { return nullptr; }
525     virtual bool isNativeTextControl() const { return false; }
526     virtual bool isSearchField() const { return false; }
527     bool isWebArea() const { return roleValue() == WebAreaRole; }
528     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
529     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
530     virtual bool isNativeListBox() const { return false; }
531     bool isListBox() const { return roleValue() == ListBoxRole; }
532     virtual bool isListBoxOption() const { return false; }
533     virtual bool isAttachment() const { return false; }
534     virtual bool isMediaTimeline() const { return false; }
535     virtual bool isMenuRelated() const { return false; }
536     virtual bool isMenu() const { return false; }
537     virtual bool isMenuBar() const { return false; }
538     virtual bool isMenuButton() const { return false; }
539     virtual bool isMenuItem() const { return false; }
540     virtual bool isFileUploadButton() const { return false; }
541     virtual bool isInputImage() const { return false; }
542     virtual bool isProgressIndicator() const { return false; }
543     virtual bool isSlider() const { return false; }
544     virtual bool isSliderThumb() const { return false; }
545     virtual bool isInputSlider() const { return false; }
546     virtual bool isControl() const { return false; }
547     virtual bool isLabel() const { return false; }
548     virtual bool isList() const { return false; }
549     virtual bool isTable() const { return false; }
550     virtual bool isDataTable() const { return false; }
551     virtual bool isTableRow() const { return false; }
552     virtual bool isTableColumn() const { return false; }
553     virtual bool isTableCell() const { return false; }
554     virtual bool isFieldset() const { return false; }
555     virtual bool isGroup() const { return false; }
556     virtual bool isARIATreeGridRow() const { return false; }
557     virtual bool isImageMapLink() const { return false; }
558     virtual bool isMenuList() const { return false; }
559     virtual bool isMenuListPopup() const { return false; }
560     virtual bool isMenuListOption() const { return false; }
561     virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
562     virtual bool isNativeSpinButton() const { return false; }
563     virtual bool isSpinButtonPart() const { return false; }
564     virtual bool isMockObject() const { return false; }
565     virtual bool isMediaControlLabel() const { return false; }
566     bool isSwitch() const { return roleValue() == SwitchRole; }
567     bool isToggleButton() const { return roleValue() == ToggleButtonRole; }
568     bool isTextControl() const;
569     bool isARIATextControl() const;
570     bool isNonNativeTextControl() const;
571     bool isTabList() const { return roleValue() == TabListRole; }
572     bool isTabItem() const { return roleValue() == TabRole; }
573     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
574     bool isComboBox() const { return roleValue() == ComboBoxRole; }
575     bool isTree() const { return roleValue() == TreeRole; }
576     bool isTreeGrid() const { return roleValue() == TreeGridRole; }
577     bool isTreeItem() const { return roleValue() == TreeItemRole; }
578     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
579     bool isButton() const;
580     bool isListItem() const { return roleValue() == ListItemRole; }
581     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
582     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
583     bool isCanvas() const { return roleValue() == CanvasRole; }
584     bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
585     bool isBlockquote() const;
586     bool isLandmark() const;
587     bool isColorWell() const { return roleValue() == ColorWellRole; }
588     bool isRangeControl() const;
589     bool isMeter() const;
590     bool isSplitter() const { return roleValue() == SplitterRole; }
591     bool isToolbar() const { return roleValue() == ToolbarRole; }
592     bool isStyleFormatGroup() const;
593     bool isSubscriptStyleGroup() const;
594     bool isSuperscriptStyleGroup() const;
595     bool isFigureElement() const;
596     bool isSummary() const { return roleValue() == SummaryRole; }
597     bool isOutput() const;
598     
599     virtual bool isChecked() const { return false; }
600     virtual bool isEnabled() const { return false; }
601     virtual bool isSelected() const { return false; }
602     virtual bool isFocused() const { return false; }
603     virtual bool isHovered() const { return false; }
604     virtual bool isIndeterminate() const { return false; }
605     virtual bool isLoaded() const { return false; }
606     virtual bool isMultiSelectable() const { return false; }
607     virtual bool isOffScreen() const { return false; }
608     virtual bool isPressed() const { return false; }
609     virtual bool isUnvisited() const { return false; }
610     virtual bool isVisited() const { return false; }
611     virtual bool isRequired() const { return false; }
612     virtual bool supportsRequiredAttribute() const { return false; }
613     virtual bool isLinked() const { return false; }
614     virtual bool isExpanded() const;
615     virtual bool isVisible() const { return true; }
616     virtual bool isCollapsed() const { return false; }
617     virtual void setIsExpanded(bool) { }
618
619     // In a multi-select list, many items can be selected but only one is active at a time.
620     virtual bool isSelectedOptionActive() const { return false; }
621
622     virtual bool hasBoldFont() const { return false; }
623     virtual bool hasItalicFont() const { return false; }
624     bool hasMisspelling() const;
625     virtual bool hasPlainText() const { return false; }
626     virtual bool hasSameFont(RenderObject*) const { return false; }
627     virtual bool hasSameFontColor(RenderObject*) const { return false; }
628     virtual bool hasSameStyle(RenderObject*) const { return false; }
629     bool isStaticText() const { return roleValue() == StaticTextRole; }
630     virtual bool hasUnderline() const { return false; }
631     bool hasHighlighting() const;
632
633     bool supportsDatetimeAttribute() const;
634     const AtomicString& datetimeAttributeValue() const;
635     
636     virtual bool canSetFocusAttribute() const { return false; }
637     virtual bool canSetTextRangeAttributes() const { return false; }
638     virtual bool canSetValueAttribute() const { return false; }
639     virtual bool canSetNumericValue() const { return false; }
640     virtual bool canSetSelectedAttribute() const { return false; }
641     virtual bool canSetSelectedChildrenAttribute() const { return false; }
642     virtual bool canSetExpandedAttribute() const { return false; }
643     
644     virtual Element* element() const;
645     virtual Node* node() const { return nullptr; }
646     virtual RenderObject* renderer() const { return nullptr; }
647     virtual bool accessibilityIsIgnored() const;
648     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
649     bool accessibilityIsIgnoredByDefault() const;
650     
651     bool isShowingValidationMessage() const;
652     String validationMessage() const;
653     
654     unsigned blockquoteLevel() const;
655     virtual int headingLevel() const { return 0; }
656     virtual int tableLevel() const { return 0; }
657     virtual AccessibilityButtonState checkboxOrRadioValue() const;
658     virtual String valueDescription() const { return String(); }
659     virtual float valueForRange() const { return 0.0f; }
660     virtual float maxValueForRange() const { return 0.0f; }
661     virtual float minValueForRange() const { return 0.0f; }
662     virtual float stepValueForRange() const { return 0.0f; }
663     virtual AccessibilityObject* selectedRadioButton() { return nullptr; }
664     virtual AccessibilityObject* selectedTabItem() { return nullptr; }
665     virtual int layoutCount() const { return 0; }
666     virtual double estimatedLoadingProgress() const { return 0; }
667     static bool isARIAControl(AccessibilityRole);
668     static bool isARIAInput(AccessibilityRole);
669
670     virtual bool supportsARIAOwns() const { return false; }
671     void ariaControlsElements(AccessibilityChildrenVector&) const;
672     void ariaControlsReferencingElements(AccessibilityChildrenVector&) const;
673     void ariaDescribedByElements(AccessibilityChildrenVector&) const;
674     void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const;
675     void ariaDetailsElements(AccessibilityChildrenVector&) const;
676     void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const;
677     void ariaErrorMessageElements(AccessibilityChildrenVector&) const;
678     void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const;
679     void ariaFlowToElements(AccessibilityChildrenVector&) const;
680     void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const;
681     void ariaLabelledByElements(AccessibilityChildrenVector&) const;
682     void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const;
683     void ariaOwnsElements(AccessibilityChildrenVector&) const;
684     void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const;
685
686     virtual bool ariaHasPopup() const { return false; }
687     String ariaPopupValue() const;
688     bool supportsARIAHasPopup() const;
689     bool ariaPressedIsPresent() const;
690     bool ariaIsMultiline() const;
691     String invalidStatus() const;
692     bool supportsARIAPressed() const;
693     bool supportsExpanded() const;
694     bool supportsChecked() const;
695     AccessibilitySortDirection sortDirection() const;
696     virtual bool canvasHasFallbackContent() const { return false; }
697     bool supportsRangeValue() const;
698     const AtomicString& identifierAttribute() const;
699     void classList(Vector<String>&) const;
700     virtual String roleDescription() const;
701     AccessibilityARIACurrentState ariaCurrentState() const;
702     String ariaCurrentValue() const;
703     bool supportsARIACurrent() const;
704     
705     // This function checks if the object should be ignored when there's a modal dialog displayed.
706     bool ignoredFromARIAModalPresence() const;
707     bool isAriaModalDescendant(Node*) const;
708     bool isAriaModalNode() const;
709     
710     bool supportsARIASetSize() const;
711     bool supportsARIAPosInSet() const;
712     int ariaSetSize() const;
713     int ariaPosInSet() const;
714     
715     // ARIA drag and drop
716     virtual bool supportsARIADropping() const { return false; }
717     virtual bool supportsARIADragging() const { return false; }
718     virtual bool isARIAGrabbed() { return false; }
719     virtual void setARIAGrabbed(bool) { }
720     virtual void determineARIADropEffects(Vector<String>&) { }
721     
722     // Called on the root AX object to return the deepest available element.
723     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return nullptr; }
724     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
725     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
726
727     virtual AccessibilityObject* focusedUIElement() const;
728
729     virtual AccessibilityObject* firstChild() const { return nullptr; }
730     virtual AccessibilityObject* lastChild() const { return nullptr; }
731     virtual AccessibilityObject* previousSibling() const { return nullptr; }
732     virtual AccessibilityObject* nextSibling() const { return nullptr; }
733     virtual AccessibilityObject* nextSiblingUnignored(int limit) const;
734     virtual AccessibilityObject* previousSiblingUnignored(int limit) const;
735     virtual AccessibilityObject* parentObject() const = 0;
736     virtual AccessibilityObject* parentObjectUnignored() const;
737     virtual AccessibilityObject* parentObjectIfExists() const { return nullptr; }
738     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
739     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
740     virtual bool isDescendantOfBarrenParent() const { return false; }
741
742     bool isDescendantOfRole(AccessibilityRole) const;
743     
744     // Text selection
745     RefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String>&) const;
746     RefPtr<Range> selectionRange() const;
747     String selectText(AccessibilitySelectTextCriteria*);
748     
749     virtual AccessibilityObject* observableObject() const { return nullptr; }
750     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
751     virtual AccessibilityObject* titleUIElement() const { return nullptr; }
752     virtual bool exposesTitleUIElement() const { return true; }
753     virtual AccessibilityObject* correspondingLabelForControlElement() const { return nullptr; }
754     virtual AccessibilityObject* correspondingControlForLabelElement() const { return nullptr; }
755     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return nullptr; }
756     
757     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
758     virtual bool isPresentationalChildOfAriaRole() const { return false; }
759     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
760     virtual bool inheritsPresentationalRole() const { return false; }
761
762     // Accessibility Text
763     virtual void accessibilityText(Vector<AccessibilityText>&) { };
764     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
765     String computedLabel();
766     
767     // A programmatic way to set a name on an AccessibleObject.
768     virtual void setAccessibleName(const AtomicString&) { }
769     virtual bool hasAttributesRequiredForInclusion() const;
770
771     // Accessibility Text - (To be deprecated).
772     virtual String accessibilityDescription() const { return String(); }
773     virtual String title() const { return String(); }
774     virtual String helpText() const { return String(); }
775
776     // Methods for determining accessibility text.
777     virtual String stringValue() const { return String(); }
778     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); }
779     virtual String text() const { return String(); }
780     virtual int textLength() const { return 0; }
781     virtual String ariaLabeledByAttribute() const { return String(); }
782     virtual String ariaDescribedByAttribute() const { return String(); }
783     const AtomicString& placeholderValue() const;
784     bool accessibleNameDerivesFromContent() const;
785     
786     // Abbreviations
787     virtual String expandedTextValue() const { return String(); }
788     virtual bool supportsExpandedTextValue() const { return false; }
789     
790     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const;
791
792     // Only if isColorWell()
793     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
794
795     virtual AccessibilityRole roleValue() const { return m_role; }
796
797     virtual AXObjectCache* axObjectCache() const;
798     AXID axObjectID() const { return m_id; }
799     
800     static AccessibilityObject* anchorElementForNode(Node*);
801     static AccessibilityObject* headingElementForNode(Node*);
802     virtual Element* anchorElement() const { return nullptr; }
803     bool supportsPressAction() const;
804     virtual Element* actionElement() const { return nullptr; }
805     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
806     IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
807     virtual LayoutRect elementRect() const = 0;
808     LayoutSize size() const { return elementRect().size(); }
809     virtual IntPoint clickPoint();
810     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
811     virtual Path elementPath() const { return Path(); }
812     virtual bool supportsPath() const { return false; }
813     
814     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
815     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
816     unsigned selectionStart() const { return selectedTextRange().start; }
817     unsigned selectionEnd() const { return selectedTextRange().length; }
818     
819     virtual URL url() const { return URL(); }
820     virtual VisibleSelection selection() const { return VisibleSelection(); }
821     virtual String selectedText() const { return String(); }
822     virtual const AtomicString& accessKey() const { return nullAtom(); }
823     const String& actionVerb() const;
824     virtual Widget* widget() const { return nullptr; }
825     virtual Widget* widgetForAttachmentView() const { return nullptr; }
826     Page* page() const;
827     virtual Document* document() const;
828     virtual FrameView* documentFrameView() const;
829     Frame* frame() const;
830     MainFrame* mainFrame() const;
831     Document* topDocument() const;
832     ScrollView* scrollViewAncestor() const;
833     String language() const;
834     // 1-based, to match the aria-level spec.
835     virtual unsigned hierarchicalLevel() const { return 0; }
836     
837     virtual void setFocused(bool) { }
838     virtual void setSelectedText(const String&) { }
839     virtual void setSelectedTextRange(const PlainTextRange&) { }
840     virtual void setValue(const String&) { }
841     virtual void setValue(float) { }
842     virtual void setSelected(bool) { }
843     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
844     
845     virtual void makeRangeVisible(const PlainTextRange&) { }
846     virtual bool press();
847     bool performDefaultAction() { return press(); }
848     
849     virtual AccessibilityOrientation orientation() const;
850     virtual void increment() { }
851     virtual void decrement() { }
852
853     virtual void childrenChanged() { }
854     virtual void textChanged() { }
855     virtual void updateAccessibilityRole() { }
856     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true);
857     virtual void addChildren() { }
858     virtual void addChild(AccessibilityObject*);
859     virtual void insertChild(AccessibilityObject*, unsigned);
860
861     virtual bool shouldIgnoreAttributeRole() const { return false; }
862     
863     virtual bool canHaveChildren() const { return true; }
864     virtual bool hasChildren() const { return m_haveChildren; }
865     virtual void updateChildrenIfNecessary();
866     virtual void setNeedsToUpdateChildren() { }
867     virtual void setNeedsToUpdateSubtree() { }
868     virtual void clearChildren();
869     virtual bool needsToUpdateChildren() const { return false; }
870 #if PLATFORM(COCOA)
871     virtual void detachFromParent();
872 #else
873     virtual void detachFromParent() { }
874 #endif
875     virtual bool isDetachedFromParent() { return false; }
876
877     virtual bool canHaveSelectedChildren() const { return false; }
878     virtual void selectedChildren(AccessibilityChildrenVector&) { }
879     virtual void visibleChildren(AccessibilityChildrenVector&) { }
880     virtual void tabChildren(AccessibilityChildrenVector&) { }
881     virtual bool shouldFocusActiveDescendant() const { return false; }
882     virtual AccessibilityObject* activeDescendant() const { return nullptr; }
883     virtual void handleActiveDescendantChanged() { }
884     virtual void handleAriaExpandedChanged() { }
885     bool isDescendantOfObject(const AccessibilityObject*) const;
886     bool isAncestorOfObject(const AccessibilityObject*) const;
887     AccessibilityObject* firstAnonymousBlockChild() const;
888
889     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
890     bool hasAttribute(const QualifiedName&) const;
891     const AtomicString& getAttribute(const QualifiedName&) const;
892     bool hasTagName(const QualifiedName&) const;
893
894     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
895     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
896     
897     RefPtr<Range> elementRange() const;
898     static bool replacedNodeNeedsCharacter(Node* replacedNode);
899     
900     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
901     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
902     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
903     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
904     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
905     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
906     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
907     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
908     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
909     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
910     
911     RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const;
912
913     static String stringForVisiblePositionRange(const VisiblePositionRange&);
914     String stringForRange(RefPtr<Range>) const;
915     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
916     virtual IntRect boundsForRange(const RefPtr<Range>) const { return IntRect(); }
917     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
918     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
919
920     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
921     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
922     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
923     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
924     VisiblePosition nextWordEnd(const VisiblePosition&) const;
925     VisiblePosition previousWordStart(const VisiblePosition&) const;
926     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
927     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
928     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
929     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
930     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
931     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
932     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
933     
934     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
935     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
936
937     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
938     int lineForPosition(const VisiblePosition&) const;
939     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
940     virtual int index(const VisiblePosition&) const { return -1; }
941
942     virtual void lineBreaks(Vector<int>&) const { }
943     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
944     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
945     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
946     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
947
948     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
949     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
950     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const { return IntRect(); }
951     static String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
952
953     unsigned doAXLineForIndex(unsigned);
954
955     String computedRoleString() const;
956
957     virtual String stringValueForMSAA() const { return String(); }
958     virtual String stringRoleForMSAA() const { return String(); }
959     virtual String nameForMSAA() const { return String(); }
960     virtual String descriptionForMSAA() const { return String(); }
961     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
962
963     virtual String passwordFieldValue() const { return String(); }
964     bool isValueAutofilled() const;
965     bool isValueAutofillAvailable() const;
966     AutoFillButtonType valueAutofillButtonType() const;
967     
968     // Used by an ARIA tree to get all its rows.
969     void ariaTreeRows(AccessibilityChildrenVector&);
970     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
971     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
972     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
973     void ariaTreeItemContent(AccessibilityChildrenVector&);
974     
975     // ARIA live-region features.
976     bool supportsARIALiveRegion(bool excludeIfOff = true) const;
977     bool isInsideARIALiveRegion(bool excludeIfOff = true) const;
978     AccessibilityObject* ariaLiveRegionAncestor(bool excludeIfOff = true) const;
979     virtual const String ariaLiveRegionStatus() const { return String(); }
980     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom(); }
981     virtual bool ariaLiveRegionAtomic() const { return false; }
982     virtual bool isBusy() const { return false; }
983     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
984     static bool liveRegionStatusIsEnabled(const AtomicString&);
985     static bool contentEditableAttributeIsEnabled(Element*);
986     bool hasContentEditableAttributeSet() const;
987
988     bool supportsARIAReadOnly() const;
989     virtual String ariaReadOnlyValue() const;
990
991     bool supportsARIAAutoComplete() const;
992     String ariaAutoCompleteValue() const;
993     
994     bool supportsARIAAttributes() const;
995     
996     // CSS3 Speech properties.
997     virtual ESpeak speakProperty() const { return SpeakNormal; }
998
999     // Make this object visible by scrolling as many nested scrollable views as needed.
1000     virtual void scrollToMakeVisible() const;
1001     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
1002     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
1003     // Scroll this object to a given point in global coordinates of the top-level window.
1004     virtual void scrollToGlobalPoint(const IntPoint&) const;
1005     
1006     enum ScrollByPageDirection { Up, Down, Left, Right };
1007     bool scrollByPage(ScrollByPageDirection) const;
1008     IntPoint scrollPosition() const;
1009     IntSize scrollContentsSize() const;    
1010     IntRect scrollVisibleContentRect() const;
1011     
1012     bool lastKnownIsIgnoredValue();
1013     void setLastKnownIsIgnoredValue(bool);
1014
1015     // Fires a children changed notification on the parent if the isIgnored value changed.
1016     void notifyIfIgnoredValueChanged();
1017
1018     // All math elements return true for isMathElement().
1019     virtual bool isMathElement() const { return false; }
1020     virtual bool isMathFraction() const { return false; }
1021     virtual bool isMathFenced() const { return false; }
1022     virtual bool isMathSubscriptSuperscript() const { return false; }
1023     virtual bool isMathRow() const { return false; }
1024     virtual bool isMathUnderOver() const { return false; }
1025     virtual bool isMathRoot() const { return false; }
1026     virtual bool isMathSquareRoot() const { return false; }
1027     virtual bool isMathText() const { return false; }
1028     virtual bool isMathNumber() const { return false; }
1029     virtual bool isMathOperator() const { return false; }
1030     virtual bool isMathFenceOperator() const { return false; }
1031     virtual bool isMathSeparatorOperator() const { return false; }
1032     virtual bool isMathIdentifier() const { return false; }
1033     virtual bool isMathTable() const { return false; }
1034     virtual bool isMathTableRow() const { return false; }
1035     virtual bool isMathTableCell() const { return false; }
1036     virtual bool isMathMultiscript() const { return false; }
1037     virtual bool isMathToken() const { return false; }
1038     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const { return false; }
1039     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const { return false; }
1040
1041     // Root components.
1042     virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
1043     virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
1044     
1045     // Under over components.
1046     virtual AccessibilityObject* mathUnderObject() { return nullptr; }
1047     virtual AccessibilityObject* mathOverObject() { return nullptr; }
1048
1049     // Fraction components.
1050     virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
1051     virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
1052
1053     // Subscript/superscript components.
1054     virtual AccessibilityObject* mathBaseObject() { return nullptr; }
1055     virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
1056     virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
1057     
1058     // Fenced components.
1059     virtual String mathFencedOpenString() const { return String(); }
1060     virtual String mathFencedCloseString() const { return String(); }
1061     virtual int mathLineThickness() const { return 0; }
1062     virtual bool isAnonymousMathOperator() const { return false; }
1063     
1064     // Multiscripts components.
1065     typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
1066     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
1067     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
1068     
1069     // Visibility.
1070     bool isARIAHidden() const;
1071     bool isDOMHidden() const;
1072     bool isHidden() const { return isARIAHidden() || isDOMHidden(); }
1073     
1074 #if HAVE(ACCESSIBILITY)
1075 #if PLATFORM(GTK)
1076     AccessibilityObjectWrapper* wrapper() const;
1077     void setWrapper(AccessibilityObjectWrapper*);
1078 #else
1079     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
1080     void setWrapper(AccessibilityObjectWrapper* wrapper) 
1081     {
1082         m_wrapper = wrapper;
1083     }
1084 #endif
1085 #endif
1086     
1087 #if PLATFORM(COCOA)
1088     void overrideAttachmentParent(AccessibilityObject* parent);
1089 #else
1090     void overrideAttachmentParent(AccessibilityObject*) { }
1091 #endif
1092     
1093 #if HAVE(ACCESSIBILITY)
1094     // a platform-specific method for determining if an attachment is ignored
1095     bool accessibilityIgnoreAttachment() const;
1096     // gives platforms the opportunity to indicate if and how an object should be included
1097     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
1098 #else
1099     bool accessibilityIgnoreAttachment() const { return true; }
1100     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
1101 #endif
1102
1103 #if PLATFORM(IOS)
1104     int accessibilityPasswordFieldLength();
1105     bool hasTouchEventListener() const;
1106     bool isInputTypePopupButton() const;
1107 #endif
1108     
1109     // allows for an AccessibilityObject to update its render tree or perform
1110     // other operations update type operations
1111     void updateBackingStore();
1112     
1113 #if PLATFORM(COCOA)
1114     bool preventKeyboardDOMEventDispatch() const;
1115     void setPreventKeyboardDOMEventDispatch(bool);
1116 #endif
1117     
1118 #if PLATFORM(COCOA) && !PLATFORM(IOS)
1119     bool caretBrowsingEnabled() const;
1120     void setCaretBrowsingEnabled(bool);
1121 #endif
1122
1123     AccessibilityObject* focusableAncestor();
1124     AccessibilityObject* editableAncestor();
1125     AccessibilityObject* highestEditableAncestor();
1126     
1127     static const AccessibilityObject* matchedParent(const AccessibilityObject&, bool includeSelf, const WTF::Function<bool(const AccessibilityObject&)>&);
1128     
1129     void clearIsIgnoredFromParentData() { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
1130     void setIsIgnoredFromParentDataForChild(AccessibilityObject*);
1131     
1132 protected:
1133     AXID m_id;
1134     AccessibilityChildrenVector m_children;
1135     mutable bool m_haveChildren;
1136     AccessibilityRole m_role;
1137     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
1138     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData;
1139     bool m_childrenDirty;
1140     bool m_subtreeDirty;
1141
1142     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) { m_isIgnoredFromParentData = data; }
1143
1144     virtual bool computeAccessibilityIsIgnored() const { return true; }
1145
1146     // If this object itself scrolls, return its ScrollableArea.
1147     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
1148     virtual void scrollTo(const IntPoint&) const { }
1149     ScrollableArea* scrollableAreaAncestor() const;
1150     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
1151     
1152     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
1153     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1154     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1155     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
1156     virtual AccessibilityRole buttonRoleType() const;
1157     bool isOnscreen() const;
1158     bool dispatchTouchEvent();
1159
1160     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1161     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1162
1163 #if PLATFORM(GTK) && HAVE(ACCESSIBILITY)
1164     bool allowsTextRanges() const;
1165     unsigned getLengthForTextRange() const;
1166 #else
1167     bool allowsTextRanges() const { return isTextControl(); }
1168     unsigned getLengthForTextRange() const { return text().length(); }
1169 #endif
1170
1171 #if PLATFORM(COCOA)
1172     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1173 #elif PLATFORM(WIN)
1174     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1175 #elif PLATFORM(GTK)
1176     AtkObject* m_wrapper;
1177 #elif PLATFORM(WPE)
1178     RefPtr<AccessibilityObjectWrapper> m_wrapper;
1179 #endif
1180 };
1181
1182 #if !HAVE(ACCESSIBILITY)
1183 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1184 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1185 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1186 inline void AccessibilityObject::updateBackingStore() { }
1187 #endif
1188
1189 } // namespace WebCore
1190
1191 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
1192 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
1193     static bool isType(const WebCore::AccessibilityObject& object) { return object.predicate; } \
1194 SPECIALIZE_TYPE_TRAITS_END()