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