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