AX: [ATK] Attempting to clear selection on ARIA listboxes results in crash
[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) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
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     ApplicationLogRole,
99     ApplicationMarqueeRole,
100     ApplicationStatusRole,
101     ApplicationTimerRole,
102     AudioRole,
103     BlockquoteRole,
104     BrowserRole,
105     BusyIndicatorRole,
106     ButtonRole,
107     CanvasRole,
108     CaptionRole,
109     CellRole, 
110     CheckBoxRole,
111     ColorWellRole,
112     ColumnRole,
113     ColumnHeaderRole,
114     ComboBoxRole,
115     DefinitionRole,
116     DescriptionListRole,
117     DescriptionListTermRole,
118     DescriptionListDetailRole,
119     DetailsRole,
120     DirectoryRole,
121     DisclosureTriangleRole,
122     DivRole,
123     DocumentRole,
124     DocumentArticleRole,
125     DocumentMathRole,
126     DocumentNoteRole,
127     DrawerRole,
128     EditableTextRole,
129     FooterRole,
130     FormRole,
131     GridRole,
132     GridCellRole,
133     GroupRole,
134     GrowAreaRole,
135     HeadingRole,
136     HelpTagRole,
137     HorizontalRuleRole,
138     IgnoredRole,
139     InlineRole,
140     ImageRole,
141     ImageMapRole,
142     ImageMapLinkRole,
143     IncrementorRole,
144     LabelRole,
145     LandmarkBannerRole,
146     LandmarkComplementaryRole,
147     LandmarkContentInfoRole,
148     LandmarkMainRole,
149     LandmarkNavigationRole,
150     LandmarkRegionRole,
151     LandmarkSearchRole,
152     LegendRole,
153     LinkRole,
154     ListRole,
155     ListBoxRole,
156     ListBoxOptionRole,
157     ListItemRole,
158     ListMarkerRole,
159     MarkRole,
160     MathElementRole,
161     MatteRole,
162     MenuRole,
163     MenuBarRole,
164     MenuButtonRole,
165     MenuItemRole,
166     MenuItemCheckboxRole,
167     MenuItemRadioRole,
168     MenuListPopupRole,
169     MenuListOptionRole,
170     OutlineRole,
171     ParagraphRole,
172     PopUpButtonRole,
173     PreRole,
174     PresentationalRole,
175     ProgressIndicatorRole,
176     RadioButtonRole,
177     RadioGroupRole,
178     RowHeaderRole,
179     RowRole,
180     RowGroupRole,
181     RubyBaseRole,
182     RubyBlockRole,
183     RubyInlineRole,
184     RubyRunRole,
185     RubyTextRole,
186     RulerRole,
187     RulerMarkerRole,
188     ScrollAreaRole,
189     ScrollBarRole,
190     SearchFieldRole,
191     SheetRole,
192     SliderRole,
193     SliderThumbRole,
194     SpinButtonRole,
195     SpinButtonPartRole,
196     SplitGroupRole,
197     SplitterRole,
198     StaticTextRole,
199     SummaryRole,
200     SwitchRole,
201     SystemWideRole,
202     SVGRootRole,
203     SVGTextRole,
204     SVGTSpanRole,
205     SVGTextPathRole,
206     TabGroupRole,
207     TabListRole,
208     TabPanelRole,            
209     TabRole,
210     TableRole,
211     TableHeaderContainerRole,
212     TextAreaRole,
213     TreeRole,
214     TreeGridRole,
215     TreeItemRole,
216     TextFieldRole,
217     ToggleButtonRole,
218     ToolbarRole,
219     UnknownRole,
220     UserInterfaceTooltipRole,
221     ValueIndicatorRole,
222     VideoRole,
223     WebApplicationRole,
224     WebAreaRole,
225     WebCoreLinkRole,
226     WindowRole,
227 };
228
229 enum AccessibilityTextSource {
230     AlternativeText,
231     ChildrenText,
232     SummaryText,
233     HelpText,
234     VisibleText,
235     TitleTagText,
236     PlaceholderText,
237     LabelByElementText,
238     TitleText,
239     SubtitleText,
240     ActionText,
241 };
242     
243 struct AccessibilityText {
244     String text;
245     AccessibilityTextSource textSource;
246     Vector<RefPtr<AccessibilityObject>> textElements;
247     
248     AccessibilityText(const String& t, const AccessibilityTextSource& s)
249     : text(t)
250     , textSource(s)
251     { }
252
253     AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<RefPtr<AccessibilityObject>> elements)
254     : text(t)
255     , textSource(s)
256     , textElements(WTFMove(elements))
257     { }
258
259     AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AccessibilityObject> element)
260     : text(t)
261     , textSource(s)
262     {
263         textElements.append(element);
264     }
265 };
266
267 struct AccessibilityTextUnderElementMode {
268     enum ChildrenInclusion {
269         TextUnderElementModeSkipIgnoredChildren,
270         TextUnderElementModeIncludeAllChildren,
271         TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
272     };
273     
274     ChildrenInclusion childrenInclusion;
275     bool includeFocusableContent;
276     Node* ignoredChildNode;
277     
278     AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
279         : childrenInclusion(c)
280         , includeFocusableContent(i)
281         , ignoredChildNode(ignored)
282         { }
283 };
284     
285 enum AccessibilityOrientation {
286     AccessibilityOrientationVertical,
287     AccessibilityOrientationHorizontal,
288     AccessibilityOrientationUndefined,
289 };
290     
291 enum AccessibilityObjectInclusion {
292     IncludeObject,
293     IgnoreObject,
294     DefaultBehavior,
295 };
296     
297 enum AccessibilityButtonState {
298     ButtonStateOff = 0,
299     ButtonStateOn, 
300     ButtonStateMixed,
301 };
302     
303 enum AccessibilitySortDirection {
304     SortDirectionNone,
305     SortDirectionAscending,
306     SortDirectionDescending,
307     SortDirectionOther
308 };
309
310 enum AccessibilitySearchDirection {
311     SearchDirectionNext = 1,
312     SearchDirectionPrevious
313 };
314
315 enum AccessibilitySearchKey {
316     AnyTypeSearchKey = 1,
317     BlockquoteSameLevelSearchKey,
318     BlockquoteSearchKey,
319     BoldFontSearchKey,
320     ButtonSearchKey,
321     CheckBoxSearchKey,
322     ControlSearchKey,
323     DifferentTypeSearchKey,
324     FontChangeSearchKey,
325     FontColorChangeSearchKey,
326     FrameSearchKey,
327     GraphicSearchKey,
328     HeadingLevel1SearchKey,
329     HeadingLevel2SearchKey,
330     HeadingLevel3SearchKey,
331     HeadingLevel4SearchKey,
332     HeadingLevel5SearchKey,
333     HeadingLevel6SearchKey,
334     HeadingSameLevelSearchKey,
335     HeadingSearchKey,
336     HighlightedSearchKey,
337     ItalicFontSearchKey,
338     LandmarkSearchKey,
339     LinkSearchKey,
340     ListSearchKey,
341     LiveRegionSearchKey,
342     MisspelledWordSearchKey,
343     OutlineSearchKey,
344     PlainTextSearchKey,
345     RadioGroupSearchKey,
346     SameTypeSearchKey,
347     StaticTextSearchKey,
348     StyleChangeSearchKey,
349     TableSameLevelSearchKey,
350     TableSearchKey,
351     TextFieldSearchKey,
352     UnderlineSearchKey,
353     UnvisitedLinkSearchKey,
354     VisitedLinkSearchKey
355 };
356
357 enum AccessibilityVisiblePositionForBounds {
358     FirstVisiblePositionForBounds,
359     LastVisiblePositionForBounds
360 };
361
362 struct AccessibilitySearchCriteria {
363     AccessibilityObject* startObject;
364     AccessibilitySearchDirection searchDirection;
365     Vector<AccessibilitySearchKey> searchKeys;
366     String searchText;
367     unsigned resultsLimit;
368     bool visibleOnly;
369     bool immediateDescendantsOnly;
370     
371     AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
372         : startObject(startObject)
373         , searchDirection(searchDirection)
374         , searchText(searchText)
375         , resultsLimit(resultsLimit)
376         , visibleOnly(visibleOnly)
377         , immediateDescendantsOnly(immediateDescendantsOnly)
378     { }
379 };
380     
381 enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
382
383 struct VisiblePositionRange {
384
385     VisiblePosition start;
386     VisiblePosition end;
387
388     VisiblePositionRange() {}
389
390     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
391         : start(s)
392         , end(e)
393     { }
394
395     VisiblePositionRange(const VisibleSelection& selection)
396         : start(selection.start())
397         , end(selection.end())
398     { }
399
400     bool isNull() const { return start.isNull() || end.isNull(); }
401 };
402
403 struct PlainTextRange {
404         
405     unsigned start;
406     unsigned length;
407     
408     PlainTextRange()
409         : start(0)
410         , length(0)
411     { }
412     
413     PlainTextRange(unsigned s, unsigned l)
414         : start(s)
415         , length(l)
416     { }
417     
418     bool isNull() const { return !start && !length; }
419 };
420
421 enum AccessibilitySelectTextActivity {
422     FindAndReplaceActivity,
423     FindAndSelectActivity,
424     FindAndCapitalize,
425     FindAndLowercase,
426     FindAndUppercase
427 };
428
429 enum AccessibilitySelectTextAmbiguityResolution {
430     ClosestAfterSelectionAmbiguityResolution,
431     ClosestBeforeSelectionAmbiguityResolution,
432     ClosestToSelectionAmbiguityResolution
433 };
434
435 struct AccessibilitySelectTextCriteria {
436     AccessibilitySelectTextActivity activity;
437     AccessibilitySelectTextAmbiguityResolution ambiguityResolution;
438     String replacementString;
439     Vector<String> searchStrings;
440     
441     AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString)
442         : activity(activity)
443         , ambiguityResolution(ambiguityResolution)
444         , replacementString(replacementString)
445     { }
446 };
447
448 enum AccessibilityMathScriptObjectType { Subscript, Superscript };
449 enum AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
450
451 enum AccessibilityARIACurrentState { ARIACurrentFalse, ARIACurrentTrue, ARIACurrentPage, ARIACurrentStep, ARIACurrentLocation, ARIACurrentDate, ARIACurrentTime };
452
453 class AccessibilityObject : public RefCounted<AccessibilityObject> {
454 protected:
455     AccessibilityObject();
456     
457 public:
458     virtual ~AccessibilityObject();
459
460     // After constructing an AccessibilityObject, it must be given a
461     // unique ID, then added to AXObjectCache, and finally init() must
462     // be called last.
463     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
464     virtual void init() { }
465
466     // When the corresponding WebCore object that this AccessibilityObject
467     // wraps is deleted, it must be detached.
468     virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr);
469     virtual bool isDetached() const;
470
471     typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector;
472     
473     virtual bool isAccessibilityNodeObject() const { return false; }    
474     virtual bool isAccessibilityRenderObject() const { return false; }
475     virtual bool isAccessibilityScrollbar() const { return false; }
476     virtual bool isAccessibilityScrollView() const { return false; }
477     virtual bool isAccessibilitySVGRoot() const { return false; }
478     virtual bool isAccessibilitySVGElement() const { return false; }
479
480     bool accessibilityObjectContainsText(String *) const;
481
482     virtual bool isAttachmentElement() const { return false; }
483     virtual bool isHeading() const { return false; }
484     virtual bool isLink() const { return false; }
485     virtual bool isImage() const { return false; }
486     virtual bool isImageMap() const { return roleValue() == ImageMapRole; }
487     virtual bool isNativeImage() const { return false; }
488     virtual bool isImageButton() const { return false; }
489     virtual bool isPasswordField() const { return false; }
490     bool isContainedByPasswordField() const;
491     virtual AccessibilityObject* passwordFieldOrContainingPasswordField() { return nullptr; }
492     virtual bool isNativeTextControl() const { return false; }
493     virtual bool isSearchField() const { return false; }
494     bool isWebArea() const { return roleValue() == WebAreaRole; }
495     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
496     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
497     virtual bool isNativeListBox() const { return false; }
498     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()