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