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