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