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