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