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