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