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