f7fb4132cafdca74a5c37c0012d1540cdc488d4f
[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 "AccessibilityObjectInterface.h"
33 #include "FloatQuad.h"
34 #include "HTMLTextFormControlElement.h"
35 #include "LayoutRect.h"
36 #include "Path.h"
37 #include "Range.h"
38 #include "TextIteratorBehavior.h"
39 #include "VisiblePosition.h"
40 #include "VisibleSelection.h"
41 #include <wtf/Forward.h>
42 #include <wtf/Function.h>
43 #include <wtf/RefPtr.h>
44 #include <wtf/Vector.h>
45
46 #if PLATFORM(COCOA)
47 #include <wtf/RetainPtr.h>
48 #elif PLATFORM(WIN)
49 #include "AccessibilityObjectWrapperWin.h"
50 #include "COMPtr.h"
51 #endif
52
53 #if PLATFORM(COCOA)
54
55 typedef struct _NSRange NSRange;
56
57 OBJC_CLASS NSArray;
58 OBJC_CLASS NSAttributedString;
59 OBJC_CLASS NSData;
60 OBJC_CLASS NSMutableAttributedString;
61 OBJC_CLASS NSString;
62 OBJC_CLASS NSValue;
63 OBJC_CLASS NSView;
64 OBJC_CLASS WebAccessibilityObjectWrapper;
65
66 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
67
68 #elif PLATFORM(GTK)
69 typedef struct _AtkObject AtkObject;
70 typedef struct _AtkObject AccessibilityObjectWrapper;
71 #elif PLATFORM(WPE)
72 class AccessibilityObjectWrapper : public RefCounted<AccessibilityObjectWrapper> { };
73 #else
74 class AccessibilityObjectWrapper;
75 #endif
76
77 namespace WebCore {
78
79 class AccessibilityObject;
80 class AXObjectCache;
81 class Element;
82 class Frame;
83 class FrameView;
84 class IntPoint;
85 class IntSize;
86 class Node;
87 class Page;
88 class RenderObject;
89 class ScrollableArea;
90 class ScrollView;
91 class Widget;
92
93 enum class AccessibilityTextSource {
94     Alternative,
95     Children,
96     Summary,
97     Help,
98     Visible,
99     TitleTag,
100     Placeholder,
101     LabelByElement,
102     Title,
103     Subtitle,
104     Action,
105 };
106
107 enum class AccessibilityEventType {
108     ContextMenu,
109     Click,
110     Decrement,
111     Dismiss,
112     Focus,
113     Increment,
114     ScrollIntoView,
115     Select,
116 };
117     
118 struct AccessibilityText {
119     String text;
120     AccessibilityTextSource textSource;
121     Vector<RefPtr<AccessibilityObject>> textElements;
122     
123     AccessibilityText(const String& t, const AccessibilityTextSource& s)
124         : text(t)
125         , textSource(s)
126     { }
127
128     AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<RefPtr<AccessibilityObject>> elements)
129         : text(t)
130         , textSource(s)
131         , textElements(WTFMove(elements))
132     { }
133
134     AccessibilityText(const String& t, const AccessibilityTextSource& s, RefPtr<AccessibilityObject>&& element)
135         : text(t)
136         , textSource(s)
137     {
138         textElements.append(WTFMove(element));
139     }
140 };
141
142 struct AccessibilityTextUnderElementMode {
143     enum ChildrenInclusion {
144         TextUnderElementModeSkipIgnoredChildren,
145         TextUnderElementModeIncludeAllChildren,
146         TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
147     };
148     
149     ChildrenInclusion childrenInclusion;
150     bool includeFocusableContent;
151     Node* ignoredChildNode;
152     
153     AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
154         : childrenInclusion(c)
155         , includeFocusableContent(i)
156         , ignoredChildNode(ignored)
157     { }
158 };
159
160 // Use this struct to store the isIgnored data that depends on the parents, so that in addChildren()
161 // we avoid going up the parent chain for each element while traversing the tree with useful information already.
162 struct AccessibilityIsIgnoredFromParentData {
163     AccessibilityObject* parent { nullptr };
164     bool isAXHidden { false };
165     bool isPresentationalChildOfAriaRole { false };
166     bool isDescendantOfBarrenParent { false };
167     
168     AccessibilityIsIgnoredFromParentData(AccessibilityObject* parent = nullptr)
169         : parent(parent)
170     { }
171
172     bool isNull() const { return !parent; }
173 };
174     
175 enum class AccessibilityOrientation {
176     Vertical,
177     Horizontal,
178     Undefined,
179 };
180     
181 enum class AccessibilityObjectInclusion {
182     IncludeObject,
183     IgnoreObject,
184     DefaultBehavior,
185 };
186     
187 enum class AccessibilityButtonState {
188     Off = 0,
189     On,
190     Mixed,
191 };
192     
193 enum class AccessibilitySortDirection {
194     None,
195     Ascending,
196     Descending,
197     Other,
198     Invalid,
199 };
200
201 enum class AccessibilitySearchDirection {
202     Next = 1,
203     Previous,
204 };
205
206 enum class AccessibilitySearchKey {
207     AnyType = 1,
208     Article,
209     BlockquoteSameLevel,
210     Blockquote,
211     BoldFont,
212     Button,
213     CheckBox,
214     Control,
215     DifferentType,
216     FontChange,
217     FontColorChange,
218     Frame,
219     Graphic,
220     HeadingLevel1,
221     HeadingLevel2,
222     HeadingLevel3,
223     HeadingLevel4,
224     HeadingLevel5,
225     HeadingLevel6,
226     HeadingSameLevel,
227     Heading,
228     Highlighted,
229     ItalicFont,
230     Landmark,
231     Link,
232     List,
233     LiveRegion,
234     MisspelledWord,
235     Outline,
236     PlainText,
237     RadioGroup,
238     SameType,
239     StaticText,
240     StyleChange,
241     TableSameLevel,
242     Table,
243     TextField,
244     Underline,
245     UnvisitedLink,
246     VisitedLink,
247 };
248
249 enum class AccessibilityVisiblePositionForBounds {
250     First,
251     Last,
252 };
253
254 struct AccessibilitySearchCriteria {
255     AccessibilityObject* startObject;
256     AccessibilitySearchDirection searchDirection;
257     Vector<AccessibilitySearchKey> searchKeys;
258     String searchText;
259     unsigned resultsLimit;
260     bool visibleOnly;
261     bool immediateDescendantsOnly;
262     
263     AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
264         : startObject(startObject)
265         , searchDirection(searchDirection)
266         , searchText(searchText)
267         , resultsLimit(resultsLimit)
268         , visibleOnly(visibleOnly)
269         , immediateDescendantsOnly(immediateDescendantsOnly)
270     { }
271 };
272     
273 enum class AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
274
275 struct VisiblePositionRange {
276
277     VisiblePosition start;
278     VisiblePosition end;
279
280     VisiblePositionRange() {}
281
282     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
283         : start(s)
284         , end(e)
285     { }
286
287     VisiblePositionRange(const VisibleSelection& selection)
288         : start(selection.start())
289         , end(selection.end())
290     { }
291
292     bool isNull() const { return start.isNull() || end.isNull(); }
293 };
294
295 struct PlainTextRange {
296         
297     unsigned start { 0 };
298     unsigned length { 0 };
299     
300     PlainTextRange() = default;
301     
302     PlainTextRange(unsigned s, unsigned l)
303         : start(s)
304         , length(l)
305     { }
306     
307     bool isNull() const { return !start && !length; }
308 };
309
310 enum class AccessibilitySelectTextActivity {
311     FindAndReplace,
312     FindAndSelect,
313     FindAndCapitalize,
314     FindAndLowercase,
315     FindAndUppercase
316 };
317
318 enum class AccessibilitySelectTextAmbiguityResolution {
319     ClosestAfter,
320     ClosestBefore,
321     ClosestTo
322 };
323
324 struct AccessibilitySelectTextCriteria {
325     AccessibilitySelectTextActivity activity;
326     AccessibilitySelectTextAmbiguityResolution ambiguityResolution;
327     String replacementString;
328     Vector<String> searchStrings;
329     
330     AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString)
331         : activity(activity)
332         , ambiguityResolution(ambiguityResolution)
333         , replacementString(replacementString)
334     { }
335 };
336
337 enum class AccessibilityMathScriptObjectType { Subscript, Superscript };
338 enum class AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
339
340 enum class AccessibilityCurrentState { False, True, Page, Step, Location, Date, Time };
341     
342 bool nodeHasPresentationRole(Node*);
343     
344 class AccessibilityObject : public RefCounted<AccessibilityObject>, public AccessibilityObjectInterface {
345 protected:
346     AccessibilityObject() = default;
347     
348 public:
349     virtual ~AccessibilityObject();
350
351     // After constructing an AccessibilityObject, it must be given a
352     // unique ID, then added to AXObjectCache, and finally init() must
353     // be called last.
354     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
355     virtual void init() { }
356
357     // When the corresponding WebCore object that this AccessibilityObject
358     // wraps is deleted, it must be detached.
359     virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr);
360     virtual bool isDetached() const;
361
362     typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector;
363     
364     virtual bool isAccessibilityNodeObject() const { return false; }    
365     virtual bool isAccessibilityRenderObject() const { return false; }
366     virtual bool isAccessibilityScrollbar() const { return false; }
367     virtual bool isAccessibilityScrollView() const { return false; }
368     virtual bool isAccessibilitySVGRoot() const { return false; }
369     virtual bool isAccessibilitySVGElement() const { return false; }
370
371     bool accessibilityObjectContainsText(String *) const;
372
373     virtual bool isAttachmentElement() const { return false; }
374     virtual bool isHeading() const { return false; }
375     virtual bool isLink() const { return false; }
376     virtual bool isImage() const { return false; }
377     virtual bool isImageMap() const { return roleValue() == AccessibilityRole::ImageMap; }
378     virtual bool isNativeImage() const { return false; }
379     virtual bool isImageButton() const { return false; }
380     virtual bool isPasswordField() const { return false; }
381     bool isContainedByPasswordField() const;
382     virtual AccessibilityObject* passwordFieldOrContainingPasswordField() { return nullptr; }
383     virtual bool isNativeTextControl() const { return false; }
384     virtual bool isSearchField() const { return false; }
385     bool isWebArea() const { return roleValue() == AccessibilityRole::WebArea; }
386     virtual bool isCheckbox() const { return roleValue() == AccessibilityRole::CheckBox; }
387     virtual bool isRadioButton() const { return roleValue() == AccessibilityRole::RadioButton; }
388     virtual bool isNativeListBox() const { return false; }
389     bool isListBox() const { return roleValue() == AccessibilityRole::ListBox; }
390     virtual bool isListBoxOption() const { return false; }
391     virtual bool isAttachment() const { return false; }
392     virtual bool isMediaTimeline() const { return false; }
393     virtual bool isMenuRelated() const { return false; }
394     virtual bool isMenu() const { return false; }
395     virtual bool isMenuBar() const { return false; }
396     virtual bool isMenuButton() const { return false; }
397     virtual bool isMenuItem() const { return false; }
398     virtual bool isFileUploadButton() const { return false; }
399     virtual bool isInputImage() const { return false; }
400     virtual bool isProgressIndicator() const { return false; }
401     virtual bool isSlider() const { return false; }
402     virtual bool isSliderThumb() const { return false; }
403     virtual bool isInputSlider() const { return false; }
404     virtual bool isControl() const { return false; }
405     virtual bool isLabel() const { return false; }
406     virtual bool isList() const { return false; }
407     virtual bool isTable() const { return false; }
408     virtual bool isDataTable() const { return false; }
409     virtual bool isTableRow() const { return false; }
410     virtual bool isTableColumn() const { return false; }
411     virtual bool isTableCell() const { return false; }
412     virtual bool isFieldset() const { return false; }
413     virtual bool isGroup() const { return false; }
414     virtual bool isARIATreeGridRow() const { return false; }
415     virtual bool isImageMapLink() const { return false; }
416     virtual bool isMenuList() const { return false; }
417     virtual bool isMenuListPopup() const { return false; }
418     virtual bool isMenuListOption() const { return false; }
419     virtual bool isSpinButton() const { return roleValue() == AccessibilityRole::SpinButton; }
420     virtual bool isNativeSpinButton() const { return false; }
421     virtual bool isSpinButtonPart() const { return false; }
422     virtual bool isMockObject() const { return false; }
423     virtual bool isMediaControlLabel() const { return false; }
424     virtual bool isMediaObject() const { return false; }
425     bool isSwitch() const { return roleValue() == AccessibilityRole::Switch; }
426     bool isToggleButton() const { return roleValue() == AccessibilityRole::ToggleButton; }
427     bool isTextControl() const;
428     bool isARIATextControl() const;
429     bool isNonNativeTextControl() const;
430     bool isTabList() const { return roleValue() == AccessibilityRole::TabList; }
431     bool isTabItem() const { return roleValue() == AccessibilityRole::Tab; }
432     bool isRadioGroup() const { return roleValue() == AccessibilityRole::RadioGroup; }
433     bool isComboBox() const { return roleValue() == AccessibilityRole::ComboBox; }
434     bool isTree() const { return roleValue() == AccessibilityRole::Tree; }
435     bool isTreeGrid() const { return roleValue() == AccessibilityRole::TreeGrid; }
436     bool isTreeItem() const { return roleValue() == AccessibilityRole::TreeItem; }
437     bool isScrollbar() const { return roleValue() == AccessibilityRole::ScrollBar; }
438     bool isButton() const;
439     bool isListItem() const { return roleValue() == AccessibilityRole::ListItem; }
440     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
441     bool isScrollView() const { return roleValue() == AccessibilityRole::ScrollArea; }
442     bool isCanvas() const { return roleValue() == AccessibilityRole::Canvas; }
443     bool isPopUpButton() const { return roleValue() == AccessibilityRole::PopUpButton; }
444     bool isBlockquote() const;
445     bool isLandmark() const;
446     bool isColorWell() const { return roleValue() == AccessibilityRole::ColorWell; }
447     bool isRangeControl() const;
448     bool isMeter() const;
449     bool isSplitter() const { return roleValue() == AccessibilityRole::Splitter; }
450     bool isToolbar() const { return roleValue() == AccessibilityRole::Toolbar; }
451     bool isStyleFormatGroup() const;
452     bool isSubscriptStyleGroup() const;
453     bool isSuperscriptStyleGroup() const;
454     bool isFigureElement() const;
455     bool isSummary() const { return roleValue() == AccessibilityRole::Summary; }
456     bool isOutput() const;
457     
458     virtual bool isChecked() const { return false; }
459     virtual bool isEnabled() const { return false; }
460     virtual bool isSelected() const { return false; }
461     virtual bool isFocused() const { return false; }
462     virtual bool isHovered() const { return false; }
463     virtual bool isIndeterminate() const { return false; }
464     virtual bool isLoaded() const { return false; }
465     virtual bool isMultiSelectable() const { return false; }
466     virtual bool isOffScreen() const { return false; }
467     virtual bool isPressed() const { return false; }
468     virtual bool isUnvisited() const { return false; }
469     virtual bool isVisited() const { return false; }
470     virtual bool isRequired() const { return false; }
471     virtual bool supportsRequiredAttribute() const { return false; }
472     virtual bool isLinked() const { return false; }
473     virtual bool isExpanded() const;
474     virtual bool isVisible() const { return true; }
475     virtual bool isCollapsed() const { return false; }
476     virtual void setIsExpanded(bool) { }
477
478     // In a multi-select list, many items can be selected but only one is active at a time.
479     virtual bool isSelectedOptionActive() const { return false; }
480
481     virtual bool hasBoldFont() const { return false; }
482     virtual bool hasItalicFont() const { return false; }
483     bool hasMisspelling() const;
484     virtual bool hasPlainText() const { return false; }
485     virtual bool hasSameFont(RenderObject*) const { return false; }
486     virtual bool hasSameFontColor(RenderObject*) const { return false; }
487     virtual bool hasSameStyle(RenderObject*) const { return false; }
488     bool isStaticText() const { return roleValue() == AccessibilityRole::StaticText; }
489     virtual bool hasUnderline() const { return false; }
490     bool hasHighlighting() const;
491
492     bool supportsDatetimeAttribute() const;
493     const AtomicString& datetimeAttributeValue() const;
494     
495     virtual bool canSetFocusAttribute() const { return false; }
496     virtual bool canSetTextRangeAttributes() const { return false; }
497     virtual bool canSetValueAttribute() const { return false; }
498     virtual bool canSetNumericValue() const { return false; }
499     virtual bool canSetSelectedAttribute() const { return false; }
500     virtual bool canSetSelectedChildrenAttribute() const { return false; }
501     virtual bool canSetExpandedAttribute() const { return false; }
502     
503     virtual Element* element() const;
504     virtual Node* node() const { return nullptr; }
505     virtual RenderObject* renderer() const { return nullptr; }
506     virtual bool accessibilityIsIgnored() const;
507     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
508     bool accessibilityIsIgnoredByDefault() const;
509     
510     bool isShowingValidationMessage() const;
511     String validationMessage() const;
512     
513     unsigned blockquoteLevel() const;
514     virtual int headingLevel() const { return 0; }
515     virtual int tableLevel() const { return 0; }
516     virtual AccessibilityButtonState checkboxOrRadioValue() const;
517     virtual String valueDescription() const { return String(); }
518     virtual float valueForRange() const { return 0.0f; }
519     virtual float maxValueForRange() const { return 0.0f; }
520     virtual float minValueForRange() const { return 0.0f; }
521     virtual float stepValueForRange() const { return 0.0f; }
522     virtual AccessibilityObject* selectedRadioButton() { return nullptr; }
523     virtual AccessibilityObject* selectedTabItem() { return nullptr; }
524     AccessibilityObject* selectedListItem();
525     virtual int layoutCount() const { return 0; }
526     virtual double estimatedLoadingProgress() const { return 0; }
527     static bool isARIAControl(AccessibilityRole);
528     static bool isARIAInput(AccessibilityRole);
529
530     virtual bool supportsARIAOwns() const { return false; }
531     bool isActiveDescendantOfFocusedContainer() const;
532     void ariaActiveDescendantReferencingElements(AccessibilityChildrenVector&) const;
533     void ariaControlsElements(AccessibilityChildrenVector&) const;
534     void ariaControlsReferencingElements(AccessibilityChildrenVector&) const;
535     void ariaDescribedByElements(AccessibilityChildrenVector&) const;
536     void ariaDescribedByReferencingElements(AccessibilityChildrenVector&) const;
537     void ariaDetailsElements(AccessibilityChildrenVector&) const;
538     void ariaDetailsReferencingElements(AccessibilityChildrenVector&) const;
539     void ariaErrorMessageElements(AccessibilityChildrenVector&) const;
540     void ariaErrorMessageReferencingElements(AccessibilityChildrenVector&) const;
541     void ariaFlowToElements(AccessibilityChildrenVector&) const;
542     void ariaFlowToReferencingElements(AccessibilityChildrenVector&) const;
543     void ariaLabelledByElements(AccessibilityChildrenVector&) const;
544     void ariaLabelledByReferencingElements(AccessibilityChildrenVector&) const;
545     void ariaOwnsElements(AccessibilityChildrenVector&) const;
546     void ariaOwnsReferencingElements(AccessibilityChildrenVector&) const;
547
548     virtual bool hasPopup() const { return false; }
549     String hasPopupValue() const;
550     bool supportsHasPopup() const;
551     bool pressedIsPresent() const;
552     bool ariaIsMultiline() const;
553     String invalidStatus() const;
554     bool supportsPressed() const;
555     bool supportsExpanded() const;
556     bool supportsChecked() const;
557     AccessibilitySortDirection sortDirection() const;
558     virtual bool canvasHasFallbackContent() const { return false; }
559     bool supportsRangeValue() const;
560     const AtomicString& identifierAttribute() const;
561     const AtomicString& linkRelValue() const;
562     void classList(Vector<String>&) const;
563     virtual String roleDescription() const;
564     AccessibilityCurrentState currentState() const;
565     String currentValue() const;
566     bool supportsCurrent() const;
567     const String keyShortcutsValue() const;
568     
569     // This function checks if the object should be ignored when there's a modal dialog displayed.
570     bool ignoredFromModalPresence() const;
571     bool isModalDescendant(Node*) const;
572     bool isModalNode() const;
573     
574     bool supportsSetSize() const;
575     bool supportsPosInSet() const;
576     int setSize() const;
577     int posInSet() const;
578     
579     // ARIA drag and drop
580     virtual bool supportsARIADropping() const { return false; }
581     virtual bool supportsARIADragging() const { return false; }
582     virtual bool isARIAGrabbed() { return false; }
583     virtual void setARIAGrabbed(bool) { }
584     virtual Vector<String> determineARIADropEffects() { return { }; }
585     
586     // Called on the root AX object to return the deepest available element.
587     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return nullptr; }
588     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
589     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
590
591     virtual AccessibilityObject* focusedUIElement() const;
592
593     virtual AccessibilityObject* firstChild() const { return nullptr; }
594     virtual AccessibilityObject* lastChild() const { return nullptr; }
595     virtual AccessibilityObject* previousSibling() const { return nullptr; }
596     virtual AccessibilityObject* nextSibling() const { return nullptr; }
597     virtual AccessibilityObject* nextSiblingUnignored(int limit) const;
598     virtual AccessibilityObject* previousSiblingUnignored(int limit) const;
599     virtual AccessibilityObject* parentObject() const = 0;
600     virtual AccessibilityObject* parentObjectUnignored() const;
601     virtual AccessibilityObject* parentObjectIfExists() const { return nullptr; }
602     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
603     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
604     virtual bool isDescendantOfBarrenParent() const { return false; }
605
606     bool isDescendantOfRole(AccessibilityRole) const;
607     
608     // Text selection
609     RefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String>&) const;
610     RefPtr<Range> selectionRange() const;
611     String selectText(AccessibilitySelectTextCriteria*);
612     
613     virtual AccessibilityObject* observableObject() const { return nullptr; }
614     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
615     virtual AccessibilityObject* titleUIElement() const { return nullptr; }
616     virtual bool exposesTitleUIElement() const { return true; }
617     virtual AccessibilityObject* correspondingLabelForControlElement() const { return nullptr; }
618     virtual AccessibilityObject* correspondingControlForLabelElement() const { return nullptr; }
619     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return nullptr; }
620     
621     virtual AccessibilityRole ariaRoleAttribute() const { return AccessibilityRole::Unknown; }
622     virtual bool isPresentationalChildOfAriaRole() const { return false; }
623     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
624     virtual bool inheritsPresentationalRole() const { return false; }
625
626     // Accessibility Text
627     virtual void accessibilityText(Vector<AccessibilityText>&) { };
628     // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
629     String computedLabel();
630     
631     // A programmatic way to set a name on an AccessibleObject.
632     virtual void setAccessibleName(const AtomicString&) { }
633     virtual bool hasAttributesRequiredForInclusion() const;
634
635     // Accessibility Text - (To be deprecated).
636     virtual String accessibilityDescription() const { return String(); }
637     virtual String title() const { return String(); }
638     virtual String helpText() const { return String(); }
639
640     // Methods for determining accessibility text.
641     bool isARIAStaticText() const { return ariaRoleAttribute() == AccessibilityRole::StaticText; }
642     virtual String stringValue() const { return String(); }
643     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); }
644     virtual String text() const { return String(); }
645     virtual int textLength() const { return 0; }
646     virtual String ariaLabeledByAttribute() const { return String(); }
647     virtual String ariaDescribedByAttribute() const { return String(); }
648     const String placeholderValue() const;
649     bool accessibleNameDerivesFromContent() const;
650     
651     // Abbreviations
652     virtual String expandedTextValue() const { return String(); }
653     virtual bool supportsExpandedTextValue() const { return false; }
654     
655     void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const;
656
657     // Only if isColorWell()
658     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
659
660     virtual AccessibilityRole roleValue() const { return m_role; }
661
662     virtual AXObjectCache* axObjectCache() const;
663     AXID axObjectID() const { return m_id; }
664     
665     static AccessibilityObject* anchorElementForNode(Node*);
666     static AccessibilityObject* headingElementForNode(Node*);
667     virtual Element* anchorElement() const { return nullptr; }
668     bool supportsPressAction() const;
669     virtual Element* actionElement() const { return nullptr; }
670     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
671     IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
672     virtual LayoutRect elementRect() const = 0;
673     LayoutSize size() const { return elementRect().size(); }
674     virtual IntPoint clickPoint();
675     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
676     virtual Path elementPath() const { return Path(); }
677     virtual bool supportsPath() const { return false; }
678     
679     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
680     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
681     unsigned selectionStart() const { return selectedTextRange().start; }
682     unsigned selectionEnd() const { return selectedTextRange().length; }
683     
684     virtual URL url() const { return URL(); }
685     virtual VisibleSelection selection() const { return VisibleSelection(); }
686     virtual String selectedText() const { return String(); }
687     virtual const AtomicString& accessKey() const { return nullAtom(); }
688     const String& actionVerb() const;
689     virtual Widget* widget() const { return nullptr; }
690     virtual Widget* widgetForAttachmentView() const { return nullptr; }
691     Page* page() const;
692     virtual Document* document() const;
693     virtual FrameView* documentFrameView() const;
694     Frame* frame() const;
695     Frame* mainFrame() const;
696     Document* topDocument() const;
697     ScrollView* scrollViewAncestor() const;
698     String language() const;
699     // 1-based, to match the aria-level spec.
700     virtual unsigned hierarchicalLevel() const { return 0; }
701     
702     virtual void setFocused(bool) { }
703     virtual void setSelectedText(const String&) { }
704     virtual void setSelectedTextRange(const PlainTextRange&) { }
705     virtual void setValue(const String&) { }
706     virtual void setValue(float) { }
707     virtual void setSelected(bool) { }
708     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
709     
710     virtual void makeRangeVisible(const PlainTextRange&) { }
711     virtual bool press();
712     bool performDefaultAction() { return press(); }
713     
714     virtual AccessibilityOrientation orientation() const;
715     virtual void increment() { }
716     virtual void decrement() { }
717
718     virtual void childrenChanged() { }
719     virtual void textChanged() { }
720     virtual void updateAccessibilityRole() { }
721     const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true);
722     virtual void addChildren() { }
723     virtual void addChild(AccessibilityObject*);
724     virtual void insertChild(AccessibilityObject*, unsigned);
725
726     virtual bool shouldIgnoreAttributeRole() const { return false; }
727     
728     virtual bool canHaveChildren() const { return true; }
729     virtual bool hasChildren() const { return m_haveChildren; }
730     virtual void updateChildrenIfNecessary();
731     virtual void setNeedsToUpdateChildren() { }
732     virtual void setNeedsToUpdateSubtree() { }
733     virtual void clearChildren();
734     virtual bool needsToUpdateChildren() const { return false; }
735 #if PLATFORM(COCOA)
736     virtual void detachFromParent();
737 #else
738     virtual void detachFromParent() { }
739 #endif
740     virtual bool isDetachedFromParent() { return false; }
741
742     virtual bool canHaveSelectedChildren() const { return false; }
743     virtual void selectedChildren(AccessibilityChildrenVector&) { }
744     virtual void visibleChildren(AccessibilityChildrenVector&) { }
745     virtual void tabChildren(AccessibilityChildrenVector&) { }
746     virtual bool shouldFocusActiveDescendant() const { return false; }
747     virtual AccessibilityObject* activeDescendant() const { return nullptr; }
748     virtual void handleActiveDescendantChanged() { }
749     virtual void handleAriaExpandedChanged() { }
750     bool isDescendantOfObject(const AccessibilityObject*) const;
751     bool isAncestorOfObject(const AccessibilityObject*) const;
752     AccessibilityObject* firstAnonymousBlockChild() const;
753
754     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
755     bool hasAttribute(const QualifiedName&) const;
756     const AtomicString& getAttribute(const QualifiedName&) const;
757     bool hasTagName(const QualifiedName&) const;
758     
759     bool shouldDispatchAccessibilityEvent() const;
760     bool dispatchAccessibilityEvent(Event&) const;
761     bool dispatchAccessibilityEventWithType(AccessibilityEventType) const;
762     bool dispatchAccessibleSetValueEvent(const String&) const;
763
764     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
765     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
766     
767     RefPtr<Range> elementRange() const;
768     static bool replacedNodeNeedsCharacter(Node* replacedNode);
769     
770     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
771     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
772     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
773     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
774     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
775     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
776     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
777     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
778     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
779     VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
780     
781     RefPtr<Range> rangeForPlainTextRange(const PlainTextRange&) const;
782
783     static String stringForVisiblePositionRange(const VisiblePositionRange&);
784     String stringForRange(RefPtr<Range>) const;
785     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
786     virtual IntRect boundsForRange(const RefPtr<Range>) const { return IntRect(); }
787     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
788     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
789
790     VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
791     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
792     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
793     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
794     VisiblePosition nextWordEnd(const VisiblePosition&) const;
795     VisiblePosition previousWordStart(const VisiblePosition&) const;
796     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
797     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
798     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
799     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
800     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
801     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
802     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
803     
804     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
805     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
806
807     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
808     int lineForPosition(const VisiblePosition&) const;
809     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
810     virtual int index(const VisiblePosition&) const { return -1; }
811
812     virtual void lineBreaks(Vector<int>&) const { }
813     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
814     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
815     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
816     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
817
818     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
819     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
820     virtual IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const { return IntRect(); }
821     static String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&);
822
823     unsigned doAXLineForIndex(unsigned);
824
825     String computedRoleString() const;
826
827     virtual String stringValueForMSAA() const { return String(); }
828     virtual String stringRoleForMSAA() const { return String(); }
829     virtual String nameForMSAA() const { return String(); }
830     virtual String descriptionForMSAA() const { return String(); }
831     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
832
833     virtual String passwordFieldValue() const { return String(); }
834     bool isValueAutofilled() const;
835     bool isValueAutofillAvailable() const;
836     AutoFillButtonType valueAutofillButtonType() const;
837     
838     // Used by an ARIA tree to get all its rows.
839     void ariaTreeRows(AccessibilityChildrenVector&);
840     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
841     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
842     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
843     void ariaTreeItemContent(AccessibilityChildrenVector&);
844     
845     // ARIA live-region features.
846     bool supportsLiveRegion(bool excludeIfOff = true) const;
847     bool isInsideLiveRegion(bool excludeIfOff = true) const;
848     AccessibilityObject* liveRegionAncestor(bool excludeIfOff = true) const;
849     virtual const String liveRegionStatus() const { return String(); }
850     virtual const String liveRegionRelevant() const { return nullAtom(); }
851     virtual bool liveRegionAtomic() const { return false; }
852     virtual bool isBusy() const { return false; }
853     static const String defaultLiveRegionStatusForRole(AccessibilityRole);
854     static bool liveRegionStatusIsEnabled(const AtomicString&);
855     static bool contentEditableAttributeIsEnabled(Element*);
856     bool hasContentEditableAttributeSet() const;
857
858     bool supportsReadOnly() const;
859     virtual String readOnlyValue() const;
860
861     bool supportsAutoComplete() const;
862     String autoCompleteValue() const;
863     
864     bool supportsARIAAttributes() const;
865     
866     // CSS3 Speech properties.
867     virtual OptionSet<SpeakAs> speakAsProperty() const { return OptionSet<SpeakAs> { }; }
868
869     // Make this object visible by scrolling as many nested scrollable views as needed.
870     virtual void scrollToMakeVisible() const;
871     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
872     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
873     // Scroll this object to a given point in global coordinates of the top-level window.
874     virtual void scrollToGlobalPoint(const IntPoint&) const;
875     
876     enum class ScrollByPageDirection { Up, Down, Left, Right };
877     bool scrollByPage(ScrollByPageDirection) const;
878     IntPoint scrollPosition() const;
879     IntSize scrollContentsSize() const;    
880     IntRect scrollVisibleContentRect() const;
881     
882     bool lastKnownIsIgnoredValue();
883     void setLastKnownIsIgnoredValue(bool);
884
885     // Fires a children changed notification on the parent if the isIgnored value changed.
886     void notifyIfIgnoredValueChanged();
887
888     // All math elements return true for isMathElement().
889     virtual bool isMathElement() const { return false; }
890     virtual bool isMathFraction() const { return false; }
891     virtual bool isMathFenced() const { return false; }
892     virtual bool isMathSubscriptSuperscript() const { return false; }
893     virtual bool isMathRow() const { return false; }
894     virtual bool isMathUnderOver() const { return false; }
895     virtual bool isMathRoot() const { return false; }
896     virtual bool isMathSquareRoot() const { return false; }
897     virtual bool isMathText() const { return false; }
898     virtual bool isMathNumber() const { return false; }
899     virtual bool isMathOperator() const { return false; }
900     virtual bool isMathFenceOperator() const { return false; }
901     virtual bool isMathSeparatorOperator() const { return false; }
902     virtual bool isMathIdentifier() const { return false; }
903     virtual bool isMathTable() const { return false; }
904     virtual bool isMathTableRow() const { return false; }
905     virtual bool isMathTableCell() const { return false; }
906     virtual bool isMathMultiscript() const { return false; }
907     virtual bool isMathToken() const { return false; }
908     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const { return false; }
909     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const { return false; }
910
911     // Root components.
912     virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
913     virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
914     
915     // Under over components.
916     virtual AccessibilityObject* mathUnderObject() { return nullptr; }
917     virtual AccessibilityObject* mathOverObject() { return nullptr; }
918
919     // Fraction components.
920     virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
921     virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
922
923     // Subscript/superscript components.
924     virtual AccessibilityObject* mathBaseObject() { return nullptr; }
925     virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
926     virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
927     
928     // Fenced components.
929     virtual String mathFencedOpenString() const { return String(); }
930     virtual String mathFencedCloseString() const { return String(); }
931     virtual int mathLineThickness() const { return 0; }
932     virtual bool isAnonymousMathOperator() const { return false; }
933     
934     // Multiscripts components.
935     typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
936     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
937     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
938     
939     // Visibility.
940     bool isAXHidden() const;
941     bool isDOMHidden() const;
942     bool isHidden() const { return isAXHidden() || isDOMHidden(); }
943     
944 #if HAVE(ACCESSIBILITY)
945 #if PLATFORM(GTK)
946     AccessibilityObjectWrapper* wrapper() const;
947     void setWrapper(AccessibilityObjectWrapper*);
948 #else
949     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
950     void setWrapper(AccessibilityObjectWrapper* wrapper) 
951     {
952         m_wrapper = wrapper;
953     }
954 #endif
955 #endif
956     
957 #if PLATFORM(COCOA)
958     void overrideAttachmentParent(AccessibilityObject* parent);
959 #else
960     void overrideAttachmentParent(AccessibilityObject*) { }
961 #endif
962     
963 #if HAVE(ACCESSIBILITY)
964     // a platform-specific method for determining if an attachment is ignored
965     bool accessibilityIgnoreAttachment() const;
966     // gives platforms the opportunity to indicate if and how an object should be included
967     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
968 #else
969     bool accessibilityIgnoreAttachment() const { return true; }
970     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return AccessibilityObjectInclusion::DefaultBehavior; }
971 #endif
972
973 #if PLATFORM(IOS_FAMILY)
974     int accessibilityPasswordFieldLength();
975     bool hasTouchEventListener() const;
976     bool isInputTypePopupButton() const;
977     bool hasAccessibleDismissEventListener() const;
978 #endif
979     
980     // allows for an AccessibilityObject to update its render tree or perform
981     // other operations update type operations
982     void updateBackingStore();
983     
984 #if PLATFORM(COCOA)
985     bool preventKeyboardDOMEventDispatch() const;
986     void setPreventKeyboardDOMEventDispatch(bool);
987 #endif
988     
989 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY)
990     bool caretBrowsingEnabled() const;
991     void setCaretBrowsingEnabled(bool);
992 #endif
993
994     AccessibilityObject* focusableAncestor();
995     AccessibilityObject* editableAncestor();
996     AccessibilityObject* highestEditableAncestor();
997     
998     static const AccessibilityObject* matchedParent(const AccessibilityObject&, bool includeSelf, const WTF::Function<bool(const AccessibilityObject&)>&);
999     
1000     void clearIsIgnoredFromParentData() { m_isIgnoredFromParentData = AccessibilityIsIgnoredFromParentData(); }
1001     void setIsIgnoredFromParentDataForChild(AccessibilityObject*);
1002     
1003 protected:
1004     AXID m_id { 0 };
1005     AccessibilityChildrenVector m_children;
1006     mutable bool m_haveChildren { false };
1007     AccessibilityRole m_role { AccessibilityRole::Unknown };
1008     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue { AccessibilityObjectInclusion::DefaultBehavior };
1009     AccessibilityIsIgnoredFromParentData m_isIgnoredFromParentData { };
1010     bool m_childrenDirty { false };
1011     bool m_subtreeDirty { false };
1012 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
1013     bool m_isolatedTreeNodeInitialized { false };
1014 #endif
1015     
1016     void setIsIgnoredFromParentData(AccessibilityIsIgnoredFromParentData& data) { m_isIgnoredFromParentData = data; }
1017
1018     virtual bool computeAccessibilityIsIgnored() const { return true; }
1019
1020     // If this object itself scrolls, return its ScrollableArea.
1021     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
1022     virtual void scrollTo(const IntPoint&) const { }
1023     ScrollableArea* scrollableAreaAncestor() const;
1024     void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
1025     
1026     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
1027     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1028     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1029     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
1030     virtual AccessibilityRole buttonRoleType() const;
1031     bool isOnscreen() const;
1032     bool dispatchTouchEvent();
1033
1034     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1035     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
1036
1037     AccessibilityObject* radioGroupAncestor() const;
1038
1039 #if PLATFORM(GTK) && HAVE(ACCESSIBILITY)
1040     bool allowsTextRanges() const;
1041     unsigned getLengthForTextRange() const;
1042 #else
1043     bool allowsTextRanges() const { return isTextControl(); }
1044     unsigned getLengthForTextRange() const { return text().length(); }
1045 #endif
1046
1047 #if PLATFORM(COCOA)
1048     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1049 #elif PLATFORM(WIN)
1050     COMPtr<AccessibilityObjectWrapper> m_wrapper;
1051 #elif PLATFORM(GTK)
1052     AtkObject* m_wrapper { nullptr };
1053 #elif PLATFORM(WPE)
1054     RefPtr<AccessibilityObjectWrapper> m_wrapper;
1055 #endif
1056 };
1057
1058 #if !HAVE(ACCESSIBILITY)
1059 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1060 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1061 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1062 inline void AccessibilityObject::updateBackingStore() { }
1063 #endif
1064
1065 } // namespace WebCore
1066
1067 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
1068 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
1069     static bool isType(const WebCore::AccessibilityObject& object) { return object.predicate; } \
1070 SPECIALIZE_TYPE_TRAITS_END()