AX: aria-hidden on container does not hide descendant popup buttons
[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 Computer, 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 "TextIterator.h"
36 #include "VisiblePosition.h"
37 #include "VisibleSelection.h"
38 #include <wtf/Forward.h>
39 #include <wtf/RefPtr.h>
40 #include <wtf/Vector.h>
41
42 #if PLATFORM(MAC)
43 #include <wtf/RetainPtr.h>
44 #elif PLATFORM(WIN) && !OS(WINCE)
45 #include "AccessibilityObjectWrapperWin.h"
46 #include "COMPtr.h"
47 #endif
48
49 #if PLATFORM(MAC)
50
51 typedef struct _NSRange NSRange;
52
53 OBJC_CLASS NSArray;
54 OBJC_CLASS NSAttributedString;
55 OBJC_CLASS NSData;
56 OBJC_CLASS NSMutableAttributedString;
57 OBJC_CLASS NSString;
58 OBJC_CLASS NSValue;
59 OBJC_CLASS NSView;
60 OBJC_CLASS WebAccessibilityObjectWrapper;
61
62 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
63
64 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
65 typedef struct _AtkObject AtkObject;
66 typedef struct _AtkObject AccessibilityObjectWrapper;
67 #elif PLATFORM(CHROMIUM)
68 // Chromium does not use a wrapper.
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 Node;
85 class Page;
86 class RenderObject;
87 class RenderListItem;
88 class ScrollableArea;
89 class VisibleSelection;
90 class Widget;
91
92 typedef unsigned AXID;
93
94 enum AccessibilityRole {
95     AnnotationRole = 1,
96     ApplicationRole,
97     ApplicationAlertRole,
98     ApplicationAlertDialogRole,
99     ApplicationDialogRole,
100     ApplicationLogRole,
101     ApplicationMarqueeRole,
102     ApplicationStatusRole,
103     ApplicationTimerRole, 
104     BrowserRole,
105     BusyIndicatorRole,
106     ButtonRole,
107     CanvasRole,
108     CellRole, 
109     CheckBoxRole,
110     ColorWellRole,
111     ColumnRole,
112     ColumnHeaderRole,
113     ComboBoxRole,
114     DefinitionRole,
115     DescriptionListTermRole,
116     DescriptionListDetailRole,
117     DirectoryRole,
118     DisclosureTriangleRole,
119     DivRole,
120     DocumentRole,
121     DocumentArticleRole,
122     DocumentMathRole,
123     DocumentNoteRole,
124     DocumentRegionRole,            
125     DrawerRole,
126     EditableTextRole,
127     FooterRole,
128     FormRole,
129     GridRole,
130     GroupRole,
131     GrowAreaRole,
132     HeadingRole,
133     HelpTagRole,
134     HorizontalRuleRole,
135     IgnoredRole,
136     ImageRole,
137     ImageMapRole,
138     ImageMapLinkRole,
139     IncrementorRole,
140     LabelRole,
141     LandmarkApplicationRole,
142     LandmarkBannerRole,
143     LandmarkComplementaryRole,
144     LandmarkContentInfoRole,
145     LandmarkMainRole,
146     LandmarkNavigationRole,
147     LandmarkSearchRole,
148     LegendRole,
149     LinkRole,
150     ListRole,
151     ListBoxRole,
152     ListBoxOptionRole,
153     ListItemRole,
154     ListMarkerRole,
155     MathElementRole,
156     MatteRole,
157     MenuRole,
158     MenuBarRole,
159     MenuButtonRole,
160     MenuItemRole,
161     MenuListPopupRole,
162     MenuListOptionRole,
163     OutlineRole,
164     ParagraphRole,
165     PopUpButtonRole,
166     PresentationalRole,
167     ProgressIndicatorRole,
168     RadioButtonRole,
169     RadioGroupRole,
170     RowHeaderRole,
171     RowRole,
172     RulerRole,
173     RulerMarkerRole,
174     ScrollAreaRole,
175     ScrollBarRole,
176     SeamlessWebAreaRole,
177     SheetRole,
178     SliderRole,
179     SliderThumbRole,
180     SpinButtonRole,
181     SpinButtonPartRole,
182     SplitGroupRole,
183     SplitterRole,
184     StaticTextRole,
185     SystemWideRole,
186     SVGRootRole,
187     TabGroupRole,
188     TabListRole,
189     TabPanelRole,            
190     TabRole,
191     TableRole,
192     TableHeaderContainerRole,
193     TextAreaRole,
194     TreeRole,
195     TreeGridRole,
196     TreeItemRole,
197     TextFieldRole,
198     ToggleButtonRole,
199     ToolbarRole,
200     UnknownRole,
201     UserInterfaceTooltipRole,
202     ValueIndicatorRole,            
203     WebAreaRole,
204     WebCoreLinkRole,
205     WindowRole,
206 };
207
208 enum AccessibilityTextSource {
209     AlternativeText,
210     ChildrenText,
211     SummaryText,
212     HelpText,
213     VisibleText,
214     TitleTagText,
215     PlaceholderText,
216     LabelByElementText,
217 };
218     
219 struct AccessibilityText {
220     String text;
221     AccessibilityTextSource textSource;
222     Vector<RefPtr<AccessibilityObject> > textElements;
223     
224     AccessibilityText(const String& t, const AccessibilityTextSource& s)
225     : text(t)
226     , textSource(s)
227     { }
228
229     AccessibilityText(const String& t, const AccessibilityTextSource& s, const Vector<RefPtr<AccessibilityObject> > elements)
230     : text(t)
231     , textSource(s)
232     , textElements(elements)
233     { }
234
235     AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AccessibilityObject> element)
236     : text(t)
237     , textSource(s)
238     {
239         textElements.append(element);
240     }
241 };
242     
243 enum AccessibilityOrientation {
244     AccessibilityOrientationVertical,
245     AccessibilityOrientationHorizontal,
246 };
247     
248 enum AccessibilityObjectInclusion {
249     IncludeObject,
250     IgnoreObject,
251     DefaultBehavior,
252 };
253     
254 enum AccessibilityButtonState {
255     ButtonStateOff = 0,
256     ButtonStateOn, 
257     ButtonStateMixed,
258 };
259     
260 enum AccessibilitySortDirection {
261     SortDirectionNone,
262     SortDirectionAscending,
263     SortDirectionDescending,
264 };
265
266 enum AccessibilitySearchDirection {
267     SearchDirectionNext = 1,
268     SearchDirectionPrevious
269 };
270
271 enum AccessibilitySearchKey {
272     AnyTypeSearchKey = 1,
273     BlockquoteSameLevelSearchKey,
274     BlockquoteSearchKey,
275     BoldFontSearchKey,
276     ButtonSearchKey,
277     CheckBoxSearchKey,
278     ControlSearchKey,
279     DifferentTypeSearchKey,
280     FontChangeSearchKey,
281     FontColorChangeSearchKey,
282     FrameSearchKey,
283     GraphicSearchKey,
284     HeadingLevel1SearchKey,
285     HeadingLevel2SearchKey,
286     HeadingLevel3SearchKey,
287     HeadingLevel4SearchKey,
288     HeadingLevel5SearchKey,
289     HeadingLevel6SearchKey,
290     HeadingSameLevelSearchKey,
291     HeadingSearchKey,
292     HighlightedSearchKey,
293     ItalicFontSearchKey,
294     LandmarkSearchKey,
295     LinkSearchKey,
296     ListSearchKey,
297     LiveRegionSearchKey,
298     MisspelledWordSearchKey,
299     PlainTextSearchKey,
300     RadioGroupSearchKey,
301     SameTypeSearchKey,
302     StaticTextSearchKey,
303     StyleChangeSearchKey,
304     TableSameLevelSearchKey,
305     TableSearchKey,
306     TextFieldSearchKey,
307     UnderlineSearchKey,
308     UnvisitedLinkSearchKey,
309     VisitedLinkSearchKey
310 };
311
312 struct AccessibilitySearchCriteria {
313     AccessibilityObject* startObject;
314     AccessibilitySearchDirection searchDirection;
315     AccessibilitySearchKey searchKey;
316     String* searchText;
317     unsigned resultsLimit;
318 };
319
320 struct VisiblePositionRange {
321
322     VisiblePosition start;
323     VisiblePosition end;
324
325     VisiblePositionRange() {}
326
327     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
328         : start(s)
329         , end(e)
330     { }
331
332     bool isNull() const { return start.isNull() || end.isNull(); }
333 };
334
335 struct PlainTextRange {
336         
337     unsigned start;
338     unsigned length;
339     
340     PlainTextRange()
341         : start(0)
342         , length(0)
343     { }
344     
345     PlainTextRange(unsigned s, unsigned l)
346         : start(s)
347         , length(l)
348     { }
349     
350     bool isNull() const { return !start && !length; }
351 };
352
353 class AccessibilityObject : public RefCounted<AccessibilityObject> {
354 protected:
355     AccessibilityObject();
356     
357 public:
358     virtual ~AccessibilityObject();
359
360     // After constructing an AccessibilityObject, it must be given a
361     // unique ID, then added to AXObjectCache, and finally init() must
362     // be called last.
363     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
364     virtual void init() { }
365
366     // When the corresponding WebCore object that this AccessibilityObject
367     // wraps is deleted, it must be detached.
368     virtual void detach();
369     virtual bool isDetached() const;
370
371     typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector;
372     
373     virtual bool isAccessibilityNodeObject() const { return false; }    
374     virtual bool isAccessibilityRenderObject() const { return false; }
375     virtual bool isAccessibilityScrollbar() const { return false; }
376     virtual bool isAccessibilityScrollView() const { return false; }
377     virtual bool isAccessibilitySVGRoot() const { return false; }
378
379     bool accessibilityObjectContainsText(String *) const;
380     
381     virtual bool isAnchor() const { return false; }
382     virtual bool isAttachment() const { return false; }
383     virtual bool isHeading() const { return false; }
384     virtual bool isLink() const { return false; }
385     virtual bool isImage() const { return false; }
386     virtual bool isNativeImage() const { return false; }
387     virtual bool isImageButton() const { return false; }
388     virtual bool isPasswordField() const { return false; }
389     virtual bool isNativeTextControl() const { return false; }
390     virtual bool isSearchField() const { return false; }
391     bool isWebArea() const { return roleValue() == WebAreaRole; }
392     bool isSeamlessWebArea() const { return roleValue() == SeamlessWebAreaRole; }
393     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
394     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
395     virtual bool isListBox() const { return roleValue() == ListBoxRole; }
396     virtual bool isMediaTimeline() const { return false; }
397     virtual bool isMenuRelated() const { return false; }
398     virtual bool isMenu() const { return false; }
399     virtual bool isMenuBar() const { return false; }
400     virtual bool isMenuButton() const { return false; }
401     virtual bool isMenuItem() const { return false; }
402     virtual bool isFileUploadButton() const { return false; }
403     virtual bool isInputImage() const { return false; }
404     virtual bool isProgressIndicator() const { return false; }
405     virtual bool isSlider() const { return false; }
406     virtual bool isInputSlider() const { return false; }
407     virtual bool isControl() const { return false; }
408     virtual bool isList() const { return false; }
409     virtual bool isAccessibilityTable() const { return false; }
410     virtual bool isDataTable() const { return false; }
411     virtual bool isTableRow() const { return false; }
412     virtual bool isTableColumn() const { return false; }
413     virtual bool isTableCell() const { return false; }
414     virtual bool isFieldset() const { return false; }
415     virtual bool isGroup() const { return false; }
416     virtual bool isARIATreeGridRow() const { return false; }
417     virtual bool isImageMapLink() const { return false; }
418     virtual bool isMenuList() const { return false; }
419     virtual bool isMenuListPopup() const { return false; }
420     virtual bool isMenuListOption() const { return false; }
421     virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
422     virtual bool isSpinButtonPart() const { return false; }
423     virtual bool isMockObject() const { return false; }
424     virtual bool isMediaControlLabel() const { return false; }
425     bool isTextControl() const;
426     bool isARIATextControl() const;
427     bool isTabList() const { return roleValue() == TabListRole; }
428     bool isTabItem() const { return roleValue() == TabRole; }
429     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
430     bool isComboBox() const { return roleValue() == ComboBoxRole; }
431     bool isTree() const { return roleValue() == TreeRole; }
432     bool isTreeItem() const { return roleValue() == TreeItemRole; }
433     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
434     bool isButton() const;
435     bool isListItem() const { return roleValue() == ListItemRole; }
436     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
437     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
438     bool isCanvas() const { return roleValue() == CanvasRole; }
439     bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
440     bool isBlockquote() const;
441     bool isLandmark() const;
442     bool isColorWell() const { return roleValue() == ColorWellRole; }
443     
444     virtual bool isChecked() const { return false; }
445     virtual bool isEnabled() const { return false; }
446     virtual bool isSelected() const { return false; }
447     virtual bool isFocused() const { return false; }
448     virtual bool isHovered() const { return false; }
449     virtual bool isIndeterminate() const { return false; }
450     virtual bool isLoaded() const { return false; }
451     virtual bool isMultiSelectable() const { return false; }
452     virtual bool isOffScreen() const { return false; }
453     virtual bool isPressed() const { return false; }
454     virtual bool isReadOnly() const { return false; }
455     virtual bool isUnvisited() const { return false; }
456     virtual bool isVisited() const { return false; }
457     virtual bool isRequired() const { return false; }
458     virtual bool isLinked() const { return false; }
459     virtual bool isExpanded() const;
460     virtual bool isVisible() const { return true; }
461     virtual bool isCollapsed() const { return false; }
462     virtual void setIsExpanded(bool) { }
463
464     // In a multi-select list, many items can be selected but only one is active at a time.
465     virtual bool isSelectedOptionActive() const { return false; }
466
467     virtual bool hasBoldFont() const { return false; }
468     virtual bool hasItalicFont() const { return false; }
469     bool hasMisspelling() const;
470     virtual bool hasPlainText() const { return false; }
471     virtual bool hasSameFont(RenderObject*) const { return false; }
472     virtual bool hasSameFontColor(RenderObject*) const { return false; }
473     virtual bool hasSameStyle(RenderObject*) const { return false; }
474     bool hasStaticText() const { return roleValue() == StaticTextRole; }
475     virtual bool hasUnderline() const { return false; }
476     bool hasHighlighting() const;
477
478     virtual bool canSetFocusAttribute() const { return false; }
479     virtual bool canSetTextRangeAttributes() const { return false; }
480     virtual bool canSetValueAttribute() const { return false; }
481     virtual bool canSetNumericValue() const { return false; }
482     virtual bool canSetSelectedAttribute() const { return false; }
483     virtual bool canSetSelectedChildrenAttribute() const { return false; }
484     virtual bool canSetExpandedAttribute() const { return false; }
485     
486     virtual Node* node() const { return 0; }
487     virtual RenderObject* renderer() const { return 0; }
488     virtual bool accessibilityIsIgnored() const;
489     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
490     bool accessibilityIsIgnoredByDefault() const;
491     
492     int blockquoteLevel() const;
493     virtual int headingLevel() const { return 0; }
494     virtual int tableLevel() const { return 0; }
495     virtual AccessibilityButtonState checkboxOrRadioValue() const;
496     virtual String valueDescription() const { return String(); }
497     virtual float valueForRange() const { return 0.0f; }
498     virtual float maxValueForRange() const { return 0.0f; }
499     virtual float minValueForRange() const { return 0.0f; }
500     virtual float stepValueForRange() const { return 0.0f; }
501     virtual AccessibilityObject* selectedRadioButton() { return 0; }
502     virtual AccessibilityObject* selectedTabItem() { return 0; }    
503     virtual int layoutCount() const { return 0; }
504     virtual double estimatedLoadingProgress() const { return 0; }
505     static bool isARIAControl(AccessibilityRole);
506     static bool isARIAInput(AccessibilityRole);
507     virtual bool supportsARIAOwns() const { return false; }
508     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
509     virtual bool supportsARIAFlowTo() const { return false; }
510     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
511     virtual bool ariaHasPopup() const { return false; }
512     virtual bool ariaPressedIsPresent() const;
513     bool ariaIsMultiline() const;
514     virtual const AtomicString& invalidStatus() const;
515     bool supportsARIAExpanded() const;
516     AccessibilitySortDirection sortDirection() const;
517     virtual bool canvasHasFallbackContent() const { return false; }
518     bool supportsRangeValue() const;
519
520     bool supportsARIASetSize() const;
521     bool supportsARIAPosInSet() const;
522     int ariaSetSize() const;
523     int ariaPosInSet() const;
524     
525     // ARIA drag and drop
526     virtual bool supportsARIADropping() const { return false; }
527     virtual bool supportsARIADragging() const { return false; }
528     virtual bool isARIAGrabbed() { return false; }
529     virtual void setARIAGrabbed(bool) { }
530     virtual void determineARIADropEffects(Vector<String>&) { }
531     
532     // Called on the root AX object to return the deepest available element.
533     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return 0; }
534     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
535     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
536
537     virtual AccessibilityObject* focusedUIElement() const;
538
539     virtual AccessibilityObject* firstChild() const { return 0; }
540     virtual AccessibilityObject* lastChild() const { return 0; }
541     virtual AccessibilityObject* previousSibling() const { return 0; }
542     virtual AccessibilityObject* nextSibling() const { return 0; }
543     virtual AccessibilityObject* parentObject() const = 0;
544     virtual AccessibilityObject* parentObjectUnignored() const;
545     virtual AccessibilityObject* parentObjectIfExists() const { return 0; }
546     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
547     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
548
549     virtual AccessibilityObject* observableObject() const { return 0; }
550     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
551     virtual AccessibilityObject* titleUIElement() const { return 0; }
552     virtual bool exposesTitleUIElement() const { return true; }
553     virtual AccessibilityObject* correspondingLabelForControlElement() const { return 0; }
554     virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; }
555     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return 0; }
556     
557     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
558     virtual bool isPresentationalChildOfAriaRole() const { return false; }
559     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
560
561     // Accessibility Text
562     virtual void accessibilityText(Vector<AccessibilityText>&) { };
563
564     // A programmatic way to set a name on an AccessibleObject.
565     virtual void setAccessibleName(const AtomicString&) { }
566
567     // Accessibility Text - (To be deprecated).
568     virtual String accessibilityDescription() const { return String(); }
569     virtual String title() const { return String(); }
570     virtual String helpText() const { return String(); }
571
572     // Methods for determining accessibility text.
573     virtual String stringValue() const { return String(); }
574     virtual String textUnderElement() const { return String(); }
575     virtual String text() const { return String(); }
576     virtual int textLength() const { return 0; }
577     virtual String ariaLabeledByAttribute() const { return String(); }
578     virtual String ariaDescribedByAttribute() const { return String(); }
579     const AtomicString& placeholderValue() const;
580
581     // Only if isColorWell()
582     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
583
584     void setRoleValue(AccessibilityRole role) { m_role = role; }
585     virtual AccessibilityRole roleValue() const { return m_role; }
586
587     virtual AXObjectCache* axObjectCache() const;
588     AXID axObjectID() const { return m_id; }
589     
590     static AccessibilityObject* anchorElementForNode(Node*);
591     virtual Element* anchorElement() const { return 0; }
592     virtual Element* actionElement() const { return 0; }
593     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
594     IntRect pixelSnappedBoundingBoxRect() const { return pixelSnappedIntRect(boundingBoxRect()); }
595     virtual LayoutRect elementRect() const = 0;
596     IntRect pixelSnappedElementRect() const { return pixelSnappedIntRect(elementRect()); }
597     LayoutSize size() const { return elementRect().size(); }
598     IntSize pixelSnappedSize() const { return elementRect().pixelSnappedSize(); }
599     virtual IntPoint clickPoint();
600     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
601     
602     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
603     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
604     unsigned selectionStart() const { return selectedTextRange().start; }
605     unsigned selectionEnd() const { return selectedTextRange().length; }
606     
607     virtual KURL url() const { return KURL(); }
608     virtual VisibleSelection selection() const { return VisibleSelection(); }
609     virtual String selectedText() const { return String(); }
610     virtual const AtomicString& accessKey() const { return nullAtom; }
611     const String& actionVerb() const;
612     virtual Widget* widget() const { return 0; }
613     virtual Widget* widgetForAttachmentView() const { return 0; }
614     Page* page() const;
615     virtual Document* document() const;
616     virtual FrameView* topDocumentFrameView() const { return 0; }
617     virtual FrameView* documentFrameView() const;
618     String language() const;
619     // 1-based, to match the aria-level spec.
620     virtual unsigned hierarchicalLevel() const { return 0; }
621     
622     virtual void setFocused(bool) { }
623     virtual void setSelectedText(const String&) { }
624     virtual void setSelectedTextRange(const PlainTextRange&) { }
625     virtual void setValue(const String&) { }
626     virtual void setValue(float) { }
627     virtual void setSelected(bool) { }
628     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
629     
630     virtual void makeRangeVisible(const PlainTextRange&) { }
631     virtual bool press() const;
632     bool performDefaultAction() const { return press(); }
633     
634     virtual AccessibilityOrientation orientation() const;
635     virtual void increment() { }
636     virtual void decrement() { }
637
638     virtual void childrenChanged() { }
639     virtual void textChanged() { }
640     virtual void updateAccessibilityRole() { }
641     const AccessibilityChildrenVector& children();
642     virtual void addChildren() { }
643     virtual void addChild(AccessibilityObject*) { }
644     virtual void insertChild(AccessibilityObject*, unsigned) { }
645     
646     virtual bool canHaveChildren() const { return true; }
647     virtual bool hasChildren() const { return m_haveChildren; }
648     virtual void updateChildrenIfNecessary();
649     virtual void setNeedsToUpdateChildren() { }
650     virtual void clearChildren();
651 #if PLATFORM(MAC)
652     virtual void detachFromParent();
653 #else
654     virtual void detachFromParent() { }
655 #endif
656
657     virtual void selectedChildren(AccessibilityChildrenVector&) { }
658     virtual void visibleChildren(AccessibilityChildrenVector&) { }
659     virtual void tabChildren(AccessibilityChildrenVector&) { }
660     virtual bool shouldFocusActiveDescendant() const { return false; }
661     virtual AccessibilityObject* activeDescendant() const { return 0; }    
662     virtual void handleActiveDescendantChanged() { }
663     virtual void handleAriaExpandedChanged() { }
664     bool isDescendantOfObject(const AccessibilityObject*) const;
665     bool isAncestorOfObject(const AccessibilityObject*) const;
666     AccessibilityObject* firstAnonymousBlockChild() const;
667     
668     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
669     bool hasAttribute(const QualifiedName&) const;
670     const AtomicString& getAttribute(const QualifiedName&) const;
671
672     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
673     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
674     
675     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
676     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
677     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
678     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
679     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
680     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
681     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
682     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
683     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
684
685     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
686     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
687     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
688     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
689
690     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
691     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
692     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
693     VisiblePosition nextWordEnd(const VisiblePosition&) const;
694     VisiblePosition previousWordStart(const VisiblePosition&) const;
695     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
696     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
697     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
698     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
699     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
700     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
701     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
702     
703     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
704     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
705
706     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
707     int lineForPosition(const VisiblePosition&) const;
708     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
709     virtual int index(const VisiblePosition&) const { return -1; }
710
711     virtual void lineBreaks(Vector<int>&) const { }
712     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
713     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
714     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
715     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
716
717     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
718     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
719     String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
720
721     unsigned doAXLineForIndex(unsigned);
722
723     virtual String stringValueForMSAA() const { return String(); }
724     virtual String stringRoleForMSAA() const { return String(); }
725     virtual String nameForMSAA() const { return String(); }
726     virtual String descriptionForMSAA() const { return String(); }
727     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
728
729     virtual String passwordFieldValue() const { return String(); }
730
731     // Used by an ARIA tree to get all its rows.
732     void ariaTreeRows(AccessibilityChildrenVector&);
733     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
734     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
735     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
736     void ariaTreeItemContent(AccessibilityChildrenVector&);
737     
738     // ARIA live-region features.
739     bool supportsARIALiveRegion() const;
740     bool isInsideARIALiveRegion() const;
741     virtual const AtomicString& ariaLiveRegionStatus() const { return nullAtom; }
742     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
743     virtual bool ariaLiveRegionAtomic() const { return false; }
744     virtual bool ariaLiveRegionBusy() const { return false; }
745     
746     bool supportsARIAAttributes() const;
747     
748     // CSS3 Speech properties.
749     virtual ESpeak speakProperty() const { return SpeakNormal; }
750
751     // Make this object visible by scrolling as many nested scrollable views as needed.
752     virtual void scrollToMakeVisible() const;
753     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
754     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
755     // Scroll this object to a given point in global coordinates of the top-level window.
756     virtual void scrollToGlobalPoint(const IntPoint&) const;
757
758     bool lastKnownIsIgnoredValue();
759     void setLastKnownIsIgnoredValue(bool);
760
761     // Fires a children changed notification on the parent if the isIgnored value changed.
762     void notifyIfIgnoredValueChanged();
763
764     // All math elements return true for isMathElement().
765     virtual bool isMathElement() const { return false; }
766     virtual bool isMathFraction() const { return false; }
767     virtual bool isMathFenced() const { return false; }
768     virtual bool isMathSubscriptSuperscript() const { return false; }
769     virtual bool isMathRow() const { return false; }
770     virtual bool isMathUnderOver() const { return false; }
771     virtual bool isMathRoot() const { return false; }
772     virtual bool isMathSquareRoot() const { return false; }
773     virtual bool isMathText() const { return false; }
774     virtual bool isMathNumber() const { return false; }
775     virtual bool isMathOperator() const { return false; }
776     virtual bool isMathFenceOperator() const { return false; }
777     virtual bool isMathSeparatorOperator() const { return false; }
778     virtual bool isMathIdentifier() const { return false; }
779     virtual bool isMathTable() const { return false; }
780     virtual bool isMathTableRow() const { return false; }
781     virtual bool isMathTableCell() const { return false; }
782     
783     // Root components.
784     virtual AccessibilityObject* mathRadicandObject() { return 0; }
785     virtual AccessibilityObject* mathRootIndexObject() { return 0; }
786     
787     // Under over components.
788     virtual AccessibilityObject* mathUnderObject() { return 0; }
789     virtual AccessibilityObject* mathOverObject() { return 0; }
790
791     // Fraction components.
792     virtual AccessibilityObject* mathNumeratorObject() { return 0; }
793     virtual AccessibilityObject* mathDenominatorObject() { return 0; }
794
795     // Subscript/superscript components.
796     virtual AccessibilityObject* mathBaseObject() { return 0; }
797     virtual AccessibilityObject* mathSubscriptObject() { return 0; }
798     virtual AccessibilityObject* mathSuperscriptObject() { return 0; }
799     
800     // Fenced components.
801     virtual String mathFencedOpenString() const { return String(); }
802     virtual String mathFencedCloseString() const { return String(); }
803     
804 #if HAVE(ACCESSIBILITY)
805 #if PLATFORM(GTK) || PLATFORM(EFL)
806     AccessibilityObjectWrapper* wrapper() const;
807     void setWrapper(AccessibilityObjectWrapper*);
808 #elif !PLATFORM(CHROMIUM)
809     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
810     void setWrapper(AccessibilityObjectWrapper* wrapper) 
811     {
812         m_wrapper = wrapper;
813     }
814 #endif
815 #endif
816     
817 #if PLATFORM(MAC)
818     void overrideAttachmentParent(AccessibilityObject* parent);
819 #else
820     void overrideAttachmentParent(AccessibilityObject*) { }
821 #endif
822     
823 #if HAVE(ACCESSIBILITY)
824     // a platform-specific method for determining if an attachment is ignored
825     bool accessibilityIgnoreAttachment() const;
826     // gives platforms the opportunity to indicate if and how an object should be included
827     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
828 #else
829     bool accessibilityIgnoreAttachment() const { return true; }
830     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
831 #endif
832
833     // allows for an AccessibilityObject to update its render tree or perform
834     // other operations update type operations
835     void updateBackingStore();
836     
837 protected:
838     AXID m_id;
839     AccessibilityChildrenVector m_children;
840     mutable bool m_haveChildren;
841     AccessibilityRole m_role;
842     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
843
844     virtual bool computeAccessibilityIsIgnored() const { return true; }
845
846     // If this object itself scrolls, return its ScrollableArea.
847     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return 0; }
848     virtual void scrollTo(const IntPoint&) const { }
849
850     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
851     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
852     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
853     virtual AccessibilityRole buttonRoleType() const;
854     bool ariaIsHidden() const;
855
856 #if PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
857     bool allowsTextRanges() const;
858     unsigned getLengthForTextRange() const;
859 #else
860     bool allowsTextRanges() const { return isTextControl(); }
861     unsigned getLengthForTextRange() const { return text().length(); }
862 #endif
863
864 #if PLATFORM(MAC)
865     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
866 #elif PLATFORM(WIN) && !OS(WINCE)
867     COMPtr<AccessibilityObjectWrapper> m_wrapper;
868 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
869     AtkObject* m_wrapper;
870 #elif PLATFORM(CHROMIUM)
871     bool m_detached;
872 #endif
873 };
874
875 #if !HAVE(ACCESSIBILITY)
876 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children() { return m_children; }
877 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
878 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
879 inline void AccessibilityObject::updateBackingStore() { }
880 #endif
881
882 } // namespace WebCore
883
884 #endif // AccessibilityObject_h