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