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