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