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