Add "VisibleOnly" key to search predicate
[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 "Path.h"
36 #include "TextIterator.h"
37 #include "VisiblePosition.h"
38 #include "VisibleSelection.h"
39 #include <wtf/Forward.h>
40 #include <wtf/RefPtr.h>
41 #include <wtf/Vector.h>
42
43 #if PLATFORM(MAC)
44 #include <wtf/RetainPtr.h>
45 #elif PLATFORM(WIN)
46 #include "AccessibilityObjectWrapperWin.h"
47 #include "COMPtr.h"
48 #endif
49
50 #if PLATFORM(MAC)
51
52 typedef struct _NSRange NSRange;
53
54 OBJC_CLASS NSArray;
55 OBJC_CLASS NSAttributedString;
56 OBJC_CLASS NSData;
57 OBJC_CLASS NSMutableAttributedString;
58 OBJC_CLASS NSString;
59 OBJC_CLASS NSValue;
60 OBJC_CLASS NSView;
61 OBJC_CLASS WebAccessibilityObjectWrapper;
62
63 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
64
65 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
66 typedef struct _AtkObject AtkObject;
67 typedef struct _AtkObject AccessibilityObjectWrapper;
68 #else
69 class AccessibilityObjectWrapper;
70 #endif
71
72 namespace WebCore {
73
74 class AccessibilityObject;
75 class AXObjectCache;
76 class Element;
77 class Frame;
78 class FrameView;
79 class HTMLAnchorElement;
80 class HTMLAreaElement;
81 class IntPoint;
82 class IntSize;
83 class Node;
84 class Page;
85 class RenderObject;
86 class RenderListItem;
87 class ScrollableArea;
88 class VisibleSelection;
89 class Widget;
90
91 typedef unsigned AXID;
92
93 enum AccessibilityRole {
94     AnnotationRole = 1,
95     ApplicationRole,
96     ApplicationAlertRole,
97     ApplicationAlertDialogRole,
98     ApplicationDialogRole,
99     ApplicationLogRole,
100     ApplicationMarqueeRole,
101     ApplicationStatusRole,
102     ApplicationTimerRole, 
103     BrowserRole,
104     BusyIndicatorRole,
105     ButtonRole,
106     CanvasRole,
107     CellRole, 
108     CheckBoxRole,
109     ColorWellRole,
110     ColumnRole,
111     ColumnHeaderRole,
112     ComboBoxRole,
113     DefinitionRole,
114     DescriptionListRole,
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     Vector<AccessibilitySearchKey> searchKeys;
316     String* searchText;
317     unsigned resultsLimit;
318     bool visibleOnly;
319     
320     AccessibilitySearchCriteria(AccessibilityObject* o, AccessibilitySearchDirection d, String* t, unsigned l, bool v)
321     : startObject(o)
322     , searchDirection(d)
323     , searchText(t)
324     , resultsLimit(l)
325     , visibleOnly(v)
326     { }
327 };
328
329 struct VisiblePositionRange {
330
331     VisiblePosition start;
332     VisiblePosition end;
333
334     VisiblePositionRange() {}
335
336     VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
337         : start(s)
338         , end(e)
339     { }
340
341     bool isNull() const { return start.isNull() || end.isNull(); }
342 };
343
344 struct PlainTextRange {
345         
346     unsigned start;
347     unsigned length;
348     
349     PlainTextRange()
350         : start(0)
351         , length(0)
352     { }
353     
354     PlainTextRange(unsigned s, unsigned l)
355         : start(s)
356         , length(l)
357     { }
358     
359     bool isNull() const { return !start && !length; }
360 };
361
362 class AccessibilityObject : public RefCounted<AccessibilityObject> {
363 protected:
364     AccessibilityObject();
365     
366 public:
367     virtual ~AccessibilityObject();
368
369     // After constructing an AccessibilityObject, it must be given a
370     // unique ID, then added to AXObjectCache, and finally init() must
371     // be called last.
372     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
373     virtual void init() { }
374
375     // When the corresponding WebCore object that this AccessibilityObject
376     // wraps is deleted, it must be detached.
377     virtual void detach();
378     virtual bool isDetached() const;
379
380     typedef Vector<RefPtr<AccessibilityObject> > AccessibilityChildrenVector;
381     
382     virtual bool isAccessibilityNodeObject() const { return false; }    
383     virtual bool isAccessibilityRenderObject() const { return false; }
384     virtual bool isAccessibilityScrollbar() const { return false; }
385     virtual bool isAccessibilityScrollView() const { return false; }
386     virtual bool isAccessibilitySVGRoot() const { return false; }
387
388     bool accessibilityObjectContainsText(String *) const;
389     
390     virtual bool isAnchor() const { return false; }
391     virtual bool isAttachment() const { return false; }
392     virtual bool isHeading() const { return false; }
393     virtual bool isLink() const { return false; }
394     virtual bool isImage() const { return false; }
395     virtual bool isNativeImage() const { return false; }
396     virtual bool isImageButton() const { return false; }
397     virtual bool isPasswordField() const { return false; }
398     virtual bool isNativeTextControl() const { return false; }
399     virtual bool isSearchField() const { return false; }
400     bool isWebArea() const { return roleValue() == WebAreaRole; }
401     bool isSeamlessWebArea() const { return roleValue() == SeamlessWebAreaRole; }
402     virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
403     virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
404     virtual bool isListBox() const { return roleValue() == ListBoxRole; }
405     virtual bool isMediaTimeline() const { return false; }
406     virtual bool isMenuRelated() const { return false; }
407     virtual bool isMenu() const { return false; }
408     virtual bool isMenuBar() const { return false; }
409     virtual bool isMenuButton() const { return false; }
410     virtual bool isMenuItem() const { return false; }
411     virtual bool isFileUploadButton() const { return false; }
412     virtual bool isInputImage() const { return false; }
413     virtual bool isProgressIndicator() const { return false; }
414     virtual bool isSlider() const { return false; }
415     virtual bool isInputSlider() const { return false; }
416     virtual bool isControl() const { return false; }
417     virtual bool isList() const { return false; }
418     virtual bool isTable() const { return false; }
419     virtual bool isAccessibilityTable() const { return false; }
420     virtual bool isDataTable() const { return false; }
421     virtual bool isTableRow() const { return false; }
422     virtual bool isTableColumn() const { return false; }
423     virtual bool isTableCell() const { return false; }
424     virtual bool isFieldset() const { return false; }
425     virtual bool isGroup() const { return false; }
426     virtual bool isARIATreeGridRow() const { return false; }
427     virtual bool isImageMapLink() const { return false; }
428     virtual bool isMenuList() const { return false; }
429     virtual bool isMenuListPopup() const { return false; }
430     virtual bool isMenuListOption() const { return false; }
431     virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
432     virtual bool isNativeSpinButton() const { return false; }
433     virtual bool isSpinButtonPart() const { return false; }
434     virtual bool isMockObject() const { return false; }
435     virtual bool isMediaControlLabel() const { return false; }
436     bool isTextControl() const;
437     bool isARIATextControl() const;
438     bool isTabList() const { return roleValue() == TabListRole; }
439     bool isTabItem() const { return roleValue() == TabRole; }
440     bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
441     bool isComboBox() const { return roleValue() == ComboBoxRole; }
442     bool isTree() const { return roleValue() == TreeRole; }
443     bool isTreeItem() const { return roleValue() == TreeItemRole; }
444     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
445     bool isButton() const;
446     bool isListItem() const { return roleValue() == ListItemRole; }
447     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
448     bool isScrollView() const { return roleValue() == ScrollAreaRole; }
449     bool isCanvas() const { return roleValue() == CanvasRole; }
450     bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
451     bool isBlockquote() const;
452     bool isLandmark() const;
453     bool isColorWell() const { return roleValue() == ColorWellRole; }
454     bool isRangeControl() const;
455
456     virtual bool isChecked() const { return false; }
457     virtual bool isEnabled() const { return false; }
458     virtual bool isSelected() const { return false; }
459     virtual bool isFocused() const { return false; }
460     virtual bool isHovered() const { return false; }
461     virtual bool isIndeterminate() const { return false; }
462     virtual bool isLoaded() const { return false; }
463     virtual bool isMultiSelectable() const { return false; }
464     virtual bool isOffScreen() const { return false; }
465     virtual bool isPressed() const { return false; }
466     virtual bool isReadOnly() const { return false; }
467     virtual bool isUnvisited() const { return false; }
468     virtual bool isVisited() const { return false; }
469     virtual bool isRequired() const { return false; }
470     virtual bool isLinked() const { return false; }
471     virtual bool isExpanded() const;
472     virtual bool isVisible() const { return true; }
473     virtual bool isCollapsed() const { return false; }
474     virtual void setIsExpanded(bool) { }
475
476     // In a multi-select list, many items can be selected but only one is active at a time.
477     virtual bool isSelectedOptionActive() const { return false; }
478
479     virtual bool hasBoldFont() const { return false; }
480     virtual bool hasItalicFont() const { return false; }
481     bool hasMisspelling() const;
482     virtual bool hasPlainText() const { return false; }
483     virtual bool hasSameFont(RenderObject*) const { return false; }
484     virtual bool hasSameFontColor(RenderObject*) const { return false; }
485     virtual bool hasSameStyle(RenderObject*) const { return false; }
486     bool isStaticText() const { return roleValue() == StaticTextRole; }
487     virtual bool hasUnderline() const { return false; }
488     bool hasHighlighting() const;
489
490     virtual bool canSetFocusAttribute() const { return false; }
491     virtual bool canSetTextRangeAttributes() const { return false; }
492     virtual bool canSetValueAttribute() const { return false; }
493     virtual bool canSetNumericValue() const { return false; }
494     virtual bool canSetSelectedAttribute() const { return false; }
495     virtual bool canSetSelectedChildrenAttribute() const { return false; }
496     virtual bool canSetExpandedAttribute() const { return false; }
497     
498     virtual Node* node() const { return 0; }
499     virtual RenderObject* renderer() const { return 0; }
500     virtual bool accessibilityIsIgnored() const;
501     virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
502     bool accessibilityIsIgnoredByDefault() const;
503     
504     int blockquoteLevel() const;
505     virtual int headingLevel() const { return 0; }
506     virtual int tableLevel() const { return 0; }
507     virtual AccessibilityButtonState checkboxOrRadioValue() const;
508     virtual String valueDescription() const { return String(); }
509     virtual float valueForRange() const { return 0.0f; }
510     virtual float maxValueForRange() const { return 0.0f; }
511     virtual float minValueForRange() const { return 0.0f; }
512     virtual float stepValueForRange() const { return 0.0f; }
513     virtual AccessibilityObject* selectedRadioButton() { return 0; }
514     virtual AccessibilityObject* selectedTabItem() { return 0; }    
515     virtual int layoutCount() const { return 0; }
516     virtual double estimatedLoadingProgress() const { return 0; }
517     static bool isARIAControl(AccessibilityRole);
518     static bool isARIAInput(AccessibilityRole);
519     virtual bool supportsARIAOwns() const { return false; }
520     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
521     virtual bool supportsARIAFlowTo() const { return false; }
522     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
523     virtual bool ariaHasPopup() const { return false; }
524     virtual bool ariaPressedIsPresent() const;
525     bool ariaIsMultiline() const;
526     virtual const AtomicString& invalidStatus() const;
527     bool supportsARIAExpanded() const;
528     AccessibilitySortDirection sortDirection() const;
529     virtual bool canvasHasFallbackContent() const { return false; }
530     bool supportsRangeValue() const;
531
532     bool supportsARIASetSize() const;
533     bool supportsARIAPosInSet() const;
534     int ariaSetSize() const;
535     int ariaPosInSet() const;
536     
537     // ARIA drag and drop
538     virtual bool supportsARIADropping() const { return false; }
539     virtual bool supportsARIADragging() const { return false; }
540     virtual bool isARIAGrabbed() { return false; }
541     virtual void setARIAGrabbed(bool) { }
542     virtual void determineARIADropEffects(Vector<String>&) { }
543     
544     // Called on the root AX object to return the deepest available element.
545     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return 0; }
546     // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
547     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
548
549     virtual AccessibilityObject* focusedUIElement() const;
550
551     virtual AccessibilityObject* firstChild() const { return 0; }
552     virtual AccessibilityObject* lastChild() const { return 0; }
553     virtual AccessibilityObject* previousSibling() const { return 0; }
554     virtual AccessibilityObject* nextSibling() const { return 0; }
555     virtual AccessibilityObject* parentObject() const = 0;
556     virtual AccessibilityObject* parentObjectUnignored() const;
557     virtual AccessibilityObject* parentObjectIfExists() const { return 0; }
558     static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
559     void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
560     virtual bool isDescendantOfBarrenParent() const { return false; }
561     
562     virtual AccessibilityObject* observableObject() const { return 0; }
563     virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
564     virtual AccessibilityObject* titleUIElement() const { return 0; }
565     virtual bool exposesTitleUIElement() const { return true; }
566     virtual AccessibilityObject* correspondingLabelForControlElement() const { return 0; }
567     virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; }
568     virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return 0; }
569     
570     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
571     virtual bool isPresentationalChildOfAriaRole() const { return false; }
572     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
573
574     // Accessibility Text
575     virtual void accessibilityText(Vector<AccessibilityText>&) { };
576
577     // A programmatic way to set a name on an AccessibleObject.
578     virtual void setAccessibleName(const AtomicString&) { }
579
580     // Accessibility Text - (To be deprecated).
581     virtual String accessibilityDescription() const { return String(); }
582     virtual String title() const { return String(); }
583     virtual String helpText() const { return String(); }
584
585     // Methods for determining accessibility text.
586     virtual String stringValue() const { return String(); }
587     virtual String textUnderElement() const { return String(); }
588     virtual String text() const { return String(); }
589     virtual int textLength() const { return 0; }
590     virtual String ariaLabeledByAttribute() const { return String(); }
591     virtual String ariaDescribedByAttribute() const { return String(); }
592     const AtomicString& placeholderValue() const;
593
594     // Only if isColorWell()
595     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
596
597     void setRoleValue(AccessibilityRole role) { m_role = role; }
598     virtual AccessibilityRole roleValue() const { return m_role; }
599
600     virtual AXObjectCache* axObjectCache() const;
601     AXID axObjectID() const { return m_id; }
602     
603     static AccessibilityObject* anchorElementForNode(Node*);
604     virtual Element* anchorElement() const { return 0; }
605     virtual Element* actionElement() const { return 0; }
606     virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
607     IntRect pixelSnappedBoundingBoxRect() const { return pixelSnappedIntRect(boundingBoxRect()); }
608     virtual LayoutRect elementRect() const = 0;
609     IntRect pixelSnappedElementRect() const { return pixelSnappedIntRect(elementRect()); }
610     LayoutSize size() const { return elementRect().size(); }
611     IntSize pixelSnappedSize() const { return elementRect().pixelSnappedSize(); }
612     virtual IntPoint clickPoint();
613     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
614     virtual Path elementPath() const { return Path(); }
615     virtual bool supportsPath() const { return false; }
616     
617     TextIteratorBehavior textIteratorBehaviorForTextRange() const;
618     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
619     unsigned selectionStart() const { return selectedTextRange().start; }
620     unsigned selectionEnd() const { return selectedTextRange().length; }
621     
622     virtual KURL url() const { return KURL(); }
623     virtual VisibleSelection selection() const { return VisibleSelection(); }
624     virtual String selectedText() const { return String(); }
625     virtual const AtomicString& accessKey() const { return nullAtom; }
626     const String& actionVerb() const;
627     virtual Widget* widget() const { return 0; }
628     virtual Widget* widgetForAttachmentView() const { return 0; }
629     Page* page() const;
630     virtual Document* document() const;
631     virtual FrameView* topDocumentFrameView() const { return 0; }
632     virtual FrameView* documentFrameView() const;
633     String language() const;
634     // 1-based, to match the aria-level spec.
635     virtual unsigned hierarchicalLevel() const { return 0; }
636     
637     virtual void setFocused(bool) { }
638     virtual void setSelectedText(const String&) { }
639     virtual void setSelectedTextRange(const PlainTextRange&) { }
640     virtual void setValue(const String&) { }
641     virtual void setValue(float) { }
642     virtual void setSelected(bool) { }
643     virtual void setSelectedRows(AccessibilityChildrenVector&) { }
644     
645     virtual void makeRangeVisible(const PlainTextRange&) { }
646     virtual bool press() const;
647     bool performDefaultAction() const { return press(); }
648     
649     virtual AccessibilityOrientation orientation() const;
650     virtual void increment() { }
651     virtual void decrement() { }
652
653     virtual void childrenChanged() { }
654     virtual void textChanged() { }
655     virtual void updateAccessibilityRole() { }
656     const AccessibilityChildrenVector& children();
657     virtual void addChildren() { }
658     virtual void addChild(AccessibilityObject*) { }
659     virtual void insertChild(AccessibilityObject*, unsigned) { }
660     
661     virtual bool canHaveChildren() const { return true; }
662     virtual bool hasChildren() const { return m_haveChildren; }
663     virtual void updateChildrenIfNecessary();
664     virtual void setNeedsToUpdateChildren() { }
665     virtual void clearChildren();
666 #if PLATFORM(MAC)
667     virtual void detachFromParent();
668 #else
669     virtual void detachFromParent() { }
670 #endif
671
672     virtual void selectedChildren(AccessibilityChildrenVector&) { }
673     virtual void visibleChildren(AccessibilityChildrenVector&) { }
674     virtual void tabChildren(AccessibilityChildrenVector&) { }
675     virtual bool shouldFocusActiveDescendant() const { return false; }
676     virtual AccessibilityObject* activeDescendant() const { return 0; }    
677     virtual void handleActiveDescendantChanged() { }
678     virtual void handleAriaExpandedChanged() { }
679     bool isDescendantOfObject(const AccessibilityObject*) const;
680     bool isAncestorOfObject(const AccessibilityObject*) const;
681     AccessibilityObject* firstAnonymousBlockChild() const;
682
683     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
684     bool hasAttribute(const QualifiedName&) const;
685     const AtomicString& getAttribute(const QualifiedName&) const;
686
687     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
688     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
689     
690     VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
691     VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
692     VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
693     VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
694     VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
695     VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
696     VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
697     VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
698     VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
699
700     String stringForVisiblePositionRange(const VisiblePositionRange&) const;
701     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
702     int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
703     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
704
705     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
706     VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
707     VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
708     VisiblePosition nextWordEnd(const VisiblePosition&) const;
709     VisiblePosition previousWordStart(const VisiblePosition&) const;
710     VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
711     VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
712     VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
713     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
714     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
715     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
716     virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
717     
718     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
719     virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
720
721     AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
722     int lineForPosition(const VisiblePosition&) const;
723     PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
724     virtual int index(const VisiblePosition&) const { return -1; }
725
726     virtual void lineBreaks(Vector<int>&) const { }
727     virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
728     PlainTextRange doAXRangeForPosition(const IntPoint&) const;
729     virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
730     PlainTextRange doAXStyleRangeForIndex(unsigned) const;
731
732     virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
733     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
734     String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
735
736     unsigned doAXLineForIndex(unsigned);
737
738     virtual String stringValueForMSAA() const { return String(); }
739     virtual String stringRoleForMSAA() const { return String(); }
740     virtual String nameForMSAA() const { return String(); }
741     virtual String descriptionForMSAA() const { return String(); }
742     virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
743
744     virtual String passwordFieldValue() const { return String(); }
745
746     // Used by an ARIA tree to get all its rows.
747     void ariaTreeRows(AccessibilityChildrenVector&);
748     // Used by an ARIA tree item to get all of its direct rows that it can disclose.
749     void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
750     // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 
751     void ariaTreeItemContent(AccessibilityChildrenVector&);
752     
753     // ARIA live-region features.
754     bool supportsARIALiveRegion() const;
755     bool isInsideARIALiveRegion() const;
756     virtual const AtomicString& ariaLiveRegionStatus() const { return nullAtom; }
757     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
758     virtual bool ariaLiveRegionAtomic() const { return false; }
759     virtual bool ariaLiveRegionBusy() const { return false; }
760     
761     bool supportsARIAAttributes() const;
762     
763     // CSS3 Speech properties.
764     virtual ESpeak speakProperty() const { return SpeakNormal; }
765
766     // Make this object visible by scrolling as many nested scrollable views as needed.
767     virtual void scrollToMakeVisible() const;
768     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
769     virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
770     // Scroll this object to a given point in global coordinates of the top-level window.
771     virtual void scrollToGlobalPoint(const IntPoint&) const;
772
773     bool lastKnownIsIgnoredValue();
774     void setLastKnownIsIgnoredValue(bool);
775
776     // Fires a children changed notification on the parent if the isIgnored value changed.
777     void notifyIfIgnoredValueChanged();
778
779     // All math elements return true for isMathElement().
780     virtual bool isMathElement() const { return false; }
781     virtual bool isMathFraction() const { return false; }
782     virtual bool isMathFenced() const { return false; }
783     virtual bool isMathSubscriptSuperscript() const { return false; }
784     virtual bool isMathRow() const { return false; }
785     virtual bool isMathUnderOver() const { return false; }
786     virtual bool isMathRoot() const { return false; }
787     virtual bool isMathSquareRoot() const { return false; }
788     virtual bool isMathText() const { return false; }
789     virtual bool isMathNumber() const { return false; }
790     virtual bool isMathOperator() const { return false; }
791     virtual bool isMathFenceOperator() const { return false; }
792     virtual bool isMathSeparatorOperator() const { return false; }
793     virtual bool isMathIdentifier() const { return false; }
794     virtual bool isMathTable() const { return false; }
795     virtual bool isMathTableRow() const { return false; }
796     virtual bool isMathTableCell() const { return false; }
797     virtual bool isMathMultiscript() const { return false; }
798
799     // Root components.
800     virtual AccessibilityObject* mathRadicandObject() { return 0; }
801     virtual AccessibilityObject* mathRootIndexObject() { return 0; }
802     
803     // Under over components.
804     virtual AccessibilityObject* mathUnderObject() { return 0; }
805     virtual AccessibilityObject* mathOverObject() { return 0; }
806
807     // Fraction components.
808     virtual AccessibilityObject* mathNumeratorObject() { return 0; }
809     virtual AccessibilityObject* mathDenominatorObject() { return 0; }
810
811     // Subscript/superscript components.
812     virtual AccessibilityObject* mathBaseObject() { return 0; }
813     virtual AccessibilityObject* mathSubscriptObject() { return 0; }
814     virtual AccessibilityObject* mathSuperscriptObject() { return 0; }
815     
816     // Fenced components.
817     virtual String mathFencedOpenString() const { return String(); }
818     virtual String mathFencedCloseString() const { return String(); }
819     virtual int mathLineThickness() const { return 0; }
820     
821     // Multiscripts components.
822     typedef Vector<pair<AccessibilityObject*, AccessibilityObject*> > AccessibilityMathMultiscriptPairs;
823     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
824     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
825
826 #if HAVE(ACCESSIBILITY)
827 #if PLATFORM(GTK) || PLATFORM(EFL)
828     AccessibilityObjectWrapper* wrapper() const;
829     void setWrapper(AccessibilityObjectWrapper*);
830 #else
831     AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
832     void setWrapper(AccessibilityObjectWrapper* wrapper) 
833     {
834         m_wrapper = wrapper;
835     }
836 #endif
837 #endif
838     
839 #if PLATFORM(MAC)
840     void overrideAttachmentParent(AccessibilityObject* parent);
841 #else
842     void overrideAttachmentParent(AccessibilityObject*) { }
843 #endif
844     
845 #if HAVE(ACCESSIBILITY)
846     // a platform-specific method for determining if an attachment is ignored
847     bool accessibilityIgnoreAttachment() const;
848     // gives platforms the opportunity to indicate if and how an object should be included
849     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
850 #else
851     bool accessibilityIgnoreAttachment() const { return true; }
852     AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
853 #endif
854
855     // allows for an AccessibilityObject to update its render tree or perform
856     // other operations update type operations
857     void updateBackingStore();
858     
859 protected:
860     AXID m_id;
861     AccessibilityChildrenVector m_children;
862     mutable bool m_haveChildren;
863     AccessibilityRole m_role;
864     AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
865
866     virtual bool computeAccessibilityIsIgnored() const { return true; }
867
868     // If this object itself scrolls, return its ScrollableArea.
869     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return 0; }
870     virtual void scrollTo(const IntPoint&) const { }
871
872     static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
873     static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
874     static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
875     static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
876     virtual AccessibilityRole buttonRoleType() const;
877     bool ariaIsHidden() const;
878     bool isOnscreen() const;
879     
880 #if PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
881     bool allowsTextRanges() const;
882     unsigned getLengthForTextRange() const;
883 #else
884     bool allowsTextRanges() const { return isTextControl(); }
885     unsigned getLengthForTextRange() const { return text().length(); }
886 #endif
887
888 #if PLATFORM(MAC)
889     RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
890 #elif PLATFORM(WIN)
891     COMPtr<AccessibilityObjectWrapper> m_wrapper;
892 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
893     AtkObject* m_wrapper;
894 #endif
895 };
896
897 #if !HAVE(ACCESSIBILITY)
898 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children() { return m_children; }
899 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
900 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
901 inline void AccessibilityObject::updateBackingStore() { }
902 #endif
903
904 } // namespace WebCore
905
906 #endif // AccessibilityObject_h