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